Parcourir la source

后台远程配置lora,单波,已经测试通过、

xuxinyi il y a 2 mois
Parent
commit
3689c81ad3
4 fichiers modifiés avec 145 ajouts et 25 suppressions
  1. 14 4
      Core/Inc/E52.h
  2. 64 5
      Core/Src/E52.c
  3. 54 15
      Core/Src/main.c
  4. 13 1
      README.md

+ 14 - 4
Core/Inc/E52.h

@@ -51,8 +51,9 @@ typedef enum {
 } REQUEST_BLUETOOTH_DATA_STEP;
 
 typedef enum {
-    CONFIGURE_E52_STEP1 = 0x01 << 4,  //还没想好
-    CONFIGURE_E52_STEP2 = 0x02 << 4   // 还没想好
+    CONFIGURE_E52_SET_BROADCAST_TYPE= 0x02 << 4,  //设置广播类型
+    CONFIGURE_E52_SET_LORA_ADDRESS= 0x03 << 4,    //设置目标地址
+    CONFIGURE_E52_CONNECT_TEST= 0x04 << 4         //测试通讯
 } CONFIGURE_E52_STEP;
 
 typedef enum {
@@ -89,6 +90,12 @@ typedef enum {
     BL_STOP
 } BLSTATUS;
 
+typedef enum {
+    BROADCAST_SINGLE = 0x01,    //单播
+    BROADCAST_MULTI,            //多播
+    BROADCAST_ALL               //广播
+}BROADCAST;
+
 // 设备信息结构体
 typedef struct __attribute__((packed)){
     uint8_t isOnline;            // 设备是否就绪
@@ -149,7 +156,7 @@ typedef struct __attribute__((packed)){
     uint8_t frame_tail_H;    // 帧尾高字节
     uint8_t frame_tail_L;    // 帧尾低字节
 } SendBlData_structure;
-void E52_Send_Bl_Data_Fun(uint8_t);
+void E52_Send_Bl_Data_Fun(uint8_t,uint8_t);
 
 
 // 发送SOS结构体
@@ -171,8 +178,11 @@ void E52_Send_SOS_Fun(void);
 
 
 
-
 void E52_Analyze_Data(void);
 void E52_Heartbeat_Fun(void);
 
+
+void E52_CONFIG_BROADCAST_TYPE_FUN(uint8_t);
+void E104_BT5005A_DST_ADDR_Fun(void);
+
 #endif //E52_H

+ 64 - 5
Core/Src/E52.c

@@ -5,6 +5,42 @@
 #include "../Inc/E52.h"
 
 Device_structure deviceInfo;
+
+
+//AT COMMAND
+/**
+ *配置lora发送方式
+ *
+ */
+
+void E52_CONFIG_BROADCAST_TYPE_FUN(uint8_t type) {
+    static const char *options[] = {
+        [BROADCAST_ALL] = "AT+OPTION=3,0",
+        [BROADCAST_MULTI] = "AT+OPTION=2,0",
+        [BROADCAST_SINGLE] = "AT+OPTION=1,0",
+    };
+
+    if (type < BROADCAST_SINGLE || type > BROADCAST_ALL || options[type] == NULL) {
+        return; // 参数非法
+    }
+
+    HAL_UART_Transmit(&huart2, (uint8_t *) options[type], strlen(options[type]), HAL_MAX_DELAY);
+}
+
+/*
+ *
+ * 配置单波与多播地址
+ */
+void E104_BT5005A_DST_ADDR_Fun(void) {
+    // 假设 target_addr_H 和 target_addr_L 是 uint8_t
+    uint16_t addr = ((uint16_t)deviceInfo.target_addr_H << 8) | deviceInfo.target_addr_L;
+
+    char lora_msg4[32];
+    sprintf(lora_msg4, "AT+DST_ADDR=%u,0", addr);   // 拼接十进制字符串
+
+    HAL_UART_Transmit(&huart2, (uint8_t *)lora_msg4, strlen(lora_msg4), HAL_MAX_DELAY);
+}
+
 /**
  *
  *设备向后台发生数据
@@ -31,7 +67,7 @@ void E52_Heartbeat_Fun() {
     // TODO: command:01
 }
 
-void E52_Send_Bl_Data_Fun(uint8_t i) {
+void E52_Send_Bl_Data_Fun(uint8_t i, uint8_t finishData) {
     printf("这是发送蓝牙数据\r\n");
     SendBlData_structure sendBlData_structure;
     sendBlData_structure.frame_header_H = 0x55;
@@ -40,7 +76,7 @@ void E52_Send_Bl_Data_Fun(uint8_t i) {
     sendBlData_structure.badge_addr_high = deviceInfo.loraDeviceAddress_H;
     sendBlData_structure.badge_addr_low = deviceInfo.loraDeviceAddress_L;
     memcpy(sendBlData_structure.bl_data, totalData[i], 8);
-    sendBlData_structure.finish_send = 0x01;
+    sendBlData_structure.finish_send = finishData;
     sendBlData_structure.frame_tail_H = 0xFF;
     sendBlData_structure.frame_tail_L = 0xEE;
     // printf("blData size = %d\n", sizeof(sendBlData_structure));
@@ -90,6 +126,29 @@ void E52_Request_Command_Fun() {
 
 void E52_Configuration_Fun() {
     printf("这是配置lora发送方式的命令\r\n");
+
+    deviceInfo.target_addr_H = rx_buf_uart2[6];
+    deviceInfo.target_addr_L = rx_buf_uart2[7];
+    switch (rx_buf_uart2[5]) {
+        case BROADCAST_ALL:
+            deviceInfo.broadcast_type = BROADCAST_ALL;
+        break;
+
+        case BROADCAST_MULTI:
+            deviceInfo.broadcast_type = BROADCAST_MULTI;
+        break;
+
+        case BROADCAST_SINGLE:
+            deviceInfo.broadcast_type = BROADCAST_SINGLE;
+        break;
+
+        default:
+            printf("无效的广播类型,请重新输入\r\n");
+            deviceInfo.target_addr_H = 0xFF;
+            deviceInfo.target_addr_L = 0xFF;
+            deviceInfo.broadcast_type = BROADCAST_ALL;
+        break;
+    }
     // TODO: command:07
 }
 
@@ -125,20 +184,20 @@ void E52_Analyze_Data() {
         // 根据接收到的第三个字节(命令字节)进行分支处理
         switch (rx_buf_uart2[2]) {
             case REQUEST_BLUETOOTH_DATA:
-                deviceInfo.commandFromCloud = COMBINE_CMD_STEP(REQUEST_BLUETOOTH_DATA, REQUEST_BLUETOOTH_DATA_SCAN);
                 E52_Request_Command_Fun();
+                deviceInfo.commandFromCloud = COMBINE_CMD_STEP(REQUEST_BLUETOOTH_DATA, REQUEST_BLUETOOTH_DATA_SCAN);
                 break;
             case CONFIGURE_E52:
-                // deviceInfo.commandFromCloud = COMBINE_CMD_STEP(CONFIGURE_E52, STEP_EXECUTE);
                 E52_Configuration_Fun();
+                deviceInfo.commandFromCloud = COMBINE_CMD_STEP(CONFIGURE_E52, CONFIGURE_E52_SET_BROADCAST_TYPE);
                 break;
             case E52_ENTER_SLEEP:
                 // deviceInfo.commandFromCloud = COMBINE_CMD_STEP(E52_ENTER_SLEEP, STEP_EXECUTE);
                 E52_Send_Sleep_Fun();
                 break;
             case E52_HEARTBEAT:
-                deviceInfo.commandFromCloud = COMBINE_CMD_STEP(E52_HEARTBEAT, HEARTBEAT_SEND);
                 E52_Heartbeat_Fun1();
+                deviceInfo.commandFromCloud = COMBINE_CMD_STEP(E52_HEARTBEAT, HEARTBEAT_SEND);
                 break;
             case IS_ONLINE:
                 deviceInfo.isOnline = TRUE;

+ 54 - 15
Core/Src/main.c

@@ -116,9 +116,9 @@ void EnterSleepMode(void)
 
 void Device_Info_Init_Fun() {
   deviceInfo.isOnline = FALSE;
-  deviceInfo.broadcast_type = 0x02;
-  deviceInfo.loraDeviceAddress_H = 0x00;
-  deviceInfo.loraDeviceAddress_L = 0x00;
+  deviceInfo.broadcast_type = BROADCAST_ALL;
+  deviceInfo.loraDeviceAddress_H = 0xFE; //默认地址高位
+  deviceInfo.loraDeviceAddress_L = 0xEF; //默认地址低位
   deviceInfo.powerValue = 0;
   deviceInfo.target_addr_H = 0xFF;
   deviceInfo.target_addr_L = 0xFF;
@@ -242,8 +242,7 @@ int main(void)
   HAL_Delay(2000);
   Device_Info_Init_Fun();
   printf("开启Lora广播模块\r\n");
-  const char *lora_msg = "AT+OPTION=3,0";
-  HAL_UART_Transmit(&huart2, (uint8_t *)lora_msg, strlen(lora_msg), HAL_MAX_DELAY);
+  E52_CONFIG_BROADCAST_TYPE_FUN(BROADCAST_ALL);
   HAL_Delay(2000);
   const char *lora_msg1 = "AT+TYPE=1";
   HAL_UART_Transmit(&huart2, (uint8_t *)lora_msg1, strlen(lora_msg1), HAL_MAX_DELAY);
@@ -275,7 +274,16 @@ int main(void)
       E52_Analyze_Data();
     }
 
-    // 检查是否接收到"请求蓝牙数据"命令,且定时器处于就绪状态
+    // 检查是否接收到"心跳"命令,且设备在线
+    if (!deviceInfo.isOnline){
+      printf("The device is not online.\r\n");
+      if (!deviceInfo.loraSendSuccessFlag) {
+        E52_Heartbeat_Fun();
+      }
+      HAL_Delay(3000);
+    }
+
+    // 03:请求蓝牙数据
     if (GET_CMD( deviceInfo.commandFromCloud)  == REQUEST_BLUETOOTH_DATA && deviceInfo.isOnline) {
 
       switch (GET_STEP(deviceInfo.commandFromCloud)) {
@@ -289,17 +297,19 @@ int main(void)
           Timer_Managment_Fun(&htim4, TIMER_OP_STOP);
           deviceInfo.BlDataFlag = BL_STOP;
           i = 0;
-          while (receiveBlDataCount >= i) {
+          while (receiveBlDataCount > i) {
 
             printf("发送第%d个蓝牙数据给Lora\r\n", i);
             if (deviceInfo.loraSendSuccessFlag == 0) {
-              E52_Send_Bl_Data_Fun(i);
+              E52_Send_Bl_Data_Fun(i,0x00);
             }else {
               continue;
             }
             memset(totalData[i], 0, sizeof(totalData[i]));
             i++;
           }
+
+          E52_Send_Bl_Data_Fun(i,0x01);
           deviceInfo.commandFromCloud = COMBINE_CMD_STEP(REQUEST_BLUETOOTH_DATA, STEP_COMPLETE);
           printf("停止蓝牙扫描,开始发送蓝牙数据给Lora\r\n");
           break;          //发送数据阶段
@@ -319,6 +329,7 @@ int main(void)
       }
     }
 
+    // 08:请求心跳数据
     if (GET_CMD( deviceInfo.commandFromCloud)  == E52_HEARTBEAT && deviceInfo.isOnline) {
       switch (GET_STEP(deviceInfo.commandFromCloud)) {
         case HEARTBEAT_SEND:
@@ -339,14 +350,42 @@ int main(void)
           break;
       }
     }
-    // 检查是否接收到"心跳"命令,且设备在线
-    if (!deviceInfo.isOnline){
-        printf("The device is not online.\r\n");
-        if (!deviceInfo.loraSendSuccessFlag) {
-          E52_Heartbeat_Fun();
-        }
-        HAL_Delay(3000);
+
+    // 07:配置E52
+    if (GET_CMD( deviceInfo.commandFromCloud)  == CONFIGURE_E52 && deviceInfo.isOnline) {
+      switch (GET_STEP(deviceInfo.commandFromCloud)) {
+          case CONFIGURE_E52_SET_BROADCAST_TYPE:      //第一步,配置广播类型
+              E52_CONFIG_BROADCAST_TYPE_FUN(deviceInfo.broadcast_type);
+              HAL_Delay(2000);
+              if (deviceInfo.broadcast_type == BROADCAST_ALL) {
+                deviceInfo.commandFromCloud = COMBINE_CMD_STEP(CONFIGURE_E52, STEP_COMPLETE);       //TODO 广播,直接结束.或者进入测试流程。
+              }else {
+                deviceInfo.commandFromCloud = COMBINE_CMD_STEP(CONFIGURE_E52, CONFIGURE_E52_SET_LORA_ADDRESS); //第三步,配置Lora地址
+              }
+          break;
+
+          case CONFIGURE_E52_SET_LORA_ADDRESS:
+              E104_BT5005A_DST_ADDR_Fun();
+              HAL_Delay(2000);
+              deviceInfo.commandFromCloud = COMBINE_CMD_STEP(CONFIGURE_E52, STEP_COMPLETE);       //TODO 广播,直接结束.或者进入测试流程。
+          break;        //如果是单波,多播,配置目标地址
+
+          case STEP_COMPLETE:
+            if (deviceInfo.loraSendSuccessFlag == 0) {
+              E52_Heartbeat_Fun();
+            }else {
+              continue;
+            }
+            deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
+          break;
+
+          default:
+            printf("未知配置命令\r\n");
+            deviceInfo.commandFromCloud = COMBINE_CMD_STEP(IDLE, STEP_INIT);
+          ;break;
+      }
     }
+
   }
   /* USER CODE END 3 */
 }

+ 13 - 1
README.md

@@ -11,4 +11,16 @@
 
 
 1.2、请求蓝牙:55 BB 03 E1 16 00 C8  注释:请求蓝牙数据。搜索蓝牙时间 00 C8 。两个16进制数表示毫秒。
-返回:55 AA 02 E1 16 25 AD 0B 1D 60 C8 F0 A9 01 FF EE   注释:
+返回:55 AA 02 E1 16 25 AD 0B 1D 60 C8 F0 A9 01 FF EE   注释:
+
+
+
+目前测试后台地址是:3460
+
+55 BB 0A FC A5 01 C8  :停止上线通知
+
+55 BB 08 FC A5 01 C8  :请求上报点卯信息
+
+55 BB 03 FC A5 01 C8  :请求蓝牙数据
+
+55 BB 07 FC A5 03 34 60 FF EE :配置lora