Aiwb2_UDP_Client5.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. #include "CONFIG.h"
  2. #if AIWB2
  3. #include "stm32f10x.h"
  4. #include <stdio.h>
  5. #include <stdarg.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include "UDP_Client.h"
  9. #include "Timer_Module.h"
  10. #include "Log_Module.h"
  11. #include "mbedtls_util.h"
  12. #include "cJSON.h"
  13. #include "Pump_Dicts_Util.h"
  14. #include "Regist.h"
  15. #include "PumpBusiness.h"
  16. #include "Initialize.h"
  17. #include "Tuoreniot.h"
  18. #include "aiwb2.h"
  19. //WiFi连接参数
  20. char WIFI_ID[50]="tuoren";
  21. char WIFI_PASSWORD[30]="123456789";
  22. // 测试模式
  23. uint8_t UDPCLIENT_TestModeFlag = 0;
  24. // coap报文
  25. static uint8_t coap_message[512];
  26. static uint16_t coap_message_length = 0;
  27. // 待发送数据的地址和长度
  28. static uint8_t data[128];
  29. static uint16_t data_length;
  30. // 信号值
  31. static struct Signal
  32. {
  33. int RSRP;
  34. int RSRQ;
  35. int RSSI;
  36. int SINR;
  37. } signal = {
  38. .RSRP = 99,
  39. .RSRQ = 99,
  40. .RSSI = 99,
  41. .SINR = 99,
  42. };
  43. // 查询信号质量
  44. void UDPCLIENT_QuerySignal(int * RSRP, int * RSRQ, int * RSSI, int * SINR)
  45. {
  46. *RSRP = signal.RSRP;
  47. *RSRQ = signal.RSRQ;
  48. *RSSI = signal.RSSI;
  49. *SINR = signal.SINR;
  50. }
  51. // 函数声明
  52. static void UDPCLIENT_Process(void); // 流程
  53. static void UDPCLIENT_SetStatus(enum UDPCLIENT_StatusEnum status); // 设置状态
  54. static void UDPCLIENT_SetResult(enum UDPCLIENT_ResultEnum result); // 设置结果
  55. static void goto_start(void); // 开始
  56. static void goto_success(void); // 成功
  57. static void goto_failure(char * _info); // 失败
  58. static void goto_finish(void); // 结束
  59. // 流程
  60. enum Step{
  61. STEP_NONE, // 空闲状态,无操作
  62. STEP_START, // 开始
  63. STEP_EXIT_SLEEP, // 退出睡眠
  64. STEP_START_AT,//发送AT,检测模块是否唤醒
  65. STEP_SET_QISDE_0,//关闭发送回显
  66. STEP_SET_WORKMODE,//设置WIFI工作模式
  67. STEP_SET_RECEIVEMODE,//设置socket接收模式
  68. STEP_WIFI_RSSI, //设定查询wifi的信息输出
  69. STEP_SELECT_AP,//查询WIFI信号强度,设置WIFI
  70. STEP_WIFI, //模块连接wifi
  71. STEP_QUERY_SIGNAL,//查询WiFi信号强度
  72. STEP_OPEN,//打开客户端
  73. STEP_JUDGE_AUTH_OR_DATA,//判断认证还是发送
  74. STEP_JOIN_AUTH_MESSAGE,//拼接认证报文
  75. STEP_JOIN_DATA_MESSAGE,//拼接数据报文
  76. STEP_SEND,// 发送send
  77. STEP_WAIT, // 等待
  78. STEP_SUCCESS,//成功
  79. STEP_ENTER_SLEEP,// 进入睡眠
  80. STEP_FAILURE,// 失败
  81. STEP_FINISH,// 结束流程
  82. };
  83. // 步骤跳转时的监听
  84. //static uint8_t STEP_JOIN_AUTH_MESSAGE_times = 0; // 认证的次数
  85. //static uint8_t STEP_QUERY_CGREG_times = 0; // 查询网络状态的次数
  86. //static void initialize()
  87. //{
  88. // STEP_JOIN_AUTH_MESSAGE_times = 0;
  89. // STEP_QUERY_CGREG_times = 0;
  90. //}
  91. static uint16_t goto_step_event(uint16_t ns)
  92. {
  93. // 重置ec800m状态
  94. aiwb2.reset();
  95. // 流程控制
  96. uint16_t step = ns;
  97. // if(ns == STEP_JOIN_AUTH_MESSAGE && STEP_JOIN_AUTH_MESSAGE_times++ >= 1)
  98. // {
  99. // goto_failure("认证次数过多");
  100. // step = STEP_FAILURE;
  101. // }
  102. // else if(ns == STEP_QUERY_CGREG && STEP_QUERY_CGREG_times++ >= 20)
  103. // {
  104. // goto_failure("查询网络状态的次数过多,联网失败");
  105. // step = STEP_FAILURE;
  106. // }
  107. return step;
  108. }
  109. // 流程控制
  110. static struct PCTRL_Struct pctrl = {
  111. .current_step = STEP_FINISH,
  112. .next_step = STEP_FINISH,
  113. .step_wait = STEP_WAIT,
  114. .goto_step_listener = goto_step_event,
  115. };
  116. // 备注
  117. static char info[40];
  118. // 开始
  119. static void goto_start(void)
  120. {
  121. // initialize();
  122. PCTRL_GotoStep(&pctrl, STEP_START, "开始");
  123. }
  124. // 成功
  125. static void goto_success(void)
  126. {
  127. UDPCLIENT_SetResult(UDPCLIENT_Result_Success);
  128. PCTRL_GotoStep(&pctrl, STEP_SUCCESS, "成功");
  129. }
  130. // 失败
  131. static void goto_failure(char * _info)
  132. {
  133. UDPCLIENT_SetResult(UDPCLIENT_Result_Failure);
  134. memset(info, 0, sizeof(info));
  135. strcpy(info, _info);
  136. PCTRL_GotoStep(&pctrl, STEP_FAILURE, "失败");
  137. Log_Printf_Debug("info:%s!\r\n", info);
  138. }
  139. // 结束
  140. static void goto_finish(void)
  141. {
  142. UDPCLIENT_SetStatus(UDPCLIENT_Status_Done);
  143. PCTRL_GotoStep(&pctrl, STEP_FINISH, "结束");
  144. }
  145. // 状态
  146. static enum UDPCLIENT_StatusEnum udpclient_status = UDPCLIENT_Status_None;
  147. // 结果
  148. static enum UDPCLIENT_ResultEnum udpclient_result = UDPCLIENT_Result_None;
  149. // 设置状态
  150. static void UDPCLIENT_SetStatus(enum UDPCLIENT_StatusEnum status)
  151. {
  152. udpclient_status = status;
  153. }
  154. // 获取状态
  155. enum UDPCLIENT_StatusEnum UDPCLIENT_GetStatus(void)
  156. {
  157. return udpclient_status;
  158. }
  159. // 设置结果
  160. static void UDPCLIENT_SetResult(enum UDPCLIENT_ResultEnum result)
  161. {
  162. udpclient_result = result;
  163. }
  164. // 获取结果
  165. enum UDPCLIENT_ResultEnum UDPCLIENT_GetResult(void)
  166. {
  167. return udpclient_result;
  168. }
  169. // 重置
  170. enum EXECUTE_ResultEnum UDPCLIENT_Reset(void)
  171. {
  172. if(UDPCLIENT_GetStatus() == UDPCLIENT_Status_Being)
  173. {
  174. Log_Printf_Debug("发送流程重置错误!\r\n");
  175. return EXECUTE_Result_Failure;
  176. }
  177. UDPCLIENT_SetStatus(UDPCLIENT_Status_None);
  178. UDPCLIENT_SetResult(UDPCLIENT_Result_None);
  179. return EXECUTE_Result_Success;
  180. }
  181. // 开始
  182. enum EXECUTE_ResultEnum UDPCLIENT_Start(void)
  183. {
  184. UDPCLIENT_Reset();
  185. if(UDPCLIENT_GetStatus() != UDPCLIENT_Status_None)
  186. {
  187. Log_Printf_Debug("发送流程启动错误!\r\n");
  188. return EXECUTE_Result_Failure;
  189. }
  190. goto_start();
  191. UDPCLIENT_SetStatus(UDPCLIENT_Status_Being);
  192. return EXECUTE_Result_Success;
  193. }
  194. // 流程处理,放到大循环里
  195. void UDPCLIENT_ProcessHandle(void)
  196. {
  197. if(UDPCLIENT_GetStatus() == UDPCLIENT_Status_Being)
  198. {
  199. UDPCLIENT_Process();
  200. }
  201. }
  202. // 发送数据的逻辑
  203. static int wifi_number = 0; //wifi信息编号变量
  204. int wifi_rssi[10]; //各wifi信号值存储数组
  205. static enum Result result = Result_None;
  206. //UDPID=2 表示建立UDP连接
  207. static uint8_t UDPID = 2;
  208. //static uint16_t socket_err = 0;
  209. //获取最佳wifi_rssi中最佳信号位置
  210. int get_BestWifiSignal(int* rssi, int number)
  211. {
  212. int signal=0; //假设首个wifi信号最好
  213. int value=-99; //初始化比较值
  214. for(int i=0; i<number; i++)
  215. {
  216. if((rssi[i] > value) && (rssi[i] != 0))
  217. {
  218. value = rssi[i];
  219. signal = i;
  220. }
  221. }
  222. return signal;
  223. }
  224. static void UDPCLIENT_Process(void)
  225. {
  226. // 流程
  227. switch(pctrl.current_step)
  228. {
  229. case STEP_NONE: // 空闲
  230. break;
  231. case STEP_START: // 开始
  232. PCTRL_GotoStep(&pctrl, STEP_EXIT_SLEEP, "退出休眠");
  233. break;
  234. case STEP_EXIT_SLEEP: // 退出休眠
  235. result = aiwb2.exit_sleep_io_test();
  236. aiwb2.exit_sleep_io();
  237. PCTRL_GotoStepWait(&pctrl, STEP_START_AT,350, "设定模块查询信息的输出");
  238. break;
  239. case STEP_START_AT: //开始AT,检测模块是否唤醒
  240. result = aiwb2.test_at();
  241. if(result == Result_Success)
  242. {
  243. PCTRL_GotoStep(&pctrl,STEP_SET_QISDE_0,"关闭发送回显");
  244. }
  245. else if(result == Result_Failed)
  246. {
  247. goto_failure("发送AT失败,模块未唤醒");
  248. }
  249. break;
  250. case STEP_SET_QISDE_0: // 关闭发送回显
  251. result = aiwb2.set_qisde(0);
  252. if(result == Result_Success)
  253. {
  254. PCTRL_GotoStep(&pctrl, STEP_SET_WORKMODE, "设置WIFI工作模式");
  255. }
  256. else if(result == Result_Failed)
  257. {
  258. goto_failure("关闭发送回显失败");
  259. }
  260. break;
  261. case STEP_SET_WORKMODE://设置WIFI工作模式
  262. result = aiwb2.set_workmode(1,1);
  263. if(result == Result_Success)
  264. {
  265. PCTRL_GotoStepWait(&pctrl,STEP_SET_RECEIVEMODE,3,"设置socket接收模式");
  266. }
  267. else if(result == Result_Failed)
  268. {
  269. goto_failure("设置WIFI工作模式失败");
  270. }
  271. break;
  272. case STEP_SET_RECEIVEMODE://设置socket接收模式
  273. result = aiwb2.set_receivingmode(1);
  274. if(result == Result_Success)
  275. {
  276. PCTRL_GotoStepWait(&pctrl,STEP_WIFI_RSSI,3,"设定模块查询信息的输出");
  277. }
  278. else if(result == Result_Failed)
  279. {
  280. goto_failure("设置socket接收模式失败");
  281. }
  282. break;
  283. case STEP_WIFI_RSSI: //设定模块查询信息的输出
  284. result = aiwb2.set_dataout();
  285. if(result == Result_Success)
  286. {
  287. PCTRL_GotoStepWait(&pctrl, STEP_SELECT_AP, 3, "查询WIFI信号强度,设定连接wifi");
  288. }
  289. else if(result == Result_Failed)
  290. {
  291. goto_failure("设定模块查询信息的输出失败");
  292. }
  293. break;
  294. case STEP_SELECT_AP://查询WIFI信号强度,设置WIFI
  295. if(wifi_number < regist_response.wifiNumber)
  296. {
  297. result = aiwb2.query_id_signal(regist_response.wifi[wifi_number].wifiName, &wifi_rssi[wifi_number]);
  298. if(result == Result_Success || result == Result_Failed)
  299. {
  300. Log_Printf_Debug("wifi%d的信号值RSSI=%d\r\n",wifi_number,wifi_rssi[wifi_number]);
  301. Log_Printf_Debug("wifi_number=%d\r\n",wifi_number);
  302. wifi_number++;
  303. if(wifi_number == regist_response.wifiNumber)
  304. {
  305. PCTRL_GotoStep(&pctrl, STEP_SELECT_AP, "wifi查询完成");
  306. }else
  307. {
  308. PCTRL_GotoStep(&pctrl, STEP_SELECT_AP, "继续wifi的RSSI,选择wifi");
  309. }
  310. }
  311. }
  312. else
  313. {
  314. //获取信号最佳的wifi在数组中的位置
  315. int i=get_BestWifiSignal(wifi_rssi, wifi_number);
  316. //拷贝wifi信息
  317. strcpy(WIFI_ID,regist_response.wifi[i].wifiName);
  318. strcpy(WIFI_PASSWORD,regist_response.wifi[i].wifiPassword);
  319. Log_Printf_Debug("选择信号最好的第%d组wifi\r\n",i);
  320. Log_Printf_Debug("WIFI_ID=%s\r\n",WIFI_ID);
  321. Log_Printf_Debug("WIFI_PASSWORD=%s\r\n",WIFI_PASSWORD);
  322. PCTRL_GotoStep(&pctrl, STEP_WIFI, "模块连接wifi");
  323. }
  324. break;
  325. case STEP_WIFI: //模块连接wifi
  326. result = aiwb2.set_connect_WIFI(WIFI_ID, WIFI_PASSWORD);
  327. if(result == Result_Success)
  328. {
  329. PCTRL_GotoStepWait(&pctrl, STEP_QUERY_SIGNAL, 3, "查询已连接的wifi信号强度");
  330. }
  331. else if(result == Result_Failed)
  332. {
  333. goto_failure("模块连接wifi失败");
  334. }
  335. break;
  336. case STEP_QUERY_SIGNAL://查询已连接的WiFi信号强度
  337. result = aiwb2.query_signal(&signal.RSSI);
  338. if(result == Result_Success)
  339. {
  340. PCTRL_GotoStep(&pctrl, STEP_OPEN, "打开客户端");
  341. }
  342. else if(result == Result_Failed)
  343. {
  344. goto_failure("查询WiFi信号强度失败");
  345. }
  346. break;
  347. case STEP_OPEN:// 打开客户端
  348. result = aiwb2.open_socket(UDPID,regist_response.address,regist_response.port);
  349. if(result == Result_Success)
  350. {
  351. PCTRL_GotoStep(&pctrl, STEP_JUDGE_AUTH_OR_DATA, "判断认证还是发送");
  352. }
  353. else if(result == Result_Failed)
  354. {
  355. goto_failure("客户端打开失败");
  356. }
  357. break;
  358. case STEP_JUDGE_AUTH_OR_DATA: // 判断认证还是发送
  359. if(TUORENIOT_IsAuthentication() == 1) // 已认证
  360. {
  361. PCTRL_GotoStep(&pctrl, STEP_JOIN_DATA_MESSAGE, "拼接数据报文");
  362. }
  363. else
  364. {
  365. PCTRL_GotoStep(&pctrl, STEP_JOIN_AUTH_MESSAGE, "拼接认证报文");
  366. }
  367. break;
  368. case STEP_JOIN_AUTH_MESSAGE: // 拼接认证报文
  369. memset(coap_message, 0, sizeof(coap_message));
  370. TUORENIOT_PackAuthMessage(coap_message, &coap_message_length);
  371. // Log_Printf_Debug("数据报文%d\r\n", coap_message_length);
  372. // Log_SendHex(coap_message, coap_message_length);
  373. // Log_Printf_Debug("\r\n");
  374. PCTRL_GotoStep(&pctrl, STEP_SEND, "发送认证报文");
  375. break;
  376. case STEP_JOIN_DATA_MESSAGE: // 拼接数据报文
  377. //
  378. strcpy(regist_response.deviceSecret,"7bd7eaa33860ce9a2bd1b33633127f04");
  379. PUMPBUSINESS_ParamsRefresh();// 编码
  380. memset(data, 0, sizeof(data));
  381. PUMPDICTS_ProtocolEncode(&pump_params, data, &data_length);
  382. memset(coap_message, 0, sizeof(coap_message));
  383. TUORENIOT_PackDataMessage(data, data_length, coap_message, &coap_message_length);
  384. // Log_Printf_Debug("数据报文%d\r\n", coap_message_length);
  385. // Log_SendHex(coap_message, coap_message_length);
  386. // Log_Printf_Debug("\r\n");
  387. PCTRL_GotoStep(&pctrl, STEP_SEND, "发送数据报文");
  388. break;
  389. case STEP_SEND: // 发送send
  390. result = aiwb2.send(conID, coap_message, coap_message_length,&coap_message_length);
  391. if(result == Result_Success)
  392. {
  393. uint8_t res = TUORENIOT_AnalysisMessage(coap_message, coap_message_length);
  394. if(res == 0) // 发送失败
  395. {
  396. PCTRL_GotoStep(&pctrl, STEP_JUDGE_AUTH_OR_DATA, "重新认证"); // 重新认证
  397. }
  398. else if(res == 1) // 认证成功
  399. {
  400. PCTRL_GotoStep(&pctrl, STEP_JOIN_DATA_MESSAGE, "拼接数据报文");
  401. }
  402. else if(res == 2) // 发送成功
  403. {
  404. goto_success();
  405. }
  406. }
  407. else if(result == Result_Failed)
  408. {
  409. goto_failure("等待结果失败");
  410. }
  411. break;
  412. case STEP_WAIT: // 等待
  413. PCTRL_Wait(&pctrl);
  414. break;
  415. case STEP_SUCCESS: // 成功
  416. PCTRL_GotoStep(&pctrl, STEP_ENTER_SLEEP, "进入睡眠");
  417. break;
  418. case STEP_FAILURE: // 失败
  419. PCTRL_GotoStep(&pctrl, STEP_ENTER_SLEEP, "进入睡眠");
  420. break;
  421. case STEP_ENTER_SLEEP: // 进入睡眠
  422. aiwb2.enter_sleep_io();
  423. goto_finish();
  424. break;
  425. case STEP_FINISH: // 结束流程
  426. Log_Printf_Debug("流程结束");
  427. break;
  428. default:
  429. goto_failure("步骤不存在");
  430. break;
  431. }
  432. }
  433. #endif