regist.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /**
  2. * author wulianwei
  3. * title mqtt注册实现
  4. */
  5. #include "regist.h"
  6. #include "module_wrapper.h"
  7. #include "TypeDefine.h"
  8. #include "SystemAlarm.h"
  9. #include "string.h"
  10. #include "sys.h"
  11. #include "DrawLCDGUI.h"
  12. #include "ProgramData.h"
  13. #include "cJSON.h"
  14. #include "AES.h"
  15. extern uart_recv_t uart_recv;
  16. extern valid_data_t valid_data;
  17. extern uint8_t mcu_id[8]; //mcu ID号缓冲区
  18. extern uint16_t Version_data; //版本号
  19. int registModuleStartCou = 0; //注册是模块启动次数
  20. char registData[200] = {0}; //设备注册信息,${mcu_id}&${PRODUCT_KEY}
  21. unsigned char key[17]="tuorenzhinenghua";
  22. unsigned char expansionkey[15 * 16];
  23. void ModuleKeepLine(void)
  24. {
  25. if(TaskSchedulerFlag.ModuleInitFlag == TASK_FLAG_SET)
  26. {
  27. registModuleStartCou++;
  28. TaskSchedulerFlag.ModuleInitFlag = TASK_FLAG_CLEAR;
  29. TaskSchedulerTimer.ModuleInitTimer = FIFTEEN_SECOND_TIMER;
  30. if(module_start_status == MODULE_FAIL)
  31. {
  32. at_module_start();
  33. }
  34. else if(module_init_status == MODULE_FAIL)
  35. {
  36. at_module_init();
  37. }
  38. else if(tcp_connect_status == TCP_CLOSED)
  39. {
  40. at_module_connect(REGIST_SERVER,REGIST_PORT);
  41. }
  42. }
  43. }
  44. static void packRegistDataAndSend(void)
  45. {
  46. int i=0;
  47. int datalen = 0;
  48. uint8_t data[50]={0};
  49. const char *CCID_SIGN = "+QCCID: ";
  50. char *ccidStr = NULL;
  51. memset(registData,0, sizeof(registData));
  52. char* dataPtr = registData+2;
  53. byteToHexStr(mcu_id, dataPtr, sizeof(mcu_id));
  54. // memcpy(dataPtr+strlen(dataPtr),"&",1);
  55. // memcpy(dataPtr+strlen(dataPtr),PRODUCT_KEY,strlen(PRODUCT_KEY));
  56. //复制CCID
  57. at_module_cmd_back("AT+QCCID\r\n",(char*)data,sizeof(data));
  58. // UsartPrintf(USART_DEBUG,"QCCID:%s\r\n",data);
  59. memcpy(dataPtr+strlen(dataPtr),"&",1);
  60. ccidStr = strstr((const char*)data,CCID_SIGN);
  61. if(ccidStr && strlen(ccidStr)>0)
  62. {
  63. ccidStr+=strlen(CCID_SIGN);
  64. memcpy(dataPtr+strlen(dataPtr),ccidStr,20);
  65. }
  66. //复制版本号
  67. snprintf(dataPtr+strlen(dataPtr),10,"&%d.%03d",Version_data/1000,Version_data%1000);
  68. UsartPrintf(USART_DEBUG,"device data:%s\r\n",dataPtr);
  69. datalen = ECBAesEncrypt((unsigned char*)dataPtr, expansionkey, 10); //2、AES 加密
  70. registData[0] = datalen>>8;
  71. registData[1] = datalen;
  72. at_module_send_rai(registData,datalen+2,KEPP_RRC);
  73. }
  74. //处理Coap注册信息,0: 成功, 1: 失败
  75. static int handleRegistInfo(void)
  76. {
  77. int flag = 1;
  78. //char str_mcu_id[20]={0};
  79. cJSON *json = NULL,*json_address=NULL,*json_port=NULL,*json_productKey = NULL,*json_deviceName = NULL,*json_deviceSecret = NULL,*json_code = NULL;
  80. json = cJSON_Parse(valid_data.buf);
  81. if(!json)
  82. {
  83. UsartPrintf(USART_DEBUG, "json parse error,%s\r\n",cJSON_GetErrorPtr());
  84. goto end;
  85. }
  86. json_code = cJSON_GetObjectItem(json,"code");
  87. json_address = cJSON_GetObjectItem(json,"address");
  88. json_port = cJSON_GetObjectItem(json,"port");
  89. json_productKey = cJSON_GetObjectItem(json,"productKey");
  90. json_deviceName = cJSON_GetObjectItem(json,"deviceName");
  91. json_deviceSecret = cJSON_GetObjectItem(json,"deviceSecret");
  92. if(json_productKey)
  93. {
  94. memset(registInfo,0,sizeof(RegistInfo));
  95. registInfo->flag='Y';
  96. //byteToHexStr(mcu_id, str_mcu_id, sizeof(mcu_id));
  97. memcpy(registInfo->address,json_address->valuestring,strlen(json_address->valuestring));
  98. memcpy(registInfo->port,json_port->valuestring,strlen(json_port->valuestring));
  99. memcpy(registInfo->productKey,json_productKey->valuestring,strlen(json_productKey->valuestring));
  100. memcpy(registInfo->deviceName,json_deviceName->valuestring,strlen(json_deviceName->valuestring));
  101. memcpy(registInfo->deviceSecret,json_deviceSecret->valuestring,strlen(json_deviceSecret->valuestring));
  102. WriteProgramData();
  103. flag = 0;
  104. }
  105. end:
  106. cJSON_Delete(json);
  107. return flag;
  108. }
  109. void DeviceRegist()
  110. {
  111. int flag = 1; //0:成功,1 失败
  112. if(registInfo->flag == 'Y')
  113. {
  114. return;
  115. }
  116. ScheduleKey(key, expansionkey, 4, 10); //1、密钥扩展生成
  117. DrawRegistingPicture();
  118. while(1)
  119. {
  120. ModuleKeepLine();
  121. at_module_handle_event();
  122. if(tcp_connect_status == TCP_OPEN)
  123. {
  124. TaskSchedulerFlag.NET_ONLINE_FLAG = TASK_FLAG_SET;//模块联网
  125. DrawSignalDisplay();
  126. packRegistDataAndSend(); //远程注册设备
  127. delay_ms(5000);
  128. at_module_handle_event();
  129. UsartPrintf(USART_DEBUG, "AesDecrypt valid_data len,%d\r\n",valid_data.len);
  130. if(valid_data.len>0)
  131. {
  132. if(valid_data.len%AES_BLOCK_SIZE == 0)
  133. {
  134. ECBAesDecrypt((unsigned char*)valid_data.buf,valid_data.len, expansionkey, 10);//AES 解密
  135. UsartPrintf(USART_DEBUG, "AesDecrypt valid_data,%s\r\n",valid_data.buf);
  136. flag = handleRegistInfo();
  137. valid_data_clear(); //清除有效数据
  138. }
  139. else
  140. {
  141. UsartPrintf(USART_DEBUG, "AesDecrypt valid_data length error\r\n");
  142. }
  143. }
  144. if(flag)
  145. {
  146. DrawRegistFailPicture();
  147. }
  148. else
  149. {
  150. DrawRegistSucPicture();
  151. }
  152. at_module_close();
  153. TaskSchedulerFlag.NET_ONLINE_FLAG = TASK_FLAG_CLEAR;//模块断网
  154. Delay_ms(1000);
  155. break;
  156. }
  157. if(registModuleStartCou == 3)
  158. {
  159. DrawRegistFailPicture();
  160. Delay_ms(1000);
  161. break;
  162. }
  163. }
  164. }