rpc_handler.go 5.5 KB

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