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
|
||
}
|