Jelajahi Sumber

add:新网关,双人对抗

zzf 11 bulan lalu
induk
melakukan
620e583032

+ 14 - 23
api/gateway/gateway.go

@@ -14,8 +14,8 @@ import (
 	"fmt"
 	"github.com/gin-gonic/gin"
 	"io/ioutil"
-	"strconv"
 	"strings"
+	"time"
 )
 
 // ScanDevice
@@ -327,23 +327,17 @@ func ScanDeviceEmq(c *gin.Context) {
 	fmt.Println("停止扫描")
 	fmt.Println(constant.CmdStopScan)
 	Publish(client, topic, constant.CmdStopScan)
-	//添加过滤
-	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)
+
 	//开启扫描
 	//Publish(client, "/EE3870DA24C4/connect_packet/connect1_subscribe", "[{\"cmd\":\"AT+SCAN=\",\"s\":\"1\"}]")
 	//停止扫描
 	//Publish(client, "/EE3870DA24C4/connect_packet/connect1_subscribe", "[{\"cmd\":\"AT+SCAN=\",\"s\":\"0\"}]")
 	//设置设备服务UUID
-	fmt.Println("设置设备服务UUID")
-	SendUUID(client, topic)
+	//fmt.Println("设置设备服务UUID")
+	if global.EmqConfig.FirstOpen == "0" {
+		SendUUID(client, topic)
+	}
+	time.Sleep(time.Millisecond * 100)
 	Publish(global.EmqClient, topic, constant.CmdStartScan)
 	response.Success("开启扫描完成", "", c)
 	return
@@ -418,7 +412,7 @@ func DisConnect(c *gin.Context) {
 
 // ConnectList
 // PingExample confrontation-training
-// @Summary 已连接列表
+// @Summary 已连接列表 已连接列表中不再做任何处理,在连接或断开连接 成功或失败时系统自动调用
 // @Schemes
 // @Description 已连接列表
 // @Tags 设备管理
@@ -427,12 +421,12 @@ func DisConnect(c *gin.Context) {
 // @Success 200 {string} string "ok"
 // @Router /v2/device/connected/list [get]
 func ConnectList(c *gin.Context) {
-	topic := "/" + global.Config.EmqConfig.GatewayMac + constant.TopicConnectSub
-	//ConnectedListEmq(global.EmqClient, topic)
-	//ConnectedNumber(global.EmqClient, topic)
-	for i := 0; i < 6; i++ {
-		ConnectedListEmq(global.EmqClient, topic, strconv.Itoa(i))
-	}
+	//topic := "/" + global.Config.EmqConfig.GatewayMac + constant.TopicConnectSub
+	////ConnectedListEmq(global.EmqClient, topic)
+	////ConnectedNumber(global.EmqClient, topic)
+	//for i := 0; i < 6; i++ {
+	//	ConnectedListEmq(global.EmqClient, topic, strconv.Itoa(i))
+	//}
 	response.Success("查询连接列表完成", "", c)
 	return
 }
@@ -521,6 +515,3 @@ func WriteDataEmq(c *gin.Context) {
 	response.Success(errors.WriteDataSuccess, nil, c)
 	return
 }
-func OpenNotifyEmq(c *gin.Context) {
-
-}

+ 1 - 1
api/gateway/gatewayEmp.go

@@ -42,7 +42,7 @@ func ReadUUID(client mqtt.Client, topic string) {
 }
 
 func ConnectDeviceEmq(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 {

+ 1 - 1
config/application.yaml

@@ -52,7 +52,7 @@ emq:
 #  - /EE3870DA24C4/connect_packet/connect4_subscribe
   - /connect_packet/connect1_publish
   userName: admin
-  password: Psychical_admin502
+  password: 28d75ca0e70eb0ef0b42ae7bb7843e82d6fdffa2509caa383dd46748bdbf8dd8
   clientId: emqClientCT
   qos: 0
   broker: emqx@127.0.0.1

+ 1 - 0
config/config.go

@@ -71,4 +71,5 @@ type EmqConfig struct {
 	Broker     string   `mapstructure:"broker"`
 	Filter     []string `mapstructure:"filter"`
 	GatewayMac string   `mapstructure:"gatewayMac"`
+	FirstOpen  string
 }

+ 2 - 0
constant/constant.go

@@ -32,6 +32,7 @@ const (
 	MessageTypeConnect       = "connect"
 	MessageTypeDisConnect    = "disConnect"
 	MessageTypeConnectList   = "connectedList"
+	MessageTypeWNP           = "wnp"
 	// DefaultKey 3des
 	DefaultKey      = "240262447423713749922240"
 	DefaultIv       = "12345678"
@@ -51,4 +52,5 @@ const (
 	PayloadQuenue     = "QUENUE"      //已连接设备
 	PayloadCNB        = "CNB"         //连接个数
 	PayloadNotify     = "NOTIFY"
+	PayloadWNP        = "WNP"
 )

TEMPAT SAMPAH
db/confrontation-training.db


+ 86 - 12
initialize/emq.go

@@ -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 {

+ 1 - 1
initialize/run.go

@@ -1,7 +1,7 @@
 package initialize
 
 func Run() {
-	SwagInit()
+	//SwagInit()
 	LoadConfig()
 	SQLite()
 	//StartSSe()

+ 1 - 1
main.go

@@ -7,7 +7,7 @@ import "confrontation-training/initialize"
 //@description 对抗训练
 //@contact.name Develoven
 //contact.email develoven@163.com
-//contact.url https://www.cnblogs.com/wormworm
+//contact.url https://www.cnblogs.com/wormwormq
 func main() {
 	initialize.Run()
 }

+ 17 - 16
models/emq/payload.go

@@ -17,22 +17,23 @@ type ScanDevice struct {
 	N       string `json:"n"`
 }
 type Payload struct {
-	State   string `json:"state"`   //状态
-	Cmd     string `json:"cmd"`     //指令
-	L       string `json:"l"`       //网关MAC
-	S       string `json:"s"`       //扫描|停止扫描
-	A       string `json:"a"`       //设置服务UUID
-	M       string `json:"m"`       //被链接设备的MAC
-	U       string `json:"u"`       //被链接设备的特征值UUID
-	D       string `json:"d"`       //数据
-	Ai      int    `json:"ai"`      //终端BLE设备的地址ID
-	At      int    `json:"at"`      //终端BLE设备的地址类型
-	Rssi    int    `json:"rssi"`    //信号强度
-	Channel int    `json:"channel"` //信道
-	Pkg     int    `json:"pkg"`     //0表示广播包,1表示扫描回应包
-	F       string `json:"f"`
-	N       string `json:"n"`
-	T       string `json:"t"` //0脑电1心电
+	State      string `json:"state"`   //状态
+	Cmd        string `json:"cmd"`     //指令
+	L          string `json:"l"`       //网关MAC
+	S          string `json:"s"`       //扫描|停止扫描
+	A          string `json:"a"`       //设置服务UUID
+	M          string `json:"m"`       //被链接设备的MAC
+	U          string `json:"u"`       //被链接设备的特征值UUID
+	D          string `json:"d"`       //数据
+	Ai         int    `json:"ai"`      //终端BLE设备的地址ID
+	At         int    `json:"at"`      //终端BLE设备的地址类型
+	Rssi       int    `json:"rssi"`    //信号强度
+	Channel    int    `json:"channel"` //信道
+	Pkg        int    `json:"pkg"`     //0表示广播包,1表示扫描回应包
+	F          string `json:"f"`
+	N          string `json:"n"`
+	T          string `json:"t"` //0脑电1心电
+	ReasonCode string `json:"reason_code"`
 }
 
 type ReceiveData struct {