Pārlūkot izejas kodu

test: websocket

HeWang 6 mēneši atpakaļ
vecāks
revīzija
bf479cfc1c
1 mainītis faili ar 234 papildinājumiem un 0 dzēšanām
  1. 234 0
      tools/pji_websocket/main/main.go

+ 234 - 0
tools/pji_websocket/main/main.go

@@ -0,0 +1,234 @@
+package main
+
+import (
+	"cicv-data-closedloop/common/config/c_log"
+	"encoding/json"
+	"fmt"
+	"log"
+	"net/url"
+	"time"
+
+	"github.com/gorilla/websocket"
+)
+
+// Request 结构体定义
+type Request struct {
+	Type      string      `json:"type"`
+	UUID      string      `json:"uuid"`
+	CommandID string      `json:"commandId"`
+	Parameter interface{} `json:"parameter"`
+}
+
+// Request1 结构体定义
+type Request1 struct {
+	Type      string      `json:"type"`
+	CommandID string      `json:"commandId"`
+	Parameter interface{} `json:"parameter"`
+}
+
+// Response 结构体定义
+type Response struct {
+	CommandID string            `json:"commandId"`
+	ErrorCode string            `json:"errorCode"`
+	Results   map[string]string `json:"results"`
+	Status    string            `json:"status"`
+	Time      int64             `json:"time"`
+	Type      string            `json:"type"`
+	UUID      string            `json:"uuid"`
+}
+
+// 状态消息 结构体定义
+type StatusMessage struct {
+	Type  string      `json:"type"`
+	Topic string      `json:"topic"`
+	Time  int64       `json:"time"`
+	Data  interface{} `json:"data"`
+}
+
+// SendWebsocketRequest 发送WebSocket请求并返回sn字段的值
+func SendWebsocketRequest(serverURL, path string, request Request1) (string, error) {
+	// 构建WebSocket连接URL
+	u := url.URL{Scheme: "ws", Host: serverURL, Path: path}
+
+	// 创建一个Dialer实例,用于建立WebSocket连接
+	dialer := websocket.Dialer{
+		ReadBufferSize:  1024,
+		WriteBufferSize: 1024,
+		// 可选:设置超时等
+		HandshakeTimeout: 5 * time.Second,
+	}
+
+	// 建立WebSocket连接
+	conn, _, err := dialer.Dial(u.String(), nil)
+	if err != nil {
+		return "", fmt.Errorf("dial: %w", err)
+	}
+	defer conn.Close()
+
+	// 将请求JSON编码为字节
+	requestJSON, err := json.Marshal(request)
+	if err != nil {
+		return "", fmt.Errorf("marshal request: %w", err)
+	}
+
+	// 发送WebSocket消息
+	err = conn.WriteMessage(websocket.TextMessage, requestJSON)
+	if err != nil {
+		return "", fmt.Errorf("write: %w", err)
+	}
+	//
+	//// 读取WebSocket响应
+	//_, responseBytes, err := conn.ReadMessage()
+	//if err != nil {
+	//	return "", fmt.Errorf("read: %w", err)
+	//}
+	//
+	//// 将响应字节解码为JSON
+	//var response Response
+	//err = json.Unmarshal(responseBytes, &response)
+	//if err != nil {
+	//	return "", fmt.Errorf("unmarshal response: %w", err)
+	//}
+	//
+	//// 返回sn字段的值
+	//return response.Results["sn"], nil
+
+	for {
+		time.Sleep(100 * time.Millisecond)
+		_, message, err := conn.ReadMessage()
+		if err != nil {
+			c_log.GlobalLogger.Error("保持websocket连接活跃,读取websocket消息 - 失败 ", err)
+			return "", err
+		}
+
+		var response Response
+		if err := json.Unmarshal(message, &response); err == nil && response.Type == "response" {
+			fmt.Println("response", response)
+			return "", err
+		}
+	}
+}
+
+//// SendWebsocketRequest 发送WebSocket请求并返回sn字段的值
+//func SendWebsocketRequest(serverURL, path string, request Request) (string, error) {
+//	// 构建WebSocket连接URL
+//	u := url.URL{Scheme: "ws", Host: serverURL, Path: path}
+//
+//	// 创建一个Dialer实例,用于建立WebSocket连接
+//	dialer := websocket.Dialer{
+//		ReadBufferSize:  1024,
+//		WriteBufferSize: 1024,
+//		// 可选:设置超时等
+//		HandshakeTimeout: 5 * time.Second,
+//	}
+//
+//	// 建立WebSocket连接
+//	conn, _, err := dialer.Dial(u.String(), nil)
+//	if err != nil {
+//		return "", fmt.Errorf("dial: %w", err)
+//	}
+//	defer conn.Close()
+//
+//	// 将请求JSON编码为字节
+//	requestJSON, err := json.Marshal(request)
+//	if err != nil {
+//		return "", fmt.Errorf("marshal request: %w", err)
+//	}
+//
+//	// 发送WebSocket消息
+//	err = conn.WriteMessage(websocket.TextMessage, requestJSON)
+//	if err != nil {
+//		return "", fmt.Errorf("write: %w", err)
+//	}
+//
+//	// 读取WebSocket响应
+//	_, responseBytes, err := conn.ReadMessage()
+//	if err != nil {
+//		return "", fmt.Errorf("read: %w", err)
+//	}
+//
+//	// 将响应字节解码为JSON
+//	var response Response
+//	err = json.Unmarshal(responseBytes, &response)
+//	if err != nil {
+//		return "", fmt.Errorf("unmarshal response: %w", err)
+//	}
+//
+//	// 返回sn字段的值
+//	return response.Results["sn"], nil
+//}
+
+func receiveHandler(connection *websocket.Conn) {
+	for {
+		time.Sleep(1 * time.Second)
+		_, msg, err := connection.ReadMessage()
+		if err != nil {
+			log.Println("Error in receive:", err)
+			break
+		}
+		log.Printf("Received: %s\n", msg)
+		// 将响应字节解码为JSON
+		var statusMessage StatusMessage
+		err = json.Unmarshal(msg, &statusMessage)
+		if err != nil {
+			log.Println("Error in receive:", err)
+			break
+		}
+		fmt.Println("statusMessage:", statusMessage)
+		if statusMessage.Type == "push" && statusMessage.Topic == "robotStatus" {
+			data := statusMessage.Data.(map[string]interface{})
+			fmt.Println("statusMessage.Data", data)
+			fmt.Println("statusMessage.Data[\"taskStatus\"]", data["taskStatus"])
+		}
+	}
+}
+
+func main() {
+	// 示例使用
+	serverURL := "192.168.1.104:9002"
+	path := "/"
+	//request := Request{
+	//	Type:      "request",
+	//	UUID:      "",
+	//	CommandID: "getRobotBaseInfo",
+	//	Parameter: nil,
+	//}
+
+	//sn, err := SendWebsocketRequest(serverURL, path, request)
+	//if err != nil {
+	//	log.Fatal(err)
+	//}
+	//log.Printf("SN: %s", sn)
+
+	// 构建WebSocket连接URL
+	u := url.URL{Scheme: "ws", Host: serverURL, Path: path}
+
+	// 创建一个Dialer实例,用于建立WebSocket连接
+	dialer := websocket.Dialer{
+		ReadBufferSize:  1024,
+		WriteBufferSize: 1024,
+		// 可选:设置超时等
+		HandshakeTimeout: 5 * time.Second,
+	}
+
+	// 建立WebSocket连接
+	conn, _, err := dialer.Dial(u.String(), nil)
+	if err != nil {
+		fmt.Println("err:", err)
+	}
+	defer conn.Close()
+
+	//go receiveHandler(conn)
+
+	request := Request1{
+		Type:      "request",
+		CommandID: "heart",
+		Parameter: nil,
+	}
+	_, err = SendWebsocketRequest(serverURL, path, request)
+	if err != nil {
+		return
+	}
+
+	select {}
+}