|
@@ -51,47 +51,20 @@ type StatusMessage struct {
|
|
|
func keepAlive() {
|
|
|
ticker := time.NewTicker(30 * time.Second)
|
|
|
defer ticker.Stop()
|
|
|
- request := Request1{
|
|
|
- Type: "request",
|
|
|
- CommandID: "heart",
|
|
|
- Parameter: nil,
|
|
|
- }
|
|
|
-
|
|
|
- requestJSON, err := json.Marshal(request)
|
|
|
- c_log.GlobalLogger.Info("requestJSON", requestJSON)
|
|
|
- if err != nil {
|
|
|
- c_log.GlobalLogger.Error("保持websocket连接活跃,解析requestJSON - 失败。", err)
|
|
|
- }
|
|
|
|
|
|
for {
|
|
|
select {
|
|
|
case <-ticker.C:
|
|
|
- err := WsConn.WriteMessage(websocket.TextMessage, requestJSON)
|
|
|
- if err != nil {
|
|
|
- c_log.GlobalLogger.Error("保持websocket连接活跃,发送心跳请求 - 失败。", err)
|
|
|
+ response, err := sendRequestAndAwaitResponse(WsConn)
|
|
|
+ if err != nil || response == nil {
|
|
|
continue
|
|
|
}
|
|
|
- _, msg, err := WsConn.ReadMessage()
|
|
|
- if err != nil {
|
|
|
- c_log.GlobalLogger.Error("保持websocket连接活跃,获取心跳响应 - 失败。", err)
|
|
|
- continue
|
|
|
- }
|
|
|
- c_log.GlobalLogger.Info("保持websocket连接活跃,发送心跳请求 - 成功。")
|
|
|
- // 将响应字节解码为JSON
|
|
|
var responseMessage Response
|
|
|
- err = json.Unmarshal(msg, &responseMessage)
|
|
|
+ err = json.Unmarshal(response, &responseMessage)
|
|
|
if err != nil {
|
|
|
- c_log.GlobalLogger.Error("保持websocket连接活跃,解析心跳响应为json - 失败。", err)
|
|
|
+ c_log.GlobalLogger.Error("保持websocket连接活跃,解析websocket响应 - 失败。", err)
|
|
|
continue
|
|
|
}
|
|
|
- c_log.GlobalLogger.Info("websocket responseMessage:", responseMessage)
|
|
|
- if responseMessage.Status != "" {
|
|
|
- c_log.GlobalLogger.Info("websocket发送心跳请求解析状态为", responseMessage.Status)
|
|
|
- }
|
|
|
- if responseMessage.ErrorCode != "" {
|
|
|
- c_log.GlobalLogger.Info("websocket发送心跳请求解析故障码为", responseMessage.ErrorCode)
|
|
|
- }
|
|
|
-
|
|
|
if responseMessage.Status != "OK" {
|
|
|
WsConn.Close()
|
|
|
c_log.GlobalLogger.Info("重试连接websocket...")
|
|
@@ -102,6 +75,54 @@ func keepAlive() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func sendRequestAndAwaitResponse(ws *websocket.Conn) ([]byte, error) {
|
|
|
+ request := Request1{
|
|
|
+ Type: "request",
|
|
|
+ CommandID: "heart",
|
|
|
+ Parameter: nil,
|
|
|
+ }
|
|
|
+
|
|
|
+ requestJSON, err := json.Marshal(request)
|
|
|
+ if err != nil {
|
|
|
+ c_log.GlobalLogger.Error("保持websocket连接活跃,解析requestJSON - 失败。", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ err = WsConn.WriteMessage(websocket.TextMessage, requestJSON)
|
|
|
+ if err != nil {
|
|
|
+ c_log.GlobalLogger.Error("保持websocket连接活跃,发送心跳请求 - 失败。", err)
|
|
|
+ }
|
|
|
+ c_log.GlobalLogger.Error("保持websocket连接活跃,发送心跳请求 - 成功。", err)
|
|
|
+
|
|
|
+ // 使用channel等待响应
|
|
|
+ responseChan := make(chan []byte)
|
|
|
+ go handleMessages(ws, responseChan)
|
|
|
+
|
|
|
+ select {
|
|
|
+ case response := <-responseChan:
|
|
|
+ c_log.GlobalLogger.Error("保持websocket连接活跃,等待心跳响应 - 成功。", err)
|
|
|
+ return response, nil
|
|
|
+ case <-time.After(30 * time.Second): // 设置超时时间
|
|
|
+ return nil, fmt.Errorf("保持websocket连接活跃,等待心跳响应 - 超时。")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func handleMessages(ws *websocket.Conn, responseChan chan<- []byte) {
|
|
|
+ for {
|
|
|
+ _, message, err := ws.ReadMessage()
|
|
|
+ if err != nil {
|
|
|
+ c_log.GlobalLogger.Error("保持websocket连接活跃,读取websocket消息失败", err)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ var response Response
|
|
|
+ if err := json.Unmarshal(message, &response); err == nil && response.Type == "response" {
|
|
|
+ responseChan <- message
|
|
|
+ close(responseChan)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
func ConnectWebsocket() {
|
|
|
for {
|
|
|
// 防止重复调用
|