Ec800m_Regist.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #include "CONFIG.h"
  2. #if EC800M
  3. /**
  4. ******************************************************************************
  5. * 版 本 :V1.0.0
  6. * 作 者 :liuyanbin
  7. * 版权所有,盗版必究。
  8. * Copyright(C) All rights reserved
  9. ******************************************************************************
  10. * 历史记录
  11. * 序号 版本 变更内容 作者 日期
  12. * 1 V0.0.1 实现4G注册 刘艳斌 2023/12/20
  13. * 2 V0.0.2 实现NB注册 刘艳斌 2023/12/20
  14. * 3 V0.0.3 整合4g和nb 刘艳斌 2024/1/24
  15. *
  16. ******************************************************************************
  17. */
  18. #include "stm32f10x.h"
  19. #include "Regist.h"
  20. #include "ec800m.h"
  21. #include "INflash.h"
  22. #include <stdio.h>
  23. #include <stdarg.h>
  24. #include <string.h>
  25. #include <stdlib.h>
  26. #include "cJSON.h"
  27. #include "Delay.h"
  28. #include "mbedtls_util.h"
  29. #include "Log_Module.h"
  30. #include "At_Module.h"
  31. #include "Common_Util.h"
  32. static uint8_t mcu_id[8]="8945809";
  33. uint16_t Version_data = 1032;
  34. uint8_t regist_result =0;
  35. //uint8_t registlen=0;
  36. unsigned char key[17]="tuorenzhinenghua";
  37. extern Coefficient_Data flashdata;
  38. extern uint8_t register_success;
  39. //static uint8_t tcpcontextID = 1;
  40. static uint8_t tcpconnectID = 2;
  41. static char * REGIST_SERVER ="8337239yf4.yicp.fun" ; //注册服务器地址
  42. static uint16_t REGIST_PORT=22155; //端口号
  43. static char qcciddata[31]={0};//
  44. //char registData[100] = {0};
  45. static char recvdata[512]={0};//和registData共用
  46. /**
  47. *
  48. *注册信息打包
  49. */
  50. enum Result packRegistDataAnd(uint8_t *length){
  51. enum Result result = Result_None;
  52. // int i=0;
  53. int datalen = 0;
  54. memset(qcciddata,'\0',sizeof(qcciddata));
  55. memset(recvdata,'\0', sizeof(recvdata));
  56. char* dataPtr = recvdata+2; //dataPtr指针指向registData第三个字节
  57. //复制muid,并转化为16进制
  58. byteToHexStr(mcu_id, dataPtr, sizeof(mcu_id));
  59. memcpy(dataPtr+strlen(dataPtr),"&",1);
  60. //获取qccid
  61. AT_Clear();
  62. //get_qccid_flag=get_qccid(qcciddata);
  63. result=ec800m.query_qccid_sync(qcciddata);
  64. if(result==Result_Failed)
  65. {
  66. return result;
  67. }
  68. //获取复制qccid
  69. memcpy(dataPtr+strlen(dataPtr),qcciddata,31);
  70. //复制版本号
  71. snprintf(dataPtr+strlen(dataPtr),10,"&%d.%03d",Version_data/1000,Version_data%1000);
  72. Log_Printf_Debug("device data:%s,%d\r\n",dataPtr,strlen(dataPtr));//串口打印
  73. Log_Printf_Debug("regist data:%s\r\n",recvdata+2);
  74. datalen = utils_aes128_ECB_base64_enc_with_length((char *)key,(uint8_t *)dataPtr);
  75. recvdata[0] = datalen>>8;//头2个字节赋值数据长度
  76. recvdata[1] = datalen;
  77. Log_Printf_Debug("strlendata:%d,datalen=%d\r\n",strlen(dataPtr),datalen);
  78. *length=datalen+2;
  79. return Result_Success;
  80. }
  81. /**
  82. *
  83. *注册数据解密
  84. */
  85. enum Result analysis_recvdata()
  86. {
  87. enum Result result = Result_None;
  88. uint16_t recvdata_length=0;
  89. cJSON *json = NULL,*json_productKey = NULL,*json_deviceName = NULL,*json_deviceSecret = NULL;
  90. memset(recvdata, '\0', sizeof(recvdata));
  91. result =ec800m.recv_with_time_sync(tcpconnectID,(uint8_t *)recvdata,&recvdata_length,10000);
  92. if(result==Result_Failed)
  93. {
  94. return result;
  95. }
  96. Log_Printf_Debug("recvdata:%d",strlen(recvdata));
  97. utils_aes128_ECB_base64_dec((char *)key,(unsigned char*)recvdata,recvdata_length);
  98. Log_Printf_Debug("解密数据recvdata:%s,%d,%d\r\n",recvdata,strlen(recvdata),recvdata_length);
  99. json = cJSON_Parse(recvdata);
  100. if(!json)
  101. {
  102. Log_Printf_Debug("json parse error,%s\r\n",cJSON_GetErrorPtr());
  103. cJSON_Delete(json);
  104. return Result_Failed;
  105. }else{
  106. json_deviceSecret = cJSON_GetObjectItem(json,"deviceSecret");
  107. json_productKey = cJSON_GetObjectItem(json,"productKey");
  108. json_deviceName = cJSON_GetObjectItem(json,"deviceName");
  109. Log_Printf_Debug("获取数据成功deviceSecret:%s,json_productKey:%s,deviceName:%s\r\n",json_deviceSecret->valuestring,json_productKey->valuestring,json_deviceName->valuestring);
  110. strcpy(flashdata.deviceSecret,json_deviceSecret->valuestring);
  111. strcpy(flashdata.productKey,json_productKey->valuestring);
  112. strcpy(flashdata.deviceName,json_deviceName->valuestring);
  113. memset(&register_success, 1, sizeof(register_success));
  114. cJSON_Delete(json);
  115. return Result_Success;
  116. }
  117. }
  118. //4G模块注册流程
  119. uint8_t regist_Handle()
  120. {
  121. uint8_t stat,length=0;
  122. uint16_t lac,err=0;
  123. uint32_t ci=0;
  124. enum Result result = Result_None;
  125. ec800m.exit_sleep();//退出休眠
  126. delay_ms(10);
  127. result=ec800m.set_sleep_sync(1);//设置休眠模式
  128. if(result==Result_Success)
  129. {
  130. result=ec800m.set_cfun_sync(1);//设置全功能模式
  131. }
  132. if(result==Result_Success)
  133. {
  134. result=ec800m.set_cgreg_sync(2);//设置网络状态
  135. }
  136. if(result==Result_Success)
  137. {
  138. for(int i=0;i<20;i++){
  139. delay_ms(400);
  140. result=ec800m.query_cgreg_sync(&regist_result,&stat,&lac,&ci);//循环查询网络状态最多20次
  141. if(stat==1)
  142. {i=20;
  143. }
  144. }
  145. }
  146. if(result==Result_Success&&stat==1)
  147. {
  148. //tcp连接流程
  149. result=ec800m.open_socket_sync(tcpconnectID,"TCP",REGIST_SERVER,REGIST_PORT,1,&err);//连接tcp
  150. }
  151. if(result==Result_Success)
  152. {
  153. result =(enum Result)packRegistDataAnd(&length);//数据打包
  154. Log_Printf_Debug("data length=%d\r\n", length);
  155. }
  156. if(result==Result_Success)
  157. {
  158. result = ec800m.set_qisde_sync(0);//关闭回显
  159. }
  160. if(result==Result_Success)
  161. {
  162. result =ec800m.send_sync(tcpconnectID,(uint8_t *)recvdata,length);//数据发送
  163. }
  164. if(result==Result_Success)
  165. {
  166. result =analysis_recvdata();
  167. }
  168. if(result==Result_Success)
  169. {
  170. result=ec800m.close_socket_sync(tcpconnectID);//断开tcp连接
  171. }
  172. ec800m.set_cfun_sync(0);//设置最小功能模式
  173. ec800m.enter_sleep();//进入休眠状态
  174. if(result==Result_Success)
  175. {
  176. return 1;
  177. }
  178. else
  179. {
  180. return 0;
  181. }
  182. }
  183. uint8_t regist_device_sync(void)
  184. {
  185. flashdata.read_flag=0;
  186. uint8_t regist_flag=0;
  187. Log_Printf_Debug("读取前read_flag:%d\r\n",flashdata.read_flag);
  188. STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&flashdata,sizeof(flashdata));//读取flash
  189. delay_ms(10);
  190. if(flashdata.read_flag==1)
  191. {
  192. Log_Printf_Debug("读取flash成功read_flag:%d,\ndeviceSecret:%s,\n productKey:%s,\ndeviceName:%s\r\n",flashdata.read_flag,flashdata.deviceSecret,flashdata.productKey,flashdata.deviceName);
  193. return 1;
  194. }
  195. regist_flag=regist_Handle();//注册流程
  196. if(regist_flag==0)//注册流程失败不储存flash
  197. {
  198. flashdata.read_flag=0;
  199. return 0;
  200. }
  201. store();//存储到flash
  202. return 1;
  203. }
  204. #endif