Regist.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. /**
  2. ******************************************************************************
  3. * 版 本 :V1.0.0
  4. * 作 者 :liuyanbin
  5. * 版权所有,盗版必究。
  6. * Copyright(C) All rights reserved
  7. ******************************************************************************
  8. * 历史记录
  9. * 序号 版本 变更内容 作者 日期
  10. * 1 V0.0.1 实现4G注册 刘艳斌 2023/12/20
  11. * 2 V0.0.2 实现NB注册 刘艳斌 2023/12/20
  12. * 3 V0.0.3 整合4g和nb 刘艳斌 2024/1/24
  13. *
  14. ******************************************************************************
  15. */
  16. #include "stm32f10x.h"
  17. #include "Regist.h"
  18. #include "AT.h"
  19. #include "ec800m.h"
  20. #include "bc260.h"
  21. #include "INflash.h"
  22. #include "sys.h"
  23. #include <stdio.h>
  24. #include <stdarg.h>
  25. #include <string.h>
  26. #include <stdlib.h>
  27. #include "cJSON.h"
  28. #include "Delay.h"
  29. #include "mbedtls_util.h"
  30. #if NBFLAG
  31. uint8_t mcu_id[8]="8945809";
  32. #else
  33. uint8_t mcu_id[8]="ceshi001";
  34. #endif
  35. uint16_t Version_data = 1032;
  36. uint8_t regist_result =0;
  37. //uint8_t registlen=0;
  38. extern struct AT_Struct AT;
  39. unsigned char key[17]="tuorenzhinenghua";
  40. extern Coefficient_Data flashdata;
  41. extern uint8_t register_success;
  42. //static uint8_t tcpcontextID = 1;
  43. static uint8_t tcpconnectID = 2;
  44. static char * REGIST_SERVER ="8337239yf4.yicp.fun" ; //注册服务器地址
  45. static uint16_t REGIST_PORT=22155; //端口号
  46. char qcciddata[31]={0};//
  47. //char registData[100] = {0};
  48. char recvdata[512]={0};//和registData共用
  49. /**
  50. *
  51. *注册信息打包
  52. */
  53. enum Result packRegistDataAnd(uint8_t *length){
  54. enum Result result = Result_None;
  55. // int i=0;
  56. int datalen = 0;
  57. memset(qcciddata,'\0',sizeof(qcciddata));
  58. memset(recvdata,'\0', sizeof(recvdata));
  59. char* dataPtr = recvdata+2; //dataPtr指针指向registData第三个字节
  60. //复制muid,并转化为16进制
  61. byteToHexStr(mcu_id, dataPtr, sizeof(mcu_id));
  62. memcpy(dataPtr+strlen(dataPtr),"&",1);
  63. //获取qccid
  64. AT_Clear();
  65. //get_qccid_flag=get_qccid(qcciddata);
  66. #if NBFLAG
  67. result=bc260y.query_qccid_sync(qcciddata);
  68. #endif
  69. #if _4GFLAG
  70. result=ec800m.query_qccid_sync(qcciddata);
  71. #endif
  72. if(result==Result_Failed)
  73. {
  74. return result;
  75. }
  76. //获取复制qccid
  77. memcpy(dataPtr+strlen(dataPtr),qcciddata,31);
  78. //复制版本号
  79. snprintf(dataPtr+strlen(dataPtr),10,"&%d.%03d",Version_data/1000,Version_data%1000);
  80. Log_Printf_Debug("device data:%s,%d\r\n",dataPtr,strlen(dataPtr));//串口打印
  81. Log_Printf_Debug("regist data:%s\r\n",recvdata+2);
  82. datalen = utils_aes128_ECB_base64_enc_with_length((char *)key,(uint8_t *)dataPtr);
  83. recvdata[0] = datalen>>8;//头2个字节赋值数据长度
  84. recvdata[1] = datalen;
  85. Log_Printf_Debug("strlendata:%d,datalen=%d\r\n",strlen(dataPtr),datalen);
  86. *length=datalen+2;
  87. return Result_Success;
  88. }
  89. /**
  90. *
  91. *注册数据解密
  92. */
  93. enum Result analysis_recvdata()
  94. {
  95. enum Result result = Result_None;
  96. uint16_t recvdata_length=0;
  97. cJSON *json = NULL,*json_productKey = NULL,*json_deviceName = NULL,*json_deviceSecret = NULL;
  98. memset(recvdata, '\0', sizeof(recvdata));
  99. #if NBFLAG
  100. result =bc260y.recv_with_time_sync(tcpconnectID,(uint8_t *)recvdata,&recvdata_length,10000);
  101. #endif
  102. #if _4GFLAG
  103. result =ec800m.recv_with_time_sync(tcpconnectID,(uint8_t *)recvdata,&recvdata_length,10000);
  104. #endif
  105. if(result==Result_Failed)
  106. {
  107. return result;
  108. }
  109. Log_Printf_Debug("recvdata:%d",strlen(recvdata));
  110. utils_aes128_ECB_base64_dec((char *)key,(unsigned char*)recvdata,recvdata_length);
  111. Log_Printf_Debug("解密数据recvdata:%s,%d,%d\r\n",recvdata,strlen(recvdata),recvdata_length);
  112. json = cJSON_Parse(recvdata);
  113. if(!json)
  114. {
  115. Log_Printf_Debug("json parse error,%s\r\n",cJSON_GetErrorPtr());
  116. cJSON_Delete(json);
  117. return Result_Failed;
  118. }else{
  119. json_deviceSecret = cJSON_GetObjectItem(json,"deviceSecret");
  120. json_productKey = cJSON_GetObjectItem(json,"productKey");
  121. json_deviceName = cJSON_GetObjectItem(json,"deviceName");
  122. Log_Printf_Debug("获取数据成功deviceSecret:%s,json_productKey:%s,deviceName:%s\r\n",json_deviceSecret->valuestring,json_productKey->valuestring,json_deviceName->valuestring);
  123. strcpy(flashdata.deviceSecret,json_deviceSecret->valuestring);
  124. strcpy(flashdata.productKey,json_productKey->valuestring);
  125. strcpy(flashdata.deviceName,json_deviceName->valuestring);
  126. memset(&register_success, 1, sizeof(register_success));
  127. cJSON_Delete(json);
  128. return Result_Success;
  129. }
  130. }
  131. #if NBFLAG
  132. uint8_t regist_Handle()
  133. {
  134. uint8_t stat,length=0;
  135. uint16_t lac,err=0;
  136. uint32_t ci=0;
  137. enum Result result = Result_None;
  138. GPIO_SetBits(WAKE_GPIO, WAKE_GPIO_Pin);
  139. bc260y.exit_sleep_sync();//退出休眠
  140. delay_ms(100);
  141. bc260y.reset();
  142. result = bc260y.set_qisde_sync(0);//关闭回显
  143. if(result==Result_Failed)
  144. {
  145. return 0;
  146. }
  147. result=bc260y.set_sleep_sync(1);//设置休眠模式
  148. if(result==Result_Failed)
  149. {
  150. return 0;
  151. }
  152. result=bc260y.set_cfun_sync(1);//设置全功能模式
  153. if(result==Result_Failed)
  154. {
  155. return 0;
  156. }
  157. result=bc260y.set_cgreg_sync(2);//设置网络状态
  158. if(result==Result_Failed)
  159. {
  160. return 0;
  161. }
  162. for(int i=0;i<20;i++){
  163. delay_ms(400);
  164. result=bc260y.query_cgreg_sync(&regist_result,&stat,&lac,&ci);//循环查询网络状态最多20次
  165. if(stat==1)
  166. {i=20;
  167. }
  168. }
  169. if(result==Result_Failed)
  170. {
  171. return 0;
  172. }
  173. if(stat==0)
  174. {
  175. Log_Printf_Debug(" stat=%d\r\n", stat);
  176. return 0;
  177. }
  178. result =(enum Result)packRegistDataAnd(&length);//数据打包
  179. if(result==Result_Failed)
  180. {
  181. return 0;
  182. }
  183. result=bc260y.close_socket_sync(tcpconnectID);//防止以前链接没断开,断开tcp链接
  184. if(result==Result_Failed)
  185. {
  186. Log_Printf_Debug(" result=%d\r\n", result);
  187. return 0;
  188. }
  189. //tcp连接流程
  190. result=bc260y.open_socket_sync(tcpconnectID,"TCP",REGIST_SERVER,REGIST_PORT,1,&err);//连接tcp
  191. if(result==Result_Failed)
  192. {
  193. Log_Printf_Debug(" result=%d\r\n", result);
  194. return 0;
  195. }
  196. result = bc260y.dataformat_sync(1);//配置发送数据格式
  197. if(result==Result_Failed)
  198. {
  199. return 0;
  200. }
  201. result =bc260y.send_sync(tcpconnectID,(uint8_t *)recvdata,length);//数据发送
  202. if(result==Result_Failed)
  203. {
  204. return 0;
  205. }
  206. result =analysis_recvdata();
  207. if(result==Result_Failed)
  208. {
  209. return 0;
  210. }
  211. result=bc260y.close_socket_sync(tcpconnectID);//断开tcp连接
  212. if(result==Result_Failed)
  213. {
  214. return 0;
  215. }
  216. bc260y.enter_sleep();//进入休眠状态
  217. return 1;
  218. }
  219. #endif
  220. #if _4GFLAG
  221. //4G模块注册流程
  222. uint8_t regist_Handle()
  223. {
  224. uint8_t stat,length=0;
  225. uint16_t lac,err=0;
  226. uint32_t ci=0;
  227. enum Result result = Result_None;
  228. ec800m.exit_sleep();//退出休眠
  229. delay_ms(10);
  230. result=ec800m.set_sleep_sync(1);//设置休眠模式
  231. if(result==Result_Success)
  232. {
  233. result=ec800m.set_cfun_sync(1);//设置全功能模式
  234. }
  235. if(result==Result_Success)
  236. {
  237. result=ec800m.set_cgreg_sync(2);//设置网络状态
  238. }
  239. if(result==Result_Success)
  240. {
  241. for(int i=0;i<20;i++){
  242. delay_ms(400);
  243. result=ec800m.query_cgreg_sync(&regist_result,&stat,&lac,&ci);//循环查询网络状态最多20次
  244. if(stat==1)
  245. {i=20;
  246. }
  247. }
  248. }
  249. if(result==Result_Success&&stat==1)
  250. {
  251. //tcp连接流程
  252. result=ec800m.open_socket_sync(tcpconnectID,"TCP",REGIST_SERVER,REGIST_PORT,1,&err);//连接tcp
  253. }
  254. if(result==Result_Success)
  255. {
  256. result =(enum Result)packRegistDataAnd(&length);//数据打包
  257. Log_Printf_Debug("data length=%d\r\n", length);
  258. }
  259. if(result==Result_Success)
  260. {
  261. result = ec800m.set_qisde_sync(0);//关闭回显
  262. }
  263. if(result==Result_Success)
  264. {
  265. result =ec800m.send_sync(tcpconnectID,(uint8_t *)recvdata,length);//数据发送
  266. }
  267. if(result==Result_Success)
  268. {
  269. result =analysis_recvdata();
  270. }
  271. if(result==Result_Success)
  272. {
  273. result=ec800m.close_socket_sync(tcpconnectID);//断开tcp连接
  274. }
  275. ec800m.set_cfun_sync(0);//设置最小功能模式
  276. ec800m.enter_sleep();//进入休眠状态
  277. if(result==Result_Success)
  278. {
  279. return 1;
  280. }
  281. else
  282. {
  283. return 0;
  284. }
  285. }
  286. #endif
  287. uint8_t regist_device(void)
  288. {
  289. flashdata.read_flag=0;
  290. uint8_t regist_flag=0;
  291. Log_Printf_Debug("读取前read_flag:%d\r\n",flashdata.read_flag);
  292. STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&flashdata,sizeof(flashdata));//读取flash
  293. delay_ms(10);
  294. if(flashdata.read_flag==1)
  295. {
  296. 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);
  297. return 1;
  298. }
  299. regist_flag=regist_Handle();//注册流程
  300. if(regist_flag==0)//注册流程失败不储存flash
  301. {
  302. flashdata.read_flag=0;
  303. return 0;
  304. }
  305. store();//存储到flash
  306. return 1;
  307. }