Aiwb2_Regist.c 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. #include "CONFIG.h"
  2. #if AIWB2
  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 "aiwb2.h"
  17. // 泵号
  18. extern uint8_t mcu_id[8];
  19. // 注册参数使用的网络名称,密码
  20. char WIFI_RegistID[50]="AA";
  21. char WIFI_RegistPASSWORD[30]="123456789";
  22. // 注册参数
  23. static struct TUORENIOT_RegistRequestStruct regist_request = {
  24. .version = 1,
  25. .networkType = 3,
  26. .networkProtocol = 1,
  27. .deviceId = "3431228A1936013C",
  28. .userId = "0001"
  29. };
  30. ///*************************************** 注册信息打包函数 ***************************************/
  31. //void TUORENIOT_PackRegistRequest(uint8_t * pack_data, uint16_t * pack_data_length, struct TUORENIOT_RegistRequestStruct * registParams)
  32. //{
  33. //
  34. // //InitClientId_2();
  35. // sprintf((char *)(pack_data + 2), "{\"version\":\"%d\",\"networkType\":\"%d\",\"networkProtocol\":\"%d\",\"productId\":\"%s\",\"deviceId\":\"%s\",\"userId\":\"%s\"}",
  36. // registParams->version, registParams->networkType, registParams->networkProtocol, registParams->productId, registParams->deviceId, registParams->userId); // ?′?óAT??á?
  37. // Log_Printf_Debug("%s\r\n", (char *)(pack_data + 2));
  38. //
  39. // uint16_t datalen = utils_aes128_ECB_base64_enc_with_length(regist_key, (pack_data + 2));
  40. //
  41. // pack_data[0] = datalen>>8;//头两个字节赋值字节长度
  42. // pack_data[1] = datalen;
  43. // * pack_data_length = datalen + 2;
  44. //}
  45. // 函数声明
  46. static void REGIST_Process(void); // 注册流程
  47. static void REGIST_SetStatus(enum REGIST_StatusEnum status); // 设置注册状态
  48. static void REGIST_SetResult(enum REGIST_ResultEnum result); // 设置注册结果
  49. static void goto_start(void); // 开始
  50. static void goto_success(void); // 成功
  51. static void goto_failure(char * _info); // 失败
  52. static void goto_finish(void); // 结束
  53. enum Step{
  54. STEP_START, // 开始
  55. STEP_EXIT_SLEEP, // 退出睡眠
  56. STEP_START_AT,//发送AT,检测模块是否唤醒
  57. STEP_SET_QISDE_0,//关闭发送回显
  58. STEP_SET_WORKMODE,//设置WIFI工作模式
  59. STEP_SET_RECEIVEMODE,//设置socket接收模式
  60. STEP_WIFI, //模块连接wifi
  61. STEP_OPEN,//打开客户端
  62. STEP_SEND,//发送send
  63. STEP_WAIT,//等待
  64. STEP_ENTER_SLEEP,// 进入深度睡眠
  65. STEP_SUCCESS,// 成功
  66. STEP_FAILURE,// 失败
  67. STEP_FINISH,// 结束流程
  68. STEP_EXIT_WIFICONNECT, // 关闭所有WIFI连接
  69. STEP_QUERY_CGREG,//查询网络状态
  70. };
  71. // 步骤跳转时的监听
  72. //static uint8_t STEP_QUERY_CGREG_times = 0; // 查询网络状态的次数
  73. //static void initialize()
  74. //{
  75. //// STEP_QUERY_CGREG_times = 0;
  76. //}
  77. static uint16_t goto_step_event(uint16_t ns)
  78. {
  79. // 重置aiwb2状态
  80. aiwb2.reset();
  81. // 流程控制
  82. uint16_t step = ns;
  83. // if(ns == STEP_QUERY_CGREG && STEP_QUERY_CGREG_times++ >= 20)
  84. // {
  85. // goto_failure("查询网络状态的次数过多,联网失败");
  86. // step = STEP_FAILURE;
  87. // }
  88. return step;
  89. }
  90. // 流程控制
  91. static struct PCTRL_Struct pctrl = {
  92. .current_step = STEP_FINISH,
  93. .next_step = STEP_FINISH,
  94. .step_wait = STEP_WAIT,
  95. .goto_step_listener = goto_step_event,
  96. };
  97. // 备注
  98. static char info[40];
  99. // 开始
  100. static void goto_start(void)
  101. {
  102. // initialize();
  103. PCTRL_GotoStep(&pctrl, STEP_START, "开始");
  104. }
  105. // 成功
  106. static void goto_success(void)
  107. {
  108. REGIST_SetResult(REGIST_Result_Success);
  109. PCTRL_GotoStep(&pctrl, STEP_SUCCESS, "成功");
  110. }
  111. // 失败
  112. static void goto_failure(char * _info)
  113. {
  114. REGIST_SetResult(REGIST_Result_Failure);
  115. memset(info, 0, sizeof(info));
  116. strcpy(info, _info);
  117. PCTRL_GotoStep(&pctrl, STEP_FAILURE, "失败");
  118. Log_Printf_Debug("info:%s!\r\n", info);
  119. }
  120. // 结束
  121. static void goto_finish(void)
  122. {
  123. REGIST_SetStatus(REGIST_Status_Done);
  124. PCTRL_GotoStep(&pctrl, STEP_FINISH, "结束");
  125. }
  126. // 注册状态
  127. static enum REGIST_StatusEnum regist_status = REGIST_Status_None;
  128. // 注册结果
  129. static enum REGIST_ResultEnum regist_result = REGIST_Result_None;
  130. // 设置注册状态
  131. static void REGIST_SetStatus(enum REGIST_StatusEnum status)
  132. {
  133. regist_status = status;
  134. }
  135. // 获取注册状态
  136. enum REGIST_StatusEnum REGIST_GetStatus(void)
  137. {
  138. return regist_status;
  139. }
  140. // 设置注册结果
  141. static void REGIST_SetResult(enum REGIST_ResultEnum result)
  142. {
  143. regist_result = result;
  144. }
  145. // 获取注册结果
  146. enum REGIST_ResultEnum REGIST_GetResult(void)
  147. {
  148. return regist_result;
  149. }
  150. // 重置注册
  151. enum EXECUTE_ResultEnum REGIST_Reset(void)
  152. {
  153. if(REGIST_GetStatus() == REGIST_Status_Being)
  154. {
  155. Log_Printf_Debug("注册流程重置错误!\r\n");
  156. return EXECUTE_Result_Failure;
  157. }
  158. REGIST_SetStatus(REGIST_Status_None);
  159. REGIST_SetResult(REGIST_Result_None);
  160. return EXECUTE_Result_Success;
  161. }
  162. // 开始注册
  163. enum EXECUTE_ResultEnum REGIST_Start(void)
  164. {
  165. REGIST_Reset();
  166. if(REGIST_GetStatus() != REGIST_Status_None)
  167. {
  168. Log_Printf_Debug("注册流程启动错误!\r\n");
  169. return EXECUTE_Result_Failure;
  170. }
  171. goto_start();
  172. REGIST_SetStatus(REGIST_Status_Being);
  173. return EXECUTE_Result_Success;
  174. }
  175. // 注册流程处理,放到大循环里
  176. void REGIST_ProcessHandle(void)
  177. {
  178. if(REGIST_GetStatus() == REGIST_Status_Being)
  179. {
  180. REGIST_Process();
  181. }
  182. }
  183. // 发送数据的逻辑
  184. static enum Result result = Result_None;
  185. extern uint8_t conID;
  186. uint8_t TCPID = 4;
  187. //发送数据的流程
  188. static void REGIST_Process(void)
  189. {
  190. // 流程
  191. switch(pctrl.current_step)
  192. {
  193. case STEP_START: // 开始
  194. PCTRL_GotoStep(&pctrl, STEP_EXIT_SLEEP, "退出休眠");
  195. break;
  196. case STEP_EXIT_SLEEP: // 退出休眠
  197. aiwb2.exit_sleep_io();
  198. PCTRL_GotoStepWait(&pctrl, STEP_START_AT,350, "发送AT,检测模块是否唤醒");
  199. break;
  200. case STEP_START_AT: //开始AT,检测模块是否唤醒
  201. result = aiwb2.test_at();
  202. if(result == Result_Success)
  203. {
  204. PCTRL_GotoStep(&pctrl, STEP_SET_QISDE_0, "关闭发送回显");
  205. }
  206. else if(result == Result_Failed)
  207. {
  208. goto_failure("发送AT失败,模块未唤醒");
  209. }
  210. break;
  211. case STEP_SET_QISDE_0: // 关闭发送回显
  212. result = aiwb2.set_qisde(0);
  213. if(result == Result_Success)
  214. {
  215. PCTRL_GotoStep(&pctrl, STEP_SET_WORKMODE, "设置WIFI工作模式");
  216. }
  217. else if(result == Result_Failed)
  218. {
  219. goto_failure("关闭发送回显失败");
  220. }
  221. break;
  222. case STEP_SET_WORKMODE://设置WIFI工作模式
  223. result = aiwb2.set_workmode(1,1);
  224. if(result == Result_Success)
  225. {
  226. PCTRL_GotoStepWait(&pctrl,STEP_SET_RECEIVEMODE, 3 , "设置socket接收模式");
  227. }
  228. else if(result == Result_Failed)
  229. {
  230. goto_failure("设置WIFI工作模式失败");
  231. }
  232. break;
  233. case STEP_SET_RECEIVEMODE://设置socket接收模式
  234. result = aiwb2.set_receivingmode(1);
  235. if(result == Result_Success)
  236. {
  237. PCTRL_GotoStepWait(&pctrl,STEP_WIFI, 3 , "模块连接wifi");
  238. }
  239. else if(result == Result_Failed)
  240. {
  241. goto_failure("设置socket接收模式失败");
  242. }
  243. break;
  244. case STEP_WIFI: //模块连接wifi
  245. result = aiwb2.set_connect_WIFI(WIFI_RegistID, WIFI_RegistPASSWORD);
  246. if(result == Result_Success)
  247. {
  248. PCTRL_GotoStepWait(&pctrl,STEP_OPEN, 3 , "连接TCP");
  249. }
  250. else if(result == Result_Failed)
  251. {
  252. goto_failure("模块连接wifi失败");
  253. }
  254. break;
  255. case STEP_OPEN: // 打开客户端
  256. result = aiwb2.open_socket(TCPID,REGIST_SERVER, REGIST_PORT);
  257. if(result == Result_Success)
  258. {
  259. PCTRL_GotoStep(&pctrl, STEP_SEND, "发送数据");
  260. // 打包注册请求
  261. memset(regist_data, 0, sizeof(regist_data));
  262. TUORENIOT_PackRegistRequest(regist_data, &regist_data_length, &regist_request);
  263. Log_Printf_Debug("regist_data: \r\n");
  264. Log_SendHex(regist_data, regist_data_length);
  265. Log_Printf_Debug("\r\n");
  266. TUORENIOT_PrintfRegistRequestStruct(&regist_request);
  267. }
  268. else if(result == Result_Failed)
  269. {
  270. goto_failure("连接tcp失败");
  271. }
  272. break;
  273. case STEP_SEND: // 发送send
  274. result = aiwb2.send(conID, regist_data, regist_data_length, &regist_data_length);
  275. if(result == Result_Success)
  276. {
  277. int8_t res = TUORENIOT_AnalysisRegistData(regist_data, regist_data_length);
  278. if(res == 1) // 成功
  279. {
  280. goto_success();
  281. }
  282. else // 失败
  283. {
  284. goto_failure("解析失败");
  285. }
  286. }
  287. else if(result == Result_Failed)
  288. {
  289. goto_failure("注册数据处理失败");
  290. }
  291. break;
  292. case STEP_WAIT: // 等待
  293. PCTRL_Wait(&pctrl);
  294. break;
  295. case STEP_ENTER_SLEEP: // 进入深度睡眠
  296. aiwb2.enter_sleep_io();
  297. goto_finish();
  298. break;
  299. case STEP_SUCCESS: // 成功
  300. PCTRL_GotoStep(&pctrl, STEP_ENTER_SLEEP, "进入深度睡眠");
  301. break;
  302. case STEP_FAILURE: // 失败
  303. PCTRL_GotoStep(&pctrl, STEP_ENTER_SLEEP, "进入深度休眠");
  304. break;
  305. case STEP_FINISH: // 结束流程STEP_FAILURE
  306. break;
  307. default:
  308. goto_failure("步骤不存在");
  309. break;
  310. }
  311. }
  312. #endif