zack 1 year ago
parent
commit
a94c97b414
13 changed files with 459 additions and 596 deletions
  1. 47 67
      Core/Inc/ConfigMacros.h
  2. 13 4
      Core/Inc/mba32a.h
  3. 3 0
      Core/Inc/ml307a.h
  4. 1 0
      Core/Inc/oledfont.h
  5. 1 1
      Core/Inc/tt808.h
  6. 51 11
      Core/Src/freertos.c
  7. 99 60
      Core/Src/interface.c
  8. 22 3
      Core/Src/key.c
  9. 9 74
      Core/Src/main.c
  10. 51 231
      Core/Src/mba32a.c
  11. 55 4
      Core/Src/ml307a.c
  12. 105 89
      Core/Src/tt808.c
  13. 2 52
      MDK-ARM/dtu.uvoptx

+ 47 - 67
Core/Inc/ConfigMacros.h

@@ -15,7 +15,7 @@
 #define openBT			1	
 #define openUpload		1	
 #define updateMenu		1	
-#define debugkeyinfo	0
+#define debugkeyinfo	1
 #define open16			11	//开字
 #define open16			11	//开字
 #define close16			12	//关字
@@ -32,10 +32,7 @@
 #define Sn3InfoAddr					((uint32_t)0x80502F0)  
 #define Sn4InfoAddr					((uint32_t)0x80503F0)  
 
-#define serialNum1Addr				((uint32_t)0x8050400)  
-#define serialNum2Addr				((uint32_t)0x8050500)  
-#define serialNum3Addr				((uint32_t)0x8050600)  
-#define serialNum4Addr				((uint32_t)0x8050700)  
+#define serialNumAddr				((uint32_t)0x8050400)  
 
 
 #define resetDevAddr				((uint32_t)0x8050800)  
@@ -56,6 +53,7 @@
 #define EveDbBodyStart	((uint32_t)0x8070800)  
 
 
+#define NUM_OF_DEVICES 8
 
 
 //*tt808
@@ -67,15 +65,32 @@
 
 //#define JLPTIP		"118.31.22.26"//徐工平台
 //#define JLPTPORT	8901
+#define PCMQTTADDR			 "121.199.29.128"
+#define PCMQTTPORT			 7883
+#define PCMQTTUSER			 "mqtt"
+#define PCMQTTPSWD			 "vNCT8uiRiFQxZULyyO7g"
 
 
+//*订阅b
+#define PCMQTTTOPIC_PREFIX 	 "dtu_bl01/"
+#define PCMQTTTOPIC_SUFFIXA 	 "/iowork/a"
+#define PCMQTTTOPIC_SUFFIXB 	 "/iowork/b"
+
+
+#define QOS					1
+#define RETAIN				0
+#define DUP 				0
+
 
 
 #define MessageID_authentication	0x0102 //鉴权
 #define MessageID_heartbeat			0x0002 //心跳
 #define MessageID_location			0x0200 //地址
 #define MessageID_Retrans			0x0704 //地址补传
-#define MessageID_Getauth			0x0223 //地址补传
+#define MessageID_Getauth			0x0223 //权限获取
+#define MessageID_uploadLock		0x0222 //上传锁信息
+
+
 #define TCPJMFSRSA  0x001
 #define TCPJMFSNULL 0x000
 
@@ -263,77 +278,46 @@ do { \
 		} \
 		refresh=true; \
     } while(0)	
+	
+	
+typedef enum {
+	null = 0,
+	ShorteningAlarm = 1,//剪断报警
+	BtUnlocking = 2,	//手机蓝牙开锁
+	PswdUnlocking = 3,	//密码开锁
+	MobilePhoneLock=4,	//手机关锁
+	SetDynamicCode=5,	//设置动态码成功
+	LockSuccessClosed=6,//关锁成功
+	LockNotClosed =7
+	
+} nowStatus;
 typedef struct
 {
 	uint16_t macCount;
 	uint16_t macWorked;
-	char MACtemp1[13];
-	char MACtemp2[13];
-	char MACtemp3[13];
-	char MACtemp4[13];
-	char MACtemp5[13];
-	char MACtemp6[13];
-	char MACtemp7[13];
-	char MACtemp8[13];
+	uint16_t macWorkedfail;
 	
+	uint16_t openLockCount;
+	uint16_t closeLockCount;
 	
-	uint8_t mactemp1[6];
-	uint8_t mactemp2[6];
-	uint8_t mactemp3[6];
-	uint8_t mactemp4[6];
-	uint8_t mactemp5[6];
-	uint8_t mactemp6[6];
-	uint8_t mactemp7[6];
-	uint8_t mactemp8[6];
+	nowStatus sta;
+	char MACtemp[NUM_OF_DEVICES][13];
+	uint8_t mactemp[NUM_OF_DEVICES][6];
 	//MAC
-	uint16_t mac1[3];
-	uint16_t mac2[3];
-	uint16_t mac3[3];
-	uint16_t mac4[3];
-	uint16_t mac5[3];
-	uint16_t mac6[3];
-	uint16_t mac7[3];
-	uint16_t mac8[3];
-	
+	uint16_t mac[NUM_OF_DEVICES][3];
+	bool Btconn[NUM_OF_DEVICES];
+	bool worked[NUM_OF_DEVICES];
 	//AT连接字符串
-	char SN1CONN[30];
-	char SN1ED[30];
-	char SN1DIS[30];
-	char SN2CONN[30];
-	char SN2ED[30];
-	char SN2DIS[30];
-	char SN3CONN[30];
-	char SN3ED[30];
-	char SN3DIS[30];
-	char SN4CONN[30];
-	char SN4ED[30];
-	char SN4DIS[30];
-	char SN5CONN[30];
-	char SN5ED[30];
-	char SN5DIS[30];
-	char SN6CONN[30];
-	char SN6ED[30];
-	char SN6DIS[30];
-	char SN7CONN[30];
-	char SN7ED[30];
-	char SN7DIS[30];
-	char SN8CONN[30];
-	char SN8ED[30];
-	char SN8DIS[30];
+	char SNCONN[NUM_OF_DEVICES][30];
+	char SNED[NUM_OF_DEVICES][30];
+	char SNDIS[NUM_OF_DEVICES][30];
 	
 
 } MacSet;
 typedef struct
 {
 	//四位数字(施解封显示)
-	char SN1name[13];
-	char SN2name[13];
-	char SN3name[13];
-	char SN4name[13];
-	char SN5name[13];
-	char SN6name[13];
-	char SN7name[13];
-	char SN8name[13];
+	char SNname[NUM_OF_DEVICES][13];
 	//Status
 	uint8_t L1status;
 	uint8_t L2status;
@@ -378,10 +362,6 @@ struct keys
 typedef struct
 {
     uint32_t serialNum;	//4字节流水号
-    uint32_t serialNum1;	//4字节流水号
-    uint32_t serialNum2;	//4字节流水号
-    uint32_t serialNum3;	//4字节流水号
-    uint32_t serialNum4;	//4字节流水号
 	uint32_t userId;	//4字节userid
 	uint8_t	 Autoseal;	//1字节自动施封
 	

+ 13 - 4
Core/Inc/mba32a.h

@@ -20,10 +20,19 @@ void OpenCloseLock(void);
 void event_lock(void);
 void open_close_lock(void);
 
-
-
-
-
+extern bool L0worked;
+extern bool L1worked;
+extern bool L2worked;
+extern bool L3worked;
+extern bool L4worked;
+extern bool L5worked;
+extern bool L6worked;
+extern bool L7worked;
+
+
+extern int workedLock; 		// 用于跟踪已连接的设备的数量
+extern int devices[8]; 	 	// 数组用于跟踪设备的工作状态
+extern bool openOrClose ;
 
 extern bool ConnOk;
 #endif /*__MBA32A_H*/

+ 3 - 0
Core/Inc/ml307a.h

@@ -26,5 +26,8 @@ void ML307AReset(void);
 void TcpConn(char *value, uint8_t cid, char *IPaddr, uint16_t port, uint8_t tcpConnmode);
 extern bool resetBTmodule;
 extern uint16_t phonenum[3];
+uint8_t MQTT_PUB(uint8_t connect_id, char *topic, char *mesg, char* pRes);
+extern char topica[50];
+extern char topicb[50];
 #endif /*__ML307A_H*/
 

+ 1 - 0
Core/Inc/oledfont.h

@@ -550,6 +550,7 @@ const unsigned char Hzk5[][24]={	//12*12
 {0x94,0xF3,0x92,0x00,0xF2,0x14,0x10,0xDF,0x10,0x14,0xF2,0x00,0x00,0x0F,0x04,0x08,0x09,0x04,0x02,0x01,0x02,0x04,0x09,0x00},/*"坶",29*/
 {0x88,0x88,0xFF,0x48,0x70,0x57,0x75,0x85,0x75,0x57,0x70,0x00,0x00,0x08,0x0F,0x00,0x09,0x05,0x03,0x0F,0x03,0x05,0x09,0x00},/*"紱",30*/
 {0x20,0x10,0xFC,0x03,0x08,0x07,0xFC,0x24,0x24,0x24,0x04,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x0F,0x01,0x01,0x01,0x01,0x00},/*"釬",31*/
+{0x48,0x2A,0x98,0x7F,0x28,0x4A,0x10,0xEF,0x08,0xF8,0x08,0x00,0x09,0x0B,0x05,0x05,0x0B,0x00,0x08,0x05,0x02,0x05,0x08,0x00},/*"杅",32*/
 	
 
 	

+ 1 - 1
Core/Inc/tt808.h

@@ -42,7 +42,7 @@ uint16_t swapBytes16(uint16_t value);
 uint32_t swapBytes32(uint32_t value);
 void REPdaMode(void);
 
-
+void processPdadata(char MACtemp[], uint8_t mactemp[],uint16_t mac[]);
 extern bool reAuth;
 #endif /*__TT808_H*/
 

+ 51 - 11
Core/Src/freertos.c

@@ -165,22 +165,53 @@ void StartScanKeyTask(void const * argument)
 	  
 	ReBTcall();//蓝牙回应
 	  
-   if(BT_Rebuffer[2]==0x02)//开锁回复
+   if(BT_Rebuffer[2]==0x02 || BT_Rebuffer[2]==0x03)//开锁回复
    {
 	   if(BT_Rebuffer[4]==0x01)
 	   {
 		   printf("\r\n***接收完成\r\n");
-		   macsetptr->macWorked+=1;
+		   macsetptr->macWorked+=1;//个数
+		   macsetptr->worked[workedLock]=1;	
+		   devices[workedLock]=1;
+		   workedLock+=1;
+		   
+		   if(BT_Rebuffer[2]==0x02)
+		   {
+			 macsetptr->sta=BtUnlocking;//蓝牙开锁
+		   }
+		   else if(BT_Rebuffer[2]==0x03)
+		   {
+			 macsetptr->sta=LockSuccessClosed;//关锁成功
+		   }
+		   
+			for(int i = 0; i < NUM_OF_DEVICES; i++) {
+				if(macsetptr->worked[i]) {
+					macsetptr->worked[i] = false;//置0
+					tt808FsFunc(macsetptr->mactemp[i], 6, MessageID_uploadLock);
+				}
+				else
+				{
+					printf("%d锁未操作\r\n",i+1);
+				}
+			}
+			   
 	   }
 	   else if(BT_Rebuffer[4]==0x02)
 	   {
 		   printf("\r\n***流水号异常\r\n");
+		   
+		   macsetptr->macWorkedfail+=1;
 		   //USART_SendString(&huart5, "AT+DISCONN=0\r\n");//断开连接
 	   }
-	   btframe.serialNum+=1;
 	   memset(BT_Rebuffer,0,20);
    }
-	 
+   
+   if((macsetptr->macWorked == macsetptr->macCount) && menu.current==3)
+   {
+	   menu.current=5;
+	   refresh=true;
+   }
+
   }
   /* USER CODE END StartScanKeyTask */
 }
@@ -234,20 +265,27 @@ void StartTestTask(void const * argument)
 	{
 		Allopen=false;
 		uint8_t macset[]={macsetptr->macCount&0xff};
-		tt808FsFunc(macset, 1, MessageID_Getauth);
-		//*test
-		//reAuth=true;
+		tt808FsFunc(macset, 1, MessageID_Getauth);//全部打开获取权限
 	}		
    if(reAuth)
-   {
+   {//权限回复正确
 	  HAL_Delay(500);
 	  reAuth = false;
-	  SET_MENU_STATUS(3,0,0,4);
+	   if(menu.enter==0)//开锁
+	   {
+		    openOrClose = menu.enter;
+		    SET_MENU_STATUS(3,1,0,4);
+	   }
+	   if(menu.enter==1)//开锁
+	   {
+		    openOrClose = menu.enter;
+		    SET_MENU_STATUS(3,0,1,4);
+	   }	 
    }
    
    if(menu.current==3 && menu.enter==4)
    {
-	  uint8_t lockCount = macsetptr->macCount;//共操作锁数
+	  //uint8_t lockCount = macsetptr->macCount;//共操作锁数
 	 //printf("共操作锁数%d\r\n",lockCount);
 	  open_close_lock();
    }
@@ -288,7 +326,6 @@ void StartloginfoTaskTask(void const * argument)
 	
 	//PushpullWork();
 	
-	
 	//*30s上传信息
 	nomalCount+=1;
 	if(nomalCount==3)
@@ -297,6 +334,9 @@ void StartloginfoTaskTask(void const * argument)
 		if(uploaweork)
 		{
 			//tt808FsFunc((uint8_t*)&(dblocptr->location.alarmFlagH), 34, MessageID_location);
+			
+			//*向主题a发布(保活心跳30s)
+			MQTT_PUB(0,topica,"1234","+MQTTURC: \"puback\"");
 		}
 	}
 #if timingPush ==1

+ 99 - 60
Core/Src/interface.c

@@ -71,6 +71,11 @@ void Jump_interface(void)
 			MACbindDisplay();
 			break;
 		}
+		case 5:
+		{
+			SecondMain();
+			break;
+		}
 	}
 
 	
@@ -81,37 +86,37 @@ void MACbindDisplay(void)
 {
 	if(menu.down<4)
 	{
-		OLED_ShowString(5,0,(unsigned char*)lockinfo.SN1name,16,1);
-		OLED_ShowString(5,15,(unsigned char*)lockinfo.SN2name,16,1);
-		OLED_ShowString(5,30,(unsigned char*)lockinfo.SN3name,16,1);
-		OLED_ShowString(5,45,(unsigned char*)lockinfo.SN4name,16,1);
+		OLED_ShowString(5,0,(unsigned char*)lockinfo.SNname[0],16,1);
+		OLED_ShowString(5,15,(unsigned char*)lockinfo.SNname[1],16,1);
+		OLED_ShowString(5,30,(unsigned char*)lockinfo.SNname[2],16,1);
+		OLED_ShowString(5,45,(unsigned char*)lockinfo.SNname[3],16,1);
 		
 		if(menu.down==0)
-			OLED_ShowString(5,0,(unsigned char*)lockinfo.SN1name,16,0);
+			OLED_ShowString(5,0,(unsigned char*)lockinfo.SNname[0],16,0);
 		if(menu.down==1)
-			OLED_ShowString(5,15,(unsigned char*)lockinfo.SN2name,16,0);
+			OLED_ShowString(5,15,(unsigned char*)lockinfo.SNname[1],16,0);
 		if(menu.down==2)
-			OLED_ShowString(5,30,(unsigned char*)lockinfo.SN3name,16,0);
+			OLED_ShowString(5,30,(unsigned char*)lockinfo.SNname[2],16,0);
 		if(menu.down==3)
-			OLED_ShowString(5,45,(unsigned char*)lockinfo.SN4name,16,0);
+			OLED_ShowString(5,45,(unsigned char*)lockinfo.SNname[3],16,0);
 		
 		OLED_ShowString(110,45,(unsigned char*)"1/2",12,1);
 	}
 	else
 	{
-		OLED_ShowString(5,0,(unsigned char*)lockinfo.SN5name,16,1);
-		OLED_ShowString(5,15,(unsigned char*)lockinfo.SN6name,16,1);
-		OLED_ShowString(5,30,(unsigned char*)lockinfo.SN7name,16,1);
-		OLED_ShowString(5,45,(unsigned char*)lockinfo.SN8name,16,1);
+		OLED_ShowString(5,0,(unsigned char*)lockinfo.SNname[4],16,1);
+		OLED_ShowString(5,15,(unsigned char*)lockinfo.SNname[5],16,1);
+		OLED_ShowString(5,30,(unsigned char*)lockinfo.SNname[6],16,1);
+		OLED_ShowString(5,45,(unsigned char*)lockinfo.SNname[7],16,1);
 		
 		if(menu.down==4)
-			OLED_ShowString(5,0,(unsigned char*)lockinfo.SN5name,16,0);
+			OLED_ShowString(5,0,(unsigned char*)lockinfo.SNname[4],16,0);
 		if(menu.down==5)
-			OLED_ShowString(5,15,(unsigned char*)lockinfo.SN6name,16,0);
+			OLED_ShowString(5,15,(unsigned char*)lockinfo.SNname[5],16,0);
 		if(menu.down==6)
-			OLED_ShowString(5,30,(unsigned char*)lockinfo.SN7name,16,0);
+			OLED_ShowString(5,30,(unsigned char*)lockinfo.SNname[6],16,0);
 		if(menu.down==7)
-			OLED_ShowString(5,45,(unsigned char*)lockinfo.SN8name,16,0);
+			OLED_ShowString(5,45,(unsigned char*)lockinfo.SNname[7],16,0);
 		OLED_ShowString(110,45,(unsigned char*)"2/2",12,1);
 	}
 }
@@ -141,13 +146,14 @@ void lockWork(void) //
 	OLED_ShowChinese(38,25,57,16,1);//键
 	OLED_ShowChinese(58,25,17,16,1);//施
 	OLED_ShowChinese(78,25,19,16,1);//封
-	OLED_ShowChinese(25,48,26,12,1);//已
-	OLED_ShowChinese(40,48,27,12,1);//绑
-	OLED_ShowChinese(55,48,28,12,1);//定
-	OLED_ShowChinese(70,48,29,12,1);//锁
-	OLED_ShowString(85,48,(unsigned char*)"(",12,1);
-	OLED_ShowString(94,48,(unsigned char*)count,12,1);
-	OLED_ShowString(100,48,(unsigned char*)")",12,1);
+	
+	OLED_ShowChinese(20,48,26,12,1);//已
+	OLED_ShowChinese(35,48,27,12,1);//绑
+	OLED_ShowChinese(50,48,28,12,1);//定
+	OLED_ShowChinese(65,48,29,12,1);//锁
+	OLED_ShowString(80,48,(unsigned char*)"(",12,1);
+	OLED_ShowString(89,48,(unsigned char*)count,12,1);
+	OLED_ShowString(95,48,(unsigned char*)")",12,1);
 	
 //*选择
 	if(menu.down==0)
@@ -182,6 +188,11 @@ void ApplyPermission(void)//
 	{
 		OLED_ShowString(60,48,(unsigned char*)"->>",12,1);
 		OLED_ShowString(80,48,(unsigned char*)"Success",12,1);
+		
+		macsetptr->macWorked=0;
+		macsetptr->macWorkedfail=0;
+		macsetptr->openLockCount=0;
+		macsetptr->closeLockCount=0;
 	}
 		
 }
@@ -190,52 +201,80 @@ void PleaseWakeUp(void)//
 {
 	char workedCount[6]; // 数字1转换为字符串形式最多需要2个字符,再加上终止符'\0'共6个字符的空间
 	sprintf(workedCount, "%u", macsetptr->macWorked);
-	OLED_ShowChinese(5,20,64,16,1);  //请
-	OLED_ShowChinese(25,20,65,16,1); //唤
-	OLED_ShowChinese(45,20,66,16,1); //醒
-	OLED_ShowChinese(65,20,67,16,1); //蓝
-	OLED_ShowChinese(85,20,68,16,1); //牙
-	OLED_ShowChinese(105,20,69,16,1);//锁
-	
-	
-	OLED_ShowChinese(25,48,26,12,1);//已
-	OLED_ShowChinese(40,48,30,12,1);//操
-	OLED_ShowChinese(55,48,31,12,1);//作
-	OLED_ShowChinese(70,48,29,12,1);//锁
-	OLED_ShowString(85,48,(unsigned char*)"(",12,1);
-	OLED_ShowString(94,48,(unsigned char*)workedCount,12,1);
-	OLED_ShowString(100,48,(unsigned char*)")",12,1);
+	
+	char workedFail[6]; // 数字1转换为字符串形式最多需要2个字符,再加上终止符'\0'共6个字符的空间
+	sprintf(workedFail, "%u", macsetptr->macWorkedfail);
+	
+	OLED_ShowChinese(5,5,64,16,1);  //请
+	OLED_ShowChinese(25,5,65,16,1); //唤
+	OLED_ShowChinese(45,5,66,16,1); //醒
+	OLED_ShowChinese(65,5,67,16,1); //蓝
+	OLED_ShowChinese(85,5,68,16,1); //牙
+	OLED_ShowChinese(105,5,69,16,1);//锁
+	
+	
+	OLED_ShowChinese(25,30,26,12,1);//已
+	OLED_ShowChinese(40,30,30,12,1);//操
+	OLED_ShowChinese(55,30,31,12,1);//作
+	OLED_ShowChinese(70,30,29,12,1);//锁
+	OLED_ShowString(85,30,(unsigned char*)"(",12,1);
+	OLED_ShowString(94,30,(unsigned char*)workedCount,12,1);
+	OLED_ShowString(100,30,(unsigned char*)")",12,1);
+	
+	
+	OLED_ShowChinese(25,50,19,12,1);//异
+	OLED_ShowChinese(40,50,20,12,1);//常
+	OLED_ShowChinese(55,50,4,12,1); //锁
+	OLED_ShowChinese(70,50,32,12,1);//数
+	OLED_ShowString(85,50,(unsigned char*)"(",12,1);
+	OLED_ShowString(94,50,(unsigned char*)workedFail,12,1);
+	OLED_ShowString(100,50,(unsigned char*)")",12,1);
+	
+	
 	
 }
 
 void SecondMain(void)//次主界面
 {
-	//*个数显示
-	OLED_ShowString(90,25,(unsigned char*)":",16,1);
-	//*解封
-//	OLED_ShowChinese(8,25,18,16,1);//解
-//	OLED_ShowChinese(28,25,19,16,1);//封	
-//	OLED_ShowChinese(48,25,69,16,1);//锁
-//	OLED_ShowChinese(68,25,70,16,1);//数
-//	OLED_ShowString(105,26,(unsigned char*)"8",16,1);
-	//*施封
-//	OLED_ShowChinese(8,25,17,16,1);//施
-//	OLED_ShowChinese(28,25,19,16,1);//封	
-//	OLED_ShowChinese(48,25,69,16,1);//锁
-//	OLED_ShowChinese(68,25,70,16,1);//数
-//	OLED_ShowString(105,26,(unsigned char*)"8",16,1);
+	char openCount[6]; // 数字1转换为字符串形式最多需要2个字符,再加上终止符'\0'共6个字符的空间
+	macsetptr->openLockCount = macsetptr->macWorked;
+	sprintf(openCount, "%u", macsetptr->openLockCount);
 	
-	//*所有锁已
-	OLED_ShowChinese(5,25,71,16,1);//所
-	OLED_ShowChinese(25,25,72,16,1);//有	
-	OLED_ShowChinese(45,25,69,16,1);//锁
-	OLED_ShowChinese(65,25,73,16,1);//已
-	OLED_ShowChinese(105,25,19,16,1);//封	
-	OLED_ShowChinese(85,25,18,16,1);//解
-//	OLED_ShowChinese(85,25,17,16,1);//施
+	char closeCount[6]; // 数字1转换为字符串形式最多需要2个字符,再加上终止符'\0'共6个字符的空间
+	sprintf(closeCount, "%u", macsetptr->closeLockCount);
+	//*解封
+	OLED_ShowChinese(25,30,11,12,1);//解
+	OLED_ShowChinese(40,30,10,12,1);//封	
+	OLED_ShowChinese(55,30,29,12,1);//锁	
+	OLED_ShowChinese(70,30,32,12,1);//数
+	OLED_ShowString(85,30,(unsigned char*)"(",12,1);
+	OLED_ShowString(94,30,(unsigned char*)openCount,12,1);
+	OLED_ShowString(100,30,(unsigned char*)")",12,1);
 	
 	
+	//*施封
+	OLED_ShowChinese(25,50,9,12,1);  //施
+	OLED_ShowChinese(40,50,10,12,1);//封	
+	OLED_ShowChinese(55,50,29,12,1);//锁	
+	OLED_ShowChinese(70,50,32,12,1);//数
+	OLED_ShowString(85,50,(unsigned char*)"(",12,1);
+	OLED_ShowString(94,50,(unsigned char*)closeCount,12,1);
+	OLED_ShowString(100,50,(unsigned char*)")",12,1);
 	
+	//*所有锁已
+	if(macsetptr->sta==BtUnlocking)
+	{
+		OLED_ShowChinese(85,5,18,16,1);//解
+	}
+	else if(macsetptr->sta==LockSuccessClosed)
+	{
+		OLED_ShowChinese(85,5,17,16,1);//施
+	}
+	OLED_ShowChinese(5,5,71,16,1);//所
+	OLED_ShowChinese(25,5,72,16,1);//有	
+	OLED_ShowChinese(45,5,69,16,1);//锁
+	OLED_ShowChinese(65,5,73,16,1);//已
+	OLED_ShowChinese(105,5,19,16,1);//封	
 	
 }
 

+ 22 - 3
Core/Src/key.c

@@ -171,15 +171,19 @@ uint8_t KEY_3_Scan_PDA(void)
 						{
 							if(menu.down==0)
 							{
+								workedLock=0;
+								memset(devices,0,8);
 								//printf("Ò»¼ü½â·â\r\n");
-								SET_MENU_STATUS(2,0,0,0);
+								SET_MENU_STATUS(2,2,0,0);
 								Allopen=true;
 								break;
 							}
 							else if(menu.down==1)
 							{
+								workedLock=0;
+								memset(devices,0,8);
 								//printf("Ò»¼üÊ©·â\r\n");
-								SET_MENU_STATUS(2,0,0,1);
+								SET_MENU_STATUS(2,1,1,1);
 								Allopen=true;
 								break;
 							}
@@ -246,7 +250,15 @@ uint8_t KEY_4_Scan_PDA(void)
 						case 2:
 						{
 							reAuth = false;
-							SET_MENU_STATUS(1,0,menu.enter,1);
+							menu.current=1;
+							refresh=true;
+							break;
+						}
+						case 3:
+						{
+							reAuth = false;
+							menu.current=1;
+							refresh=true;
 							break;
 						}
 						case 4:
@@ -254,6 +266,13 @@ uint8_t KEY_4_Scan_PDA(void)
 							SET_MENU_STATUS(1,0,2,1);
 							break;
 						}
+						case 5:
+						{
+							menu.current=1;
+							//SET_MENU_STATUS(1,2,0,1);
+							refresh=true;
+							break;
+						}
 						
 					}
 					#if debugkeyinfo == 1

+ 9 - 74
Core/Src/main.c

@@ -240,85 +240,20 @@ void ReadSNname(void)
 	for (int i = 0; i < 8; i++) {
 		strncpy(macStr_init[i], mac + i * 12, 12); // 复制12个字符到macStr中
 		macStr_init[i][12] = '\0'; // 添加字符串结束符
-	}			
-	
-	if(mac[0]==0)
-	{
-		//Todo
-		printf("mac1未绑定\r\n");
-	}
-	else
-	{
-		sprintf(lockinfo.SN1name, "%s",macStr_init[0]);
-	}
-	
-	if(mac[12]==0)
-	{
-		//Todo
-		printf("mac2未绑定\r\n");
-	}
-	else
-	{
-		sprintf(lockinfo.SN2name, "%s",macStr_init[1]);
-	}	
-	if(mac[24]==0)
-	{
-		//Todo
-		printf("mac3未绑定\r\n");
-	}
-	else
-	{
-		sprintf(lockinfo.SN3name, "%s",macStr_init[2]);
 	}		
-	if(mac[36]==0)//4
-	{
-		//Todo
-		printf("mac4未绑定\r\n");
-	}
-	else
-	{
-		sprintf(lockinfo.SN4name, "%s",macStr_init[3]);
-	}	
-	if(mac[48]==0)//5
-	{
-		//Todo
-		printf("mac5未绑定\r\n");
-	}
-	else
-	{
-		sprintf(lockinfo.SN5name, "%s",macStr_init[4]);
-	}	
-	
-	if(mac[60]==0)//6
-	{
-		//Todo
-		printf("mac6未绑定\r\n");
-	}
-	else
-	{
-		sprintf(lockinfo.SN6name, "%s",macStr_init[5]);
-	}	
 	
-	if(mac[72]==0)//7
-	{
-		//Todo
-		printf("mac7未绑定\r\n");
+	for (int i = 0; i < NUM_OF_DEVICES; i++) {
+		processPdadata(macStr_init[i], macsetptr->mactemp[i], macsetptr->mac[i]);
 	}
-	else
-	{
-		sprintf(lockinfo.SN7name, "%s",macStr_init[6]);
-	}		
 	
-	if(mac[84]==0)//8
-	{
-		//Todo
-		printf("mac8未绑定\r\n");
+	for(int i = 0; i < 8; i++) {
+		if(mac[i*12] == 0) {
+			//Todo
+			printf("mac%d未绑定\r\n", i+1);
+		} else {
+			sprintf(lockinfo.SNname[i], "%s", macStr_init[i]);
+		}
 	}
-	else
-	{
-		sprintf(lockinfo.SN8name, "%s",macStr_init[7]);
-	}	
-	
 	
 }
 /* USER CODE END 4 */

+ 51 - 231
Core/Src/mba32a.c

@@ -94,6 +94,13 @@ void MBA32A_Init(void)
 	btframe.userId 	  = 0x64747531; 
 	btframe.Autoseal  = 0xFF; //自动施封时间
 	
+	//Flash_ReadBytes((uint16_t*)&btframe.serialNum, serialNumAddr, 2);//读取4字节流水号
+	//if(btframe.serialNum==0xFFFFFFFF)
+	//{
+		btframe.serialNum = 0;//u32
+	//}
+	
+	
 	printf("\t###01\tBT_init%d...\r\n", resetcount_bt); 
 	
 	Start_Read_resetFlag16();/** 启动位读写检查 **/
@@ -235,7 +242,6 @@ void MBA32AReset(void)
 }
 
 
-
 /**
   * @breaf 蓝牙开锁信息帧
   */
@@ -245,27 +251,10 @@ void open_lock(BtFrame btframe)			//
 	uint8_t open_CMD[] = {0x02, 0x0C, 	0x00,0x00,0x00,0x00,		0x00,0x00,0x00,0x00, \
 												0x00,0x00,0x00,0x00,   0x00};//开锁命令帧
 	
-	uint32_t serialNum;
-	if(menu.current==4)
-	{
-		serialNum = btframe.serialNum1;//流水号
-	}
-	if(menu.current==5)
-	{
-		serialNum = btframe.serialNum2;//流水号
-	}
-	if(menu.current==6)
-	{
-		serialNum = btframe.serialNum3;//流水号
-	}
-	if(menu.current==7)
-	{
-		serialNum = btframe.serialNum4;//流水号
-	}
-	open_CMD[2]=(serialNum>>24) & 0xff;
-	open_CMD[3]=(serialNum>>16) & 0xff;
-	open_CMD[4]=(serialNum>>8) & 0xff;
-	open_CMD[5]= serialNum & 0xff;
+	open_CMD[2]=(btframe.serialNum>>24) & 0xff;
+	open_CMD[3]=(btframe.serialNum>>16) & 0xff;
+	open_CMD[4]=(btframe.serialNum>>8) & 0xff;
+	open_CMD[5]= btframe.serialNum & 0xff;
 												
 	uint32_t userid = btframe.userId;//用户id
 	open_CMD[6]=(userid>>24) & 0xff;
@@ -292,27 +281,11 @@ void close_lock(BtFrame btframe)		//
 	uint8_t header[2] 	= {0x66, 0x01};//Jl_lock帧头
 	uint8_t close_CMD[] = {0x03, 0x0B, 0x00,0x00,0x00,0x00,		0x00,0x00,0x00,0x00, \
 												0x00,0x00,0x00,0x00};//关锁命令帧
-	uint32_t serialNum;
-	if(menu.current==4)
-	{
-		serialNum = btframe.serialNum1;//流水号
-	}
-	if(menu.current==5)
-	{
-		serialNum = btframe.serialNum2;//流水号
-	}
-	if(menu.current==6)
-	{
-		serialNum = btframe.serialNum3;//流水号
-	}
-	if(menu.current==7)
-	{
-		serialNum = btframe.serialNum4;//流水号
-	}
-	close_CMD[2]=(serialNum>>24) & 0xff;
-	close_CMD[3]=(serialNum>>16) & 0xff;
-	close_CMD[4]=(serialNum>>8) & 0xff;
-	close_CMD[5]= serialNum & 0xff;
+	
+	close_CMD[2]=(btframe.serialNum>>24) & 0xff;
+	close_CMD[3]=(btframe.serialNum>>16) & 0xff;
+	close_CMD[4]=(btframe.serialNum>>8) & 0xff;
+	close_CMD[5]= btframe.serialNum & 0xff;
 												
 	uint32_t userid = btframe.userId;//用户id
 	close_CMD[6]=(userid>>24) & 0xff;
@@ -330,205 +303,52 @@ void close_lock(BtFrame btframe)		//
 }
 
 
-uint8_t BtLockConn(uint8_t temp,uint8_t close)
+
+
+
+int workedLock = 0; 		// 用于跟踪已连接的设备的数量
+int devices[8] = {0}; 	 	// 数组用于跟踪设备的工作状态
+
+void connectDevices(bool openClose)
 {
-	if(temp==0)
-	{
-		if(sendCmd_BT(macsetptr->SN1CONN,macsetptr->SN1ED,1,1))
-		{
-			//printf("%s连接成功\r\n",lockinfo.SN1name);
-			if(close)
-			{
-				close_lock(btframe); //施封操作
-				return 1;
-			}
-			else
-			{
-				open_lock(btframe); //解封操作
-				return 1;
-			}
-		}
-		else
-		{
-			//printf("%s连接失败\r\n",lockinfo.SN1name);
-		}	
-	}
-	else if(temp==1)
-	{
-		if(sendCmd_BT(macsetptr->SN2CONN,macsetptr->SN2ED,1,1))
-		{
-			//printf("%s连接成功\r\n",lockinfo.SN2name);
-			if(close)
-			{
-				close_lock(btframe); //施封操作
-			}
-			else
-			{
-				open_lock(btframe); //解封操作
-			}
-		}
-		else
-		{
-			//printf("%s连接失败\r\n",lockinfo.SN2name);
-		}	
-	}
-	else if(temp==2)
+    char* snName = NULL;
+    char* snConn = NULL;
+    //char* snEd = NULL;
+	while(workedLock < macsetptr->macCount)//当所以操作完成跳出循环
 	{
-		if(sendCmd_BT(macsetptr->SN3CONN,macsetptr->SN3ED,1,1))
+		for(int i=0;i<macsetptr->macCount;i++)//循环遍历所有设备空间
 		{
-			printf("%s连接成功\r\n",lockinfo.SN3name);
-			if(close)
-			{
-				close_lock(btframe); //施封操作
-			}
-			else
+			if (devices[i] == 0)  // 检查设备是否完成操作
 			{
-				open_lock(btframe); //解封操作
-			}
-		}
-		else
-		{
-			printf("%s连接失败\r\n",lockinfo.SN3name);
-		}	
-	}
-	else if(temp==3)
-	{
-		if(sendCmd_BT(macsetptr->SN4CONN,macsetptr->SN4ED,1,1))
-		{
-			printf("%s连接成功\r\n",lockinfo.SN4name);
-			if(close)
-			{
-				close_lock(btframe); //施封操作
-			}
-			else
-			{
-				open_lock(btframe); //解封操作
-			}
-		}
-		else
-		{
-			printf("%s连接失败\r\n",lockinfo.SN4name);
-		}	
-	}
-	
-	else if(temp==4)
-	{
-		if(sendCmd_BT(macsetptr->SN5CONN,macsetptr->SN5ED,1,1))
-		{
-			printf("%s连接成功\r\n",lockinfo.SN5name);
-			if(close)
-			{
-				close_lock(btframe); //施封操作
-			}
-			else
-			{
-				open_lock(btframe); //解封操作
-			}
-		}
-		else
-		{
-			printf("%s连接失败\r\n",lockinfo.SN5name);
-		}	
-	}
-	else if(temp==5)
-	{
-		if(sendCmd_BT(macsetptr->SN6CONN,macsetptr->SN6ED,1,1))
-		{
-			printf("%s连接成功\r\n",lockinfo.SN6name);
-			if(close)
-			{
-				close_lock(btframe); //施封操作
-			}
-			else
-			{
-				open_lock(btframe); //解封操作
-			}
-		}
-		else
-		{
-			printf("%s连接失败\r\n",lockinfo.SN6name);
-		}	
-	}
-		
-	else if(temp==6)
-	{
-		if(sendCmd_BT(macsetptr->SN7CONN,macsetptr->SN7ED,1,1))
-		{
-			printf("%s连接成功\r\n",lockinfo.SN7name);
-			if(close)
-			{
-				close_lock(btframe); //施封操作
-			}
-			else
-			{
-				open_lock(btframe); //解封操作
-			}
-		}
-		else
-		{
-			printf("%s连接失败\r\n",lockinfo.SN7name);
-		}	
-	}
-	else if(temp==7)
-	{
-		if(sendCmd_BT(macsetptr->SN8CONN,macsetptr->SN8ED,1,1))
-		{
-			printf("%s连接成功\r\n",lockinfo.SN8name);
-			if(close)
-			{
-				close_lock(btframe); //施封操作
-			}
-			else
-			{
-				open_lock(btframe); //解封操作
+				//*获取当前连接字符串
+				snName = lockinfo.SNname[i];
+				snConn = macsetptr->SNCONN[i];
+				//snEd = macsetptr->SNED[i];
+                printf("设备%d执行操作->%s\n", i, snName);//0-7:1-8
+				if (snName != NULL && sendCmd_BT(snConn, "ERROR", 1, 1)) //进行连接 macsetptr->Btconn[workedLock]
+				{
+					btframe.serialNum+=1;
+					if (openClose) {
+						close_lock(btframe); //施封操作
+						printf("已发送施封报文至设备-%s!,流水号%04X\n", snName, btframe.serialNum);
+					}
+					else if(!openClose) {
+						open_lock(btframe); //解封操作
+						printf("已发送解封报文至设备-%s!,流水号%04X\n", snName, btframe.serialNum);
+					}
+					
+				}
 			}
 		}
-		else
-		{
-			printf("%s连接失败\r\n",lockinfo.SN8name);
-		}	
+		printf("延时1000\r\n");
+		HAL_Delay(1000);
 	}
 }
 
-
-void connectDevices() {
-    int connectedDevice = 0; // 用于跟踪已连接的设备的数量
-    int devices[8] = {0}; // 数组用于跟踪设备的连接状态(0 - 未连接,1 - 已连接)
-    
-    while (connectedDevice < macsetptr->macCount) { // 直到已连接设备数量达到macCount时继续循环
-        for (int i = 0; i < macsetptr->macCount; i++) { // 循环遍历所有设备
-            if (devices[i] == 0) { // 检查设备是否未连接
-                // 尝试连接设备
-                //printf("正在尝试连接设备 %d...\n", i);
-                // 连接代码
-                int connectionStatus = BtLockConn(i, 0); 
-                if (connectionStatus == 1) { // 如果连接成功
-                    //printf("已连接设备 %d!\n", i);
-                    devices[i] = 1; // 将设备标记为已连接
-                    connectedDevice++; // 已连接设备数量加一
-                    // 对已连接设备进行操作
-                } else {
-                    //printf("无法连接设备 %d。\n", i);
-                }
-                
-                // 添加超时机制,使用HAL_Delay函数
-                HAL_Delay(200); // 等待200毫秒
-				printf("%d\r\n",i);
-				printf("%d\r\n",macsetptr->macCount);
-            }
-        }
-    }
-    if(connectedDevice==macsetptr->macCount)
-	{
-		menu.current=0;
-	}
-    
-    // 所有设备均已连接,可以在这里进行进一步操作
-}
+bool openOrClose =false;
 void open_close_lock(void)
 {
-	connectDevices();
-	
+	connectDevices(openOrClose);
 
 }
 

+ 55 - 4
Core/Src/ml307a.c

@@ -36,7 +36,7 @@ extern Ipaddr ipaddr;
 //*本模块方法
 void ML307AReset(void);
 void RTCtime(void);
-
+uint8_t MQTTCONN(void);
 void TcpConn(char *value, uint8_t cid, char *IPaddr, uint16_t port, uint8_t tcpConnmode)
 {
 	char *ptr = value;
@@ -45,6 +45,9 @@ void TcpConn(char *value, uint8_t cid, char *IPaddr, uint16_t port, uint8_t tcpC
 
 uint16_t phonenum[3];
 bool phonenull=false;
+
+char topica[50];//*终端发布A
+char topicb[50];//*服务器发布B
 void ML307A_Init(void)
 {
 	//*phoneNumADDR
@@ -52,12 +55,16 @@ void ML307A_Init(void)
 	if(phonenum[0]==0xFFFF)
 	{
 		phonenull=true;
+		phonenum[0]=0x0000;
+		phonenum[1]=0x1600;
+		phonenum[2]=0x0008;
 	}
 	else
 	{
 		//
 	}
-	
+	sprintf(topica, "%s%04X%04X%04X%s", PCMQTTTOPIC_PREFIX, phonenum[0], phonenum[1], phonenum[2], PCMQTTTOPIC_SUFFIXA);//终端发布
+	sprintf(topicb, "%s%04X%04X%04X%s", PCMQTTTOPIC_PREFIX, phonenum[0], phonenum[1], phonenum[2], PCMQTTTOPIC_SUFFIXB);//终端订阅
 	Flash_ReadBytes((uint16_t*)&(ipaddr.IP0),ReIPAddr,5);//读取phonenum
 	if(ipaddr.IP0==0xFFFF)
 	{
@@ -74,6 +81,7 @@ void ML307A_Init(void)
 
 	printf("\t###02\t4G_init...%d\r\n",resetcount_4g); 
 	sendCmd_4G("AT+MGNSS=0\r\n", "OK", 1, 1);//关闭MGNSS
+	sendCmd_4G("AT+MQTTDISC=0\r\n", "OK", 1, 1);//关闭MQTT
 	switch(step4g)
 	{
 		case 0:
@@ -139,9 +147,10 @@ void ML307A_Init(void)
 #endif
 			{
 				step4g++;
-				//printf("#TCP连接完成\r\n");
 
 			}
+			MQTTCONN();//*连接MQTT
+			printf("#连接MQTT\r\n");
 			//break;
 		}
 		case 4:
@@ -214,6 +223,48 @@ uint8_t sendCmd_4G(char *pCmd, char *pRes, uint32_t timeOut, uint8_t sendNum)
     return 0;
 }
 
+uint8_t MQTT_CONN(char *IpAddr, uint16_t port, char *ID, char *User, char *Passwd, char* pRes)
+{
+	
+	char MQTT_Sendbuf[128]; 
+	sprintf((char *)MQTT_Sendbuf,"AT+MQTTCONN=0,\"%s\",%d,\"%s\",\"%s\",\"%s\"\r\n",IpAddr, port, ID,User, Passwd);
+	if(sendCmd_4G(MQTT_Sendbuf,pRes,1,1))
+	{
+		return 1;
+	}
+	return 0;
+}
+uint8_t MQTT_PUB(uint8_t connect_id, char *topic, char *mesg, char* pRes)
+{
+	char MQTT_Sendbuf[128]; 
+	uint8_t length = strlen(mesg);
+	sprintf((char *)MQTT_Sendbuf,"AT+MQTTPUB=%d,\"%s\",1,0,0,%d,\"%s\"\r\n",connect_id, topic, length, mesg);
+	if(sendCmd_4G(MQTT_Sendbuf,pRes,1,1))
+	{
+		printf("#发布心跳成功\r\n");
+		return 1;
+	}
+	return 0;
+}
+/**
+  * @breaf MQTT初始化
+  */
+uint8_t MQTTCONN(void)
+{
+	if(MQTT_CONN((char*)PCMQTTADDR,PCMQTTPORT,"dtu",(char*)PCMQTTUSER,(char*)PCMQTTPSWD,"+MQTTURC: \"conn\",0,0"))
+	{
+		printf("#连接MQTT成功\r\n");
+		//*订阅
+		char MQTTSUB[150];
+		sprintf(MQTTSUB, "AT+MQTTSUB=0,%s,1\r\n", topicb);
+		if(sendCmd_4G(MQTTSUB, "+MQTTURC: \"suback\"", 1, 1)) {
+			printf("#订阅成功\r\n");
+			return 1;
+		}
+	}
+	return 0;
+}
+
 /**
  @brief 重启模块
  @param 无
@@ -241,7 +292,7 @@ void Pre_processing_4G(void)//
 	} 
 	if(!Online)
 	{
-		printf("未连接平台\r\n");
+		//printf("未连接平台\r\n");
 		//wdiFlag = true;
 	}
 }

+ 105 - 89
Core/Src/tt808.c

@@ -96,6 +96,10 @@ void MessageHandle(uint16_t MessageID)
 		header[7] 	= 0x00;
 		header[8] 	= 0x00;
 		header[9] 	= 0x08;						//“手机号”
+		phonenum[0]=0x0000;
+		phonenum[1]=0x1600;
+		phonenum[2]=0x0008;
+		
 	}
 	else
 	{
@@ -158,6 +162,7 @@ uint32_t swapBytes32(uint32_t value) {
   * @breaf 消息体封装
   * Message[] 消息数据;	length 消息数据长度;	outMessage[] 封装后消息数据; MessageID 消息ID
   */
+extern BtFrame btframe;
 uint8_t Message_bodydata(uint8_t *Message, uint8_t length, uint8_t outMessage[],uint16_t MessageID)
 {
 	int index = 0;
@@ -218,7 +223,31 @@ uint8_t Message_bodydata(uint8_t *Message, uint8_t length, uint8_t outMessage[],
 			outMessage[i]=temp_Message[i];
 		}
 	}
-
+	else if(MessageID==MessageID_uploadLock)//上传锁信息
+	{
+		temp_length = length+9;//加4字节操作时间+4字节userIDbtframe.userId+1byte操作类型
+			
+		uint8_t temp_Message[temp_length];
+		for (int i = 0; i < length; i++) {
+			temp_Message[index++] = Message[i];  // 将消息头拷贝到报文中
+		}
+		uint32_t ntime = dblocptr->location.timeStamp;//现在时间
+		temp_Message[index++]=(ntime>>24) & 0xff;
+		temp_Message[index++]=(ntime>>16) & 0xff;
+		temp_Message[index++]=(ntime>>8) & 0xff;
+		temp_Message[index++]= ntime & 0xff;		
+		
+		temp_Message[index++]=(btframe.userId>>24) & 0xff;
+		temp_Message[index++]=(btframe.userId>>16) & 0xff;
+		temp_Message[index++]=(btframe.userId>>8) & 0xff;
+		temp_Message[index++]=(btframe.userId) & 0xff;
+		temp_Message[index++] = macsetptr->sta;
+		
+		for(int i =0;i<temp_length;i++)
+		{
+			outMessage[i]=temp_Message[i];
+		}	
+	}
 	else//加首尾
 	{
 		temp_length = length+3;//加首尾 25/23/crc
@@ -566,56 +595,20 @@ void AtPRocess(char *value, char conn[],char connected[],char disconn[]) {
     printf("%s\r\n", disconn);
 }
 
-void Process_str_collections()
-{
-	if(macset.macCount==1){
-		AtPRocess(lockinfo.SN1name,macset.SN1CONN, macset.SN1ED, macset.SN1DIS);}
-	else if(macset.macCount==2){
-		AtPRocess(lockinfo.SN1name,macset.SN1CONN, macset.SN1ED, macset.SN1DIS);
-		AtPRocess(lockinfo.SN2name,macset.SN2CONN, macset.SN2ED, macset.SN2DIS);}
-	else if(macset.macCount==3){
-		AtPRocess(lockinfo.SN1name,macset.SN1CONN, macset.SN1ED, macset.SN1DIS);
-		AtPRocess(lockinfo.SN2name,macset.SN2CONN, macset.SN2ED, macset.SN2DIS);
-		AtPRocess(lockinfo.SN3name,macset.SN3CONN, macset.SN3ED, macset.SN3DIS);}
-	else if(macset.macCount==4){
-		AtPRocess(lockinfo.SN1name,macset.SN1CONN, macset.SN1ED, macset.SN1DIS);
-		AtPRocess(lockinfo.SN2name,macset.SN2CONN, macset.SN2ED, macset.SN2DIS);
-		AtPRocess(lockinfo.SN3name,macset.SN3CONN, macset.SN3ED, macset.SN3DIS);
-		AtPRocess(lockinfo.SN4name,macset.SN4CONN, macset.SN4ED, macset.SN4DIS);}
-	else if(macset.macCount==5){
-		AtPRocess(lockinfo.SN1name,macset.SN1CONN, macset.SN1ED, macset.SN1DIS);
-		AtPRocess(lockinfo.SN2name,macset.SN2CONN, macset.SN2ED, macset.SN2DIS);
-		AtPRocess(lockinfo.SN3name,macset.SN3CONN, macset.SN3ED, macset.SN3DIS);
-		AtPRocess(lockinfo.SN4name,macset.SN4CONN, macset.SN4ED, macset.SN4DIS);
-		AtPRocess(lockinfo.SN5name,macset.SN5CONN, macset.SN5ED, macset.SN5DIS);}
-	else if(macset.macCount==6){
-		AtPRocess(lockinfo.SN1name,macset.SN1CONN, macset.SN1ED, macset.SN1DIS);
-		AtPRocess(lockinfo.SN2name,macset.SN2CONN, macset.SN2ED, macset.SN2DIS);
-		AtPRocess(lockinfo.SN3name,macset.SN3CONN, macset.SN3ED, macset.SN3DIS);
-		AtPRocess(lockinfo.SN4name,macset.SN4CONN, macset.SN4ED, macset.SN4DIS);
-		AtPRocess(lockinfo.SN5name,macset.SN5CONN, macset.SN5ED, macset.SN5DIS);
-		AtPRocess(lockinfo.SN6name,macset.SN6CONN, macset.SN6ED, macset.SN6DIS);}
-	else if(macset.macCount==7){
-		AtPRocess(lockinfo.SN1name,macset.SN1CONN, macset.SN1ED, macset.SN1DIS);
-		AtPRocess(lockinfo.SN2name,macset.SN2CONN, macset.SN2ED, macset.SN2DIS);
-		AtPRocess(lockinfo.SN3name,macset.SN3CONN, macset.SN3ED, macset.SN3DIS);
-		AtPRocess(lockinfo.SN4name,macset.SN4CONN, macset.SN4ED, macset.SN4DIS);
-		AtPRocess(lockinfo.SN5name,macset.SN5CONN, macset.SN5ED, macset.SN5DIS);
-		AtPRocess(lockinfo.SN6name,macset.SN6CONN, macset.SN6ED, macset.SN6DIS);
-		AtPRocess(lockinfo.SN7name,macset.SN7CONN, macset.SN7ED, macset.SN7DIS);}
-	else if(macset.macCount==8){
-		AtPRocess(lockinfo.SN1name,macset.SN1CONN, macset.SN1ED, macset.SN1DIS);
-		AtPRocess(lockinfo.SN2name,macset.SN2CONN, macset.SN2ED, macset.SN2DIS);
-		AtPRocess(lockinfo.SN3name,macset.SN3CONN, macset.SN3ED, macset.SN3DIS);
-		AtPRocess(lockinfo.SN4name,macset.SN4CONN, macset.SN4ED, macset.SN4DIS);
-		AtPRocess(lockinfo.SN5name,macset.SN5CONN, macset.SN5ED, macset.SN5DIS);
-		AtPRocess(lockinfo.SN6name,macset.SN6CONN, macset.SN6ED, macset.SN6DIS);
-		AtPRocess(lockinfo.SN7name,macset.SN7CONN, macset.SN7ED, macset.SN7DIS);
-		AtPRocess(lockinfo.SN8name,macset.SN8CONN, macset.SN8ED, macset.SN8DIS);}
+void Process_str_collections() {
+    // 循环遍历从0到macCount-1的每个索引
+    for (int i = 0; i < macset.macCount; i++) {
+        AtPRocess(
+            lockinfo.SNname[i],
+            macset.SNCONN[i],
+            macset.SNED[i],
+            macset.SNDIS[i]
+        );
+    }
 }
+
 void processPdadata(char MACtemp[], uint8_t mactemp[],uint16_t mac[])
 {
-	
 	const char *hex = (const char *)MACtemp;  // 将 uint8_t * 转换为 const char *
 	int size = strlen(hex) / 2;  // 计算二进制数据的长度
 	unsigned char *bin = (unsigned char *)malloc(size);  // 分配足够的内存用于存储二进制数据
@@ -627,6 +620,8 @@ void processPdadata(char MACtemp[], uint8_t mactemp[],uint16_t mac[])
 	mac[2] = mactemp[4]<<8|mactemp[5];
 }
 
+#define MAC_LENGTH 12
+#define MAC_DB_ENTRY_SIZE 3
 void REPdaMode(void)
 {
 	HAL_StatusTypeDef WriteSta;
@@ -634,56 +629,55 @@ void REPdaMode(void)
 	 if(strncmp((char*)U1_485recvBuff, "DTU+ADDMAC",  strlen("DTU+ADDMAC"))==0)
 	 {
 		 macset.macCount=0;
-		 memset(lockinfo.SN1name, 0, sizeof(lockinfo.SN1name));
-		 memset(lockinfo.SN2name, 0, sizeof(lockinfo.SN2name));
-		 memset(lockinfo.SN3name, 0, sizeof(lockinfo.SN3name));
-		 memset(lockinfo.SN4name, 0, sizeof(lockinfo.SN4name));
-		 memset(lockinfo.SN5name, 0, sizeof(lockinfo.SN5name));
-		 memset(lockinfo.SN6name, 0, sizeof(lockinfo.SN6name));
-		 memset(lockinfo.SN7name, 0, sizeof(lockinfo.SN7name));
-		 memset(lockinfo.SN8name, 0, sizeof(lockinfo.SN8name));
+		workedLock=0;
+		memset(devices,0,8);
 		 erase_flash(MacDbBodyAddr);
-		 if(U1_485recvLength>12)
-		 {
-			memcpy(macset.MACtemp1,U1_485recvBuff+11,12);
-			processPdadata(macset.MACtemp1,macset.mactemp1,macset.mac1);
-			WriteSta= Flash_WriteBytes(macsetptr->mac1,MacDbBodyAddr,3);
+		if(U1_485recvLength>12){
+			memcpy(macset.MACtemp[0],U1_485recvBuff+11,12);
+			processPdadata(macset.MACtemp[0],macset.mactemp[0],macset.mac[0]);
+			WriteSta= Flash_WriteBytes(macsetptr->mac[0],MacDbBodyAddr,3);
 			if(WriteSta== HAL_OK)	macset.macCount += 1;}
 		 if(U1_485recvLength>25){
-			memcpy(macset.MACtemp2,U1_485recvBuff+24,12);
-			processPdadata(macset.MACtemp2,macset.mactemp2,macset.mac2);
-			WriteSta= Flash_WriteBytes(macsetptr->mac2,MacDbBodyAddr+(macset.macCount*6),3);
+			memcpy(macset.MACtemp[1],U1_485recvBuff+24,12);
+			processPdadata(macset.MACtemp[1],macset.mactemp[1],macset.mac[1]);
+			WriteSta= Flash_WriteBytes(macsetptr->mac[1],MacDbBodyAddr+(macset.macCount*6),3);
 			if(WriteSta== HAL_OK)	macset.macCount += 1;}
 		 if(U1_485recvLength>38){
-			memcpy(macset.MACtemp3,U1_485recvBuff+37,12);
-			processPdadata(macset.MACtemp3,macset.mactemp3,macset.mac3);
-			WriteSta= Flash_WriteBytes(macsetptr->mac3,MacDbBodyAddr+(macset.macCount*6),3);
+			memcpy(macset.MACtemp[2],U1_485recvBuff+37,12);
+			processPdadata(macset.MACtemp[2],macset.mactemp[2],macset.mac[2]);
+			WriteSta= Flash_WriteBytes(macsetptr->mac[2],MacDbBodyAddr+(macset.macCount*6),3);
 			if(WriteSta== HAL_OK)	macset.macCount += 1;}
 		 if(U1_485recvLength>51){
-			memcpy(macset.MACtemp4,U1_485recvBuff+50,12);
-			processPdadata(macset.MACtemp4,macset.mactemp4,macset.mac4);
-			WriteSta= Flash_WriteBytes(macsetptr->mac4,MacDbBodyAddr+(macset.macCount*6),3);
+			memcpy(macset.MACtemp[3],U1_485recvBuff+50,12);
+			processPdadata(macset.MACtemp[3],macset.mactemp[3],macset.mac[3]);
+			WriteSta= Flash_WriteBytes(macsetptr->mac[3],MacDbBodyAddr+(macset.macCount*6),3);
 			if(WriteSta== HAL_OK)	macset.macCount += 1;}
 		 if(U1_485recvLength>64){
-			memcpy(macset.MACtemp5,U1_485recvBuff+63,12);
-			processPdadata(macset.MACtemp5,macset.mactemp5,macset.mac5);
-			WriteSta= Flash_WriteBytes(macsetptr->mac5,MacDbBodyAddr+(macset.macCount*6),3);
+			memcpy(macset.MACtemp[4],U1_485recvBuff+63,12);
+			processPdadata(macset.MACtemp[4],macset.mactemp[4],macset.mac[4]);
+			WriteSta= Flash_WriteBytes(macsetptr->mac[4],MacDbBodyAddr+(macset.macCount*6),3);
 			if(WriteSta== HAL_OK)	macset.macCount += 1;}
 		 if(U1_485recvLength>77){
-			memcpy(macset.MACtemp6,U1_485recvBuff+76,12);
-			processPdadata(macset.MACtemp6,macset.mactemp6,macset.mac6);
-			WriteSta= Flash_WriteBytes(macsetptr->mac6,MacDbBodyAddr+(macset.macCount*6),3);
+			memcpy(macset.MACtemp[5],U1_485recvBuff+76,12);
+			processPdadata(macset.MACtemp[5],macset.mactemp[5],macset.mac[5]);
+			WriteSta= Flash_WriteBytes(macsetptr->mac[5],MacDbBodyAddr+(macset.macCount*6),3);
 			if(WriteSta== HAL_OK)	macset.macCount += 1;}
 		 if(U1_485recvLength>90){
-			memcpy(macset.MACtemp7,U1_485recvBuff+89,12);
-			processPdadata(macset.MACtemp7,macset.mactemp7,macset.mac7);
-			WriteSta= Flash_WriteBytes(macsetptr->mac7,MacDbBodyAddr+(macset.macCount*6),3);
+			memcpy(macset.MACtemp[6],U1_485recvBuff+89,12);
+			processPdadata(macset.MACtemp[6],macset.mactemp[6],macset.mac[6]);
+			WriteSta= Flash_WriteBytes(macsetptr->mac[6],MacDbBodyAddr+(macset.macCount*6),3);
 			if(WriteSta== HAL_OK)	macset.macCount += 1;}
 		 if(U1_485recvLength>103){
-			memcpy(macset.MACtemp8,U1_485recvBuff+102,12);
-			processPdadata(macset.MACtemp8,macset.mactemp8,macset.mac8);
-			WriteSta= Flash_WriteBytes(macsetptr->mac8,MacDbBodyAddr+(macset.macCount*6),3);
+			memcpy(macset.MACtemp[7],U1_485recvBuff+102,12);
+			processPdadata(macset.MACtemp[7],macset.mactemp[7],macset.mac[7]);
+			WriteSta= Flash_WriteBytes(macsetptr->mac[7],MacDbBodyAddr+(macset.macCount*6),3);
 			if(WriteSta== HAL_OK)	macset.macCount += 1;}
+		 
+		 
+			
+		 for(int i = 0; i < macset.macCount; i++) {
+			 memset(lockinfo.SNname[i], 0, 13);
+		 }			
 
 		if(WriteSta == HAL_OK)
 		{
@@ -695,17 +689,23 @@ void REPdaMode(void)
 			printf("更新存储刻度完成\r\n");
 		}	
 		ReadSNname();//更新
-		Process_str_collections();//处理连接字符串
+		Process_str_collections();//处理连接字符串		
+		
+		
 		memset(U1_485recvBuff,0,BUFFER_SIZE);
 	 }
 }
+
+bool snConnected[NUM_OF_DEVICES] = {false};
 void ReBTcall(void)
 {
-	 if(strncmp((char*)autoRe, "+CONNECTED:0,",  strlen("+CONNECTED:0,"))==0)
-	 {
-		 memset(autoRe,0,BUFFER_SIZE);
-	 }
-
+    for (int i = 0; i < NUM_OF_DEVICES; ++i) {
+        if (strncmp((char*)autoRe, macsetptr->SNED[i], strlen(macsetptr->SNED[i])) == 0) {
+            snConnected[i] = true;
+            memset(autoRe, 0, BUFFER_SIZE);
+            break; // Exit the loop once a match is found
+        }
+    }
 }
 //*工作命令
 void ReMIPURC(void)//DTU
@@ -886,6 +886,23 @@ void MIPURCHandle(void)
 				}
 				memset(MIPurc,0,rlt);//rlt下发长度 
 			}
+			else if(xxRE == MessageID_uploadLock)//锁信息上传
+			{
+				if(YESorNO==YES)
+				{
+					printf("@锁信息上传应答yes\r\n");
+				}
+				else if(YESorNO==NO)
+				{
+					printf("@锁信息上传应答no\r\n");					
+				}	
+				
+				if(sendCmd_BT("AT+DISCONN=0\r\n","ERROR",1,1))
+				{
+					printf("已断开连接\r\n");
+				}
+				memset(MIPurc,0,rlt);//rlt下发长度 
+			}
 		 }
 		 else if(PTXXID == XXID_ptxxtc)	//收到平台消息透传 8900
 		 {
@@ -991,4 +1008,3 @@ void ReU4Proces(void)
 
 //*离线蓝牙锁
 
-

+ 2 - 52
MDK-ARM/dtu.uvoptx

@@ -153,57 +153,7 @@
         <Ww>
           <count>0</count>
           <WinNumber>1</WinNumber>
-          <ItemText>macset</ItemText>
-        </Ww>
-        <Ww>
-          <count>1</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>U1_485recvBuff</ItemText>
-        </Ww>
-        <Ww>
-          <count>2</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>lockinfo</ItemText>
-        </Ww>
-        <Ww>
-          <count>3</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mac</ItemText>
-        </Ww>
-        <Ww>
-          <count>4</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>mac_u16</ItemText>
-        </Ww>
-        <Ww>
-          <count>5</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>macStr_init[i]</ItemText>
-        </Ww>
-        <Ww>
-          <count>6</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>macStr_init</ItemText>
-        </Ww>
-        <Ww>
-          <count>7</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>\\dtu\../Core/Src/main.c\mac[12]</ItemText>
-        </Ww>
-        <Ww>
-          <count>8</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>lockinfo</ItemText>
-        </Ww>
-        <Ww>
-          <count>9</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>macset</ItemText>
-        </Ww>
-        <Ww>
-          <count>10</count>
-          <WinNumber>1</WinNumber>
-          <ItemText>dblocptr</ItemText>
+          <ItemText>btframe</ItemText>
         </Ww>
       </WatchWindow1>
       <WatchWindow2>
@@ -217,7 +167,7 @@
         <Mm>
           <WinNumber>1</WinNumber>
           <SubType>0</SubType>
-          <ItemText>MacDbHeadAddr</ItemText>
+          <ItemText>serialNumAddr</ItemText>
           <AccSizeX>0</AccSizeX>
         </Mm>
       </MemoryWindow1>