|
@@ -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 {}
|
|
|
|
+}
|