Ec800m_Regist.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. #include "CONFIG.h"
  2. #if EC800M
  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 "ec800m.h"
  17. // socket ID
  18. static uint8_t connectID = 2;
  19. // 注册参数
  20. static struct TUORENIOT_RegistRequestStruct regist_request = {
  21. .version = 1,
  22. .networkType = 2,
  23. .networkProtocol = 1,
  24. .productId = "1dbfd476b7nm2",
  25. .deviceId = "3431228A1936013C",
  26. .userId = "1000",
  27. .sim = "",
  28. };
  29. // 函数声明
  30. static void REGIST_Process(void); // 注册流程
  31. static void REGIST_SetStatus(enum REGIST_StatusEnum status); // 设置注册状态
  32. static void REGIST_SetResult(enum REGIST_ResultEnum result); // 设置注册结果
  33. static void goto_start(void); // 开始
  34. static void goto_success(void); // 成功
  35. static void goto_failure(char * _info); // 失败
  36. static void goto_finish(void); // 结束
  37. // 流程
  38. enum Step{
  39. STEP_START, // 开始
  40. STEP_EXIT_SLEEP, // 退出睡眠
  41. STEP_ENTER_SLEEP, // 进入睡眠
  42. STEP_WAIT, // 等待
  43. STEP_STATE, // 查询状态
  44. STEP_OPEN, // 打开
  45. STEP_OPEN_WAIT_RESULT, // 等待打开结果
  46. STEP_JUDGE_AUTH_OR_DATA, // 判断认证还是发送
  47. STEP_JOIN_AUTH_MESSAGE, // 拼接认证报文
  48. STEP_JOIN_DATA_MESSAGE, // 拼接数据报文
  49. STEP_QUERY_SLEEP, // 查询休眠
  50. STEP_SET_SLEEP, // 开启休眠
  51. STEP_QUERY_QENG_SERVINGCELL, // 查询信号质量
  52. STEP_QUERY_ID, //查询SIM卡号
  53. STEP_SET_QISDE_0, // 关闭发送回显
  54. STEP_SEND, // 发送
  55. STEP_RECV, // 等待发送结果
  56. STEP_SET_CFUN_0, // 设置最小功能模式
  57. STEP_WAIT_SET_CFUN_0, // 等待设置最小功能模式
  58. STEP_SET_CFUN_1, // 设置全功能模式
  59. STEP_WAIT_SET_CFUN_1, // 等待设置全功能模式结果
  60. STEP_SET_CGREG_2, // 设置ps域允许上报网络注册和位置信息
  61. STEP_QUERY_CGREG, // 查询网络注册状态
  62. STEP_CLOSE, // 关闭
  63. STEP_SUCCESS, // 成功
  64. STEP_FAILURE, // 失败
  65. STEP_FINISH, // 流程结束
  66. STEP_VERIFY_REGIST, // 验证注册
  67. STEP_VERIFY_INITIALIZE, // 验证初始化
  68. };
  69. // 步骤跳转时的监听
  70. static uint8_t STEP_QUERY_CGREG_times = 0; // 查询网络状态的次数
  71. static void initialize()
  72. {
  73. STEP_QUERY_CGREG_times = 0;
  74. }
  75. static uint16_t goto_step_event(uint16_t ns)
  76. {
  77. // 重置ec800m状态
  78. ec800m.reset();
  79. // 流程控制
  80. uint16_t step = ns;
  81. if(ns == STEP_QUERY_CGREG && STEP_QUERY_CGREG_times++ >= 20)
  82. {
  83. goto_failure("查询网络状态的次数过多,联网失败");
  84. step = STEP_FAILURE;
  85. }
  86. return step;
  87. }
  88. // 流程控制
  89. static struct PCTRL_Struct pctrl = {
  90. .current_step = STEP_FINISH,
  91. .next_step = STEP_FINISH,
  92. .step_wait = STEP_WAIT,
  93. .goto_step_listener = goto_step_event,
  94. };
  95. // 备注
  96. static char info[40];
  97. // 开始
  98. static void goto_start(void)
  99. {
  100. initialize();
  101. PCTRL_GotoStep(&pctrl, STEP_START, "开始");
  102. }
  103. // 成功
  104. static void goto_success(void)
  105. {
  106. REGIST_SetResult(REGIST_Result_Success);
  107. PCTRL_GotoStep(&pctrl, STEP_SUCCESS, "成功");
  108. }
  109. // 失败
  110. static void goto_failure(char * _info)
  111. {
  112. REGIST_SetResult(REGIST_Result_Failure);
  113. memset(info, 0, sizeof(info));
  114. strcpy(info, _info);
  115. PCTRL_GotoStep(&pctrl, STEP_FAILURE, "失败");
  116. Log_Printf_Debug("info:%s!\r\n", info);
  117. }
  118. // 结束
  119. static void goto_finish(void)
  120. {
  121. REGIST_SetStatus(REGIST_Status_Done);
  122. PCTRL_GotoStep(&pctrl, STEP_FINISH, "结束");
  123. }
  124. // 注册状态
  125. static enum REGIST_StatusEnum regist_status = REGIST_Status_None;
  126. // 注册结果
  127. static enum REGIST_ResultEnum regist_result = REGIST_Result_None;
  128. // 设置注册状态
  129. static void REGIST_SetStatus(enum REGIST_StatusEnum status)
  130. {
  131. regist_status = status;
  132. }
  133. // 获取注册状态
  134. enum REGIST_StatusEnum REGIST_GetStatus(void)
  135. {
  136. return regist_status;
  137. }
  138. // 设置注册结果
  139. static void REGIST_SetResult(enum REGIST_ResultEnum result)
  140. {
  141. regist_result = result;
  142. }
  143. // 获取注册结果
  144. enum REGIST_ResultEnum REGIST_GetResult(void)
  145. {
  146. return regist_result;
  147. }
  148. // 重置注册
  149. enum EXECUTE_ResultEnum REGIST_Reset(void)
  150. {
  151. if(REGIST_GetStatus() == REGIST_Status_Being)
  152. {
  153. Log_Printf_Debug("注册流程重置错误!\r\n");
  154. return EXECUTE_Result_Failure;
  155. }
  156. REGIST_SetStatus(REGIST_Status_None);
  157. REGIST_SetResult(REGIST_Result_None);
  158. return EXECUTE_Result_Success;
  159. }
  160. // 开始注册
  161. enum EXECUTE_ResultEnum REGIST_Start(void)
  162. {
  163. REGIST_Reset();
  164. if(REGIST_GetStatus() != REGIST_Status_None)
  165. {
  166. Log_Printf_Debug("注册流程启动错误!\r\n");
  167. return EXECUTE_Result_Failure;
  168. }
  169. goto_start();
  170. REGIST_SetStatus(REGIST_Status_Being);
  171. return EXECUTE_Result_Success;
  172. }
  173. // 注册流程处理,放到大循环里
  174. void REGIST_ProcessHandle(void)
  175. {
  176. if(REGIST_GetStatus() == REGIST_Status_Being)
  177. {
  178. REGIST_Process();
  179. }
  180. }
  181. // 发送数据的逻辑
  182. static enum Result result = Result_None;
  183. static uint8_t cgreg_n;
  184. static uint8_t cgreg_stat;
  185. static uint16_t cgreg_lac;
  186. static uint32_t cgreg_ci;
  187. static uint16_t socket_err = 0;
  188. static void REGIST_Process(void)
  189. {
  190. // 流程
  191. switch(pctrl.current_step)
  192. {
  193. case STEP_START: // 开始
  194. PCTRL_GotoStepWait(&pctrl, STEP_EXIT_SLEEP,3000, "退出休眠");
  195. break;
  196. case STEP_EXIT_SLEEP: // 退出休眠
  197. ec800m.exit_sleep();
  198. PCTRL_GotoStepWait(&pctrl, STEP_SET_SLEEP, 3, "设置休眠模式");
  199. break;
  200. case STEP_SET_SLEEP: // 设置休眠模式
  201. result = ec800m.set_sleep(1);
  202. if(result != Result_None)
  203. {
  204. PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_1, "设置全功能模式");
  205. }
  206. else if(result == Result_Failed)
  207. {
  208. goto_failure("设置休眠模式失败");
  209. }
  210. break;
  211. case STEP_SET_CFUN_1: // 设置全功能模式
  212. result = ec800m.set_cfun(1);
  213. if(result == Result_Success)
  214. {
  215. PCTRL_GotoStep(&pctrl, STEP_SET_CGREG_2, "设置ps域");
  216. }
  217. else if(result == Result_Failed)
  218. {
  219. goto_failure("设置全功能模式失败");
  220. }
  221. break;
  222. case STEP_SET_CGREG_2: // 设置ps域
  223. result = ec800m.set_cgreg(2);
  224. if(result == Result_Success)
  225. {
  226. PCTRL_GotoStep(&pctrl, STEP_QUERY_CGREG, "查询ps域");
  227. }
  228. else if(result == Result_Failed)
  229. {
  230. goto_failure("设置ps域失败");
  231. }
  232. break;
  233. case STEP_QUERY_CGREG: // 查询ps域
  234. result = ec800m.query_cgreg(&cgreg_n, &cgreg_stat, &cgreg_lac, &cgreg_ci);
  235. if(result == Result_Success)
  236. {
  237. if(cgreg_stat == 1 || cgreg_stat == 5)
  238. {
  239. PCTRL_GotoStep(&pctrl, STEP_QUERY_ID, "查询SIM卡号");
  240. }
  241. else
  242. {
  243. PCTRL_GotoWait(&pctrl, 500);
  244. }
  245. }
  246. else if(result == Result_Failed)
  247. {
  248. goto_failure("查询ps域失败");
  249. }
  250. break;
  251. case STEP_QUERY_ID: //查询SIM卡号
  252. result = ec800m.query_qccid(regist_request.sim);
  253. if(result == Result_Success)
  254. {
  255. PCTRL_GotoStep(&pctrl, STEP_CLOSE, "关闭连接");
  256. }
  257. else if(result == Result_Failed)
  258. {
  259. goto_failure("查询SIM卡号失败");
  260. }
  261. break;
  262. case STEP_CLOSE: // 关闭连接
  263. result = ec800m.close_socket(connectID);
  264. if(result == Result_Success)
  265. {
  266. if(REGIST_GetResult() != REGIST_Result_None)
  267. {
  268. PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_0, "设置最小功能模式");
  269. }
  270. else
  271. {
  272. PCTRL_GotoStep(&pctrl, STEP_SET_QISDE_0, "关闭发送回显");
  273. }
  274. }
  275. else if(result == Result_Failed)
  276. {
  277. goto_failure("断开tcp连接失败");
  278. }
  279. break;
  280. case STEP_SET_QISDE_0: // 关闭发送回显
  281. result = ec800m.set_qisde(0);
  282. if(result == Result_Success)
  283. {
  284. PCTRL_GotoStep(&pctrl, STEP_OPEN, "连接tcp");
  285. }
  286. else if(result == Result_Failed)
  287. {
  288. goto_failure("关闭发送回显失败");
  289. }
  290. break;
  291. case STEP_OPEN: // 打开客户端
  292. result=ec800m.open_socket(connectID, "TCP", REGIST_SERVER, REGIST_PORT, 1, &socket_err);
  293. if(result == Result_Success)
  294. {
  295. PCTRL_GotoStep(&pctrl, STEP_SEND, "发送数据");
  296. // 打包注册请求
  297. memset(regist_data, 0, sizeof(regist_data));
  298. TUORENIOT_PackRegistRequest(regist_data, &regist_data_length, &regist_request);
  299. Log_Printf_Debug("regist_data: \r\n");
  300. Log_SendHex(regist_data, regist_data_length);
  301. Log_Printf_Debug("\r\n");
  302. TUORENIOT_PrintfRegistRequestStruct(&regist_request);
  303. }
  304. else if(result == Result_Failed)
  305. {
  306. goto_failure("连接tcp失败");
  307. }
  308. break;
  309. case STEP_SEND: // 发送send
  310. result = ec800m.send(connectID, regist_data, regist_data_length);
  311. if(result == Result_Success)
  312. {
  313. PCTRL_GotoStep(&pctrl, STEP_RECV, "等待结果");
  314. memset(regist_data, 0, sizeof(regist_data));
  315. }
  316. else if(result == Result_Failed)
  317. {
  318. goto_failure("发送数据失败");
  319. }
  320. break;
  321. case STEP_RECV: // 等待结果
  322. result = ec800m.recv_with_time(connectID, regist_data, &regist_data_length, 10000);
  323. if(result == Result_Success)
  324. {
  325. uint8_t res = TUORENIOT_AnalysisRegistData(regist_data, regist_data_length);
  326. if(res == 1) // 成功
  327. {
  328. goto_success();
  329. }
  330. else // 失败
  331. {
  332. goto_failure("解析失败");
  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_SET_CFUN_0: // 设置最小功能模式
  342. result = ec800m.set_cfun(0);
  343. if(result != Result_None)
  344. {
  345. PCTRL_GotoStep(&pctrl, STEP_ENTER_SLEEP, "进入睡眠");
  346. }
  347. break;
  348. case STEP_ENTER_SLEEP: // 进入睡眠
  349. ec800m.enter_sleep();
  350. goto_finish();
  351. break;
  352. case STEP_WAIT: // 等待
  353. PCTRL_Wait(&pctrl);
  354. break;
  355. case STEP_SUCCESS: // 成功
  356. PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_0, "设置最小功能模式");
  357. break;
  358. case STEP_FAILURE: // 失败
  359. PCTRL_GotoStep(&pctrl, STEP_SET_CFUN_0, "设置最小功能模式");
  360. break;
  361. case STEP_FINISH: // 结束流程
  362. break;
  363. default:
  364. goto_failure("步骤不存在");
  365. break;
  366. }
  367. }
  368. #endif