package api import ( "confrontation-training/constant" errmsg "confrontation-training/err" "confrontation-training/global" "confrontation-training/models" "encoding/json" "fmt" "github.com/gorilla/websocket" "github.com/r3labs/sse/v2" "strings" "time" ) // SseScanDevice 扫描设备 func SseScanDevice(paramMap map[string]string) { var scanUrl = global.Config.Gateway.BaseUrl + global.Config.Gateway.ScanUrl ws, _, err := websocket.DefaultDialer.Dial(global.Config.Websocket.WSUrl, nil) if err != nil { fmt.Println("Websocket client init error" + err.Error()) return } deviceMap := make(map[string]models.DeviceScanned) if len(paramMap) > 0 { for key, value := range paramMap { scanUrl += "&" + key + "=" + value } } client := sse.NewClient(scanUrl) go func() { fmt.Println("开始SSE") err := client.SubscribeRaw(func(msg *sse.Event) { //fmt.Println(string(msg.Data)) var data models.DeviceScannedFromGateway err := json.Unmarshal(msg.Data, &data) if err != nil { fmt.Printf("SSE数据转换异常:%s", err.Error()) return } deviceScanned := models.DeviceScanned{} deviceScanned.Name = data.Name deviceScanned.Rssi = data.Rssi deviceScanned.MAC = data.Bdaddrs[0].Bdaddr deviceScanned.BdadrType = data.Bdaddrs[0].BdaddrType deviceScanned.Chip = data.ChipId deviceMap[deviceScanned.MAC] = deviceScanned fmt.Println(deviceScanned) }) if err != nil { fmt.Println(err.Error()) return } }() if err != nil { fmt.Println(err.Error()) return } timer := time.NewTimer(time.Duration(global.Config.Gateway.ScanSecond) * time.Millisecond) select { case <-timer.C: messageMap := make(map[string]map[string]models.DeviceScanned) messageMap[constant.MessageTypeDeviceScanned] = deviceMap bytes, err := json.Marshal(messageMap) if err != nil { fmt.Printf("json异常:%s", err.Error()) return } err = ws.WriteMessage(websocket.TextMessage, bytes) if err != nil { return } } } // SseOpenNotify 开启通知 func SseOpenNotify() { var notifyUrl = global.Config.Gateway.BaseUrl + global.Config.Gateway.NotifyUrl ws, _, err := websocket.DefaultDialer.Dial(global.Config.Websocket.WSUrl, nil) if err != nil { fmt.Println("Websocket client init error" + err.Error()) return } client := sse.NewClient(notifyUrl) err = client.SubscribeRaw(func(msg *sse.Event) { s := string(msg.Data) fmt.Println("notify receive data :" + s) flag := strings.HasPrefix(s, "E840") || strings.HasPrefix(s, "E841") || strings.HasPrefix(s, "E823") if !flag { //websocket 通知数据 //msgMap := make(map[string]string) //msgMap[] err := ws.WriteMessage(websocket.TextMessage, msg.Data) if err != nil { fmt.Println(errmsg.SendMessageError + err.Error()) return } } }) if err != nil { return } }