rpc_handler.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. package main
  2. import (
  3. "context"
  4. "encoding/json"
  5. "strconv"
  6. "strings"
  7. "sync"
  8. "time"
  9. "hnyfkj.com.cn/rtu/linux/baseapp"
  10. "hnyfkj.com.cn/rtu/linux/camera"
  11. "hnyfkj.com.cn/rtu/linux/dh_takephoto"
  12. "hnyfkj.com.cn/rtu/linux/hk_takephoto"
  13. "hnyfkj.com.cn/rtu/linux/utils/jsonrpc2"
  14. )
  15. var cameraMutex sync.Mutex
  16. func getGigeCameraPower(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
  17. on, err := camera.GetGigeCameraPowerCtrl()
  18. if err != nil {
  19. return jsonrpc2.BuildError(req, jsonrpc2.ErrInternal, err.Error())
  20. }
  21. return jsonrpc2.BuildResponse(req, map[string]string{
  22. "enable": strconv.FormatBool(on),
  23. }, nil)
  24. }
  25. func setGigeCameraPower(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
  26. var params map[string]string
  27. if err := json.Unmarshal(req.Params, &params); err != nil {
  28. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, err.Error())
  29. }
  30. enable, ok := params["enable"]
  31. if !ok || enable == "" {
  32. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, "missing or empty 'enable' parameter")
  33. }
  34. var on bool
  35. switch {
  36. case strings.EqualFold(enable, "true"), enable == "1":
  37. on = true
  38. case strings.EqualFold(enable, "false"), enable == "0":
  39. on = false
  40. default:
  41. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, "invalid 'enable' value")
  42. }
  43. if err := camera.PowerOnGigeCamera(on); err != nil {
  44. return jsonrpc2.BuildError(req, jsonrpc2.ErrInternal, err.Error())
  45. }
  46. return jsonrpc2.BuildResponse(req, "success", nil)
  47. }
  48. func checkGigeCamera(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
  49. var params map[string]string
  50. if err := json.Unmarshal(req.Params, &params); err != nil {
  51. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, err.Error())
  52. }
  53. ip, ok := params["ip"]
  54. if !ok || ip == "" {
  55. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, "missing or empty 'ip' parameter")
  56. }
  57. prefix, ok := params["prefix"]
  58. if !ok || prefix == "" {
  59. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, "missing or empty 'prefix' parameter")
  60. }
  61. gigeAddrCIDR := ip + "/" + prefix
  62. equal, err := camera.CidrEqualSemantic(eth1AddrCIDR, gigeAddrCIDR)
  63. if err != nil {
  64. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, err.Error())
  65. }
  66. if !equal {
  67. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, "gige camera ip not in network")
  68. }
  69. if err := camera.PingOnce(ip, 1); err != nil {
  70. return jsonrpc2.BuildError(req, -32001, err.Error())
  71. }
  72. return jsonrpc2.BuildResponse(req, "success", nil)
  73. }
  74. func getSupportedCameraCount(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
  75. var params map[string]string
  76. if err := json.Unmarshal(req.Params, &params); err != nil {
  77. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, err.Error())
  78. }
  79. cameraType, ok := params["type"]
  80. if !ok || cameraType == "" {
  81. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, "missing or empty 'type' parameter")
  82. }
  83. var count int
  84. cameraMutex.Lock()
  85. defer cameraMutex.Unlock()
  86. switch strings.ToLower(cameraType) {
  87. case "all":
  88. count = camera.GetSupportedCameraCount()
  89. case "hk":
  90. count = hk_takephoto.GetHKCameraCount()
  91. case "dh":
  92. count = dh_takephoto.GetDHCameraCount()
  93. default:
  94. return jsonrpc2.BuildError(req, -32001, "unsupported camera type")
  95. }
  96. return jsonrpc2.BuildResponse(req, strconv.Itoa(count), nil)
  97. }
  98. func setWaitAEDoneForTakePhoto(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
  99. var params map[string]string
  100. if err := json.Unmarshal(req.Params, &params); err != nil {
  101. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, err.Error())
  102. }
  103. waitAE, ok := params["waitAE"]
  104. if !ok || waitAE == "" {
  105. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, "missing or empty 'waitAE' parameter")
  106. }
  107. switch waitAE {
  108. case "0":
  109. camera.SetWaitAEDoneForTakePhoto(0)
  110. case "1":
  111. camera.SetWaitAEDoneForTakePhoto(1)
  112. default:
  113. return jsonrpc2.BuildError(req, -32001, "invalid 'waitAE' value")
  114. }
  115. return jsonrpc2.BuildResponse(req, "success", nil)
  116. }
  117. func takePhoto(ctx context.Context, req *jsonrpc2.Request) *jsonrpc2.Response {
  118. var params map[string]string
  119. if err := json.Unmarshal(req.Params, &params); err != nil {
  120. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, err.Error())
  121. }
  122. format, ok := params["format"]
  123. if !ok || format == "" {
  124. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, "missing or empty 'format' parameter")
  125. }
  126. outFilename, ok := params["outFilename"]
  127. if !ok || outFilename == "" {
  128. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, "missing or empty 'outFilename' parameter")
  129. }
  130. timeoutMs, ok := params["timeoutMs"]
  131. if !ok || timeoutMs == "" {
  132. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, "missing or empty 'timeoutMs' parameter")
  133. }
  134. if !strings.EqualFold(format, "jpg") {
  135. return jsonrpc2.BuildError(req, jsonrpc2.ErrInvalidParams, "unsupported format")
  136. }
  137. timeout, err := strconv.Atoi(timeoutMs)
  138. if err != nil || timeout <= 0 {
  139. timeout = 300
  140. }
  141. cameraMutex.Lock()
  142. defer cameraMutex.Unlock()
  143. baseapp.Logger.Infof("开始拍照, 请稍微...")
  144. var resp *jsonrpc2.Response
  145. start := time.Now()
  146. imgMark, err := camera.TakePhoto(
  147. camera.IMG_TYPE_JPG,
  148. outFilename,
  149. timeout,
  150. )
  151. elapsed := time.Since(start).Milliseconds()
  152. if err != nil {
  153. resp = jsonrpc2.BuildError(req, -32001, err.Error())
  154. baseapp.Logger.Errorf("拍照时发生错误: %v, 用时: %dms, 请修复所有问题后重试!!", err, elapsed)
  155. } else {
  156. resp = jsonrpc2.BuildResponse(req, map[string]any{
  157. "status": "success",
  158. "mark": imgMark,
  159. }, nil)
  160. baseapp.Logger.Infof("拍照结束, 输出: \"%s\", 用时: %dms, 拍照信息: %+v", outFilename, elapsed, imgMark)
  161. }
  162. return resp
  163. }