package main import ( "encoding/json" "net/http" "os/exec" "strconv" "strings" ) func healthCheckNetworkHandler(w http.ResponseWriter, r *http.Request) { var modem struct { ICCID string `json:"iccid"` RSSI string `json:"rssi"` } var net struct { Status string `json:"net_ok"` Type string `json:"net_type"` } var avar1, avar2, avar3, avar4, avar5, avar6 string avar1, avar2, avar3 = "已完成", "未通过", "网络服务异常" avar4, avar5, avar6 = "已完成", "未通过", "网络连接异常" if callRPCResult(r.Context(), 7000, "core.getNetStatus", nil, &net) != nil { goto done } avar1, avar2, avar3 = "已完成", "通过", "网络服务正常" if net.Status != "true" { goto done } avar4, avar5, avar6 = "已完成", "通过", "网络连接正常("+net.Type+"网络)" if net.Type != "蜂窝" { goto done } if callRPCResult(r.Context(), 7000, "core.getModemInfo", nil, &modem) != nil { avar5, avar6 = "未通过", "蜂窝模块异常" goto done } if modem.ICCID == "" { avar5, avar6 = "未通过", "SIM卡异常" goto done } avar6 = "网络连接正常(蜂窝网络,SIM卡正常," + getCSQDesc(modem.RSSI) + ")" done: w.Header().Set("Content-Type", "application/json; charset=utf-8") json.NewEncoder(w).Encode(map[string]string{"avar1": avar1, "avar2": avar2, "avar3": avar3, "avar4": avar4, "avar5": avar5, "avar6": avar6}) } func getCSQDesc(csq string) string { n, err := strconv.Atoi(csq) if err != nil { return "信号未知" } switch { case n == 99 || n == 199: return "信号未知" case n >= 0 && n <= 9: return "信号较弱" case n >= 10 && n <= 19: return "信号一般" case n >= 20 && n <= 31: return "信号良好" case n >= 100 && n <= 191: return "信号有效" default: return "信号未知" } } func healthCheckTimeHandler(w http.ResponseWriter, r *http.Request) { var status struct { SystemTime string `json:"system_time"` TimeSource string `json:"time_source"` TimeSynced string `json:"time_synced"` } if err := callRPCResult(r.Context(), 7001, "core.getTimeSyncStatus", nil, &status); err != nil { json.NewEncoder(w).Encode(map[string]string{ "bvar1": "已完成", "bvar2": "未通过", "bvar3": "时间服务检测失败", "bvar4": "已完成", "bvar5": "未通过", "bvar6": "时间同步检测失败", }) return } result := map[string]string{"bvar1": "已完成", "bvar2": "通过", "bvar3": "时间服务正常", "bvar4": "已完成", "bvar5": "未通过", "bvar6": "系统时间未同步"} if status.TimeSynced == "true" { result["bvar5"] = "通过" result["bvar6"] = "系统时间已同步" } json.NewEncoder(w).Encode(result) } func healthCheckPositionHandler(w http.ResponseWriter, r *http.Request) { var pos struct { Lat string `json:"lat"` Lon string `json:"lon"` } if err := callRPCResult(r.Context(), 7002, "core.getPositionInfo", nil, &pos); err != nil { json.NewEncoder(w).Encode(map[string]string{ "cvar1": "已完成", "cvar2": "未通过", "cvar3": "定位服务检测失败", "cvar4": "已完成", "cvar5": "未通过", "cvar6": "定位状态检测失败", }) return } result := map[string]string{"cvar1": "已完成", "cvar2": "通过", "cvar3": "定位服务正常", "cvar4": "已完成", "cvar5": "未通过", "cvar6": "未能获取到确切的位置信息"} if pos.Lat != "" && pos.Lon != "" { result["cvar5"] = "通过" result["cvar6"] = "已获取到确切的位置信息" } json.NewEncoder(w).Encode(result) } func healthCheckCameraHandler(w http.ResponseWriter, r *http.Request) { var count string if err := callRPCResult(r.Context(), 7003, "core.getSupportedCameraCount", map[string]string{"type": "all"}, &count); err != nil { json.NewEncoder(w).Encode(map[string]string{ "dvar1": "已完成", "dvar2": "未通过", "dvar3": "相机服务检测失败", "dvar4": "已完成", "dvar5": "未通过", "dvar6": "识别查找相机失败", }) return } result := map[string]string{"dvar1": "已完成", "dvar2": "通过", "dvar3": "相机服务正常", "dvar4": "已完成", "dvar5": "未通过", "dvar6": "未找到相机"} if count != "" && count != "0" { result["dvar5"] = "通过" result["dvar6"] = "共找到(" + count + ")个相机" } json.NewEncoder(w).Encode(result) } func healthCheckCameraPhotoHandler(w http.ResponseWriter, r *http.Request) { var result struct { Mark map[string]interface{} `json:"mark"` Status string `json:"status"` } params := map[string]string{ "format": "jpg", "outFilename": "/tmp/health_check.jpg", "timeoutMs": "300", } if err := callRPCResult(r.Context(), 7003, "core.takePhoto", params, &result); err != nil { json.NewEncoder(w).Encode(map[string]string{ "dvar7": "已完成", "dvar8": "未通过", "dvar9": "测试相机拍照失败", }) return } if result.Status == "success" { json.NewEncoder(w).Encode(map[string]string{ "dvar7": "已完成", "dvar8": "通过", "dvar9": "测试相机拍照成功", }) return } else { json.NewEncoder(w).Encode(map[string]string{ "dvar7": "已完成", "dvar8": "未通过", "dvar9": "测试相机拍照失败", }) return } } func healthCheckUserAppHandler(w http.ResponseWriter, r *http.Request) { var result = map[string]string{ "evar1": "已完成", "evar2": "未通过", "evar3": "用户应用尚未安装", } out, err := exec.Command("systemctl", "show", "yfkj-user-app.service", "-p", "LoadState", "-p", "ActiveState", "-p", "SubState").Output() if err == nil { v := string(out) switch { case strings.Contains(v, "ActiveState=active") && strings.Contains(v, "SubState=running"): result["evar2"] = "通过" result["evar3"] = "用户应用已安装,运行正常" case strings.Contains(v, "LoadState=loaded"): result["evar3"] = "用户应用已安装,但未运行" } } json.NewEncoder(w).Encode(result) }