sse.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package api
  2. import (
  3. "confrontation-training/constant"
  4. errmsg "confrontation-training/err"
  5. "confrontation-training/global"
  6. "confrontation-training/models"
  7. "encoding/json"
  8. "fmt"
  9. "github.com/gorilla/websocket"
  10. "github.com/r3labs/sse/v2"
  11. "strings"
  12. "time"
  13. )
  14. // SseScanDevice 扫描设备
  15. func SseScanDevice(paramMap map[string]string) {
  16. var scanUrl = global.Config.Gateway.BaseUrl + global.Config.Gateway.ScanUrl
  17. ws, _, err := websocket.DefaultDialer.Dial(global.Config.Websocket.WSUrl, nil)
  18. if err != nil {
  19. fmt.Println("Websocket client init error" + err.Error())
  20. return
  21. }
  22. deviceMap := make(map[string]models.DeviceScanned)
  23. if len(paramMap) > 0 {
  24. for key, value := range paramMap {
  25. scanUrl += "&" + key + "=" + value
  26. }
  27. }
  28. client := sse.NewClient(scanUrl)
  29. go func() {
  30. fmt.Println("开始SSE")
  31. err := client.SubscribeRaw(func(msg *sse.Event) {
  32. //fmt.Println(string(msg.Data))
  33. var data models.DeviceScannedFromGateway
  34. err := json.Unmarshal(msg.Data, &data)
  35. if err != nil {
  36. fmt.Printf("SSE数据转换异常:%s", err.Error())
  37. return
  38. }
  39. deviceScanned := models.DeviceScanned{}
  40. deviceScanned.Name = data.Name
  41. deviceScanned.Rssi = data.Rssi
  42. deviceScanned.MAC = data.Bdaddrs[0].Bdaddr
  43. deviceScanned.BdadrType = data.Bdaddrs[0].BdaddrType
  44. deviceScanned.Chip = data.ChipId
  45. deviceMap[deviceScanned.MAC] = deviceScanned
  46. fmt.Println(deviceScanned)
  47. })
  48. if err != nil {
  49. fmt.Println(err.Error())
  50. return
  51. }
  52. }()
  53. if err != nil {
  54. fmt.Println(err.Error())
  55. return
  56. }
  57. timer := time.NewTimer(time.Duration(global.Config.Gateway.ScanSecond) * time.Millisecond)
  58. select {
  59. case <-timer.C:
  60. messageMap := make(map[string]map[string]models.DeviceScanned)
  61. messageMap[constant.MessageTypeDeviceScanned] = deviceMap
  62. bytes, err := json.Marshal(messageMap)
  63. if err != nil {
  64. fmt.Printf("json异常:%s", err.Error())
  65. return
  66. }
  67. err = ws.WriteMessage(websocket.TextMessage, bytes)
  68. if err != nil {
  69. return
  70. }
  71. }
  72. }
  73. // SseOpenNotify 开启通知
  74. func SseOpenNotify() {
  75. var notifyUrl = global.Config.Gateway.BaseUrl + global.Config.Gateway.NotifyUrl
  76. ws, _, err := websocket.DefaultDialer.Dial(global.Config.Websocket.WSUrl, nil)
  77. if err != nil {
  78. fmt.Println("Websocket client init error" + err.Error())
  79. return
  80. }
  81. client := sse.NewClient(notifyUrl)
  82. err = client.SubscribeRaw(func(msg *sse.Event) {
  83. s := string(msg.Data)
  84. fmt.Println("notify receive data :" + s)
  85. flag := strings.HasPrefix(s, "E840") || strings.HasPrefix(s, "E841") || strings.HasPrefix(s, "E823")
  86. if !flag {
  87. //websocket 通知数据
  88. //msgMap := make(map[string]string)
  89. //msgMap[]
  90. err := ws.WriteMessage(websocket.TextMessage, msg.Data)
  91. if err != nil {
  92. fmt.Println(errmsg.SendMessageError + err.Error())
  93. return
  94. }
  95. }
  96. })
  97. if err != nil {
  98. return
  99. }
  100. }