Bc260y_Regist.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. #include "CONFIG.h"
  2. #if BC260Y
  3. #include "stm32f10x.h"
  4. #include "Regist.h"
  5. #include "FlashSetup.h"
  6. #include <stdio.h>
  7. #include <stdarg.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #include "cJSON.h"
  11. #include "mbedtls_util.h"
  12. #include "Log_Module.h"
  13. #include "At_Module.h"
  14. #include "Common_Util.h"
  15. #include "Tuoreniot.h"
  16. #include "bc260y.h"
  17. // 泵号
  18. extern uint8_t mcu_id[8];
  19. // socket ID
  20. static uint8_t connectID = 2;
  21. // 注册参数
  22. static struct TUORENIOT_RegistRequestStruct regist_request = {
  23. .version = 1,
  24. .platform = "aliyun",
  25. .networkProtocol = "CoAP",
  26. .deviceId = "3431228A1936013C",
  27. .userId = 4562
  28. };
  29. // dns
  30. static char pridnsaddr[20];
  31. /**
  32. *
  33. *注册参数信息打包
  34. */
  35. void TUORENIOT_PackRegistRequest(uint8_t * pack_data, uint16_t * pack_data_length, struct TUORENIOT_RegistRequestStruct * registParams)
  36. {
  37. Log_Printf_Debug("mcu_id: %s\r\n", mcu_id);
  38. byteToHexStr(mcu_id, registParams->deviceId, sizeof(mcu_id));
  39. sprintf((char *)(pack_data + 2), "{\"platform\":\"%s\",\"connectionType\":\"%s\",\"deviceId\":\"%s\"}",
  40. registParams->platform, registParams->networkProtocol, registParams->deviceId); // 拼接AT指令
  41. Log_Printf_Debug("%s\r\n", (char *)(pack_data + 2));
  42. uint16_t datalen = utils_aes128_ECB_base64_enc_with_length(regist_key, (pack_data + 2));
  43. pack_data[0] = datalen>>8;//头2个字节赋值数据长度
  44. pack_data[1] = datalen;
  45. * pack_data_length = datalen + 2;
  46. }
  47. // 函数声明
  48. static void REGIST_Process(void); // 注册流程
  49. static void REGIST_SetStatus(enum REGIST_StatusEnum status); // 设置注册状态
  50. static void REGIST_SetResult(enum REGIST_ResultEnum result); // 设置注册结果
  51. static void goto_start(void); // 开始
  52. static void goto_success(void); // 成功
  53. static void goto_failure(char * _info); // 失败
  54. static void goto_finish(void); // 结束
  55. // 流程
  56. enum Step{
  57. STEP_FINISH, // 结束
  58. STEP_START, // 开始
  59. STEP_EXIT_SLEEP, // 退出睡眠
  60. STEP_WAIT, // 等待
  61. STEP_STATE, // 查询状态
  62. STEP_OPEN, // 打开
  63. STEP_SET_SLEEP, // 设置休眠
  64. STEP_SET_QISDE_0, // 关闭发送回显
  65. STEP_SET_QISDE_1, // 打开发送回显
  66. STEP_SEND, // 发送
  67. STEP_RECV, // 等待发送结果
  68. STEP_QUERY_CFUN, // 查询功能模式
  69. STEP_SET_CFUN_0, // 设置最小功能模式
  70. STEP_SET_CFUN_1, // 设置全功能模式
  71. STEP_SET_CEREG_2, // 设置ps域允许上报网络注册和位置信息
  72. STEP_QUERY_CEREG, // 查询网络注册状态
  73. STEP_DATAFORMAT, // 配置发送格式
  74. STEP_CLOSE, // 关闭
  75. STEP_SUCCESS, // 成功
  76. STEP_FAILURE, // 失败
  77. STEP_QUERY_DNS, // 查询DNS
  78. STEP_SET_DNS, // 设置DNS
  79. };
  80. // 步骤跳转时的监听
  81. static uint8_t STEP_SET_CFUN_1_times = 0; // 全功能模式的次数
  82. static uint16_t goto_step_event(uint16_t ns)
  83. {
  84. // 重置bc260y状态
  85. bc260y.reset();
  86. // 流程控制
  87. uint16_t step = ns;
  88. if(ns == STEP_SET_CFUN_1 && STEP_SET_CFUN_1_times++ >= 1)
  89. {
  90. goto_failure("重新联网次数过多");
  91. step = STEP_FAILURE;
  92. }
  93. return step;
  94. }
  95. // 流程控制
  96. static struct PCTRL_Struct pctrl = {
  97. .current_step = STEP_FINISH,
  98. .next_step = STEP_FINISH,
  99. .step_wait = STEP_WAIT,
  100. .goto_step_listener = goto_step_event,
  101. };
  102. // 备注
  103. static char info[40];
  104. // 开始
  105. static void goto_start(void)
  106. {
  107. PCTRL_GotoStep(&pctrl, STEP_START, "开始");
  108. }
  109. // 成功
  110. static void goto_success(void)
  111. {
  112. REGIST_SetResult(REGIST_Result_Success);
  113. PCTRL_GotoStep(&pctrl, STEP_SUCCESS, "成功");
  114. }
  115. // 失败
  116. static void goto_failure(char * _info)
  117. {
  118. REGIST_SetResult(REGIST_Result_Failure);
  119. memset(info, 0, sizeof(info));
  120. strcpy(info, _info);
  121. PCTRL_GotoStep(&pctrl, STEP_FAILURE, "失败");
  122. Log_Printf_Debug("info:%s!\r\n", info);
  123. }
  124. // 结束
  125. static void goto_finish(void)
  126. {
  127. REGIST_SetStatus(REGIST_Status_Done);
  128. PCTRL_GotoStep(&pctrl, STEP_FINISH, "结束");
  129. }
  130. // 注册状态
  131. static enum REGIST_StatusEnum regist_status = REGIST_Status_None;
  132. // 注册结果
  133. static enum REGIST_ResultEnum regist_result = REGIST_Result_None;
  134. // 设置注册状态
  135. static void REGIST_SetStatus(enum REGIST_StatusEnum status)
  136. {
  137. regist_status = status;
  138. }
  139. // 获取注册状态
  140. enum REGIST_StatusEnum REGIST_GetStatus(void)
  141. {
  142. return regist_status;
  143. }
  144. // 设置注册结果
  145. static void REGIST_SetResult(enum REGIST_ResultEnum result)
  146. {
  147. regist_result = result;
  148. }
  149. // 获取注册结果
  150. enum REGIST_ResultEnum REGIST_GetResult(void)
  151. {
  152. return regist_result;
  153. }
  154. // 重置注册
  155. enum EXECUTE_ResultEnum REGIST_Reset(void)
  156. {
  157. if(REGIST_GetStatus() == REGIST_Status_Being)
  158. {
  159. Log_Printf_Debug("注册流程重置错误!\r\n");
  160. return EXECUTE_Result_Failure;
  161. }
  162. REGIST_SetStatus(REGIST_Status_None);
  163. REGIST_SetResult(REGIST_Result_None);
  164. return EXECUTE_Result_Success;
  165. }
  166. // 开始注册
  167. enum EXECUTE_ResultEnum REGIST_Start(void)
  168. {
  169. REGIST_Reset();
  170. if(REGIST_GetStatus() != REGIST_Status_None)
  171. {
  172. Log_Printf_Debug("注册流程启动错误!\r\n");
  173. return EXECUTE_Result_Failure;
  174. }
  175. goto_start();
  176. REGIST_SetStatus(REGIST_Status_Being);
  177. return EXECUTE_Result_Success;
  178. }
  179. // 注册流程处理,放到大循环里
  180. void REGIST_ProcessHandle(void)
  181. {
  182. if(REGIST_GetStatus() == REGIST_Status_Being)
  183. {
  184. REGIST_Process();
  185. }
  186. }
  187. // 注册流程
  188. static enum Result result = Result_None;
  189. static uint8_t cfun_mode, mode, stat = 0;
  190. static uint16_t lac, err = 0;
  191. static uint32_t ci = 0;
  192. static void REGIST_Process()
  193. {
  194. switch(pctrl.current_step)
  195. {
  196. case STEP_START: // 开始
  197. PCTRL_GotoStep(&pctrl, STEP_EXIT_SLEEP, "退出休眠");
  198. break;
  199. case STEP_EXIT_SLEEP:
  200. result = bc260y.exit_sleep_2();//退出休眠
  201. if(result == Result_Success)
  202. {
  203. PCTRL_GotoStep(&pctrl, STEP_SET_QISDE_1, "开启回显");
  204. }
  205. else if(result == Result_Failed)
  206. {
  207. goto_failure("退出休眠失败");
  208. }
  209. break;
  210. case STEP_SET_QISDE_1:
  211. result = bc260y.set_qisde(1);//开启回显
  212. if(result == Result_Success)
  213. {
  214. PCTRL_GotoStep(&pctrl, STEP_SET_SLEEP, "设置休眠模式");
  215. }
  216. else if(result == Result_Failed)
  217. {
  218. goto_failure("开启回显失败");
  219. }
  220. break;
  221. case STEP_SET_SLEEP:
  222. result=bc260y.set_sleep(2);//设置休眠模式
  223. if(result == Result_Success)
  224. {
  225. PCTRL_GotoStep(&pctrl, STEP_DATAFORMAT, "设置数据格式");
  226. }
  227. else if(result == Result_Failed)
  228. {
  229. goto_failure("设置休眠模式失败");
  230. }
  231. break;
  232. case STEP_DATAFORMAT:
  233. result = bc260y.dataformat(1); // 设置数据格式, 十六进制
  234. if(result == Result_Success)
  235. {
  236. PCTRL_GotoStep(&pctrl, STEP_QUERY_CFUN, "查询功能模式");
  237. }
  238. else if(result == Result_Failed)
  239. {
  240. goto_failure("设置数据格式失败");
  241. }
  242. break;
  243. case STEP_QUERY_CFUN:
  244. result = bc260y.query_cfun(&cfun_mode); // 查询功能模式
  245. if(result == Result_Success)
  246. {
  247. if(cfun_mode == 1)
  248. {
  249. PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_0, "设置最小功能模式");
  250. }
  251. else
  252. {
  253. PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_1, "设置全功能模式");
  254. }
  255. }
  256. else if(result == Result_Failed)
  257. {
  258. goto_failure("查询功能模式失败");
  259. }
  260. break;
  261. case STEP_SET_CFUN_0:
  262. result=bc260y.set_cfun(0);//设置最小功能模式
  263. if(result == Result_Success)
  264. {
  265. if(REGIST_GetResult() != REGIST_Result_None)
  266. {
  267. goto_finish();
  268. }
  269. else
  270. {
  271. PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_1, "设置全功能模式");
  272. }
  273. }
  274. else if(result == Result_Failed)
  275. {
  276. goto_failure("设置最小功能模式失败");
  277. goto_finish();
  278. }
  279. break;
  280. case STEP_SET_CFUN_1:
  281. result=bc260y.set_cfun(1);//设置全功能模式
  282. if(result == Result_Success)
  283. {
  284. PCTRL_GotoStep(&pctrl, STEP_QUERY_DNS, "查询DNS");
  285. memset(pridnsaddr, 0, sizeof(pridnsaddr));
  286. }
  287. else if(result == Result_Failed)
  288. {
  289. goto_failure("设置全功能模式失败");
  290. }
  291. break;
  292. case STEP_QUERY_DNS:
  293. result = bc260y.query_dns(pridnsaddr); // 查询DNS
  294. if(result == Result_Success)
  295. {
  296. Log_Printf_Debug("DNS: %s, %d\r\n", pridnsaddr, strlen(pridnsaddr));
  297. if(strlen(pridnsaddr) <= 1)
  298. {
  299. PCTRL_GotoStep(&pctrl, STEP_SET_DNS, "设置DNS");
  300. }
  301. else
  302. {
  303. PCTRL_GotoStep(&pctrl, STEP_SET_CEREG_2, "设置网络状态");
  304. }
  305. }
  306. else if(result == Result_Failed) goto_failure("查询DNS失败");
  307. break;
  308. case STEP_SET_DNS:
  309. result = bc260y.set_dns("114.114.114.114", "8.8.8.8"); // 设置DNS
  310. if(result == Result_Success)
  311. {
  312. PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_0, "设置最小功能模式");
  313. }
  314. else if(result == Result_Failed)
  315. {
  316. goto_failure("设置DNS失败");
  317. }
  318. break;
  319. case STEP_SET_CEREG_2:
  320. result=bc260y.set_cereg(2); // 设置网络状态
  321. if(result == Result_Success)
  322. {
  323. PCTRL_GotoStep(&pctrl, STEP_QUERY_CEREG, "查询网络状态");
  324. }
  325. else if(result == Result_Failed)
  326. {
  327. goto_failure("设置网络状态失败");
  328. }
  329. break;
  330. case STEP_QUERY_CEREG:
  331. result=bc260y.query_cereg(&mode, &stat, &lac, &ci);// 查询网络状态
  332. if(result == Result_Success)
  333. {
  334. PCTRL_GotoStep(&pctrl, STEP_CLOSE, "断开tcp连接");
  335. }
  336. else if(result == Result_Failed)
  337. {
  338. goto_failure("查询网络状态失败");
  339. }
  340. break;
  341. case STEP_CLOSE:
  342. result=bc260y.close_socket(connectID);//防止以前链接没断开,断开tcp链接
  343. if(result == Result_Success)
  344. {
  345. if(REGIST_GetResult() != REGIST_Result_None)
  346. {
  347. PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_0, "设置最小功能模式");
  348. }
  349. else
  350. {
  351. PCTRL_GotoStep(&pctrl, STEP_OPEN, "连接tcp");
  352. }
  353. }
  354. else if(result == Result_Failed)
  355. {
  356. goto_failure("断开tcp连接失败");
  357. }
  358. break;
  359. case STEP_OPEN:
  360. result=bc260y.open_socket(connectID, "TCP", REGIST_SERVER, REGIST_PORT, 1, &err); // 连接tcp
  361. if(result == Result_Success)
  362. {
  363. PCTRL_GotoStep(&pctrl, STEP_SEND, "发送数据");
  364. // 打包注册请求
  365. memset(regist_data, 0, sizeof(regist_data));
  366. TUORENIOT_PackRegistRequest(regist_data, &regist_data_length, &regist_request);
  367. TUORENIOT_PrintfRegistRequestStruct(&regist_request);
  368. }
  369. else if(result == Result_Failed)
  370. {
  371. goto_failure("连接tcp失败");
  372. }
  373. break;
  374. case STEP_SEND: // 发送数据
  375. result =bc260y.send_rai(connectID, regist_data, regist_data_length, 0);//数据发送
  376. if(result == Result_Success)
  377. {
  378. PCTRL_GotoStep(&pctrl, STEP_RECV, "等待结果");
  379. memset(regist_data, 0, sizeof(regist_data));
  380. }
  381. else if(result == Result_Failed)
  382. {
  383. goto_failure("发送数据失败");
  384. }
  385. break;
  386. case STEP_RECV: // 等待结果
  387. result =bc260y.recv_with_time(connectID, regist_data, &regist_data_length, 10000);
  388. if(result == Result_Success)
  389. {
  390. uint8_t res = TUORENIOT_AnalysisRegistData(regist_data, regist_data_length);
  391. if(res == 1) // 成功
  392. {
  393. goto_success();
  394. }
  395. else // 失败
  396. {
  397. goto_failure("解析失败");
  398. }
  399. PCTRL_GotoStep(&pctrl, STEP_CLOSE, "断开tcp连接");
  400. }
  401. else if(result == Result_Failed)
  402. {
  403. goto_failure("等待结果失败");
  404. }
  405. break;
  406. case STEP_WAIT: // 等待
  407. PCTRL_Wait(&pctrl);
  408. break;
  409. case STEP_SUCCESS: // 成功
  410. goto_finish();
  411. break;
  412. case STEP_FAILURE: // 失败
  413. PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_0, "失败,设置最小功能模式");
  414. break;
  415. case STEP_FINISH: // 结束
  416. break;
  417. default: // 默认
  418. goto_failure("步骤不存在");
  419. break;
  420. }
  421. }
  422. #endif