|
@@ -2,10 +2,12 @@ package initialize
|
|
|
|
|
|
import (
|
|
|
gateway2 "confrontation-training/api/gateway"
|
|
|
+ "confrontation-training/common"
|
|
|
"confrontation-training/constant"
|
|
|
"confrontation-training/global"
|
|
|
"confrontation-training/models/emq"
|
|
|
"confrontation-training/models/gateway"
|
|
|
+ "encoding/hex"
|
|
|
"encoding/json"
|
|
|
"fmt"
|
|
|
mqtt "github.com/eclipse/paho.mqtt.golang"
|
|
@@ -29,6 +31,7 @@ func CreateEmqClient() {
|
|
|
global.EmqConfig.Broker = config.EmqConfig.Broker
|
|
|
global.EmqConfig.Filter = config.EmqConfig.Filter
|
|
|
global.EmqConfig.GatewayMac = config.EmqConfig.GatewayMac
|
|
|
+ global.EmqConfig.FirstOpen = "0"
|
|
|
emqConfig := global.EmqConfig
|
|
|
connectAddress := fmt.Sprintf("%s://%s:%d", emqConfig.Protocol, emqConfig.Broker, emqConfig.Port)
|
|
|
fmt.Println("connect address:", connectAddress)
|
|
@@ -45,6 +48,19 @@ func CreateEmqClient() {
|
|
|
log.Fatal(token.Error())
|
|
|
}
|
|
|
SubScribe(client)
|
|
|
+ topic := "/" + global.Config.EmqConfig.GatewayMac + constant.TopicConnectSub
|
|
|
+ SendUUID(global.EmqClient, topic)
|
|
|
+
|
|
|
+ //添加过滤
|
|
|
+ fmt.Println("添加设备过滤:")
|
|
|
+ filterCmd := "[{\"cmd\":\"AT+FLT=\",\"total\":\"2\"}"
|
|
|
+ for _, filter := range global.EmqConfig.Filter {
|
|
|
+ filterCmd = filterCmd + ",{\"t\":\"0\",\"d\":\"" + filter + "\"}"
|
|
|
+ }
|
|
|
+ filterCmd = filterCmd + "]"
|
|
|
+ fmt.Println(filterCmd)
|
|
|
+ //filterCmd = "[{\"cmd\":\"AT+FLT=\",\"total\":\"2\"},{\"t\":\"0\",\"d\":\"MIND\"},{\"t\":\"0\",\"d\":\"BW-ECG\"}]"
|
|
|
+ Publish(client, topic, filterCmd)
|
|
|
//SendUUID(client, "/EE3870DA24C4/connect_packet/connect1_subscribe")
|
|
|
//Publish(client, "/EE3870DA24C4/connect_packet/connect1_subscribe", constant.CmdStartScan)
|
|
|
//SendUUID(client, "/EE3870DA24C4/connect_packet/connect1_subscribe")
|
|
@@ -78,7 +94,7 @@ func SendUUID(client mqtt.Client, topic string) {
|
|
|
time.Sleep(time.Millisecond * 100)
|
|
|
}
|
|
|
func ConnectDevice(client mqtt.Client, topic string, mac string, index string, ai string, at string) {
|
|
|
- message := "[{\"cmd\":\"AT+CNN=\",\"m\":\"" + mac + "\",\"i\":\"" + index + "\",\"ai\":\"" + ai + "\",\"at\":\"" + at + "\",\"l\":\"1\",\"x\":\"251\",\"relink\":\"1\",\"timeout\":\"12000\"}]"
|
|
|
+ message := "[{\"cmd\":\"AT+CNN=\",\"m\":\"" + mac + "\",\"i\":\"" + index + "\",\"ai\":\"" + ai + "\",\"at\":\"" + at + "\",\"l\":\"1\",\"x\":\"251\",\"relink\":\"0\",\"timeout\":\"12000\"}]"
|
|
|
if token := client.Publish(topic, byte(global.EmqConfig.Qos), false, message); token.Wait() && token.Error() != nil {
|
|
|
fmt.Printf("publish failed, topic: %s, payload: %s\n", topic, message)
|
|
|
} else {
|
|
@@ -106,7 +122,7 @@ func SubScribe(client mqtt.Client) {
|
|
|
for _, topic := range emqConfig.Topic {
|
|
|
topic = "/" + global.EmqConfig.GatewayMac + topic
|
|
|
client.Subscribe(topic, byte(emqConfig.Qos), func(client mqtt.Client, message mqtt.Message) {
|
|
|
- //fmt.Printf("`%s` Received `%s` from `%s` topic\n", common.NowTime("2006-01-02 15:04:05"), message.Payload(), message.Topic())
|
|
|
+ fmt.Printf("`%s` Received `%s` from `%s` topic\n", common.NowTime("2006-01-02 15:04:05"), message.Payload(), message.Topic())
|
|
|
messageMap := make(map[string]string)
|
|
|
var payloads []emq.Payload
|
|
|
err := json.Unmarshal(message.Payload(), &payloads)
|
|
@@ -147,14 +163,41 @@ func SubScribe(client mqtt.Client) {
|
|
|
case constant.PayloadSUUID:
|
|
|
messageMap["msgType"] = constant.MessageTypeSUUID
|
|
|
content = "设置UUID"
|
|
|
+ if payload.State == "SUCCESS" {
|
|
|
+ global.EmqConfig.FirstOpen = "1"
|
|
|
+ } else {
|
|
|
+ global.EmqConfig.FirstOpen = "0"
|
|
|
+ }
|
|
|
case constant.PayloadConnect:
|
|
|
messageMap["msgType"] = constant.MessageTypeConnect
|
|
|
- content = "设备连接"
|
|
|
+ //content = "设备连接"
|
|
|
+ realMac := transMac(payload.M)
|
|
|
+ deviceInfo := global.DeviceMap[realMac]
|
|
|
+ payload.T = deviceInfo.Type
|
|
|
+ marshal, _ := json.Marshal(payload)
|
|
|
+ content = string(marshal)
|
|
|
+ //连接成功或连接失败,发送已连接设备列表
|
|
|
+ for i := 0; i < 6; i++ {
|
|
|
+ topic := "/" + global.Config.EmqConfig.GatewayMac + constant.TopicConnectSub
|
|
|
+ gateway2.ConnectedListEmq(global.EmqClient, topic, strconv.Itoa(i))
|
|
|
+ }
|
|
|
case constant.PayloadDisConnect:
|
|
|
messageMap["msgType"] = constant.MessageTypeDisConnect
|
|
|
//content = "断开设备连接"
|
|
|
+ if payload.State == "SUCCESS" && payload.ReasonCode == "62" {
|
|
|
+ messageMap["msgType"] = constant.MessageTypeConnect
|
|
|
+ }
|
|
|
+ realMac := transMac(payload.M)
|
|
|
+ deviceInfo := global.DeviceMap[realMac]
|
|
|
+ payload.T = deviceInfo.Type
|
|
|
marshal, _ := json.Marshal(payload)
|
|
|
content = string(marshal)
|
|
|
+ //断开连接成功或连接失败,发送已连接设备列表
|
|
|
+ for i := 0; i < 6; i++ {
|
|
|
+ topic := "/" + global.Config.EmqConfig.GatewayMac + constant.TopicConnectSub
|
|
|
+ gateway2.ConnectedListEmq(global.EmqClient, topic, strconv.Itoa(i))
|
|
|
+ }
|
|
|
+
|
|
|
case constant.PayloadQuenue:
|
|
|
messageMap["msgType"] = constant.MessageTypeConnectList
|
|
|
if payload.M == "" {
|
|
@@ -178,6 +221,14 @@ func SubScribe(client mqtt.Client) {
|
|
|
topic := "/" + global.Config.EmqConfig.GatewayMac + constant.TopicConnectSub
|
|
|
gateway2.ConnectedListEmq(global.EmqClient, topic, strconv.Itoa(i))
|
|
|
}
|
|
|
+ case constant.PayloadWNP:
|
|
|
+ messageMap["msgType"] = constant.MessageTypeWNP
|
|
|
+ realMac := transMac(payload.M)
|
|
|
+ deviceInfo := global.DeviceMap[realMac]
|
|
|
+ payload.T = deviceInfo.Type
|
|
|
+ payload.N = deviceInfo.Name
|
|
|
+ marshal, _ := json.Marshal(payload)
|
|
|
+ content = string(marshal)
|
|
|
case constant.PayloadNotify: //接收到蓝牙通知数据
|
|
|
//1.判断是脑电数据还是心电数据
|
|
|
//1.1脑电数据直接转发
|
|
@@ -196,20 +247,20 @@ func SubScribe(client mqtt.Client) {
|
|
|
flag := strings.HasPrefix(receiveData.Value, "E840") || strings.HasPrefix(receiveData.Value, "E841") || strings.HasPrefix(receiveData.Value, "E823") || strings.HasPrefix(receiveData.Value, "E820") || strings.HasPrefix(receiveData.Value, "E81F") || strings.HasPrefix(receiveData.Value, "E813") || strings.HasPrefix(receiveData.Value, "E810") || strings.HasPrefix(receiveData.Value, "E822") || strings.HasPrefix(receiveData.Value, "E826") || strings.HasPrefix(receiveData.Value, "E8FF00000000")
|
|
|
if !flag {
|
|
|
//var ecgData []int
|
|
|
- ecgData := [12]int{}
|
|
|
- data := []byte(receiveData.Value[4:])
|
|
|
- if len(data) == 36 {
|
|
|
- for i := 0; i < 36; i += 3 {
|
|
|
- ecgData[i/3] = int(16<<data[i]&0xFF | 8<<data[i+1]&0xFF | data[i+2]&0xFF)
|
|
|
+ ecgData := [6]int{}
|
|
|
+ data := byteString2ByteArray(receiveData.Value[4:])
|
|
|
+ if len(data) == 18 {
|
|
|
+ for i := 0; i < 18; i += 3 {
|
|
|
+ ecgData[i/3] = data[i]<<16 | data[i+1]<<8 | data[i+2]
|
|
|
}
|
|
|
} else {
|
|
|
|
|
|
- for len(data) < 36 {
|
|
|
- for i := len(data); i < 36; i++ {
|
|
|
+ for len(data) < 18 {
|
|
|
+ for i := len(data); i < 18; i++ {
|
|
|
data = append(data, data[i])
|
|
|
}
|
|
|
}
|
|
|
- for i := 0; i < 36; i += 3 {
|
|
|
+ for i := 0; i < 18; i += 3 {
|
|
|
ecgData[i/3] = int(16<<data[i]&0xFF | 8<<data[i+1]&0xFF | data[i+2]&0xFF)
|
|
|
}
|
|
|
}
|
|
@@ -218,13 +269,14 @@ func SubScribe(client mqtt.Client) {
|
|
|
for _, datum := range ecgData {
|
|
|
receiveData.Value = receiveData.Value + strconv.Itoa(datum) + ","
|
|
|
}
|
|
|
+ receiveData.Value = strings.TrimRight(receiveData.Value, ",")
|
|
|
receiveData.Value = receiveData.Value + "]"
|
|
|
marshal, _ := json.Marshal(receiveData)
|
|
|
content = string(marshal)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- if messageMap["msgType"] != constant.MessageTypeECGData && messageMap["msgType"] != constant.MessageTypeEEGData && messageMap["msgType"] != constant.MessageTypeDeviceScanned && messageMap["msgType"] != constant.MessageTypeConnectList && messageMap["msgType"] != constant.MessageTypeDisConnect {
|
|
|
+ if messageMap["msgType"] != constant.MessageTypeECGData && messageMap["msgType"] != constant.MessageTypeEEGData && messageMap["msgType"] != constant.MessageTypeDeviceScanned && messageMap["msgType"] != constant.MessageTypeConnectList && messageMap["msgType"] != constant.MessageTypeDisConnect && messageMap["msgType"] != constant.MessageTypeConnect && messageMap["msgType"] != constant.MessageTypeWNP {
|
|
|
if payload.State == constant.Success {
|
|
|
content = content + "成功"
|
|
|
} else {
|
|
@@ -240,6 +292,13 @@ func SubScribe(client mqtt.Client) {
|
|
|
return
|
|
|
}
|
|
|
if sendFlag && content != "成功" && content != "失败" {
|
|
|
+ if messageMap["msgType"] == constant.MessageTypeECGData {
|
|
|
+
|
|
|
+ fmt.Printf("发送心电数据===" + common.NowTime("2006-01-02 15:04:05") + "=====" + string(bytes))
|
|
|
+ }
|
|
|
+ for k, _ := range messageMap {
|
|
|
+ delete(messageMap, k)
|
|
|
+ }
|
|
|
err = ws.WriteMessage(websocket.TextMessage, bytes)
|
|
|
if err != nil {
|
|
|
fmt.Println("消息发送异常:" + err.Error())
|
|
@@ -250,7 +309,22 @@ func SubScribe(client mqtt.Client) {
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
+func byteString2ByteArray(byteString string) []int {
|
|
|
+
|
|
|
+ //var byteArr [len(byteString)]byte
|
|
|
+ byteArr := make([]int, len(byteString)/2)
|
|
|
+ for i := 0; i < 18; i++ {
|
|
|
+ subStr := byteString[i*2 : i*2+2]
|
|
|
+
|
|
|
+ decodeString, err := hex.DecodeString(subStr)
|
|
|
+ if err != nil {
|
|
|
|
|
|
+ }
|
|
|
+ byteArr[i] = int(decodeString[0])
|
|
|
+ }
|
|
|
+ return byteArr
|
|
|
+
|
|
|
+}
|
|
|
func transMac(mac string) string {
|
|
|
result := ""
|
|
|
for i := 0; i < len(mac); i = i + 2 {
|