Regist.c 5.9 KB

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