初始
This commit is contained in:
89
api/video_hat/ws_connect.go
Normal file
89
api/video_hat/ws_connect.go
Normal file
@ -0,0 +1,89 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user