aiwb2.c 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504
  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 "Aiwb2.h"
  9. #include "Common_Util.h"
  10. #include "Log_Module.h"
  11. #include "At_Module.h"
  12. #include "Tuoreniot.h"
  13. /**
  14. * 版 本 :V1.0.0 /2024.10.15
  15. * 作 者 :李宗辉
  16. */
  17. // AT指令
  18. static char AT_CMD[256];
  19. uint8_t conID = 0; //socket
  20. // 方法声明
  21. //设置休眠
  22. enum Result aiwb2_set_sleep(void);
  23. //关闭回显
  24. enum Result aiwb2_set_qisde(uint8_t echo);
  25. //返回成功结果
  26. static enum Result success_no_log(void);
  27. //返回成功结果,不打印结果
  28. static enum Result success_noPrintedresults(void);
  29. //进入休眠
  30. enum Result aiwb2_exit_sleep(void);
  31. //判断模块是否重启
  32. enum Result aiwb2_ready(void);
  33. //重置状态
  34. void aiwb2_reset(void); // 重置状态。该文件中的方法共用状态,在使用下面的方法前需要重置一下状态。
  35. void aiwb2_reset_no_ATClear(void);//不清理AT
  36. //WiFi_Aiwb2模块发送"AT+SOCKETRECVCFG"指令:设置socket 接收模式
  37. enum Result aiwb2_set_receivingmode(uint8_t n);
  38. //iFi_Aiwb2模块发送"AT+WMODE"指令:设置WIFI 工作模式
  39. enum Result aiwb2_set_workmode(uint8_t n,uint8_t m);
  40. //WiFi_Aiwb2模块发送"AT"指令
  41. enum Result aiwb2_test_at(void);
  42. // 验证ID是否正确
  43. static uint8_t verifyActiveID(uint8_t activeID);
  44. //设定查询wifi的信息输出
  45. enum Result aiwb2_set_dataout(void);
  46. //查询指定ID的WiFi信号强度
  47. enum Result aiwb2_query_id_signal(char * ID, int * RSSI);
  48. //查询已连接WiFi的信号强度
  49. enum Result aiwb2_query_signal(int * RSSI);
  50. // WiFi_Aiwb2模块发送"AT+WJAP"指令:连接wifi
  51. enum Result aiwb2_connect_WIFI(char *WIFI_Name, char *WIFI_Password);
  52. //断块WIFI连接
  53. enum Result aiwb2_wdisconnet(void);
  54. //打开socket服务
  55. enum Result aiwb2_open_socket(uint8_t UDPID, char * IP_address, uint16_t remote_port);
  56. //接收数据,带计时
  57. enum Result aiwb2_recv_with_time(uint8_t connectID, uint8_t * data, uint16_t * data_length, uint32_t time_out);
  58. //接收数据,带计时(注册接收)
  59. enum Result aiwb2_recv_with_time_regist(uint8_t connectID, uint8_t * data, uint16_t * data_length, uint32_t time_out);
  60. //接收数据(注册接收)
  61. enum Result aiwb2_recv_regist(uint8_t connectID, uint8_t * data, uint16_t * data_length);
  62. //关闭socket服务
  63. enum Result aiwb2_close_socket(uint8_t connectID);
  64. //发送报文
  65. enum Result aiwb2_send(uint8_t connectID, uint8_t * data, uint16_t send_data_length, uint16_t * recv_data_length);
  66. //唤醒模块,并检测是否重启
  67. enum Result aiwb2_exit_sleep_io_test(void);
  68. // 发送AT指令
  69. static void send_data(uint8_t * data, uint16_t length)
  70. {
  71. // 发送AT指令
  72. AT_Send_Bytes(data, length);
  73. }
  74. /**
  75. * @brief 设置状态
  76. * @param enum STATUS status:aiwb2 状态
  77. * @retval 无
  78. */
  79. static void setStatus(enum STATUS status)
  80. {
  81. aiwb2.status = status;
  82. }
  83. /**
  84. * @brief 模块是否启动成功
  85. * @param enum STATUS status:aiwb2 状态
  86. * @retval 无
  87. */
  88. enum Result aiwb2_ready(void)
  89. {
  90. if(AT_Get_Status() != AT_Status_None)
  91. {
  92. return Result_None;
  93. }
  94. enum Result result = Result_None;
  95. // 判断是否接收到
  96. uint8_t RDY[5]="ready";
  97. if(memmem(AT_result(),AT_result_length(),RDY,strlen((char *)RDY)) != 0)
  98. {
  99. // 发送日志
  100. Log_Printf_Debug("进入模块是否重启判断AT返回: %d\r\n", AT_result_length());
  101. Log_SendArray_Debug(AT_result(), AT_result_length());
  102. // 成功结果
  103. result = Result_Success;
  104. // 清理一下AT返回结果缓存
  105. AT_Clear_Result();
  106. }
  107. return result;
  108. }
  109. /**
  110. * @brief 获取ID
  111. * @param activeID:AT指令标识符ID
  112. * @retval 无
  113. */
  114. static void setActiveID(uint8_t activeID)
  115. {
  116. aiwb2.activeID = activeID;
  117. }
  118. /**
  119. * @brief 清除定时
  120. * @param 无
  121. * @retval 无
  122. */
  123. static void clearTimer(void)
  124. {
  125. time_clear(&aiwb2.timer);
  126. }
  127. /**
  128. * @brief 重置状态。该文件中的方法共用状态,在使用方法前需要重置一下状态。
  129. * @param 无
  130. * @retval 无
  131. */
  132. void aiwb2_reset(void)
  133. {
  134. setStatus(Status_None); // 重置状态
  135. setActiveID(0); // 重置ID
  136. clearTimer(); // 重置计时
  137. AT_Clear(); // 清除AT指令
  138. }
  139. void aiwb2_reset_no_ATClear(void)
  140. {
  141. setStatus(Status_None); // 重置状态
  142. setActiveID(0); // 重置ID
  143. clearTimer(); // 重置计时
  144. //AT_Clear_noclear_result(); // 清除AT指令
  145. }
  146. /**
  147. * @brief 获取wifi当前模块状态
  148. * @param 无
  149. * @retval ec800m.status:模块状态
  150. */
  151. static enum STATUS getStatus(void)
  152. {
  153. return aiwb2.status;
  154. }
  155. /**
  156. * @brief 获取AT指令的ID
  157. * @param activeID : AT指令的ID
  158. * @retval c800m.activeID:AT指令的ID
  159. */
  160. static uint8_t getActiveID(void)
  161. {
  162. return aiwb2.activeID;
  163. }
  164. /**
  165. * @brief 发送AT指令
  166. * @param cmd:发送的AT指令
  167. * @retval 无
  168. */
  169. static uint8_t send_at_string(char * cmd)
  170. {
  171. uint8_t state = 0;
  172. if(AT_Get_Status() == AT_Status_None)
  173. {
  174. // 发送AT指令
  175. AT_Send_String(cmd);
  176. state = 1;
  177. }
  178. return state;
  179. }
  180. /**
  181. * @brief WiFi_Aiwb2模块发送"AT"指令
  182. * @param cmd:AT指令 activeID:AT指令的ID
  183. * @retval 无
  184. */
  185. enum Result send_at(char * cmd, uint8_t activeID)
  186. {
  187. Log_Printf_Debug(cmd); //打印AT指令
  188. if(send_at_string(cmd)) // 发送AT指令
  189. {
  190. setActiveID(activeID); // 活动ID
  191. setStatus(Status_Sending); // 设置状态为已发送
  192. clearTimer();//重置计时
  193. return Result_None; // 未知结果
  194. }else
  195. {
  196. Log_Printf_Debug("AT指令发送失败\r\n"); // 打印日志
  197. return Result_Failed; // 失败结果
  198. }
  199. }
  200. /**
  201. * @brief 这是状态为失败
  202. * @param type
  203. * @retval Result_Failed:失败
  204. */
  205. static enum Result failed(int type)
  206. {
  207. // 失败
  208. setStatus(Status_Failed);
  209. if(type == 1)
  210. {
  211. Log_Printf_Debug("activeID: %d, error: 接收结果过期,请重置状态\r\n", aiwb2.activeID); // 打印日志
  212. }
  213. else if(type == 2)
  214. {
  215. // 发送日志
  216. Log_Printf_Debug("activeID: %d, AT接收失败: %d\r\n", aiwb2.activeID, AT_result_length());
  217. Log_SendArray_Debug(AT_result(), AT_result_length());
  218. }
  219. else
  220. {
  221. Log_Printf_Debug("activeID: %d, error: 未知错误类型\r\n", aiwb2.activeID); // 打印日志
  222. }
  223. // 失败结果
  224. return Result_Failed;
  225. }
  226. /**
  227. * @brief 获取定时
  228. * @param 无
  229. * @retval Result_Failed:失败
  230. */
  231. static uint32_t getTimerMs(void)
  232. {
  233. return time_get_delay(&aiwb2.timer);
  234. }
  235. /**
  236. * @brief 返回超时结果
  237. * @param 无
  238. * @retval Result_Failed:失败
  239. */
  240. static enum Result overtime(void)
  241. {
  242. setStatus(Status_Overtime); // 超时
  243. return Result_Failed; // 结果
  244. }
  245. // 返回成功结果
  246. static enum Result success_no_log(void)
  247. {
  248. // 成功
  249. setStatus(Status_Success);
  250. // 结果
  251. return Result_Success;
  252. }
  253. /**
  254. * @brief 返回成功结果
  255. * @param 无
  256. * @retval Result_Success:成功
  257. */
  258. static enum Result success(void)
  259. {
  260. // 成功
  261. Log_Printf_Debug("接收成功: %d\r\n", AT_result_length());
  262. Log_SendArray_Debug(AT_result(), AT_result_length());
  263. // setStatus(Status_Success);
  264. // 结果
  265. return success_no_log();
  266. }
  267. /**
  268. * @brief 返回成功结果 不打印结果
  269. * @param 无
  270. * @retval Result_Success:成功
  271. */
  272. static enum Result success_noPrintedresults(void)
  273. {
  274. // setStatus(Status_Success);
  275. // 结果
  276. return success_no_log();
  277. }
  278. /**
  279. * @brief 验证ID是否正确
  280. * @param activeID : AT指令的ID
  281. * @retval 1:AT指令的ID正确 0:错误(重复)
  282. */
  283. static uint8_t verifyActiveID(uint8_t activeID)
  284. {
  285. if(getActiveID() == 0 || getActiveID() == activeID){ return 1; }
  286. else
  287. {
  288. Log_Printf_Debug("activeID repetition!\r\n");
  289. return 0;
  290. }
  291. }
  292. /**
  293. * @brief WiFi_Aiwb2模块发送"AT"指令
  294. * @param 无
  295. * @retval enum Result:AT指令是否成功发送并返回的结果
  296. */
  297. enum Result aiwb2_test_at(void)
  298. {
  299. enum Result result = Result_None;
  300. int activeID = 1, time = 500; // 活动ID, 超时时间
  301. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  302. if(getStatus() == Status_None )
  303. {
  304. sprintf(AT_CMD, "AT\r\n");//拼接AT指令
  305. result = send_at(AT_CMD, activeID);
  306. }
  307. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  308. {
  309. Log_Printf_Debug("返回结果过期1,请重置状态\r\n"); // 打印日志
  310. result = failed(1); // 失败
  311. }
  312. else if(getTimerMs() > time) // 正在发送状态。判断超时
  313. {
  314. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  315. result = overtime(); // 超时
  316. }if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  317. {
  318. // 发送日志
  319. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  320. // Log_SendArray_Debug(AT_result(), AT_result_length());
  321. result = success(); // 成功
  322. aiwb2_reset();
  323. }
  324. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  325. {
  326. // 发送日志
  327. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  328. // Log_SendArray_Debug(AT_result(), AT_result_length());
  329. result = failed(2); // 失败
  330. }
  331. return result;
  332. }
  333. /**
  334. * @brief WiFi_Aiwb2模块发送"AT+WMODE"指令:WIFI 工作模式
  335. * @param n:WIFI 工作模式,1:STA模式 m:保是否存到 flash,1:保存
  336. * @retval enum Result:AT指令是否成功发送并返回的结果
  337. */
  338. enum Result aiwb2_set_workmode(uint8_t n,uint8_t m)
  339. {
  340. enum Result result = Result_None;
  341. int activeID = 6, time = 500; // 活动ID, 超时时间
  342. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  343. if(getStatus() == Status_None) // 空闲状态
  344. {
  345. sprintf(AT_CMD, "AT+WMODE=%d,%d\r\n", n,m); // 拼接AT指令
  346. result = send_at(AT_CMD, activeID);
  347. }
  348. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  349. {
  350. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  351. result = failed(1); // 失败
  352. }
  353. else if(getTimerMs() > time) // 正在发送状态。判断超时
  354. {
  355. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  356. result = overtime(); // 超时
  357. }
  358. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  359. {
  360. // 发送日志
  361. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  362. // Log_SendArray_Debug(AT_result(), AT_result_length());
  363. result = success(); // 成功
  364. aiwb2_reset();
  365. }
  366. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  367. {
  368. // 发送日志
  369. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  370. // Log_SendArray_Debug(AT_result(), AT_result_length());
  371. result = failed(2); // 失败
  372. }
  373. return result;
  374. }
  375. /**
  376. * @brief WiFi_Aiwb2模块发送"AT+SOCKETRECVCFG"指令:设置socket 接收模式
  377. * @param 0:不打印接受的数据内容 1:打印接收的数据内容
  378. * @retval enum Result:AT指令是否成功发送并返回的结果
  379. */
  380. enum Result aiwb2_set_receivingmode(uint8_t n)
  381. {
  382. enum Result result = Result_None;
  383. int activeID = 3, time = 500; // 活动ID, 超时时间
  384. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  385. if(getStatus() == Status_None) // 空闲状态
  386. {
  387. sprintf(AT_CMD, "AT+SOCKETRECVCFG=%d\r\n", n); // 拼接AT指令
  388. result = send_at(AT_CMD, activeID);
  389. }
  390. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  391. {
  392. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  393. result = failed(1); // 失败
  394. }
  395. else if(getTimerMs() > time) // 正在发送状态。判断超时
  396. {
  397. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  398. result = overtime(); // 超时
  399. }
  400. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  401. {
  402. // 发送日志
  403. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  404. // Log_SendArray_Debug(AT_result(), AT_result_length());
  405. result = success(); // 成功
  406. aiwb2_reset();
  407. }
  408. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  409. {
  410. // 发送日志
  411. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  412. // Log_SendArray_Debug(AT_result(), AT_result_length());
  413. result = failed(2); // 失败
  414. }
  415. return result;
  416. }
  417. /**
  418. * @brief WiFi_Aiwb2模块发送"AT+WJAP"指令:连接wifi
  419. * @param WIFI_Name:wifi名字 WIFI_Password:wifi密码
  420. * @retval enum Result:AT指令是否成功发送并返回的结果
  421. */
  422. enum Result aiwb2_connect_WIFI(char *WIFI_Name, char *WIFI_Password)
  423. {
  424. enum Result result = Result_None;
  425. int activeID = 4, time = 5000; // 活动ID, 超时时间
  426. if(!verifyActiveID(activeID)){ return Result_Failed; }
  427. if(getStatus() == Status_None) // 空闲状态
  428. {
  429. sprintf(AT_CMD, "AT+WJAP=\"%s\",\"%s\"\r\n", WIFI_Name, WIFI_Password); // 拼接AT指令
  430. result = send_at(AT_CMD, activeID);
  431. }
  432. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  433. {
  434. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  435. result = failed(1); // 失败
  436. }
  437. else if(getTimerMs() > time) // 正在发送状态。判断超时
  438. {
  439. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  440. result = overtime(); // 超时
  441. }
  442. else if(strstr((char * )AT_result(), "WIFI_GOT_IP\r\n") != NULL) // 查询是否返回
  443. {
  444. // 发送日志
  445. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  446. // Log_SendArray_Debug(AT_result(), AT_result_length());
  447. result = success(); // 成功
  448. aiwb2_reset();
  449. }
  450. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  451. {
  452. // 发送日志
  453. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  454. // Log_SendArray_Debug(AT_result(), AT_result_length());
  455. result = failed(2); // 失败
  456. }
  457. return result;
  458. }
  459. /**
  460. * @brief WiFi_Aiwb2模块发送"AT+SOCKET"指令:打开socket服务
  461. * @param UDPID:2表示建立UDP连接 IP_address:远程服务器地址 remote_port:远程服务器端口
  462. * @retval enum Result:AT指令是否成功发送并返回的结果
  463. */
  464. enum Result aiwb2_open_socket(uint8_t UDPID, char * IP_address, uint16_t remote_port)
  465. {
  466. enum Result result = Result_None;
  467. int activeID = 5, time = 5000; // 活动ID, 超时时间
  468. if(!verifyActiveID(activeID)){ return Result_Failed; }
  469. if(getStatus() == Status_None) // 空闲状态
  470. {
  471. sprintf(AT_CMD, "AT+SOCKET=%d,\"%s\",%d\r\n", UDPID, IP_address, remote_port); // 拼接AT指令 为什么使用了两个
  472. result = send_at(AT_CMD, activeID);
  473. }
  474. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  475. {
  476. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  477. result = failed(1); // 失败
  478. }
  479. else if(getTimerMs() > time) // 正在发送状态。判断超时
  480. {
  481. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  482. result = overtime(); // 超时
  483. }
  484. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  485. {
  486. // 发送日志
  487. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  488. // Log_SendArray_Debug(AT_result(), AT_result_length());
  489. //处理返回结果 获取ConID
  490. char *data = (char * )AT_result();
  491. char *saveptr = NULL;
  492. char *split = "\r\n";
  493. // 解析第一行
  494. char *line1 = strtok_r(data, split, &saveptr);
  495. // 查找 "ConID=" 并提取连接ID
  496. char *conID_str = strstr(line1, "ConID=");
  497. if (conID_str != NULL)
  498. {
  499. conID = atoi(conID_str + strlen("ConID="));
  500. Log_Printf_Debug("conID: %d\r\n", conID);
  501. result = success(); // 成功
  502. aiwb2_reset();
  503. }
  504. }
  505. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  506. {
  507. // 发送日志
  508. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  509. // Log_SendArray_Debug(AT_result(), AT_result_length());
  510. result = failed(2); // 失败
  511. }
  512. return result;
  513. }
  514. /**
  515. * @brief WiFi_Aiwb2模块发送"AT+SOCKETSEN"指令:发送报文
  516. * @param UDPID:2表示建立UDP连接 IP_address:远程服务器地址 remote_port:远程服务器端口
  517. * @retval enum Result:AT指令是否成功发送并返回的结果
  518. */
  519. enum Result aiwb2_send(uint8_t connectID, uint8_t * data, uint16_t send_data_length, uint16_t * recv_data_length)
  520. {
  521. enum Result result = Result_None;
  522. int activeID = 6, time = 10000; // 活动ID, 超时时间
  523. if(!verifyActiveID(activeID)){ return Result_Failed; }
  524. // 判断状态
  525. if(getStatus() == Status_None) // 空闲状态
  526. {
  527. sprintf(AT_CMD, "AT+SOCKETSEND=%d,%d\r\r\n", connectID, send_data_length); // 拼接AT指令
  528. result = send_at(AT_CMD, activeID);
  529. }
  530. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  531. {
  532. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  533. result = failed(1); // 失败
  534. }
  535. else if(getTimerMs() > time) // 正在发送状态。判断超时
  536. {
  537. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  538. result = overtime(); // 超时
  539. }
  540. else if(strstr((char * )AT_result(), ">") != NULL && AT_result_length() == 1) // 有响应
  541. {
  542. // flag_Arrow = 1;
  543. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  544. Log_SendArray_Debug(AT_result(), AT_result_length());
  545. Log_Printf_Debug("\r\ncoap:\r\n");
  546. Log_SendHex(data, send_data_length);
  547. Log_Printf_Debug("\r\n");
  548. // 发送数据
  549. send_data(data, send_data_length);
  550. // 清理一下AT返回结果缓存
  551. AT_Clear_Result();
  552. }
  553. else if(strstr((char * )AT_result(), "SocketDown") != NULL) // 查询是否返回
  554. {
  555. uint32_t last_time = AT_wait_time();
  556. if(last_time > 10) // 过10ms之后再取数据,避免数据截断。
  557. {
  558. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  559. Log_SendArray_Debug(AT_result(), AT_result_length());
  560. // 发送日志
  561. Log_Printf_Debug("AT返回: %d, time_diff: %d\r\n", AT_result_length(), last_time);
  562. // 清理一下AT返回结果缓存
  563. //AT_Clear_Result();
  564. char * saveptr = NULL;
  565. char * split = "\r\n";
  566. char * douhao = ",";
  567. //char * zuokuohao = "{";
  568. char * Line0 = strtok_r((char * )AT_result(), split, &saveptr);
  569. uint8_t Line0_Len = strlen(Line0); //得到OK的长度
  570. Log_Printf_Debug("Line0: %s\r\n", Line0);
  571. // 后续调用,传入 NULL
  572. char * Line1 = strtok_r(NULL, douhao, &saveptr);
  573. uint8_t Line1_Len = strlen(Line1); //得到+EVENT:SocketDown的长度
  574. Log_Printf_Debug("Line1(%d): %s\r\n",Line1_Len ,Line1);
  575. char * Line2 = strtok_r(NULL, douhao, &saveptr);
  576. uint8_t Line2_Len = strlen(Line2); //得到conID的长度
  577. Log_Printf_Debug("Line2(%d): %s\r\n",Line2_Len ,Line2);
  578. char * Line3 = strtok_r(NULL, douhao, &saveptr);
  579. uint8_t Line3_Len = strlen(Line3); //得到认证返回数据的长度
  580. Log_Printf_Debug("Line3(%d): %s\r\n",Line3_Len ,Line3);
  581. Line1_Len = Line1_Len + Line0_Len;
  582. uint8_t Line4_Len = Line1_Len + Line2_Len;
  583. uint8_t Line5_Len = Line4_Len + Line3_Len;
  584. * recv_data_length = strtoul(Line3, NULL, 10) ;
  585. uint16_t line_length = Line5_Len + 6 ;
  586. Log_Printf_Debug("Line5_Len: %d\r\n", Line5_Len);
  587. // 内存拷贝
  588. memcpy(data, AT_result() + line_length, * recv_data_length);
  589. result = Result_Success;
  590. AT_Clear_Result();
  591. result = success(); // 成功
  592. }
  593. }
  594. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  595. {
  596. // 发送日志
  597. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  598. // Log_SendArray_Debug(AT_result(), AT_result_length());
  599. result = failed(2); // 失败
  600. }
  601. return result;
  602. }
  603. /**
  604. * @brief 接收数据。带计时
  605. * @param connectID:认证返回的conID data :接收的数据 data:length 接收的数据长度。
  606. * @retval enum Result:AT指令是否成功发送并返回的结果
  607. */
  608. enum Result aiwb2_recv_with_time(uint8_t connectID, uint8_t * data, uint16_t * data_length, uint32_t time_out)
  609. {
  610. enum Result result = Result_None;
  611. int activeID = 7, time = time_out; // 活动ID, 超时时间
  612. if(!verifyActiveID(activeID)){ return Result_Failed; }
  613. if(getStatus() == Status_None) // 空闲状态
  614. {
  615. setStatus(Status_Sending);
  616. }
  617. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  618. {
  619. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  620. result = failed(1); // 失败
  621. }
  622. else if(getTimerMs() > time) // 正在发送状态。判断超时
  623. {
  624. Log_Printf_Debug("等待时间超时\r\n"); // 打印日志
  625. result = overtime(); // 超时
  626. }
  627. else
  628. {
  629. // 接收数据
  630. result = aiwb2.recv(connectID, data, data_length);
  631. if(result == Result_Success)
  632. {
  633. result = success(); // 成功
  634. }
  635. }
  636. return result;
  637. }
  638. /**
  639. * @brief 接收数据
  640. * @param connectID:认证返回的conID data :接收的数据 data:length 接收的数据长度。
  641. * @retval enum Result:AT指令是否成功发送并返回的结果
  642. */
  643. enum Result aiwb2_recv(uint8_t connectID, uint8_t * data, uint16_t * data_length)
  644. {
  645. // 设置AT为使用中,防止被其他程序占用
  646. AT_Set_Status(AT_Status_Using);
  647. enum Result result = Result_None;
  648. if(connectID > 10)//认证返回的conID最大是4
  649. {
  650. Log_Printf_Debug("recv params error!\r\n");
  651. return Result_Failed;
  652. }
  653. // Log_Printf_Debug("-------aiwb2_recv-------AT返回: %d\r\n", AT_result_length());
  654. // Log_SendArray_Debug(AT_result(), AT_result_length());
  655. char cmp[100];
  656. sprintf(cmp, "+EVENT:SocketDown,%d", connectID); // 拼接AT指令
  657. if(strstr((char * )AT_result(), cmp) != NULL)
  658. {
  659. Log_Printf_Debug("-------aiwb2_recv-------AT返回: %d\r\n", AT_result_length());
  660. Log_SendArray_Debug(AT_result(), AT_result_length());
  661. // 防止接收不完整
  662. uint32_t last_time = AT_wait_time();
  663. if(last_time > 10) // 过10ms之后再取数据,避免数据截断。
  664. {
  665. Log_Printf_Debug("--------aiwb2_recv——2------AT返回: %d\r\n", AT_result_length());
  666. Log_SendArray_Debug(AT_result(), AT_result_length());
  667. // 发送日志
  668. Log_Printf_Debug("AT返回: %d, time_diff: %d\r\n", AT_result_length(), last_time);
  669. // 清理一下AT返回结果缓存
  670. //AT_Clear_Result();
  671. char * saveptr = NULL;
  672. char * split = "\r\n";
  673. char * douhao = ",";
  674. //char * zuokuohao = "{";
  675. char * Line0 = strtok_r((char * )AT_result(), split, &saveptr);
  676. uint8_t Line0_Len = strlen(Line0); //得到OK的长度
  677. Log_Printf_Debug("Line0: %s\r\n", Line0);
  678. // 后续调用,传入 NULL
  679. char * Line1 = strtok_r(NULL, douhao, &saveptr);
  680. uint8_t Line1_Len = strlen(Line1); //得到+EVENT:SocketDown的长度
  681. Log_Printf_Debug("Line1(%d): %s\r\n",Line1_Len ,Line1);
  682. char * Line2 = strtok_r(NULL, douhao, &saveptr);
  683. uint8_t Line2_Len = strlen(Line2); //得到conID的长度
  684. Log_Printf_Debug("Line2(%d): %s\r\n",Line2_Len ,Line2);
  685. char * Line3 = strtok_r(NULL, douhao, &saveptr);
  686. uint8_t Line3_Len = strlen(Line3); //得到认证返回数据的长度
  687. Log_Printf_Debug("Line3(%d): %s\r\n",Line3_Len ,Line3);
  688. Line1_Len = Line1_Len + Line0_Len;
  689. uint8_t Line4_Len = Line1_Len + Line2_Len;
  690. uint8_t Line5_Len = Line4_Len + Line3_Len;
  691. * data_length = strtoul(Line3, NULL, 10) ;
  692. uint16_t line_length = Line5_Len + 6 ;
  693. Log_Printf_Debug("Line5_Len: %d\r\n", Line5_Len);
  694. // 内存拷贝
  695. memcpy(data, AT_result() + line_length, * data_length);
  696. result = Result_Success;
  697. AT_Clear_Result();
  698. }
  699. }
  700. return result;
  701. }
  702. /**
  703. * @brief 接收数据。带计时(注册接收)
  704. * @param connectID:认证返回的conID data :接收的数据 data:length 接收的数据长度。
  705. * @retval enum Result:AT指令是否成功发送并返回的结果
  706. */
  707. enum Result aiwb2_recv_with_time_regist(uint8_t connectID, uint8_t * data, uint16_t * data_length, uint32_t time_out)
  708. {
  709. enum Result result = Result_None;
  710. int activeID = 7, time = time_out; // 活动ID, 超时时间
  711. if(!verifyActiveID(activeID)){ return Result_Failed; }
  712. if(getStatus() == Status_None) // 空闲状态
  713. {
  714. setStatus(Status_Sending);
  715. }
  716. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  717. {
  718. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  719. result = failed(1); // 失败
  720. }
  721. else if(getTimerMs() > time) // 正在发送状态。判断超时
  722. {
  723. Log_Printf_Debug("等待时间超时\r\n"); // 打印日志
  724. result = overtime(); // 超时
  725. }
  726. else
  727. {
  728. // 接收数据
  729. result = aiwb2.recv_regist(connectID, data, data_length);
  730. if(result == Result_Success)
  731. {
  732. result = success(); // 成功
  733. }
  734. }
  735. return result;
  736. }
  737. /**
  738. * @brief 接收数据(注册接收)
  739. * @param connectID:认证返回的conID data :接收的数据 data:length 接收的数据长度。
  740. * @retval enum Result:AT指令是否成功发送并返回的结果
  741. */
  742. enum Result aiwb2_recv_regist(uint8_t connectID, uint8_t * data, uint16_t * data_length)
  743. {
  744. // 设置AT为使用中,防止被其他程序占用
  745. AT_Set_Status(AT_Status_Using);
  746. enum Result result = Result_None;
  747. if(connectID > 4)//认证返回的conID最大是4
  748. {
  749. Log_Printf_Debug("recv params error!\r\n");
  750. return Result_Failed;
  751. }
  752. char cmp[50];
  753. sprintf(cmp, "+EVENT:SocketDown,%d", connectID); // 拼接AT指令
  754. if(strstr((char * )AT_result(), cmp) != NULL)
  755. {
  756. // 防止接收不完整
  757. uint32_t last_time = AT_wait_time();
  758. if(last_time > 10) // 过10ms之后再取数据,避免数据截断。
  759. {
  760. // 清理一下AT返回结果缓存
  761. //AT_Clear_Result();
  762. char * saveptr = NULL;
  763. //char * split = "\r\n";
  764. char * douhao = ",";
  765. // 后续调用,传入 NULL
  766. char * Line1 = strtok_r((char * )AT_result(), douhao, &saveptr);
  767. uint8_t Line1_Len = strlen(Line1); //得到+EVENT:SocketDown的长度
  768. Log_Printf_Debug("Line1(%d): %s\r\n",Line1_Len ,Line1);
  769. char * Line2 = strtok_r(NULL, douhao, &saveptr);
  770. uint8_t Line2_Len = strlen(Line2); //得到conID的长度
  771. Log_Printf_Debug("Line2(%d): %s\r\n",Line2_Len ,Line2);
  772. char * Line3 = strtok_r(NULL, douhao, &saveptr);
  773. uint8_t Line3_Len = strlen(Line3); //得到认证返回数据的长度
  774. Log_Printf_Debug("Line3(%d): %s\r\n",Line3_Len ,Line3);
  775. //
  776. // Log_Printf_Debug("--------------AT返回: %d\r\n", AT_result_length());
  777. // Log_SendArray_Debug(AT_result(), AT_result_length());
  778. //
  779. uint8_t Line4_Len = Line1_Len + Line2_Len;
  780. uint8_t Line5_Len = Line4_Len + Line3_Len;
  781. * data_length = strtoul(Line3, NULL, 10) ;
  782. uint16_t line_length = Line5_Len + 3;
  783. Log_Printf_Debug("Line5_Len: %d\r\n", Line5_Len);
  784. // 内存拷贝
  785. memcpy(data, AT_result() + line_length, * data_length);
  786. result = Result_Success;
  787. AT_Clear_Result();
  788. }
  789. }
  790. return result;
  791. }
  792. /**
  793. * @brief 设置休眠
  794. * @param 无
  795. * @retval enum Result:AT指令是否成功发送并返回的结果
  796. */
  797. enum Result aiwb2_set_sleep(void)
  798. {
  799. enum Result result = Result_None;
  800. int activeID = 8, time = 500; // 活动ID, 超时时间
  801. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  802. if(getStatus() == Status_None) // 空闲状态
  803. {
  804. sprintf(AT_CMD, "AT+SYSIOMAP=38,NC,NC,NC,NC,11,NC,NC,14,17,3,20,22,0,21,NC,NC,NC,NC,NC,NC,NC,NC,NC,NC, NC,NC,4,2,NC,1,5,NC,NC,NC,NC,12,NC,NC\r\n"); // 拼接AT指令
  805. result = send_at(AT_CMD, activeID);
  806. }
  807. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  808. {
  809. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  810. result = failed(1); // 失败
  811. }
  812. else if(getTimerMs() > time) // 正在发送状态。判断超时
  813. {
  814. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  815. result = overtime(); // 超时
  816. }
  817. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  818. {
  819. // 发送日志
  820. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  821. // Log_SendArray_Debug(AT_result(), AT_result_length());
  822. result = success(); // 成功
  823. aiwb2_reset();
  824. }
  825. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  826. {
  827. // 发送日志
  828. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  829. // Log_SendArray_Debug(AT_result(), AT_result_length());
  830. result = failed(2); // 失败
  831. }
  832. return result;
  833. }
  834. /**
  835. * @brief 进入休眠
  836. * @param 无
  837. * @retval enum Result:AT指令是否成功发送并返回的结果
  838. */
  839. enum Result aiwb2_exit_sleep(void)
  840. {
  841. enum Result result = Result_None;
  842. int activeID = 9, time = 500; // 活动ID, 超时时间
  843. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  844. if(getStatus() == Status_None) // 空闲状态
  845. {
  846. sprintf(AT_CMD, "AT+SLEEP=2,2,7,0\r\n"); // 拼接AT指令
  847. result = send_at(AT_CMD, activeID);
  848. }
  849. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  850. {
  851. Log_Printf_Debug("返回结果过期1,请重置状态\r\n"); // 打印日志
  852. result = failed(1); // 失败
  853. }
  854. else if(getTimerMs() > time) // 正在发送状态。判断超时
  855. {
  856. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  857. result = overtime(); // 超时
  858. }
  859. if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  860. {
  861. // 发送日志
  862. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  863. // Log_SendArray_Debug(AT_result(), AT_result_length());
  864. result = success(); // 成功
  865. aiwb2_reset();
  866. }
  867. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  868. {
  869. // 发送日志
  870. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  871. // Log_SendArray_Debug(AT_result(), AT_result_length());
  872. result = failed(2); // 失败
  873. }
  874. return result;
  875. }
  876. /**
  877. * @brief 关闭socket服务
  878. * @param connectID:socketID
  879. * @retval enum Result:AT指令是否成功发送并返回的结果
  880. */
  881. enum Result aiwb2_close_socket(uint8_t connectID)
  882. {
  883. enum Result result = Result_None;
  884. int activeID = 10, time = 500; // 活动ID, 超时时间
  885. // 校验ID
  886. if(!verifyActiveID(activeID)){ return Result_Failed; }
  887. // 判断状态
  888. if(getStatus() == Status_None) // 空闲状态
  889. {
  890. sprintf(AT_CMD, "AT+SOCKETDEL=%d\r\r\n", connectID); // 拼接AT指令
  891. result = send_at(AT_CMD, activeID);
  892. }
  893. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  894. {
  895. result = failed(1); // 失败
  896. }
  897. else if(getTimerMs() > time) // 正在发送状态。判断超时
  898. {
  899. result = overtime(); // 超时
  900. }
  901. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  902. {
  903. result = success(); // 成功
  904. }
  905. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  906. {
  907. result = failed(2); // 失败
  908. }
  909. return result;
  910. }
  911. /**
  912. * @brief 控制是否回显 要发送的AT指令数据
  913. * @param connectID:socketID
  914. * @retval enum Result:AT指令是否成功发送并返回的结果
  915. */
  916. enum Result aiwb2_set_qisde(uint8_t echo)
  917. {
  918. enum Result result = Result_None;
  919. int activeID = 11, time = 500; // 活动ID, 超时时间
  920. // 校验ID
  921. if(!verifyActiveID(activeID)){ return Result_Failed; }
  922. // 判断状态
  923. if(getStatus() == Status_None) // 空闲状态
  924. {
  925. sprintf(AT_CMD, "ATE%d\r\r\n", echo); // 拼接AT指令
  926. result = send_at(AT_CMD, activeID);
  927. }
  928. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  929. {
  930. result = failed(1); // 失败
  931. }
  932. else if(getTimerMs() > time) // 正在发送状态。判断超时
  933. {
  934. result = overtime(); // 超时
  935. }
  936. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  937. {
  938. result = success(); // 成功
  939. }
  940. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  941. {
  942. result = failed(2); // 失败
  943. }
  944. return result;
  945. }
  946. /**
  947. * @brief 断块WIFI连接
  948. * @param 无
  949. * @retval enum Result:AT指令是否成功发送并返回的结果
  950. */
  951. enum Result aiwb2_wdisconnet(void)
  952. {
  953. enum Result result = Result_None;
  954. int activeID = 12, time = 500; // 活动ID, 超时时间
  955. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  956. if(getStatus() == Status_None )
  957. {
  958. sprintf(AT_CMD, "AT+WDISCONNECT\r\n");//拼接AT指令
  959. result = send_at(AT_CMD, activeID);
  960. }
  961. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  962. {
  963. Log_Printf_Debug("返回结果过期1,请重置状态\r\n"); // 打印日志
  964. result = failed(1); // 失败
  965. }
  966. else if(getTimerMs() > time) // 正在发送状态。判断超时
  967. {
  968. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  969. result = overtime(); // 超时
  970. }if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  971. {
  972. // 发送日志
  973. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  974. // Log_SendArray_Debug(AT_result(), AT_result_length());
  975. result = success(); // 成功
  976. aiwb2_reset();
  977. }
  978. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  979. {
  980. // 发送日志
  981. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  982. // Log_SendArray_Debug(AT_result(), AT_result_length());
  983. result = failed(2); // 失败
  984. }
  985. return result;
  986. }
  987. /**
  988. * @brief 查询指定WIFI信号强度
  989. * @param RSSI:信号强度
  990. * @retval enum Result:AT指令是否成功发送并返回的结果
  991. */
  992. enum Result aiwb2_query_id_signal(char * ID, int * RSSI)
  993. {
  994. enum Result result = Result_None;
  995. int activeID = 14, time=5000; // 活动ID, 超时时间
  996. // 校验ID
  997. if(!verifyActiveID(activeID)){ return Result_Failed; }
  998. // 判断状态
  999. if(getStatus() == Status_None) // 空闲状态
  1000. {
  1001. sprintf(AT_CMD, "AT+WSCAN=\"%s\"\r\n",ID); // 拼接AT指令
  1002. result = send_at(AT_CMD, activeID);
  1003. }
  1004. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1005. {
  1006. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  1007. result = failed(1); // 失败
  1008. }
  1009. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1010. {
  1011. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1012. result = overtime(); // 超时
  1013. }
  1014. else if(strstr((char * )AT_result(), "OK") != NULL) // 查询是否返回
  1015. {
  1016. if(AT_result_length() != 52 )
  1017. {
  1018. // 发送日志
  1019. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1020. // Log_SendArray_Debug(AT_result(), AT_result_length());
  1021. // // 处理返回结果
  1022. char * saveptr = NULL;
  1023. char * blank =" ";
  1024. char * split ="\r\n";
  1025. char *lin1 = strtok_r((char * )AT_result(), blank, &saveptr);
  1026. * RSSI = atoi(strtok_r(NULL, split, &saveptr));
  1027. //
  1028. // //打印信号强度值
  1029. // Log_Printf_Debug("指定ID的WiFi强度值:%d\r\n", * RSSI);
  1030. result = success(); // 成功
  1031. }else if(AT_result_length() == 52)
  1032. {
  1033. * RSSI = -99;
  1034. Log_Printf_Debug("指定\"%s\"的WiFi未检测到\r\n", ID);
  1035. result = success(); // 成功
  1036. }
  1037. }
  1038. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL)
  1039. {
  1040. * RSSI = -99;
  1041. Log_Printf_Debug("指定的\"%s\"wifi接受失败: %d\r\n", ID,AT_result_length());
  1042. Log_SendArray_Debug(AT_result(), AT_result_length());
  1043. result = success_noPrintedresults(); // 返回成功,得以判断后续的wifi的RSSI
  1044. }
  1045. return result;
  1046. }
  1047. /**
  1048. * @brief 查询当前WiFi信号强度
  1049. * @param RSSI:信号强度
  1050. * @retval enum Result:AT指令是否成功发送并返回的结果
  1051. */
  1052. enum Result aiwb2_query_signal(int * RSSI)
  1053. {
  1054. enum Result result = Result_None;
  1055. int activeID = 19, time=1000; // 活动ID, 超时时间
  1056. // 校验ID
  1057. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1058. // 判断状态
  1059. if(getStatus() == Status_None) // 空闲状态
  1060. {
  1061. sprintf(AT_CMD, "AT+WRSSI?\r\n"); // 拼接AT指令
  1062. result = send_at(AT_CMD, activeID);
  1063. }
  1064. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1065. {
  1066. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  1067. result = failed(1); // 失败
  1068. }
  1069. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1070. {
  1071. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1072. result = overtime(); // 超时
  1073. }
  1074. else if(strstr((char * )AT_result(), "OK") != NULL) // 查询是否返回
  1075. {
  1076. if(strstr((char * )AT_result(), "WRSSI") != NULL)
  1077. {
  1078. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1079. // Log_SendArray_Debug(AT_result(), AT_result_length());
  1080. // 处理返回结果
  1081. char * saveptr = NULL;
  1082. char * colon = ":";
  1083. char * split = "\r\n";
  1084. strtok_r((char * )AT_result(), colon, &saveptr);
  1085. * RSSI = atoi(strtok_r(NULL, split, &saveptr));
  1086. //打印信号强度值
  1087. Log_Printf_Debug("WiFi信号强度RSSI值: %d\r\n", *RSSI);
  1088. result = success(); // 成功
  1089. }
  1090. else
  1091. {
  1092. // 发送日志
  1093. // Log_Printf_Debug("返回: %d\r\n", AT_result_length());
  1094. // Log_SendArray_Debug(AT_result(), AT_result_length());
  1095. result = failed(2); // 失败
  1096. }
  1097. }
  1098. else if(strstr((char * )AT_result(), "ERROR") != NULL)
  1099. {
  1100. // 发送日志
  1101. // Log_Printf_Debug("返回: %d\r\n", AT_result_length());
  1102. // Log_SendArray_Debug(AT_result(), AT_result_length());
  1103. result = failed(2); // 失败
  1104. }
  1105. return result;
  1106. }
  1107. /**
  1108. * @brief 进入睡眠(改变IO口电平的方式)
  1109. * @param 无
  1110. * @retval 无
  1111. */
  1112. void aiwb2_enter_sleep_io(void)
  1113. {
  1114. GPIO_ResetBits(WAKE_GPIO, WAKE_GPIO_Pin); // 拉低io口,进入深睡眠
  1115. }
  1116. /**
  1117. * @brief 退出睡眠(改变IO口电平的方式)
  1118. * @param 无
  1119. * @retval 无
  1120. */
  1121. void aiwb2_exit_sleep_io(void)
  1122. {
  1123. GPIO_SetBits(WAKE_GPIO, WAKE_GPIO_Pin); // 拉高io口,唤醒模组
  1124. }
  1125. /**
  1126. * @brief 退出睡眠并检测是否重启成功(改变IO口电平的方式)
  1127. * @param 无
  1128. * @retval enum Result :是否成功返回信息
  1129. */
  1130. enum Result aiwb2_exit_sleep_io_test(void)
  1131. {
  1132. enum Result result = Result_None;
  1133. int activeID = 20, time=500; // 活动ID, 超时时间
  1134. if(!verifyActiveID(activeID)){ return Result_Failed;}
  1135. if(getStatus() == Status_None) // 空闲状态
  1136. {
  1137. GPIO_SetBits(WAKE_GPIO, WAKE_GPIO_Pin); // 拉高io口,唤醒模组
  1138. setActiveID(activeID); // 活动ID
  1139. setStatus(Status_Sending); // 设置状态为已发送
  1140. clearTimer();//重置计时
  1141. // return Result_None; // 未知结
  1142. }
  1143. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1144. {
  1145. Log_Printf_Debug("返回结果过期,请重置状态\r\n");// 打印日志
  1146. result = failed(1); // 失败
  1147. }
  1148. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1149. {
  1150. Log_Printf_Debug("退出睡眠步骤超时\r\n"); // 打印日志
  1151. result = overtime(); // 超时
  1152. }
  1153. else if(strstr((char * )AT_result(), "ready") != NULL)
  1154. {
  1155. Log_Printf_Debug("退出休眠成功\r\n");// 打印日志
  1156. result = success_noPrintedresults(); // 成功
  1157. }
  1158. return result;
  1159. }
  1160. /**
  1161. * @brief 设定查询指定WIFI信息的输出数据
  1162. * @param RSSI:信号强度
  1163. * @retval enum Result:AT指令是否成功发送并返回的结果
  1164. */
  1165. enum Result aiwb2_set_dataout(void)
  1166. {
  1167. enum Result result = Result_None;
  1168. int activeID = 21, time = 500; // 活动ID, 超时时间
  1169. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  1170. if(getStatus() == Status_None )
  1171. {
  1172. sprintf(AT_CMD, "AT+WSCANOPT=232\r\n");//拼接AT指令
  1173. result = send_at(AT_CMD, activeID);
  1174. }
  1175. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1176. {
  1177. Log_Printf_Debug("返回结果过期1,请重置状态\r\n"); // 打印日志
  1178. result = failed(1); // 失败
  1179. }
  1180. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1181. {
  1182. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1183. result = overtime(); // 超时
  1184. }if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1185. {
  1186. // 发送日志
  1187. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1188. // Log_SendArray_Debug(AT_result(), AT_result_length());
  1189. result = success(); // 成功
  1190. aiwb2_reset();
  1191. }
  1192. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1193. {
  1194. // 发送日志
  1195. // Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1196. // Log_SendArray_Debug(AT_result(), AT_result_length());
  1197. result = failed(2); // 失败
  1198. }
  1199. return result;
  1200. }
  1201. /*
  1202. 注册wifi参数设置
  1203. */
  1204. static char Name[50];
  1205. static char Password[30];
  1206. //初始化wifi名字
  1207. static void initClient_WiFiName(void);
  1208. //初始化密码
  1209. static void initClient_WiFiPassword(void);
  1210. //初始化wifi名字
  1211. static void initClient_WiFiName(void)
  1212. {
  1213. //获取name
  1214. memset(Name, 0, sizeof(Name));
  1215. strcat(Name, "zz");
  1216. }
  1217. //初始化wifi密码
  1218. static void initClient_WiFiPassword(void)
  1219. {
  1220. //获取密码
  1221. memset(Password, 0, sizeof(Password));
  1222. strcat(Password, "123456789");
  1223. }
  1224. // 获取wifi_name
  1225. char * WIFI_Name(void)
  1226. {
  1227. initClient_WiFiName();
  1228. return Name;
  1229. }
  1230. char * WIFI_Password(void)
  1231. {
  1232. initClient_WiFiPassword();
  1233. return Password;
  1234. }
  1235. // aiwb2提供的一些方法
  1236. struct AIWB2_Struct aiwb2 =
  1237. {
  1238. .timer = {
  1239. .time = 0,
  1240. .flag = 0
  1241. },
  1242. .ready = aiwb2_ready,
  1243. .reset = aiwb2_reset,
  1244. .test_at = aiwb2_test_at,
  1245. .set_receivingmode = aiwb2_set_receivingmode,
  1246. .set_workmode = aiwb2_set_workmode,
  1247. .set_connect_WIFI =aiwb2_connect_WIFI,
  1248. .set_qisde = aiwb2_set_qisde,
  1249. .set_dataout = aiwb2_set_dataout,
  1250. .open_socket = aiwb2_open_socket,
  1251. .close_socket=aiwb2_close_socket,
  1252. .send = aiwb2_send,
  1253. .recv_with_time = aiwb2_recv_with_time,
  1254. .recv = aiwb2_recv,
  1255. .recv_with_time_regist =aiwb2_recv_with_time_regist,
  1256. .recv_regist=aiwb2_recv_regist,
  1257. .enter_sleep_io = aiwb2_enter_sleep_io,
  1258. .wdisconnet = aiwb2_wdisconnet,
  1259. .query_id_signal = aiwb2_query_id_signal,
  1260. .query_signal = aiwb2_query_signal,
  1261. .exit_sleep_io_test = aiwb2_exit_sleep_io_test,
  1262. .exit_sleep_io = aiwb2_exit_sleep_io,
  1263. };
  1264. #endif