package video_hat import ( "encoding/json" "github.com/gorilla/websocket" "github.com/tiger1103/gfast/v3/api/constant" "github.com/tiger1103/gfast/v3/api/video_hat/ws2" "log" "time" ) // 项目启动就登录视频安全帽的 WS func WsConnection() { // 首先加载 WS 路径映射 InitWsMap() // 无限循环尝试连接,直到成功 for { if connectWs() { break // 如果连接成功,则退出循环 } log.Println("Reconnecting in 5 seconds...") time.Sleep(5 * time.Second) // 等待5秒后重新连接WS } } func connectWs() bool { // 创建 WebSocket 连接 dialer := websocket.Dialer{ HandshakeTimeout: 10 * time.Second, } // 尝试连接 WebSocket var err error constant.Conn, _, err = dialer.Dial(constant.Url, nil) if err != nil { log.Println("Dial:", err) return false } defer constant.Conn.Close() // 连接成功之后发送登录信息 ws2.Login(constant.Conn) // 设置定时任务,每间隔60秒发送参数获取实时、状态等心跳包 go ws2.SendHeartbeatTime(constant.Conn) // 处理从 WebSocket 接收的消息 if handlerFun(constant.Conn) { return true } return false } func handlerFun(Conn *websocket.Conn) bool { // 读取 Conn 的数据成 JSON 字符串 for { _, message, err := Conn.ReadMessage() if err != nil { log.Println("ReadMessage:", err) return false // 如果读取过程中出现错误,则返回 false } // 创建一个 map 来存储解析后的 JSON var msgMap map[string]interface{} // 将读取到的字节切片解析为 JSON err = json.Unmarshal(message, &msgMap) if err != nil { log.Println("Unmarshal:", err) continue // 如果解析失败,则跳过此次循环 } if cmd, ok := msgMap["cmd"].(string); ok { if handler, exists := commandHandlers[cmd]; exists { jsonString, err := json.Marshal(msgMap) if err != nil { log.Println("Marshal:", err) continue // 如果序列化失败,则跳过此次循环 } handler(string(jsonString)) // 调用处理函数 } } } return true // 正常退出循环,返回 true }