Bc260y_Regist.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. #include "CONFIG.h"
  2. #if BC260Y
  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 "bc260y.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. static uint16_t Version_data = 1032;
  34. static uint8_t regist_result =0;
  35. static uint8_t register_status;//注册成功,向flash存储标志
  36. static Coefficient_Data flashdata;
  37. //uint8_t registlen=0;
  38. unsigned char key[17]="tuorenzhinenghua";
  39. static uint8_t tcpconnectID = 2;
  40. static char * REGIST_SERVER ="8337239yf4.yicp.fun" ; //注册服务器地址
  41. static uint16_t REGIST_PORT=22155; //端口号
  42. static char qcciddata[31]={0};//
  43. static char recvdata[512]={0};//和registData共用
  44. //清空flash
  45. void clearflash(void){
  46. flashdata.read_flag=0;
  47. memcpy(flashdata.deviceSecret,"0",40);
  48. memcpy(flashdata.productKey,"0",20);
  49. memcpy(flashdata.deviceName,"0",20);
  50. delay_ms(10);
  51. STMFLASH_Write(FLASH_SAVE_ADDR,(uint16_t*)&flashdata,sizeof(flashdata));
  52. }
  53. void storedata(void){
  54. flashdata.read_flag=1;
  55. Log_Printf_Debug("###########\r\n");
  56. Log_Printf_Debug("deviceSecret:%s,productKey:%s,deviceName:%s,read_flag:%d\r\n",flashdata.deviceSecret,flashdata.productKey,flashdata.deviceName,flashdata.read_flag);
  57. Log_Printf_Debug("结构体大小: %d\r\n", sizeof(Coefficient_Data));
  58. delay_ms(10);
  59. STMFLASH_Write(FLASH_SAVE_ADDR,(uint16_t*)&flashdata,sizeof(flashdata));
  60. flashdata.read_flag=0;
  61. delay_ms(10);
  62. Log_Printf_Debug("写入数据完成\r\n");
  63. STMFLASH_Read(FLASH_SAVE_ADDR,(uint16_t*)&flashdata,sizeof(flashdata));
  64. Log_Printf_Debug("读取完成read_flag:%d,deviceSecret:%s,productKey:%s,deviceName:%s\r\n",flashdata.read_flag,flashdata.deviceSecret,flashdata.productKey,flashdata.deviceName);
  65. }
  66. /**
  67. *
  68. *注册信息打包
  69. */
  70. enum Result packRegistDataAnd(uint8_t *length){
  71. enum Result result = Result_None;
  72. // int i=0;
  73. int datalen = 0;
  74. memset(qcciddata,'\0',sizeof(qcciddata));
  75. memset(recvdata,'\0', sizeof(recvdata));
  76. char* dataPtr = recvdata+2; //dataPtr指针指向registData第三个字节
  77. //复制muid,并转化为16进制
  78. byteToHexStr(mcu_id, dataPtr, sizeof(mcu_id));
  79. memcpy(dataPtr+strlen(dataPtr),"&",1);
  80. //获取qccid
  81. AT_Clear();
  82. result=bc260y.query_qccid_sync(qcciddata);
  83. if(result==Result_Failed)
  84. {
  85. return result;
  86. }
  87. //获取复制qccid
  88. memcpy(dataPtr+strlen(dataPtr),qcciddata,31);
  89. //复制版本号
  90. snprintf(dataPtr+strlen(dataPtr),10,"&%d.%03d",Version_data/1000,Version_data%1000);
  91. Log_Printf_Debug("device data:%s,%d\r\n",dataPtr,strlen(dataPtr));//串口打印
  92. Log_Printf_Debug("regist data:%s\r\n",recvdata+2);
  93. datalen = utils_aes128_ECB_base64_enc_with_length((char *)key,(uint8_t *)dataPtr);
  94. recvdata[0] = datalen>>8;//头2个字节赋值数据长度
  95. recvdata[1] = datalen;
  96. Log_Printf_Debug("strlendata:%d,datalen=%d\r\n",strlen(dataPtr),datalen);
  97. *length=datalen+2;
  98. return Result_Success;
  99. }
  100. /**
  101. *
  102. *注册数据解密
  103. */
  104. enum Result analysis_recvdata()
  105. {
  106. enum Result result = Result_None;
  107. uint16_t recvdata_length=0;
  108. cJSON *json = NULL,*json_productKey = NULL,*json_deviceName = NULL,*json_deviceSecret = NULL;
  109. memset(recvdata, '\0', sizeof(recvdata));
  110. result =bc260y.recv_with_time_sync(tcpconnectID,(uint8_t *)recvdata,&recvdata_length,10000);
  111. if(result==Result_Failed)
  112. {
  113. return result;
  114. }
  115. Log_Printf_Debug("recvdata:%d",strlen(recvdata));
  116. utils_aes128_ECB_base64_dec((char *)key,(unsigned char*)recvdata,recvdata_length);
  117. Log_Printf_Debug("解密数据recvdata:%s,%d,%d\r\n",recvdata,strlen(recvdata),recvdata_length);
  118. json = cJSON_Parse(recvdata);
  119. if(!json)
  120. {
  121. Log_Printf_Debug("json parse error,%s\r\n",cJSON_GetErrorPtr());
  122. cJSON_Delete(json);
  123. return Result_Failed;
  124. }else{
  125. json_deviceSecret = cJSON_GetObjectItem(json,"deviceSecret");
  126. json_productKey = cJSON_GetObjectItem(json,"productKey");
  127. json_deviceName = cJSON_GetObjectItem(json,"deviceName");
  128. Log_Printf_Debug("获取数据成功deviceSecret:%s,json_productKey:%s,deviceName:%s\r\n",json_deviceSecret->valuestring,json_productKey->valuestring,json_deviceName->valuestring);
  129. strcpy(flashdata.deviceSecret,json_deviceSecret->valuestring);
  130. strcpy(flashdata.productKey,json_productKey->valuestring);
  131. strcpy(flashdata.deviceName,json_deviceName->valuestring);
  132. memset(&register_status, 1, sizeof(register_status));
  133. cJSON_Delete(json);
  134. return Result_Success;
  135. }
  136. }
  137. uint8_t regist_Handle()
  138. {
  139. uint8_t stat,length=0;
  140. uint16_t lac,err=0;
  141. uint32_t ci=0;
  142. enum Result result = Result_None;
  143. GPIO_SetBits(WAKE_GPIO, WAKE_GPIO_Pin);
  144. bc260y.exit_sleep_sync();//退出休眠
  145. delay_ms(100);
  146. bc260y.reset();
  147. result = bc260y.set_qisde_sync(0);//关闭回显
  148. if(result==Result_Failed)
  149. {
  150. return 0;
  151. }
  152. result=bc260y.set_sleep_sync(1);//设置休眠模式
  153. if(result==Result_Failed)
  154. {
  155. return 0;
  156. }
  157. result=bc260y.set_cfun_sync(1);//设置全功能模式
  158. if(result==Result_Failed)
  159. {
  160. return 0;
  161. }
  162. result=bc260y.set_cgreg_sync(2);//设置网络状态
  163. if(result==Result_Failed)
  164. {
  165. return 0;
  166. }
  167. for(int i=0;i<20;i++){
  168. delay_ms(400);
  169. result=bc260y.query_cgreg_sync(&regist_result,&stat,&lac,&ci);//循环查询网络状态最多20次
  170. if(stat==1)
  171. {i=20;
  172. }
  173. }
  174. if(result==Result_Failed)
  175. {
  176. return 0;
  177. }
  178. if(stat==0)
  179. {
  180. Log_Printf_Debug(" stat=%d\r\n", stat);
  181. return 0;
  182. }
  183. result =(enum Result)packRegistDataAnd(&length);//数据打包
  184. if(result==Result_Failed)
  185. {
  186. return 0;
  187. }
  188. result=bc260y.close_socket_sync(tcpconnectID);//防止以前链接没断开,断开tcp链接
  189. if(result==Result_Failed)
  190. {
  191. Log_Printf_Debug(" result=%d\r\n", result);
  192. return 0;
  193. }
  194. //tcp连接流程
  195. result=bc260y.open_socket_sync(tcpconnectID,"TCP",REGIST_SERVER,REGIST_PORT,1,&err);//连接tcp
  196. if(result==Result_Failed)
  197. {
  198. Log_Printf_Debug(" result=%d\r\n", result);
  199. return 0;
  200. }
  201. result = bc260y.dataformat_sync(1);//配置发送数据格式
  202. if(result==Result_Failed)
  203. {
  204. return 0;
  205. }
  206. result =bc260y.send_sync(tcpconnectID,(uint8_t *)recvdata,length);//数据发送
  207. if(result==Result_Failed)
  208. {
  209. return 0;
  210. }
  211. result =analysis_recvdata();
  212. if(result==Result_Failed)
  213. {
  214. return 0;
  215. }
  216. result=bc260y.close_socket_sync(tcpconnectID);//断开tcp连接
  217. if(result==Result_Failed)
  218. {
  219. return 0;
  220. }
  221. bc260y.enter_sleep();//进入休眠状态
  222. return 1;
  223. }
  224. uint8_t regist_device_sync(void)
  225. {
  226. flashdata.read_flag=0;
  227. uint8_t regist_flag=0;
  228. //读取flash
  229. Log_Printf_Debug("读取前read_flag:%d\r\n",flashdata.read_flag);
  230. STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)&flashdata,sizeof(flashdata));//读取flash
  231. delay_ms(10);
  232. //已经注册。读取flash成功
  233. if(flashdata.read_flag==1)
  234. {
  235. 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);
  236. register_status=1;
  237. return 1;
  238. }
  239. //未注册开始注册流程
  240. regist_flag=regist_Handle();//注册流程
  241. if(regist_flag==0)//注册流程失败不储存flash
  242. {
  243. flashdata.read_flag=0;
  244. register_status=0;
  245. clearflash();
  246. return 0;
  247. }
  248. //注册成功向flash储存
  249. if(register_status==1){
  250. storedata();//存储到flash
  251. return 1;
  252. }
  253. else
  254. {
  255. Log_Printf_Debug("注册失败。。。regist_flag:%d,register_status:%d\r\n",regist_flag,register_status);
  256. return 0;
  257. }
  258. }
  259. enum Regist_Result regist_get_result(void)
  260. {
  261. if(register_status==1){
  262. return Regist_Result_Success;
  263. }
  264. else
  265. {
  266. return Regist_Result_Failure;
  267. }
  268. }
  269. char * regist_get_aliyun_productKey(void)
  270. {
  271. return flashdata.productKey;
  272. }
  273. char * regist_get_aliyun_deviceName(void)
  274. {
  275. return flashdata.deviceName;
  276. }
  277. char * regist_get_aliyun_deviceSecret(void)
  278. {
  279. return flashdata.deviceSecret;
  280. }
  281. #endif