bc260y.c 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976
  1. #include "CONFIG.h"
  2. #if BC260Y
  3. /**
  4. ******************************************************************************
  5. * 版 本 :V1.0.0
  6. * 作 者 :liuyanbin,helomgxiang
  7. * 版权所有,盗版必究。
  8. * Copyright(C) All rights reserved
  9. ******************************************************************************
  10. * 历史记录
  11. * 序号 版本 变更内容 作者 日期
  12. * 1 V0.0.1 实现4GAT指令 何龙翔 2023/12/10
  13. * 2 V0.0.2 基于4实现NB指令 刘艳斌 2024/1/10
  14. * 3 V0.0.3 整合4g和nb代码 刘艳斌 2024/1/24
  15. * 4 V0.0.4 修改send函数添加sendrai 刘艳斌 2024/2/18
  16. ******************************************************************************
  17. */
  18. #include "stm32f10x.h"
  19. #include <stdio.h>
  20. #include <stdarg.h>
  21. #include <string.h>
  22. #include <stdlib.h>
  23. #include "CONFIG.h"
  24. #include "bc260y.h"
  25. #include "Log_Module.h"
  26. #include "At_Module.h"
  27. #include "Common_Util.h"
  28. // 方法声明
  29. void bc260y_reset(void); // 重置状态。该文件中的方法共用状态,在使用下面的方法前需要重置一下状态。
  30. enum Result bc260y_exit_sleep(void); // 退出休眠
  31. enum Result bc260y_exit_sleep_sync(void); // 退出休眠
  32. void bc260y_enter_sleep(void); // 进入休眠
  33. /**
  34. * 查询休眠模式
  35. * 输入<<
  36. *
  37. * 输出>>
  38. * n 睡眠模式。0 禁用,默认;1 启用。
  39. **/
  40. enum Result bc260y_query_sleep(uint8_t * n); // 查询休眠模式。
  41. enum Result bc260y_query_sleep_sync(uint8_t * n); // 查询休眠模式。同步
  42. /**
  43. * 设置休眠模式
  44. * 输入<<
  45. * n 参数。0 禁用;1启用。
  46. * 输出>>
  47. *
  48. **/
  49. enum Result bc260y_set_sleep(uint8_t n); // 设置休眠模式。
  50. enum Result bc260y_set_sleep_sync(uint8_t n); // 设置休眠模式。同步
  51. /**
  52. * 设置功能模式
  53. * 输入<<
  54. * fun 0 最小功能模式;1 全功能模式。
  55. * 输出>>
  56. *
  57. **/
  58. enum Result bc260y_query_cfun(uint8_t * n); // 查询功能模式。
  59. enum Result bc260y_query_cfun_sync(uint8_t * n); // 查询功能模式。
  60. enum Result bc260y_set_cfun(uint8_t fun);
  61. enum Result bc260y_set_cfun_sync(uint8_t fun); // 同步
  62. /**
  63. * 设置ps域网络注册状态
  64. * 输入<<
  65. * n 0 禁止上报网络注册;1 允许上报网络注册;2 允许上报网络注册和位置信息
  66. * 输出>>
  67. *
  68. **/
  69. enum Result bc260y_set_cereg(uint8_t n);
  70. enum Result bc260y_set_cereg_sync(uint8_t n); // 同步
  71. /**
  72. * 查询ps域网络注册状态
  73. * 输入<<
  74. *
  75. * 输出>>
  76. * n 控制指定URC的上报。0 禁止上报网络注册;1 允许上报网络注册;2 允许上报网络注册和位置信息
  77. * stat 网络注册状态。0 未注册;1 已注册,归属地网络; 2 未注册;3 注册被拒绝;4 未知;5 已注册,漫游。
  78. * lac 基站位置区号。用于基站定位,2个字节。
  79. * ci 基站小区ID。用于基站定位,4个字节。
  80. *
  81. **/
  82. enum Result bc260y_query_cereg(uint8_t * n, uint8_t * stat, uint16_t * lac, uint32_t * ci);
  83. enum Result bc260y_query_cereg_sync(uint8_t * n, uint8_t * stat, uint16_t * lac, uint32_t * ci); // 同步
  84. /**
  85. * 查询socket服务状态
  86. * 输入<<
  87. * connectID Socket ID。范围1-11
  88. *
  89. * 输出>>
  90. * state Socket服务状态。0 未连接;1 正在连接;2 已建立连接;3 服务正在监听;4 连接断开。
  91. *
  92. *
  93. **/
  94. enum Result bc260y_query_socket_state(uint8_t connectID, uint8_t * state);
  95. enum Result bc260y_query_socket_state_sync(uint8_t connectID, uint8_t * state); // 同步
  96. /**
  97. * 打开socket服务
  98. * 输入<<
  99. * connectID Socket ID。范围1-11
  100. * service_type Socket服务类型。取值为"UDP", "TCP"。
  101. * IP_address 远程服务器地址
  102. * remote_port 远程服务器端口
  103. * access_mode Socket服务的数据访问模式。0 缓存模式;1 直吐模式;2 透传模式。
  104. *
  105. * 输出>>
  106. * err 操作错误代码。0 表示没有错误;其余参考移远文档。
  107. *
  108. **/
  109. enum Result bc260y_open_socket(uint8_t connectID, char * service_type, char * IP_address, uint16_t remote_port, uint8_t access_mode, uint16_t * err);
  110. enum Result bc260y_open_socket_sync(uint8_t connectID, char * service_type, char * IP_address, uint16_t remote_port, uint8_t access_mode, uint16_t * err); // 同步
  111. /**
  112. * 关闭socket服务
  113. * 输入<<
  114. * connectID Socket ID。范围1-11
  115. *
  116. * 输出>>
  117. *
  118. **/
  119. enum Result bc260y_close_socket(uint8_t connectID);
  120. enum Result bc260y_close_socket_sync(uint8_t connectID); // 同步
  121. /**
  122. * 解释:控制是否回显AT+QISEND要发送的数据
  123. * 为了便于处理返回,发送数据时需要关闭回显。
  124. * 输入<<
  125. * echo 是否回显AT+QISEND要发送的数据。0 不回显;1 回显。默认是回显
  126. *
  127. * 输出>>
  128. *
  129. **/
  130. enum Result bc260y_set_qisde(uint8_t echo);
  131. enum Result bc260y_set_qisde_sync(uint8_t echo); // 同步
  132. /**
  133. * 发送数据
  134. * 输入<<
  135. * connectID Socket ID。范围1-11。
  136. * send_length 发送长度。
  137. * data 待发送的数据。
  138. *
  139. *
  140. **/
  141. enum Result bc260y_send(uint8_t connectID, uint8_t * data, uint16_t data_length);
  142. enum Result bc260y_send_rai(uint8_t connectID, uint8_t * data, uint16_t data_length,uint8_t rai);
  143. enum Result bc260y_send_sync(uint8_t connectID, uint8_t * data, uint16_t data_length); // 同步
  144. /**
  145. * 接收数据
  146. * 输入<<
  147. * connectID Socket ID。范围0-11。
  148. *
  149. * 输出>>
  150. * data 接收的数据。
  151. * data_length 接收的数据长度。
  152. **/
  153. enum Result bc260y_recv(uint8_t connectID, uint8_t * data, uint16_t * data_length); // 接收数据
  154. /**
  155. * 接收数据。带计时
  156. * 输入<<
  157. * connectID Socket ID。范围0-11。
  158. *
  159. * 输出>>
  160. * data 接收的数据。
  161. * data_length 接收的数据长度。
  162. *
  163. **/
  164. enum Result bc260y_recv_with_time(uint8_t connectID, uint8_t * data, uint16_t * data_length, uint32_t time_out);
  165. enum Result bc260y_recv_with_time_sync(uint8_t connectID, uint8_t * data, uint16_t * data_length, uint32_t time_out); // 同步
  166. /**
  167. * 解释:关闭模块
  168. * 关闭模块,关闭后会自动重启。
  169. * 输入<<
  170. * n 模块关机方式。0 立即关机;1 正常关机。默认是1
  171. *
  172. *
  173. **/
  174. enum Result bc260y_power_down(uint8_t n);
  175. enum Result bc260y_power_down_sync(uint8_t n); // 同步
  176. /**
  177. * 模块是否启动成功
  178. * 输入<<
  179. *
  180. * 输出>>
  181. *
  182. **/
  183. enum Result bc260y_ready(void);
  184. /**
  185. * 查询信号质量
  186. * 输入<<
  187. *
  188. * 输出>>
  189. * RSRP
  190. * RSRQ
  191. * RSSI
  192. * SINR
  193. **/
  194. enum Result bc260y_qeng_servingcell(int * RSRP, int * RSRQ, int * RSSI, int * SINR);
  195. enum Result bc260y_qeng_servingcell_sync(int * RSRP, int * RSRQ, int * RSSI, int * SINR);
  196. /**
  197. * 查询ICCID
  198. * 输入<<
  199. *
  200. * 输出>>
  201. * iccid SIM卡卡号
  202. **/
  203. enum Result bc260y_query_qccid(char * iccid);
  204. enum Result bc260y_query_qccid_sync(char * iccid);
  205. /**
  206. * 配置发送数据格式
  207. * 输入<<
  208. *n 0数据格式为文本字符串,1为十六进制字符串
  209. *
  210. **/
  211. enum Result bc260y_dataformat(uint8_t n);
  212. enum Result bc260y_dataformat_sync(uint8_t n);
  213. //
  214. // AT指令
  215. static char AT_CMD[256];
  216. // EC800M提供的一些方法
  217. struct BC260Y_Struct bc260y =
  218. {
  219. .timer = {
  220. .time = 0,
  221. .flag = 0
  222. },
  223. .reset = bc260y_reset,
  224. .exit_sleep = bc260y_exit_sleep,
  225. .exit_sleep_sync = bc260y_exit_sleep_sync,
  226. .enter_sleep = bc260y_enter_sleep,
  227. .query_sleep = bc260y_query_sleep,
  228. .query_sleep_sync = bc260y_query_sleep_sync,
  229. .set_sleep = bc260y_set_sleep,
  230. .set_sleep_sync = bc260y_set_sleep_sync,
  231. .query_cfun = bc260y_query_cfun,
  232. .query_cfun_sync = bc260y_query_cfun_sync,
  233. .set_cfun = bc260y_set_cfun,
  234. .set_cfun_sync = bc260y_set_cfun_sync,
  235. .set_cereg = bc260y_set_cereg,
  236. .set_cereg_sync = bc260y_set_cereg_sync,
  237. .query_cereg = bc260y_query_cereg,
  238. .query_cereg_sync = bc260y_query_cereg_sync,
  239. .query_socket_state = bc260y_query_socket_state,
  240. .query_socket_state_sync = bc260y_query_socket_state_sync,
  241. .open_socket = bc260y_open_socket,
  242. .open_socket_sync = bc260y_open_socket_sync,
  243. .close_socket = bc260y_close_socket,
  244. .close_socket_sync = bc260y_close_socket_sync,
  245. .set_qisde = bc260y_set_qisde,
  246. .set_qisde_sync = bc260y_set_qisde_sync,
  247. .send = bc260y_send,
  248. .send_rai = bc260y_send_rai,
  249. .send_sync = bc260y_send_sync,
  250. .recv = bc260y_recv,
  251. .recv_with_time = bc260y_recv_with_time,
  252. .recv_with_time_sync = bc260y_recv_with_time_sync,
  253. .power_down = bc260y_power_down,
  254. .power_down_sync = bc260y_power_down_sync,
  255. .ready = bc260y_ready,
  256. .qeng_servingcell = bc260y_qeng_servingcell,
  257. .qeng_servingcell_sync = bc260y_qeng_servingcell_sync,
  258. .query_qccid = bc260y_query_qccid,
  259. .query_qccid_sync = bc260y_query_qccid_sync,
  260. .dataformat= bc260y_dataformat,
  261. .dataformat_sync= bc260y_dataformat_sync
  262. };
  263. // 发送AT指令
  264. static void send_data(uint8_t * data, uint16_t length)
  265. {
  266. // 发送AT指令
  267. AT_Send_Bytes(data, length);
  268. }
  269. // 发送AT指令
  270. static uint8_t send_at_string(char * cmd)
  271. {
  272. uint8_t state = 0;
  273. if(AT_Get_Status() == AT_Status_None)
  274. {
  275. // 发送AT指令
  276. AT_Send_String(cmd);
  277. state = 1;
  278. }
  279. return state;
  280. }
  281. // 获取状态
  282. static enum STATUS getStatus(void)
  283. {
  284. return bc260y.status;
  285. }
  286. // 设置状态
  287. static void setStatus(enum STATUS status)
  288. {
  289. bc260y.status = status;
  290. }
  291. // 获取定时
  292. static uint32_t getTimerMs(void)
  293. {
  294. return time_get_delay(&bc260y.timer);
  295. }
  296. // 清除定时
  297. static void clearTimer(void)
  298. {
  299. time_clear(&bc260y.timer);
  300. }
  301. // 设置定时
  302. //static void setTimerMs(uint32_t time)
  303. //{
  304. // bc260y.timer_ms = time;
  305. //}
  306. // 获取ID
  307. static uint8_t getActiveID(void)
  308. {
  309. return bc260y.activeID;
  310. }
  311. static void setActiveID(uint8_t activeID)
  312. {
  313. bc260y.activeID = activeID;
  314. }
  315. // 验证ID
  316. static uint8_t verifyActiveID(uint8_t activeID)
  317. {
  318. if(getActiveID() == 0 || getActiveID() == activeID){ return 1; }
  319. else
  320. {
  321. Log_Printf_Debug("activeID repetition!\r\n");
  322. return 0;
  323. }
  324. }
  325. // 返回超时结果
  326. static enum Result overtime(void)
  327. {
  328. setStatus(Status_Overtime); // 超时
  329. return Result_Failed; // 结果
  330. }
  331. // 返回成功结果
  332. static enum Result success(void)
  333. {
  334. // 成功
  335. setStatus(Status_Success);
  336. // 结果
  337. return Result_Success;
  338. }
  339. // 返回失败结果
  340. static enum Result failed(void)
  341. {
  342. // 失败
  343. setStatus(Status_Failed);
  344. // 失败结果
  345. return Result_Failed;
  346. }
  347. // 重置状态。该文件中的方法共用状态,在使用方法前需要重置一下状态。
  348. void bc260y_reset(void)
  349. {
  350. setStatus(Status_None); // 重置状态
  351. setActiveID(0); // 重置ID
  352. clearTimer(); // 重置计时
  353. AT_Clear(); // 清除AT指令
  354. }
  355. // 发送指令并改变状态
  356. enum Result send_at(char * cmd, uint8_t activeID)
  357. {
  358. Log_Printf_Debug(cmd); // 打印AT指令
  359. if(send_at_string(cmd)) // 发送AT指令
  360. {
  361. setActiveID(activeID); // 活动ID
  362. setStatus(Status_Sending); // 设置已发送
  363. clearTimer(); // 重置计时
  364. return Result_None; // 未知结果
  365. }
  366. else
  367. {
  368. Log_Printf_Debug("AT指令发送失败\r\n"); // 打印日志
  369. return Result_Failed; // 失败结果
  370. }
  371. }
  372. // 退出休眠
  373. enum Result bc260y_exit_sleep(void)
  374. {
  375. //GPIO_SetBits(WAKE_GPIO, WAKE_GPIO_Pin);// nb拉高io口,唤醒模组
  376. enum Result result = Result_None;
  377. int activeID = 1, time = 500; // 活动ID, 超时时间
  378. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  379. // 判断状态
  380. if(getStatus() == Status_None) // 空闲状态
  381. {
  382. sprintf(AT_CMD, "AT\r\n"); // 拼接AT指令
  383. result = send_at(AT_CMD, activeID);
  384. }
  385. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  386. {
  387. Log_Printf_Debug("返回结果过期1,请重置状态\r\n"); // 打印日志
  388. result = failed(); // 失败
  389. }
  390. else if(getTimerMs() > time) // 正在发送状态。判断超时
  391. {
  392. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  393. Log_SendArray_Debug(AT_result(), AT_result_length());
  394. result = overtime(); // 超时
  395. }
  396. if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  397. {
  398. // 发送日志
  399. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  400. Log_SendArray_Debug(AT_result(), AT_result_length());
  401. result = success(); // 成功
  402. }
  403. else if(strstr((char * )AT_result(), "+QNBIOTEVENT:") != NULL)
  404. {
  405. // 发送日志
  406. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  407. Log_SendArray_Debug(AT_result(), AT_result_length());
  408. result = success(); // 成功
  409. }
  410. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  411. {
  412. // 发送日志
  413. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  414. Log_SendArray_Debug(AT_result(), AT_result_length());
  415. result = failed(); // 失败
  416. }
  417. return result;
  418. }
  419. enum Result bc260y_exit_sleep_sync()
  420. {
  421. enum Result result = Result_None;
  422. while(1)
  423. {
  424. result = bc260y_exit_sleep();
  425. if(result != Result_None)
  426. {
  427. // 重置
  428. bc260y.reset();
  429. break;
  430. }
  431. }
  432. return result;
  433. }
  434. // 进入休眠
  435. void bc260y_enter_sleep(void)
  436. {
  437. // GPIO_ResetBits(WAKE_GPIO, WAKE_GPIO_Pin); // nb拉低io口,进入睡眠
  438. }
  439. /**
  440. * 查询休眠模式
  441. * 输入<<
  442. *
  443. * 输出>>
  444. * n 睡眠模式。0 禁用,默认;1 启用。
  445. *
  446. **/
  447. enum Result bc260y_query_sleep(uint8_t * n)
  448. {
  449. enum Result result = Result_None;
  450. int activeID = 1, time = 500; // 活动ID, 超时时间
  451. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  452. // 判断状态
  453. if(getStatus() == Status_None) // 空闲状态
  454. {
  455. sprintf(AT_CMD, "AT+QSCLK?\r\n"); // 拼接AT指令
  456. result = send_at(AT_CMD, activeID);
  457. }
  458. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  459. {
  460. Log_Printf_Debug("返回结果过期1,请重置状态\r\n"); // 打印日志
  461. result = failed(); // 失败
  462. }
  463. else if(getTimerMs() > time) // 正在发送状态。判断超时
  464. {
  465. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  466. result = overtime(); // 超时
  467. Log_SendArray_Debug(AT_result(), AT_result_length());
  468. }
  469. if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  470. {
  471. // 发送日志
  472. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  473. Log_SendArray_Debug(AT_result(), AT_result_length());
  474. // 处理返回结果
  475. char * saveptr = NULL;
  476. char * split = "\r\n";
  477. // 第一行
  478. char * Line1 = strtok_r((char * )AT_result(), split, &saveptr);
  479. // 第二行
  480. char * Line2 = strtok_r(NULL, split, &saveptr);
  481. // 拆解第二行
  482. char * saveptr_inner = NULL;
  483. char * split_inner = ": ";
  484. strtok_r(Line2, split_inner, &saveptr_inner);
  485. // 获取mode
  486. * n = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  487. result = success(); // 成功
  488. }
  489. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  490. {
  491. // 发送日志
  492. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  493. Log_SendArray_Debug(AT_result(), AT_result_length());
  494. result = failed(); // 失败
  495. }
  496. return result;
  497. }
  498. /**
  499. * 查询休眠模式。同步方法
  500. * 输入<<
  501. *
  502. * 输出>>
  503. * n 睡眠模式。0 禁用,默认;1 启用。
  504. *
  505. **/
  506. enum Result bc260y_query_sleep_sync(uint8_t * n)
  507. {
  508. enum Result result = Result_None;
  509. while(1)
  510. {
  511. result = bc260y_query_sleep(n);
  512. if(result != Result_None)
  513. {
  514. // 重置
  515. bc260y.reset();
  516. break;
  517. }
  518. }
  519. return result;
  520. }
  521. /**
  522. * 设置休眠模式
  523. * n 参数。0 禁用;1启用允许进入Deep Sleep 模式,2允许模块进入入Light Sleep 模式。
  524. **/
  525. enum Result bc260y_set_sleep(uint8_t n)
  526. {
  527. enum Result result = Result_None;
  528. int activeID = 2, time = 500; // 活动ID, 超时时间
  529. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  530. // 判断状态
  531. if(getStatus() == Status_None) // 空闲状态
  532. {
  533. sprintf(AT_CMD, "AT+QSCLK=%d\r\n", n); // 拼接AT指令
  534. result = send_at(AT_CMD, activeID);
  535. }
  536. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  537. {
  538. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  539. result = failed(); // 失败
  540. }
  541. else if(getTimerMs() > time) // 正在发送状态。判断超时
  542. {
  543. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  544. result = overtime(); // 超时
  545. }
  546. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  547. {
  548. // 发送日志
  549. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  550. Log_SendArray_Debug(AT_result(), AT_result_length());
  551. result = success(); // 成功
  552. }
  553. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  554. {
  555. // 发送日志
  556. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  557. Log_SendArray_Debug(AT_result(), AT_result_length());
  558. result = failed(); // 失败
  559. }
  560. return result;
  561. }
  562. /**
  563. * 设置休眠模式。同步
  564. * n 参数。0 禁用;1启用。
  565. **/
  566. enum Result bc260y_set_sleep_sync(uint8_t n)
  567. {
  568. enum Result result = Result_None;
  569. while(1)
  570. {
  571. result = bc260y_set_sleep(n);
  572. if(result != Result_None)
  573. {
  574. // 重置
  575. bc260y.reset();
  576. break;
  577. }
  578. }
  579. return result;
  580. }
  581. /**
  582. * 查询功能模式
  583. * 输入<<
  584. *
  585. * 输出>>
  586. * n 功能模式。0 最小功能模式,默认;1 全功能模式。
  587. *
  588. **/
  589. enum Result bc260y_query_cfun(uint8_t * n)
  590. {
  591. enum Result result = Result_None;
  592. int activeID = 100, time = 500; // 活动ID, 超时时间
  593. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  594. // 判断状态
  595. if(getStatus() == Status_None) // 空闲状态
  596. {
  597. sprintf(AT_CMD, "AT+CFUN?\r\n"); // 拼接AT指令
  598. result = send_at(AT_CMD, activeID);
  599. }
  600. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  601. {
  602. Log_Printf_Debug("返回结果过期1,请重置状态\r\n"); // 打印日志
  603. result = failed(); // 失败
  604. }
  605. else if(getTimerMs() > time) // 正在发送状态。判断超时
  606. {
  607. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  608. result = overtime(); // 超时
  609. Log_SendArray_Debug(AT_result(), AT_result_length());
  610. }
  611. if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  612. {
  613. // 发送日志
  614. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  615. Log_SendArray_Debug(AT_result(), AT_result_length());
  616. // 处理返回结果
  617. char * saveptr = NULL;
  618. char * split = "\r\n";
  619. // 第一行
  620. strtok_r((char * )AT_result(), split, &saveptr);
  621. // 第二行
  622. char * Line2 = strtok_r(NULL, split, &saveptr);
  623. // 拆解第二行
  624. char * saveptr_inner = NULL;
  625. char * split_inner = ": ";
  626. strtok_r(Line2, split_inner, &saveptr_inner);
  627. // 获取mode
  628. * n = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  629. result = success(); // 成功
  630. }
  631. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  632. {
  633. // 发送日志
  634. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  635. Log_SendArray_Debug(AT_result(), AT_result_length());
  636. result = failed(); // 失败
  637. }
  638. return result;
  639. }
  640. enum Result bc260y_query_cfun_sync(uint8_t * n)
  641. {
  642. enum Result result = Result_None;
  643. while(1)
  644. {
  645. result = bc260y_query_cfun(n);
  646. if(result != Result_None)
  647. {
  648. // 重置
  649. bc260y.reset();
  650. break;
  651. }
  652. }
  653. return result;
  654. }
  655. /**
  656. * 设置功能模式
  657. * fun 0 最小功能模式;1 全功能模式。
  658. **/
  659. enum Result bc260y_set_cfun(uint8_t fun)
  660. {
  661. enum Result result = Result_None;
  662. int activeID = 4, time; // 活动ID, 超时时间
  663. // 校验参数
  664. if(fun == 0){ time = 3000; }
  665. else if(fun == 1){ time = 7000; }
  666. else
  667. {
  668. Log_Printf_Debug("set_cfun params error!\r\n");
  669. return Result_Failed;
  670. }
  671. // 校验ID
  672. if(!verifyActiveID(activeID)){ return Result_Failed; }
  673. // 判断状态
  674. if(getStatus() == Status_None) // 空闲状态
  675. {
  676. sprintf(AT_CMD, "AT+CFUN=%d\r\n", fun); // 拼接AT指令
  677. result = send_at(AT_CMD, activeID);
  678. }
  679. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  680. {
  681. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  682. result = failed(); // 失败
  683. }
  684. else if(getTimerMs() > time) // 正在发送状态。判断超时
  685. {
  686. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  687. Log_SendArray_Debug(AT_result(), AT_result_length());
  688. result = overtime(); // 超时
  689. }
  690. else if(fun == 1 && strstr((char * )AT_result(), "+IP:") != NULL) // 查询是否返回
  691. {
  692. // 防止接收不完整
  693. if(AT_wait_time() > 10) // 过10ms之后再取数据,避免数据截断。
  694. {
  695. // 发送日志
  696. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  697. Log_SendArray_Debug(AT_result(), AT_result_length());
  698. result = success(); // 成功
  699. }
  700. }
  701. else if(fun == 0 && strstr((char * )AT_result(), "+CPIN: NOT READY") != NULL) // 查询是否返回
  702. {
  703. // 防止接收不完整
  704. if(AT_wait_time() > 10) // 过10ms之后再取数据,避免数据截断。
  705. {
  706. // 发送日志
  707. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  708. Log_SendArray_Debug(AT_result(), AT_result_length());
  709. result = success(); // 成功
  710. }
  711. }
  712. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  713. {
  714. // 发送日志
  715. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  716. Log_SendArray_Debug(AT_result(), AT_result_length());
  717. result = failed(); // 失败
  718. }
  719. return result;
  720. }
  721. /**
  722. * 设置功能模式
  723. * 输入<<
  724. * fun 0 最小功能模式;1 全功能模式。
  725. * 输出>>
  726. *
  727. **/
  728. enum Result bc260y_set_cfun_sync(uint8_t fun)
  729. {
  730. enum Result result = Result_None;
  731. while(1)
  732. {
  733. result = bc260y_set_cfun(fun);
  734. if(result != Result_None)
  735. {
  736. // 重置
  737. bc260y.reset();
  738. break;
  739. }
  740. }
  741. return result;
  742. }
  743. /**
  744. * 设置ps域网络注册状态
  745. * n 0 禁止上报网络注册;1 允许上报网络注册;2 允许上报网络注册和位置信息
  746. **/
  747. enum Result bc260y_set_cereg(uint8_t n)
  748. {
  749. enum Result result = Result_None;
  750. int activeID = 6, time = 500; // 活动ID, 超时时间
  751. // 校验参数
  752. if(n > 2)
  753. {
  754. Log_Printf_Debug("set_cgreg params error!\r\n");
  755. return Result_Failed;
  756. }
  757. // 校验ID
  758. if(!verifyActiveID(activeID)){ return Result_Failed; }
  759. // 判断状态
  760. if(getStatus() == Status_None) // 空闲状态
  761. {
  762. sprintf(AT_CMD, "AT+CEREG=%d\r\n", n); // 拼接AT指令
  763. result = send_at(AT_CMD, activeID);
  764. }
  765. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  766. {
  767. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  768. result = failed(); // 失败
  769. }
  770. else if(getTimerMs() > time) // 正在发送状态。判断超时
  771. {
  772. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  773. result = overtime(); // 超时
  774. }
  775. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  776. {
  777. // 发送日志
  778. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  779. Log_SendArray_Debug(AT_result(), AT_result_length());
  780. result = success(); // 成功
  781. }
  782. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  783. {
  784. // 发送日志
  785. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  786. Log_SendArray_Debug(AT_result(), AT_result_length());
  787. result = failed(); // 失败
  788. }
  789. return result;
  790. }
  791. /**
  792. * 设置ps域网络注册状态
  793. * 输入<<
  794. * n 0 禁止上报网络注册;1 允许上报网络注册;2 允许上报网络注册和位置信息
  795. * 输出>>
  796. *
  797. **/
  798. enum Result bc260y_set_cereg_sync(uint8_t n)
  799. {
  800. enum Result result = Result_None;
  801. while(1)
  802. {
  803. result = bc260y_set_cereg(n);
  804. if(result != Result_None)
  805. {
  806. // 重置
  807. bc260y.reset();
  808. break;
  809. }
  810. }
  811. return result;
  812. }
  813. /**
  814. * 查询ps域网络注册状态
  815. * 输入<<
  816. *
  817. * 输出>>
  818. * n 控制指定URC的上报。0 禁止上报网络注册;1 允许上报网络注册;2 允许上报网络注册和位置信息
  819. * stat 网络注册状态。0 未注册;1 已注册,归属地网络; 2 未注册;3 注册被拒绝;4 未知;5 已注册,漫游。
  820. * lac 基站位置区号。用于基站定位,2个字节。
  821. * ci 基站小区ID。用于基站定位,4个字节。
  822. *
  823. **/
  824. enum Result bc260y_query_cereg(uint8_t * n, uint8_t * stat, uint16_t * lac, uint32_t * ci)
  825. {
  826. enum Result result = Result_None;
  827. int activeID = 9, time = 500; // 活动ID, 超时时间
  828. // 校验ID
  829. if(!verifyActiveID(activeID)){ return Result_Failed; }
  830. // 判断状态
  831. if(getStatus() == Status_None) // 空闲状态
  832. {
  833. sprintf(AT_CMD, "AT+CEREG?\r\n"); // 拼接AT指令
  834. result = send_at(AT_CMD, activeID);
  835. }
  836. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  837. {
  838. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  839. result = failed(); // 失败
  840. }
  841. else if(getTimerMs() > time) // 正在发送状态。判断超时
  842. {
  843. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  844. setStatus(Status_Overtime); // 超时
  845. result = Result_Failed; // 结果
  846. }
  847. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  848. {
  849. // 发送日志
  850. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  851. Log_SendArray_Debug(AT_result(), AT_result_length());
  852. // 处理返回结果
  853. char * saveptr = NULL;
  854. char * split = "\r\n";
  855. // 第一行
  856. strtok_r((char * )AT_result(), split, &saveptr);
  857. // 第二行
  858. char * Line2 = strtok_r(NULL, split, &saveptr);
  859. char * saveptr_inner = NULL;
  860. char * split_inner = ": ,\"";
  861. strtok_r(Line2, split_inner, &saveptr_inner);
  862. * n = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  863. * stat = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  864. // Log_Printf_Debug("saveptr_inner: %s\r\n", Line2);
  865. * lac = strtoul(strtok_r(NULL, split_inner, &saveptr_inner), NULL, 16);
  866. * ci = strtoul(strtok_r(NULL, split_inner, &saveptr_inner), NULL, 16);
  867. // 打印
  868. Log_Printf_Debug("mode: %d, stat: %d, lac: %d, ci: %d\r\n", * n, * stat, * lac, * ci);
  869. result = success(); // 成功
  870. }
  871. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  872. {
  873. // 发送日志
  874. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  875. Log_SendArray_Debug(AT_result(), AT_result_length());
  876. result = failed(); // 失败
  877. }
  878. return result;
  879. }
  880. /**
  881. * 查询ps域网络注册状态
  882. * 输入<<
  883. *
  884. * 输出>>
  885. * n 控制指定URC的上报。0 禁止上报网络注册;1 允许上报网络注册;2 允许上报网络注册和位置信息
  886. * stat 网络注册状态。0 未注册;1 已注册,归属地网络; 2 未注册;3 注册被拒绝;4 未知;5 已注册,漫游。
  887. * lac 基站位置区号。用于基站定位,2个字节。
  888. * ci 基站小区ID。用于基站定位,4个字节。
  889. *
  890. **/
  891. enum Result bc260y_query_cereg_sync(uint8_t * n, uint8_t * stat, uint16_t * lac, uint32_t * ci)
  892. {
  893. enum Result result = Result_None;
  894. while(1)
  895. {
  896. result = bc260y_query_cereg(n, stat, lac, ci);
  897. if(result != Result_None)
  898. {
  899. // 重置
  900. bc260y.reset();
  901. break;
  902. }
  903. }
  904. return result;
  905. }
  906. /**
  907. * 查询socket服务状态
  908. * connectID Socket ID。范围1-11
  909. * state Socket服务状态。0 未连接;1 正在连接;2 已建立连接;3 服务正在监听;4 连接断开。
  910. *
  911. * activeID 9
  912. **/
  913. enum Result bc260y_query_socket_state(uint8_t connectID, uint8_t * state)
  914. {
  915. enum Result result = Result_None;
  916. int activeID = 9, time = 500; // 活动ID, 超时时间
  917. // 校验ID
  918. if(!verifyActiveID(activeID)){ return Result_Failed; }
  919. // 判断状态
  920. if(getStatus() == Status_None) // 空闲状态
  921. {
  922. sprintf(AT_CMD, "AT+QISTATE=1,%d\r\n", connectID); // 拼接AT指令
  923. result = send_at(AT_CMD, activeID);
  924. }
  925. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  926. {
  927. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  928. result = failed(); // 失败
  929. }
  930. else if(getTimerMs() > time) // 正在发送状态。判断超时
  931. {
  932. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  933. result = overtime(); // 超时
  934. }
  935. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  936. {
  937. // 发送日志
  938. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  939. Log_SendArray_Debug(AT_result(), AT_result_length());
  940. // 处理返回结果
  941. char * saveptr = NULL;
  942. char * split = "\r\n";
  943. // 第一行
  944. strtok_r((char * )AT_result(), split, &saveptr);
  945. // 第二行
  946. char * Line2 = strtok_r(NULL, split, &saveptr);
  947. // 查询结果为空
  948. if(strcmp(Line2, "OK") == 0){ * state = 0; }
  949. else
  950. {
  951. // 拆解第二行
  952. char * saveptr_inner = NULL;
  953. char * split_inner = ": ,\"";
  954. strtok_r(Line2, split_inner, &saveptr_inner);
  955. strtok_r(NULL, split_inner, &saveptr_inner);
  956. strtok_r(NULL, split_inner, &saveptr_inner);
  957. strtok_r(NULL, split_inner, &saveptr_inner);
  958. strtok_r(NULL, split_inner, &saveptr_inner);
  959. strtok_r(NULL, split_inner, &saveptr_inner);
  960. * state = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  961. }
  962. // 打印
  963. Log_Printf_Debug("result: %d\r\n", * state);
  964. result = success(); // 成功
  965. }
  966. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  967. {
  968. // 发送日志
  969. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  970. Log_SendArray_Debug(AT_result(), AT_result_length());
  971. result = failed(); // 失败
  972. }
  973. return result;
  974. }
  975. /**
  976. * 查询socket服务状态
  977. * connectID Socket ID。范围1-11
  978. * state Socket服务状态。0 未连接;1 正在连接;2 已建立连接;3 服务正在监听;4 连接断开。
  979. *
  980. * activeID 9
  981. **/
  982. enum Result bc260y_query_socket_state_sync(uint8_t connectID, uint8_t * state)
  983. {
  984. enum Result result = Result_None;
  985. while(1)
  986. {
  987. result = bc260y_query_socket_state(connectID, state);
  988. if(result != Result_None)
  989. {
  990. // 重置
  991. bc260y.reset();
  992. break;
  993. }
  994. }
  995. return result;
  996. }
  997. /**
  998. * 打开socket服务
  999. * 输入<<
  1000. * connectID Socket ID。范围1-11
  1001. * service_type Socket服务类型。取值为"UDP", "TCP"。
  1002. * IP_address 远程服务器地址
  1003. * remote_port 远程服务器端口
  1004. * access_mode Socket服务的数据访问模式。0 缓存模式;1 直吐模式;2 透传模式。
  1005. *
  1006. * 输出>>
  1007. * err 操作错误代码。0 表示没有错误;其余参考移远文档。
  1008. *
  1009. * activeID 19
  1010. **/
  1011. enum Result bc260y_open_socket(uint8_t connectID, char * service_type, char * IP_address, uint16_t remote_port, uint8_t access_mode, uint16_t * err)
  1012. {
  1013. enum Result result = Result_None;
  1014. int activeID = 19, time = 3000; // 活动ID, 超时时间
  1015. // 校验ID
  1016. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1017. // 判断状态
  1018. if(getStatus() == Status_None) // 空闲状态
  1019. {
  1020. sprintf(AT_CMD, "AT+QIOPEN=0,%d,\"%s\",\"%s\",%d,%d,%d\r\n", connectID, service_type, IP_address, remote_port, 0, access_mode); // 拼接AT指令
  1021. result = send_at(AT_CMD, activeID);
  1022. }
  1023. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1024. {
  1025. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1026. result = failed(); // 失败
  1027. }
  1028. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1029. {
  1030. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1031. result = overtime(); // 超时
  1032. }
  1033. else if(strstr((char * )AT_result(), "+QIOPEN: ") != NULL) // 查询是否返回
  1034. {
  1035. // 发送日志
  1036. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1037. Log_SendArray_Debug(AT_result(), AT_result_length());//
  1038. // 处理返回结果
  1039. char * saveptr = NULL;
  1040. char * split = "\r\n";
  1041. // 第一行
  1042. strtok_r((char * )AT_result(), split, &saveptr);
  1043. // 第二行
  1044. char * Line2 = strtok_r(NULL, split, &saveptr);
  1045. // 第三行
  1046. char * Line3 = strtok_r(NULL, split, &saveptr);
  1047. // 查询结果为空
  1048. if(strcmp(Line2, "OK") == 0)
  1049. {
  1050. // 拆解第三行
  1051. char * saveptr_inner = NULL;
  1052. char * split_inner = ": ,\"";
  1053. strtok_r(Line3, split_inner, &saveptr_inner);
  1054. uint8_t connID = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  1055. * err = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  1056. Log_Printf_Debug("result: %d, %d\r\n", connID, * err);
  1057. }
  1058. result = success(); // 成功
  1059. }
  1060. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1061. {
  1062. // 发送日志
  1063. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1064. Log_SendArray_Debug(AT_result(), AT_result_length());
  1065. result = failed(); // 失败
  1066. }
  1067. return result;
  1068. }
  1069. /**
  1070. * 打开socket服务
  1071. * 输入<<
  1072. * connectID Socket ID。范围1-11
  1073. * service_type Socket服务类型。取值为"UDP", "TCP"。
  1074. * IP_address 远程服务器地址
  1075. * remote_port 远程服务器端口
  1076. * access_mode Socket服务的数据访问模式。0 缓存模式;1 直吐模式;2 透传模式。
  1077. *
  1078. * 输出>>
  1079. * err 操作错误代码。0 表示没有错误;其余参考移远文档。
  1080. *
  1081. * activeID 19
  1082. **/
  1083. enum Result bc260y_open_socket_sync(uint8_t connectID, char * service_type, char * IP_address, uint16_t remote_port, uint8_t access_mode, uint16_t * err)
  1084. {
  1085. enum Result result = Result_None;
  1086. while(1)
  1087. {
  1088. result = bc260y_open_socket(connectID, service_type, IP_address, remote_port, access_mode, err);
  1089. if(result != Result_None)
  1090. {
  1091. // 重置
  1092. bc260y.reset();
  1093. break;
  1094. }
  1095. }
  1096. return result;
  1097. }
  1098. /**
  1099. * 关闭socket服务
  1100. * 输入<<
  1101. * connectID Socket ID。范围1-11
  1102. *
  1103. * activeID 29
  1104. **/
  1105. enum Result bc260y_close_socket(uint8_t connectID)
  1106. {
  1107. enum Result result = Result_None;
  1108. int activeID = 29, time = 500; // 活动ID, 超时时间
  1109. // 校验ID
  1110. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1111. // 判断状态
  1112. if(getStatus() == Status_None) // 空闲状态
  1113. {
  1114. sprintf(AT_CMD, "AT+QICLOSE=%d\r\n", connectID); // 拼接AT指令
  1115. result = send_at(AT_CMD, activeID);
  1116. }
  1117. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1118. {
  1119. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1120. result = Result_Failed;
  1121. }
  1122. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1123. {
  1124. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1125. result = overtime(); // 超时
  1126. }
  1127. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1128. {
  1129. // 发送日志
  1130. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1131. Log_SendArray_Debug(AT_result(), AT_result_length());
  1132. result = success(); // 成功
  1133. }
  1134. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1135. {
  1136. // 发送日志
  1137. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1138. Log_SendArray_Debug(AT_result(), AT_result_length());
  1139. result = failed(); // 失败
  1140. }
  1141. return result;
  1142. }
  1143. /**
  1144. * 关闭socket服务
  1145. * 输入<<
  1146. * connectID Socket ID。范围1-11
  1147. *
  1148. * activeID 29
  1149. **/
  1150. enum Result bc260y_close_socket_sync(uint8_t connectID)
  1151. {
  1152. enum Result result = Result_None;
  1153. while(1)
  1154. {
  1155. result = bc260y_close_socket(connectID);
  1156. if(result != Result_None)
  1157. {
  1158. // 重置
  1159. bc260y.reset();
  1160. break;
  1161. }
  1162. }
  1163. return result;
  1164. }
  1165. /**
  1166. * 解释:控制是否回显AT+QISEND要发送的数据
  1167. * 为了便于处理返回,发送数据时需要关闭回显。
  1168. * 输入<<
  1169. * echo 是否回显AT+QISEND要发送的数据。0 不回显;1 回显。默认是回显
  1170. *
  1171. * activeID 45
  1172. **/
  1173. enum Result bc260y_set_qisde(uint8_t echo)
  1174. {
  1175. enum Result result = Result_None;
  1176. int activeID = 45, time = 1000; // 活动ID, 超时时间
  1177. // 校验ID
  1178. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1179. // 判断状态
  1180. if(getStatus() == Status_None) // 空闲状态
  1181. {
  1182. sprintf(AT_CMD, "ATE%d\r\n", echo); // 拼接AT指令
  1183. result = send_at(AT_CMD, activeID);
  1184. }
  1185. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1186. {
  1187. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1188. result = Result_Failed;
  1189. }
  1190. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1191. {
  1192. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1193. result = overtime(); // 超时
  1194. }
  1195. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1196. {
  1197. // 发送日志
  1198. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1199. Log_SendArray_Debug(AT_result(), AT_result_length());
  1200. result = success(); // 成功
  1201. }
  1202. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1203. {
  1204. // 发送日志
  1205. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1206. Log_SendArray_Debug(AT_result(), AT_result_length());
  1207. result = failed(); // 失败
  1208. }
  1209. return result;
  1210. }
  1211. /**
  1212. * 解释:控制是否回显AT+QISEND要发送的数据
  1213. * 为了便于处理返回,发送数据时需要关闭回显。
  1214. * 输入<<
  1215. * echo 是否回显AT+QISEND要发送的数据。0 不回显;1 回显。默认是回显
  1216. *
  1217. * activeID 45
  1218. **/
  1219. enum Result bc260y_set_qisde_sync(uint8_t echo)
  1220. {
  1221. enum Result result = Result_None;
  1222. while(1)
  1223. {
  1224. result = bc260y_set_qisde(echo);
  1225. if(result != Result_None)
  1226. {
  1227. // 重置
  1228. bc260y.reset();
  1229. break;
  1230. }
  1231. }
  1232. return result;
  1233. }
  1234. /**
  1235. * 发送数据
  1236. * 输入<<
  1237. * connectID Socket ID。范围1-11。
  1238. * send_length 发送长度。
  1239. * data 待发送的数据。
  1240. *
  1241. * activeID 49
  1242. **/
  1243. enum Result bc260y_send(uint8_t connectID, uint8_t * data, uint16_t data_length)
  1244. {
  1245. enum Result result = Result_None;
  1246. int activeID = 49, time = 10000; // 活动ID, 超时时间
  1247. // 校验ID
  1248. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1249. // 判断状态
  1250. if(getStatus() == Status_None) // 空闲状态
  1251. {
  1252. sprintf(AT_CMD, "AT+QISEND=%d,%d\r\n", connectID, data_length); // 拼接AT指令
  1253. result = send_at(AT_CMD, activeID);
  1254. }
  1255. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1256. {
  1257. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1258. result = Result_Failed;
  1259. }
  1260. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1261. {
  1262. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1263. result = overtime(); // 超时
  1264. }
  1265. else if(strstr((char * )AT_result(), ">") != NULL) // 有响应
  1266. {
  1267. // 发送日志
  1268. Log_Printf_Debug("AT6返回: %d\r\n", AT_result_length());
  1269. Log_SendArray_Debug(AT_result(), AT_result_length());
  1270. // Log_Printf_Debug("coap:\r\n");
  1271. // Log_SendHex(data, data_length);
  1272. // Log_Printf_Debug("\r\n");
  1273. // 发送数据
  1274. send_data(data, data_length);
  1275. // 清理一下AT返回结果缓存
  1276. AT_Clear_Result();
  1277. }
  1278. else if(strstr((char * )AT_result(), "SEND OK\r\n") != NULL) // 查询是否返回
  1279. {
  1280. // 发送日志
  1281. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1282. Log_SendArray_Debug(AT_result(), AT_result_length());
  1283. result = success(); // 成功
  1284. }
  1285. else if(strstr((char * )AT_result(), "SEND FALL\r\n") != NULL) // 查询是否返回
  1286. {
  1287. // 发送日志
  1288. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1289. Log_SendArray_Debug(AT_result(), AT_result_length());
  1290. result = failed(); // 失败
  1291. }
  1292. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1293. {
  1294. // 发送日志
  1295. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1296. Log_SendArray_Debug(AT_result(), AT_result_length());
  1297. result = failed(); // 失败
  1298. }
  1299. return result;
  1300. }
  1301. /**
  1302. * 发送数据
  1303. * 输入<<
  1304. * connectID Socket ID。范围1-11。
  1305. * send_length 发送长度。
  1306. * data 待发送的数据。
  1307. *rai 发送模式,0发送不释放RRC,1发送立即释放RRC,2发送返回释放RRC
  1308. * activeID 49
  1309. **/
  1310. enum Result bc260y_send_rai(uint8_t connectID, uint8_t * data, uint16_t data_length,uint8_t rai)
  1311. {
  1312. enum Result result = Result_None;
  1313. int activeID = 50, time = 10000; // 活动ID, 超时时间
  1314. // 校验ID
  1315. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1316. // 判断状态
  1317. if(getStatus() == Status_None) // 空闲状态
  1318. {
  1319. // memset(hexData,0, sizeof(hexData));
  1320. // byteToHexStr(data,hexData, data_length);//nb需要转16进制
  1321. // sprintf(AT_CMD, "AT+QISEND=%d,%d,%s,%d\r\n", connectID, data_length,hexData,rai); // 拼接AT指令
  1322. result = send_at(AT_CMD, activeID);
  1323. }
  1324. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1325. {
  1326. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1327. result = Result_Failed;
  1328. }
  1329. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1330. {
  1331. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1332. result = overtime(); // 超时
  1333. }
  1334. else if(strstr((char * )AT_result(), "SEND OK\r\n") != NULL) // 查询是否返回
  1335. {
  1336. // 发送日志
  1337. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1338. Log_SendArray_Debug(AT_result(), AT_result_length());
  1339. result = success(); // 成功
  1340. }
  1341. else if(strstr((char * )AT_result(), "SEND FALL\r\n") != NULL) // 查询是否返回
  1342. {
  1343. // 发送日志
  1344. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1345. Log_SendArray_Debug(AT_result(), AT_result_length());
  1346. result = failed(); // 失败
  1347. }
  1348. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1349. {
  1350. // 发送日志
  1351. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1352. Log_SendArray_Debug(AT_result(), AT_result_length());
  1353. result = failed(); // 失败
  1354. }
  1355. return result;
  1356. }
  1357. /**
  1358. * 发送数据
  1359. * 输入<<
  1360. * connectID Socket ID。范围1-11。
  1361. * send_length 发送长度。
  1362. * data 待发送的数据。
  1363. *
  1364. * activeID 49
  1365. **/
  1366. enum Result bc260y_send_sync(uint8_t connectID, uint8_t * data, uint16_t data_length)
  1367. {
  1368. enum Result result = Result_None;
  1369. while(1)
  1370. {
  1371. result = bc260y_send(connectID, data, data_length);
  1372. if(result != Result_None)
  1373. {
  1374. // 重置
  1375. bc260y.reset();
  1376. break;
  1377. }
  1378. }
  1379. return result;
  1380. }
  1381. /**
  1382. * 接收数据
  1383. * 输入<<
  1384. * connectID Socket ID。范围0-11。
  1385. *
  1386. * 输出>>
  1387. * data 接收的数据。
  1388. * data_length 接收的数据长度。
  1389. *
  1390. **/
  1391. enum Result bc260y_recv(uint8_t connectID, uint8_t * data, uint16_t * data_length)
  1392. {
  1393. // 设置AT为使用中,防止被其他程序占用
  1394. AT_Set_Status(AT_Status_Using);
  1395. enum Result result = Result_None;
  1396. // 校验参数
  1397. if(connectID > 11)
  1398. {
  1399. Log_Printf_Debug("recv params error!\r\n");
  1400. return Result_Failed;
  1401. }
  1402. char cmp[20];
  1403. sprintf(cmp, "+QIURC: \"recv\",%d", connectID); // 拼接AT指令
  1404. // 判断是否接收到
  1405. if(strstr((char * )AT_result(), cmp) != NULL)
  1406. {
  1407. // 防止接收不完整
  1408. uint32_t last_time = AT_wait_time();
  1409. if(last_time > 10) // 过10ms之后再取数据,避免数据截断。
  1410. {
  1411. // 发送日志
  1412. Log_Printf_Debug("AT返回: %d, time_diff: %d\r\n", AT_result_length(), last_time);
  1413. // Log_SendArray_Debug(AT_result(), AT_result_length());
  1414. char * saveptr = NULL;
  1415. char * split = "\r";//删除\n,这个会改变解析的值
  1416. char * Line1 = strtok_r((char * )AT_result(), split, &saveptr);
  1417. uint8_t Line1_Len = strlen(Line1);
  1418. // Log_Printf_Debug("Line1(%d): %s\r\n",Line1_Len ,Line1);
  1419. // 分割Line1,获取报文长度
  1420. char * saveptr_inner = NULL;
  1421. char * split_inner = ",";
  1422. strtok_r(Line1, split_inner, &saveptr_inner);
  1423. strtok_r(NULL, split_inner, &saveptr_inner);
  1424. //Log_Printf_Debug("saveptr_inner: %s####\r\n",saveptr_inner);
  1425. * data_length = strtoul(strtok_r(NULL, split_inner, &saveptr_inner), NULL, 10);
  1426. // uint16_t line_length = Line1_Len+4 ;
  1427. // 内存拷贝
  1428. memcpy(data,saveptr_inner+1, *data_length);
  1429. //memcpy(data,AT_result(), *data_length);
  1430. // for(int i =0;i<*data_length;i++)
  1431. // {
  1432. // Log_Printf_Debug("%02x",data[i]);
  1433. // }
  1434. // Log_Printf_Debug("\r\n ####data: %s\r\n",data);
  1435. // 成功
  1436. result = Result_Success;
  1437. // 清理一下AT返回结果缓存
  1438. AT_Clear_Result();
  1439. }
  1440. }
  1441. return result;
  1442. }
  1443. /**
  1444. * 接收数据。带计时
  1445. * 输入<<
  1446. * connectID Socket ID。范围0-11。
  1447. *
  1448. * 输出>>
  1449. * data 接收的数据。
  1450. * data_length 接收的数据长度。
  1451. *
  1452. **/
  1453. enum Result bc260y_recv_with_time(uint8_t connectID, uint8_t * data, uint16_t * data_length, uint32_t time_out)
  1454. {
  1455. enum Result result = Result_None;
  1456. int activeID = 59, time = time_out; // 活动ID, 超时时间
  1457. // 校验ID
  1458. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1459. // 判断状态
  1460. if(getStatus() == Status_None) // 空闲状态
  1461. {
  1462. setStatus(Status_Sending);
  1463. }
  1464. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1465. {
  1466. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1467. result = Result_Failed;
  1468. }
  1469. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1470. {
  1471. Log_Printf_Debug("等待时间超时\r\n"); // 打印日志
  1472. result = overtime(); // 超时
  1473. Log_SendArray_Debug(AT_result(), AT_result_length());
  1474. }
  1475. else
  1476. {
  1477. // 接收数据
  1478. result = bc260y.recv(connectID, data, data_length);
  1479. if(result == Result_Success)
  1480. {
  1481. result = success(); // 成功
  1482. }
  1483. }
  1484. return result;
  1485. }
  1486. /**
  1487. * 接收数据。带计时
  1488. * 输入<<
  1489. * connectID Socket ID。范围0-11。
  1490. *
  1491. * 输出>>
  1492. * data 接收的数据。
  1493. * data_length 接收的数据长度。
  1494. *
  1495. **/
  1496. enum Result bc260y_recv_with_time_sync(uint8_t connectID, uint8_t * data, uint16_t * data_length, uint32_t time_out)
  1497. {
  1498. enum Result result = Result_None;
  1499. while(1)
  1500. {
  1501. result = bc260y_recv_with_time(connectID, data, data_length, time_out);
  1502. if(result != Result_None)
  1503. {
  1504. // 重置
  1505. bc260y.reset();
  1506. break;
  1507. }
  1508. }
  1509. return result;
  1510. }
  1511. /**
  1512. * 解释:关闭模块
  1513. * 关闭模块,关闭后会自动重启。
  1514. * 输入<<
  1515. * n 模块关机方式。0 立即关机;1 正常关机。默认是1
  1516. *
  1517. * activeID 69
  1518. **/
  1519. enum Result bc260y_power_down(uint8_t n)
  1520. {
  1521. enum Result result = Result_None;
  1522. int activeID = 69, time = 3000; // 活动ID, 超时时间
  1523. // 校验ID
  1524. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1525. // 判断状态
  1526. if(getStatus() == Status_None) // 空闲状态
  1527. {
  1528. sprintf(AT_CMD, "AT+QPOWD=%d\r\n", n); // 拼接AT指令
  1529. result = send_at(AT_CMD, activeID);
  1530. }
  1531. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1532. {
  1533. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1534. result = Result_Failed;
  1535. }
  1536. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1537. {
  1538. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1539. result = overtime();
  1540. }
  1541. else if(strstr((char * )AT_result(), "POWERED DOWN\r\n") != NULL) // 查询是否返回
  1542. {
  1543. // 发送日志
  1544. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1545. Log_SendArray_Debug(AT_result(), AT_result_length());
  1546. // 成功结果
  1547. result = success();
  1548. }
  1549. return result;
  1550. }
  1551. /**
  1552. * 解释:关闭模块。同步
  1553. * 关闭模块,关闭后会自动重启。
  1554. * 输入<<
  1555. * n 模块关机方式。0 立即关机;1 正常关机。默认是1
  1556. *
  1557. * activeID 69
  1558. **/
  1559. enum Result bc260y_power_down_sync(uint8_t n)
  1560. {
  1561. enum Result result = Result_None;
  1562. while(1)
  1563. {
  1564. result = bc260y_power_down(n);
  1565. if(result != Result_None)
  1566. {
  1567. // 重置
  1568. bc260y.reset();
  1569. break;
  1570. }
  1571. }
  1572. return result;
  1573. }
  1574. /**
  1575. * 模块是否启动成功
  1576. * 输入<<
  1577. *
  1578. * 输出>>
  1579. *
  1580. **/
  1581. enum Result bc260y_ready(void)
  1582. {
  1583. if(AT_Get_Status() != AT_Status_None)
  1584. {
  1585. return Result_None;
  1586. }
  1587. enum Result result = Result_None;
  1588. // 判断是否接收到
  1589. uint8_t RDY[5]="RDY";
  1590. if(memmem(AT_result(),AT_result_length(),RDY,strlen((char *)RDY)) != 0)
  1591. {
  1592. // 发送日志
  1593. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1594. Log_SendArray_Debug(AT_result(), AT_result_length());
  1595. // 成功结果
  1596. result = Result_Success;
  1597. // 清理一下AT返回结果缓存
  1598. AT_Clear_Result();
  1599. }
  1600. return result;
  1601. }
  1602. /**
  1603. * 查询信号质量
  1604. * 输入<<
  1605. *
  1606. * 输出>>
  1607. * RSRP
  1608. * RSRQ
  1609. * RSSI
  1610. * SINR
  1611. **/
  1612. enum Result bc260y_qeng_servingcell(int * RSRP, int * RSRQ, int * RSSI, int * SINR)
  1613. {
  1614. enum Result result = Result_None;
  1615. int activeID = 71, time = 500; // 活动ID, 超时时间
  1616. // 校验ID
  1617. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1618. // 判断状态
  1619. if(getStatus() == Status_None) // 空闲状态
  1620. {
  1621. //sprintf(AT_CMD, "AT+QENG=\"servingcell\"\r\n"); // 拼接AT指令
  1622. sprintf(AT_CMD, "AT+QENG=0\r\n"); // 拼接AT指令
  1623. result = send_at(AT_CMD, activeID);
  1624. }
  1625. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1626. {
  1627. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1628. result = failed(); // 失败
  1629. }
  1630. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1631. {
  1632. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1633. setStatus(Status_Overtime); // 超时
  1634. result = Result_Failed; // 结果
  1635. }
  1636. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1637. {
  1638. // 发送日志
  1639. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1640. Log_SendArray_Debug(AT_result(), AT_result_length());
  1641. // 处理返回结果
  1642. // char * saveptr = NULL;
  1643. // char * split = "\r\n";
  1644. char * saveptr_inner = NULL;
  1645. char * split_inner = ",\"";
  1646. strtok_r((char * )AT_result(), split_inner, &saveptr_inner);
  1647. strtok_r(NULL, split_inner, &saveptr_inner);
  1648. strtok_r(NULL, split_inner, &saveptr_inner);
  1649. strtok_r(NULL, split_inner, &saveptr_inner);
  1650. strtok_r(NULL, split_inner, &saveptr_inner);
  1651. * RSRP = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  1652. * RSRQ = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  1653. * RSSI = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  1654. * SINR = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  1655. // 打印
  1656. Log_Printf_Debug("RSRP: %d, RSRQ: %d, RSSI: %d, SINR: %d\r\n", * RSRP, * RSRQ, * RSSI, * SINR);
  1657. result = success(); // 成功
  1658. }
  1659. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1660. {
  1661. // 发送日志
  1662. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1663. Log_SendArray_Debug(AT_result(), AT_result_length());
  1664. result = failed(); // 失败
  1665. }
  1666. return result;
  1667. }
  1668. enum Result bc260y_qeng_servingcell_sync(int * RSRP, int * RSRQ, int * RSSI, int * SINR)
  1669. {
  1670. enum Result result = Result_None;
  1671. while(1)
  1672. {
  1673. result = bc260y_qeng_servingcell(RSRP, RSRQ, RSSI, SINR);
  1674. if(result != Result_None)
  1675. {
  1676. // 重置
  1677. bc260y.reset();
  1678. break;
  1679. }
  1680. }
  1681. return result;
  1682. }
  1683. /**
  1684. * 查询ICCID
  1685. * 输入<<
  1686. *
  1687. * 输出>>
  1688. * iccid SIM卡卡号
  1689. **/
  1690. enum Result bc260y_query_qccid(char * iccid)
  1691. {
  1692. enum Result result = Result_None;
  1693. int activeID = 75, time = 500; // 活动ID, 超时时间
  1694. // 校验ID
  1695. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1696. // 判断状态
  1697. if(getStatus() == Status_None) // 空闲状态
  1698. {
  1699. sprintf(AT_CMD, "AT+QCCID\r\n"); // 拼接AT指令
  1700. result = send_at(AT_CMD, activeID);
  1701. }
  1702. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1703. {
  1704. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1705. result = failed(); // 失败
  1706. }
  1707. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1708. {
  1709. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1710. setStatus(Status_Overtime); // 超时
  1711. result = Result_Failed; // 结果
  1712. }
  1713. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1714. {
  1715. // 发送日志
  1716. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1717. Log_SendArray_Debug(AT_result(), AT_result_length());
  1718. // 处理返回结果
  1719. char * saveptr = NULL;
  1720. char * split = "\r\n";
  1721. // 第一行
  1722. char * Line1 =strtok_r((char * )AT_result(), split, &saveptr);
  1723. // // 第二行
  1724. // char * Line2 = strtok_r(NULL, split, &saveptr);
  1725. // 拆解第二行
  1726. char * saveptr_inner = NULL;
  1727. char * split_inner = ": ,\"";
  1728. strtok_r(Line1, split_inner, &saveptr_inner);
  1729. // 字符串拷贝
  1730. strcpy(iccid, strtok_r(NULL, split_inner, &saveptr_inner));
  1731. // 打印
  1732. Log_Printf_Debug("ICCID: %s\r\n", iccid);
  1733. result = success(); // 成功
  1734. }
  1735. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1736. {
  1737. // 发送日志
  1738. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1739. Log_SendArray_Debug(AT_result(), AT_result_length());
  1740. result = failed(); // 失败
  1741. }
  1742. return result;
  1743. }
  1744. enum Result bc260y_query_qccid_sync(char * iccid)
  1745. {
  1746. enum Result result = Result_None;
  1747. while(1)
  1748. {
  1749. result = bc260y_query_qccid(iccid);
  1750. if(result != Result_None)
  1751. {
  1752. // 重置
  1753. bc260y.reset();
  1754. break;
  1755. }
  1756. }
  1757. return result;
  1758. }
  1759. /**
  1760. * 配置发送数据格式
  1761. * 输入<<
  1762. *n 0数据格式为文本字符串,1为十六进制字符串
  1763. *
  1764. **/
  1765. enum Result bc260y_dataformat(uint8_t n)
  1766. {
  1767. enum Result result = Result_None;
  1768. int activeID = 2, time = 500; // 活动ID, 超时时间
  1769. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  1770. // 判断状态
  1771. if(getStatus() == Status_None) // 空闲状态
  1772. {
  1773. sprintf(AT_CMD, "AT+QICFG=dataformat,%d,%d\r\n", n,0); // 拼接AT指令
  1774. result = send_at(AT_CMD, activeID);
  1775. }
  1776. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1777. {
  1778. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1779. result = failed(); // 失败
  1780. }
  1781. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1782. {
  1783. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1784. result = overtime(); // 超时
  1785. }
  1786. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1787. {
  1788. // 发送日志
  1789. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1790. Log_SendArray_Debug(AT_result(), AT_result_length());
  1791. result = success(); // 成功
  1792. }
  1793. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1794. {
  1795. // 发送日志
  1796. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1797. Log_SendArray_Debug(AT_result(), AT_result_length());
  1798. result = failed(); // 失败
  1799. }
  1800. return result;
  1801. }
  1802. /**
  1803. * 配置发送数据格式
  1804. * 输入<<
  1805. *n 0数据格式为文本字符串,1为十六进制字符串
  1806. *
  1807. **/
  1808. enum Result bc260y_dataformat_sync(uint8_t n)
  1809. {
  1810. enum Result result = Result_None;
  1811. while(1)
  1812. {
  1813. result =bc260y_dataformat(n);
  1814. if(result != Result_None)
  1815. {
  1816. // 重置
  1817. bc260y.reset();
  1818. break;
  1819. }
  1820. }
  1821. return result;
  1822. }
  1823. #endif