package gateway 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 deviceMap := make(map[string]models.DeviceScanned) if len(paramMap) > 0 { for key, value := range paramMap { scanUrl += "&" + key + "=" + value } } //events := make(chan *sse.Event) client := sse.NewClient(scanUrl) go func() { fmt.Println("开始SSE") //err := client.SubscribeChan("messages", events) //if err != nil { // return //} 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 } }() ticket := time.NewTicker(time.Duration(global.Config.Gateway.ScanSecond) * time.Millisecond) for range ticket.C { fmt.Println("当前时间:" + time.Now().Format("2006-01-02 15:04:05")) if len(deviceMap) > 0 { ws, _, err := websocket.DefaultDialer.Dial(global.Config.Websocket.WSUrl, nil) if err != nil { fmt.Println("Websocket client init error" + err.Error()) return } messageMap := make(map[string]string) messageMap["msgType"] = constant.MessageTypeDeviceScanned marshal, err := json.Marshal(deviceMap) if err != nil { fmt.Println("data parse Error :" + err.Error()) return } messageMap["data"] = string(marshal) bytes, err := json.Marshal(messageMap) if err != nil { fmt.Printf("json异常:%s", err.Error()) return } err = ws.WriteMessage(websocket.TextMessage, bytes) if err != nil { fmt.Println("消息发送异常:" + err.Error()) 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[] var receiveData models.DeviceDataReceived errJson := json.Unmarshal(msg.Data, &receiveData) if errJson != nil { fmt.Println("receive data parse error:" + errJson.Error()) //panic(err) return } messageMap := make(map[string]string) messageMap["msgType"] = constant.MessageTypeData messageMap["data"] = string(msg.Data) err := ws.WriteMessage(websocket.TextMessage, msg.Data) if err != nil { fmt.Println(errmsg.SendMessageError + err.Error()) return } } }) if err != nil { return } }