main.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. package main
  2. import (
  3. "cicv-data-closedloop/common/config/c_log"
  4. "encoding/json"
  5. "fmt"
  6. "log"
  7. "net/url"
  8. "time"
  9. "github.com/gorilla/websocket"
  10. )
  11. // Request 结构体定义
  12. type Request struct {
  13. Type string `json:"type"`
  14. UUID string `json:"uuid"`
  15. CommandID string `json:"commandId"`
  16. Parameter interface{} `json:"parameter"`
  17. }
  18. // Request1 结构体定义
  19. type Request1 struct {
  20. Type string `json:"type"`
  21. CommandID string `json:"commandId"`
  22. Parameter interface{} `json:"parameter"`
  23. }
  24. // Response 结构体定义
  25. type Response struct {
  26. CommandID string `json:"commandId"`
  27. ErrorCode string `json:"errorCode"`
  28. Results map[string]string `json:"results"`
  29. Status string `json:"status"`
  30. Time int64 `json:"time"`
  31. Type string `json:"type"`
  32. UUID string `json:"uuid"`
  33. }
  34. // 状态消息 结构体定义
  35. type StatusMessage struct {
  36. Type string `json:"type"`
  37. Topic string `json:"topic"`
  38. Time int64 `json:"time"`
  39. Data interface{} `json:"data"`
  40. }
  41. // SendWebsocketRequest 发送WebSocket请求并返回sn字段的值
  42. func SendWebsocketRequest(serverURL, path string, request Request1) (string, error) {
  43. // 构建WebSocket连接URL
  44. u := url.URL{Scheme: "ws", Host: serverURL, Path: path}
  45. // 创建一个Dialer实例,用于建立WebSocket连接
  46. dialer := websocket.Dialer{
  47. ReadBufferSize: 1024,
  48. WriteBufferSize: 1024,
  49. // 可选:设置超时等
  50. HandshakeTimeout: 5 * time.Second,
  51. }
  52. // 建立WebSocket连接
  53. conn, _, err := dialer.Dial(u.String(), nil)
  54. if err != nil {
  55. return "", fmt.Errorf("dial: %w", err)
  56. }
  57. defer conn.Close()
  58. // 将请求JSON编码为字节
  59. requestJSON, err := json.Marshal(request)
  60. if err != nil {
  61. return "", fmt.Errorf("marshal request: %w", err)
  62. }
  63. // 发送WebSocket消息
  64. err = conn.WriteMessage(websocket.TextMessage, requestJSON)
  65. if err != nil {
  66. return "", fmt.Errorf("write: %w", err)
  67. }
  68. //
  69. //// 读取WebSocket响应
  70. //_, responseBytes, err := conn.ReadMessage()
  71. //if err != nil {
  72. // return "", fmt.Errorf("read: %w", err)
  73. //}
  74. //
  75. //// 将响应字节解码为JSON
  76. //var response Response
  77. //err = json.Unmarshal(responseBytes, &response)
  78. //if err != nil {
  79. // return "", fmt.Errorf("unmarshal response: %w", err)
  80. //}
  81. //
  82. //// 返回sn字段的值
  83. //return response.Results["sn"], nil
  84. for {
  85. time.Sleep(100 * time.Millisecond)
  86. _, message, err := conn.ReadMessage()
  87. if err != nil {
  88. c_log.GlobalLogger.Error("保持websocket连接活跃,读取websocket消息 - 失败 ", err)
  89. return "", err
  90. }
  91. var response Response
  92. if err := json.Unmarshal(message, &response); err == nil && response.Type == "response" {
  93. fmt.Println("response", response)
  94. return "", err
  95. }
  96. }
  97. }
  98. //// SendWebsocketRequest 发送WebSocket请求并返回sn字段的值
  99. //func SendWebsocketRequest(serverURL, path string, request Request) (string, error) {
  100. // // 构建WebSocket连接URL
  101. // u := url.URL{Scheme: "ws", Host: serverURL, Path: path}
  102. //
  103. // // 创建一个Dialer实例,用于建立WebSocket连接
  104. // dialer := websocket.Dialer{
  105. // ReadBufferSize: 1024,
  106. // WriteBufferSize: 1024,
  107. // // 可选:设置超时等
  108. // HandshakeTimeout: 5 * time.Second,
  109. // }
  110. //
  111. // // 建立WebSocket连接
  112. // conn, _, err := dialer.Dial(u.String(), nil)
  113. // if err != nil {
  114. // return "", fmt.Errorf("dial: %w", err)
  115. // }
  116. // defer conn.Close()
  117. //
  118. // // 将请求JSON编码为字节
  119. // requestJSON, err := json.Marshal(request)
  120. // if err != nil {
  121. // return "", fmt.Errorf("marshal request: %w", err)
  122. // }
  123. //
  124. // // 发送WebSocket消息
  125. // err = conn.WriteMessage(websocket.TextMessage, requestJSON)
  126. // if err != nil {
  127. // return "", fmt.Errorf("write: %w", err)
  128. // }
  129. //
  130. // // 读取WebSocket响应
  131. // _, responseBytes, err := conn.ReadMessage()
  132. // if err != nil {
  133. // return "", fmt.Errorf("read: %w", err)
  134. // }
  135. //
  136. // // 将响应字节解码为JSON
  137. // var response Response
  138. // err = json.Unmarshal(responseBytes, &response)
  139. // if err != nil {
  140. // return "", fmt.Errorf("unmarshal response: %w", err)
  141. // }
  142. //
  143. // // 返回sn字段的值
  144. // return response.Results["sn"], nil
  145. //}
  146. func receiveHandler(connection *websocket.Conn) {
  147. for {
  148. time.Sleep(1 * time.Second)
  149. _, msg, err := connection.ReadMessage()
  150. if err != nil {
  151. log.Println("Error in receive:", err)
  152. break
  153. }
  154. log.Printf("Received: %s\n", msg)
  155. // 将响应字节解码为JSON
  156. var statusMessage StatusMessage
  157. err = json.Unmarshal(msg, &statusMessage)
  158. if err != nil {
  159. log.Println("Error in receive:", err)
  160. break
  161. }
  162. fmt.Println("statusMessage:", statusMessage)
  163. if statusMessage.Type == "push" && statusMessage.Topic == "robotStatus" {
  164. data := statusMessage.Data.(map[string]interface{})
  165. fmt.Println("statusMessage.Data", data)
  166. fmt.Println("statusMessage.Data[\"taskStatus\"]", data["taskStatus"])
  167. }
  168. }
  169. }
  170. func main() {
  171. // 示例使用
  172. serverURL := "192.168.1.104:9002"
  173. path := "/"
  174. //request := Request{
  175. // Type: "request",
  176. // UUID: "",
  177. // CommandID: "getRobotBaseInfo",
  178. // Parameter: nil,
  179. //}
  180. //sn, err := SendWebsocketRequest(serverURL, path, request)
  181. //if err != nil {
  182. // log.Fatal(err)
  183. //}
  184. //log.Printf("SN: %s", sn)
  185. // 构建WebSocket连接URL
  186. u := url.URL{Scheme: "ws", Host: serverURL, Path: path}
  187. // 创建一个Dialer实例,用于建立WebSocket连接
  188. dialer := websocket.Dialer{
  189. ReadBufferSize: 1024,
  190. WriteBufferSize: 1024,
  191. // 可选:设置超时等
  192. HandshakeTimeout: 5 * time.Second,
  193. }
  194. // 建立WebSocket连接
  195. conn, _, err := dialer.Dial(u.String(), nil)
  196. if err != nil {
  197. fmt.Println("err:", err)
  198. }
  199. defer conn.Close()
  200. //go receiveHandler(conn)
  201. request := Request1{
  202. Type: "request",
  203. CommandID: "heart",
  204. Parameter: nil,
  205. }
  206. _, err = SendWebsocketRequest(serverURL, path, request)
  207. if err != nil {
  208. return
  209. }
  210. select {}
  211. }