Regist.c 8.9 KB

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