page7_handler.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. package main
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "os/exec"
  6. "strconv"
  7. "strings"
  8. )
  9. func healthCheckNetworkHandler(w http.ResponseWriter, r *http.Request) {
  10. var modem struct {
  11. ICCID string `json:"iccid"`
  12. RSSI string `json:"rssi"`
  13. }
  14. var net struct {
  15. Status string `json:"net_ok"`
  16. Type string `json:"net_type"`
  17. }
  18. var avar1, avar2, avar3, avar4, avar5, avar6 string
  19. avar1, avar2, avar3 = "已完成", "未通过", "网络服务异常"
  20. avar4, avar5, avar6 = "已完成", "未通过", "网络连接异常"
  21. if callRPCResult(r.Context(), 7000, "core.getNetStatus", nil, &net) != nil {
  22. goto done
  23. }
  24. avar1, avar2, avar3 = "已完成", "通过", "网络服务正常"
  25. if net.Status != "true" {
  26. goto done
  27. }
  28. avar4, avar5, avar6 = "已完成", "通过", "网络连接正常("+net.Type+"网络)"
  29. if net.Type != "蜂窝" {
  30. goto done
  31. }
  32. if callRPCResult(r.Context(), 7000, "core.getModemInfo", nil, &modem) != nil {
  33. avar5, avar6 = "未通过", "蜂窝模块异常"
  34. goto done
  35. }
  36. if modem.ICCID == "" {
  37. avar5, avar6 = "未通过", "SIM卡异常"
  38. goto done
  39. }
  40. avar6 = "网络连接正常(蜂窝网络,SIM卡正常," + getCSQDesc(modem.RSSI) + ")"
  41. done:
  42. w.Header().Set("Content-Type", "application/json; charset=utf-8")
  43. json.NewEncoder(w).Encode(map[string]string{"avar1": avar1, "avar2": avar2, "avar3": avar3,
  44. "avar4": avar4, "avar5": avar5, "avar6": avar6})
  45. }
  46. func getCSQDesc(csq string) string {
  47. n, err := strconv.Atoi(csq)
  48. if err != nil {
  49. return "信号未知"
  50. }
  51. switch {
  52. case n == 99 || n == 199:
  53. return "信号未知"
  54. case n >= 0 && n <= 9:
  55. return "信号较弱"
  56. case n >= 10 && n <= 19:
  57. return "信号一般"
  58. case n >= 20 && n <= 31:
  59. return "信号良好"
  60. case n >= 100 && n <= 191:
  61. return "信号有效"
  62. default:
  63. return "信号未知"
  64. }
  65. }
  66. func healthCheckTimeHandler(w http.ResponseWriter, r *http.Request) {
  67. var status struct {
  68. SystemTime string `json:"system_time"`
  69. TimeSource string `json:"time_source"`
  70. TimeSynced string `json:"time_synced"`
  71. }
  72. if err := callRPCResult(r.Context(), 7001, "core.getTimeSyncStatus", nil, &status); err != nil {
  73. json.NewEncoder(w).Encode(map[string]string{
  74. "bvar1": "已完成", "bvar2": "未通过", "bvar3": "时间服务检测失败",
  75. "bvar4": "已完成", "bvar5": "未通过", "bvar6": "时间同步检测失败",
  76. })
  77. return
  78. }
  79. result := map[string]string{"bvar1": "已完成", "bvar2": "通过", "bvar3": "时间服务正常",
  80. "bvar4": "已完成", "bvar5": "未通过", "bvar6": "系统时间未同步"}
  81. if status.TimeSynced == "true" {
  82. result["bvar5"] = "通过"
  83. result["bvar6"] = "系统时间已同步"
  84. }
  85. json.NewEncoder(w).Encode(result)
  86. }
  87. func healthCheckPositionHandler(w http.ResponseWriter, r *http.Request) {
  88. var pos struct {
  89. Lat string `json:"lat"`
  90. Lon string `json:"lon"`
  91. }
  92. if err := callRPCResult(r.Context(), 7002, "core.getPositionInfo", nil, &pos); err != nil {
  93. json.NewEncoder(w).Encode(map[string]string{
  94. "cvar1": "已完成", "cvar2": "未通过", "cvar3": "定位服务检测失败",
  95. "cvar4": "已完成", "cvar5": "未通过", "cvar6": "定位状态检测失败",
  96. })
  97. return
  98. }
  99. result := map[string]string{"cvar1": "已完成", "cvar2": "通过", "cvar3": "定位服务正常",
  100. "cvar4": "已完成", "cvar5": "未通过", "cvar6": "未能获取到确切的位置信息"}
  101. if pos.Lat != "" && pos.Lon != "" {
  102. result["cvar5"] = "通过"
  103. result["cvar6"] = "已获取到确切的位置信息"
  104. }
  105. json.NewEncoder(w).Encode(result)
  106. }
  107. func healthCheckCameraHandler(w http.ResponseWriter, r *http.Request) {
  108. var count string
  109. if err := callRPCResult(r.Context(), 7003, "core.getSupportedCameraCount", map[string]string{"type": "all"}, &count); err != nil {
  110. json.NewEncoder(w).Encode(map[string]string{
  111. "dvar1": "已完成", "dvar2": "未通过", "dvar3": "相机服务检测失败",
  112. "dvar4": "已完成", "dvar5": "未通过", "dvar6": "识别查找相机失败",
  113. })
  114. return
  115. }
  116. result := map[string]string{"dvar1": "已完成", "dvar2": "通过", "dvar3": "相机服务正常",
  117. "dvar4": "已完成", "dvar5": "未通过", "dvar6": "未找到相机"}
  118. if count != "" && count != "0" {
  119. result["dvar5"] = "通过"
  120. result["dvar6"] = "共找到(" + count + ")个相机"
  121. }
  122. json.NewEncoder(w).Encode(result)
  123. }
  124. func healthCheckCameraPhotoHandler(w http.ResponseWriter, r *http.Request) {
  125. var result struct {
  126. Mark map[string]interface{} `json:"mark"`
  127. Status string `json:"status"`
  128. }
  129. params := map[string]string{
  130. "format": "jpg",
  131. "outFilename": "/tmp/health_check.jpg",
  132. "timeoutMs": "300",
  133. }
  134. if err := callRPCResult(r.Context(), 7003, "core.takePhoto", params, &result); err != nil {
  135. json.NewEncoder(w).Encode(map[string]string{
  136. "dvar7": "已完成",
  137. "dvar8": "未通过",
  138. "dvar9": "测试相机拍照失败",
  139. })
  140. return
  141. }
  142. if result.Status == "success" {
  143. json.NewEncoder(w).Encode(map[string]string{
  144. "dvar7": "已完成",
  145. "dvar8": "通过",
  146. "dvar9": "测试相机拍照成功",
  147. })
  148. return
  149. } else {
  150. json.NewEncoder(w).Encode(map[string]string{
  151. "dvar7": "已完成",
  152. "dvar8": "未通过",
  153. "dvar9": "测试相机拍照失败",
  154. })
  155. return
  156. }
  157. }
  158. func healthCheckUserAppHandler(w http.ResponseWriter, r *http.Request) {
  159. var result = map[string]string{
  160. "evar1": "已完成",
  161. "evar2": "未通过",
  162. "evar3": "用户应用尚未安装",
  163. }
  164. out, err := exec.Command("systemctl", "show", "yfkj-user-app.service",
  165. "-p", "LoadState",
  166. "-p", "ActiveState",
  167. "-p", "SubState").Output()
  168. if err == nil {
  169. v := string(out)
  170. switch {
  171. case strings.Contains(v, "ActiveState=active") && strings.Contains(v, "SubState=running"):
  172. result["evar2"] = "通过"
  173. result["evar3"] = "用户应用已安装,运行正常"
  174. case strings.Contains(v, "LoadState=loaded"):
  175. result["evar3"] = "用户应用已安装,但未运行"
  176. }
  177. }
  178. json.NewEncoder(w).Encode(result)
  179. }