HeWang преди 6 месеца
родител
ревизия
a8071c0777
променени са 1 файла, в които са добавени 52 реда и са изтрити 31 реда
  1. 52 31
      aarch64/pjibot_guide/common/config/c_websocket.go

+ 52 - 31
aarch64/pjibot_guide/common/config/c_websocket.go

@@ -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 {
 		// 防止重复调用