90 lines
2.1 KiB
Go
90 lines
2.1 KiB
Go
|
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
|
|||
|
}
|