bc26.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. /**
  2. * author wulianwei
  3. * title BC260Y模块驱动
  4. */
  5. #include "stm32f10x.h"
  6. #include "bc26.h"
  7. #include "sys.h"
  8. #include "module_wrapper.h"
  9. #include "at.h"
  10. //C库
  11. #include <string.h>
  12. #include <stdio.h>
  13. extern uart_recv_t uart_recv;
  14. extern valid_data_t valid_data;
  15. uint8_t err_cout = MODULE_FAIL;
  16. //从睡眠中唤醒BC26
  17. static void bc26_wake(void)
  18. {
  19. at_send_simple_cmd(AT); //AT触发
  20. }
  21. //==========================================================
  22. // 函数名称: bc26_send_data
  23. //
  24. // 函数功能: 发送数据
  25. //
  26. // 入口参数: data:数据(数组)
  27. // len:长度
  28. //
  29. // 返回参数: 无
  30. //
  31. // 说明:
  32. //==========================================================
  33. static int bc26_send_data(const void *data, int len)
  34. {
  35. char cmdBuf[SEND_SIZE+20]={0};
  36. char hexData[SEND_SIZE] = {0};
  37. bc26_wake();
  38. //bc26_tcp_reconnect();
  39. byteToHexStr(data,hexData,len);
  40. snprintf(cmdBuf,SEND_SIZE,"AT+QISEND=0,%d,\"%s\",%d\r\n", len,hexData,0); //发送数据,返回后不释放链接
  41. // UsartPrintf(USART_DEBUG, "raisend:%s\r\n",cmdBuf);
  42. if(!at_send_cmd(cmdBuf, "SEND OK"))
  43. {
  44. // Usart_SendString(USART2, data, len); //发送设备连接请求数据
  45. return 0;
  46. }
  47. return -1;
  48. }
  49. static int bc26_send_data_rai(const void *data, int len,int rai)
  50. {
  51. char cmdBuf[SEND_SIZE+20]={0};
  52. char hexData[SEND_SIZE] = {0};
  53. bc26_wake();
  54. delay_ms(3);
  55. bc26_wake();
  56. //清空接收缓存
  57. //bc26_tcp_reconnect();
  58. len = len<=SEND_SIZE/2 ? len:SEND_SIZE/2;
  59. byteToHexStr(data,hexData, len);
  60. snprintf(cmdBuf,sizeof(cmdBuf),"AT+QISEND=0,%d,\"%s\",%d\r\n", len,hexData,rai); //发送数据,返回后释放链接
  61. //UsartPrintf(USART_DEBUG, "\r\nraisend:%s,%d\r\n",cmdBuf,strlen(cmdBuf));
  62. if(!at_send_cmd(cmdBuf, "SEND OK"))
  63. {
  64. // Usart_SendString(USART2, data, len); //发送设备连接请求数据
  65. return 0;
  66. }
  67. return -1;
  68. }
  69. //==========================================================
  70. // 函数名称: bc26_get_data
  71. //
  72. // 函数功能: 获取平台返回的数据
  73. //
  74. // 入口参数: data:存储有效数据(数组),len:有效数据长度,timeOut:等待的时间(ms)
  75. //
  76. // 返回参数: 平台返回的原始数据
  77. //
  78. // 说明: 不同网络设备返回的格式不同,需要去调试
  79. //==========================================================
  80. static int bc26_get_data(void *data,int len,int timeOut)
  81. {
  82. int minLen = 0;
  83. char *recvdiff[4] = {0};//分割字符串地址
  84. char recvbuf[RECV_SIZE] = {0};
  85. int data_len = 0;//有效数据长度
  86. char *recvSign = "+QIURC: \"recv\",0,";
  87. if(!uart_recv_match_wait(recvSign,timeOut))
  88. {
  89. uart_recv.start_addr = strstr(uart_recv.buf,recvSign);
  90. UsartPrintf(USART_DEBUG, "返回数据:%d,%s\r\n",uart_recv.len,uart_recv.start_addr);
  91. memcpy((char*)recvbuf, (char*)uart_recv.start_addr, uart_recv.len);
  92. split((char*)recvbuf,",",recvdiff,sizeof(recvdiff));
  93. data_len = my_atoi(recvdiff[2]);
  94. minLen = data_len < len? data_len : len;
  95. memcpy(data,(char*)recvdiff[3]+1,minLen); //有效数据前后多了一个双引号
  96. uart_recv_clear();
  97. return data_len;
  98. }
  99. uart_recv_clear();
  100. return -1;
  101. }
  102. static void bc26_restart(void)
  103. {
  104. UsartPrintf(USART_DEBUG, "自动重启\r\n");
  105. BC26_RST_HIGH();
  106. delay_ms(60);
  107. BC26_RST_LOW();
  108. uart_recv_clear();
  109. }
  110. static int bc26_config(void)
  111. {
  112. char recv[300] = {0};
  113. at_send_cmd_back_wait(AT,recv,sizeof(recv),100); //AT触发
  114. UsartPrintf(USART_DEBUG, "1.休眠\r\n");
  115. at_send_cmd_back(LIGHTSLEEP,recv,sizeof(recv));
  116. if(!strstr(recv,"OK"))
  117. {
  118. UsartPrintf(USART_DEBUG,"休眠失败\r\n");
  119. return -1;
  120. }
  121. UsartPrintf(USART_DEBUG, "2.不回显命令\r\n");
  122. at_send_cmd_back(ATE0,recv,sizeof(recv));
  123. if(!strstr(recv,"OK"))
  124. {
  125. UsartPrintf(USART_DEBUG,"禁止回显失败\r\n");
  126. return -1;
  127. }
  128. UsartPrintf(USART_DEBUG, "3.16进制发送数据\r\n");
  129. at_send_cmd_back(QICFG,recv,sizeof(recv));
  130. if(!strstr(recv,"OK"))
  131. {
  132. UsartPrintf(USART_DEBUG,"16进制发送数据失败\r\n");
  133. return -1;
  134. }
  135. module_init_status = MODULE_OK;
  136. return 0;
  137. }
  138. //==========================================================
  139. // 函数名称: bc26_init
  140. //
  141. // 函数功能: 初始化BC26
  142. //
  143. // 入口参数: 无
  144. //
  145. // 返回参数: 0 成功 1失败
  146. //
  147. // 说明:
  148. //==========================================================
  149. static int bc26_init(void)
  150. {
  151. return bc26_config();
  152. }
  153. /**
  154. * @Title 模块ue功能关闭
  155. * @Return 0:成功,-1:失败
  156. */
  157. static int bc26_ue_down(void)
  158. {
  159. bc26_wake();//唤醒
  160. delay_ms(10);
  161. if(at_send_cmd(CFUN0,"OK"))
  162. {
  163. UsartPrintf(USART_DEBUG, "UE功能关闭\r\n");
  164. return -1;
  165. }
  166. tcp_connect_status = TCP_CLOSED; //tcp断开
  167. UsartPrintf(USART_DEBUG, "UE功能关闭失败\r\n");
  168. return 0;
  169. }
  170. /**
  171. * @Title TCP连接
  172. * @Param ip:地址, port:端口
  173. */
  174. static void bc26_tcp_connect(const char *ip, const char *port)
  175. {
  176. char conCmd[200]={0};
  177. bc26_wake();//唤醒
  178. UsartPrintf(USART_DEBUG, "连接TCP服务器\r\n");
  179. snprintf(conCmd,sizeof(conCmd),QIOPEN,ip,port);
  180. at_send_simple_cmd(conCmd);
  181. tcp_connect_status = TCP_CONNECTING;
  182. }
  183. /**
  184. * @Title 打开UDP端口
  185. * @Param ip:地址, port:端口
  186. */
  187. static void bc26_udp_open(const char *ip, const char *port)
  188. {
  189. char conCmd[200]={0};
  190. // bc26_wake();//唤醒
  191. snprintf(conCmd,sizeof(conCmd),QIOPENUDP,ip,port);
  192. UsartPrintf(USART_DEBUG, "连接UDP服务器\r\n");
  193. at_send_simple_cmd(conCmd);
  194. tcp_connect_status = TCP_CONNECTING;
  195. }
  196. /**
  197. * @Title TCP通道关闭
  198. * @Return 0:成功,-1:失败
  199. */
  200. static int bc26_tcp_close(void)
  201. {
  202. bc26_wake();//唤醒
  203. delay_ms(10);
  204. //UsartPrintf(USART_DEBUG, "断开TCP操作:%s\r\n",QICLOSE);
  205. if(at_send_cmd(QICLOSE,"CLOSE OK"))
  206. {
  207. return -1;
  208. }
  209. tcp_connect_status = TCP_CLOSED; //tcp断开
  210. UsartPrintf(USART_DEBUG, "断开TCP服务器\r\n");
  211. return 0;
  212. }
  213. /**
  214. * @Title 判断tcp连接状态
  215. * @Return 0 保持连接,-1 断开连接
  216. */
  217. static int bc26_tcp_state(void)
  218. {
  219. char *statebuf[8] ={0};
  220. char recvbuf[200] = {0};
  221. bc26_wake();
  222. delay_ms(15);
  223. at_send_cmd_back(QISTATE,recvbuf,sizeof(recvbuf));
  224. if(strstr(recvbuf,"OK"))
  225. {
  226. if(strstr((char *)recvbuf,"+QISTATE: 0"))
  227. {
  228. split((char*)recvbuf,",",statebuf,sizeof(statebuf));
  229. if(statebuf[5])
  230. {
  231. if(*(statebuf[5]) == '2')
  232. {
  233. tcp_connect_status = TCP_OPEN; //tcp连接
  234. UsartPrintf(USART_DEBUG, "TCP服务器保持链接\r\n");
  235. return 0;
  236. }
  237. }
  238. }
  239. }
  240. tcp_connect_status = TCP_CLOSED; //tcp断开
  241. UsartPrintf(USART_DEBUG, "TCP服务器已断开\r\n");
  242. return -1;
  243. }
  244. static void bc26_tcp_reconnect(const char *ip, const char *port)
  245. {
  246. bc26_wake();//唤醒
  247. if(bc26_tcp_state())
  248. {
  249. UsartPrintf(USART_DEBUG, "重连服务器\r\n");
  250. bc26_tcp_close();
  251. bc26_tcp_connect(ip,port);
  252. }
  253. }
  254. static void bc26_udp_reopen(const char *ip, const char *port)
  255. {
  256. bc26_wake();//唤醒
  257. if(bc26_tcp_state())
  258. {
  259. UsartPrintf(USART_DEBUG, "重连服务器\r\n");
  260. bc26_tcp_close();
  261. bc26_udp_open(ip,port);
  262. }
  263. }
  264. static void bc26_tcp_online_event(void)
  265. {
  266. UsartPrintf(USART_DEBUG, "bc26_tcp_online_event\r\n");
  267. tcp_connect_status = TCP_OPEN;// tcp在线
  268. }
  269. static void bc26_tcp_close_event(void)
  270. {
  271. UsartPrintf(USART_DEBUG, "bc26_tcp_close_event\r\n");
  272. tcp_connect_status = TCP_CLOSED; //tcp断线
  273. }
  274. static void bc26_recv_event(void)
  275. {
  276. int i;
  277. int minLen = 0;
  278. char *recvdiff[4] = {0};//分割字符串地址
  279. char recvbuf[RECV_SIZE] = {0};
  280. int data_len = 0;//有效数据长度
  281. int valid_data_size = sizeof(valid_data.buf);
  282. uart_recv_wait(150);//有效数据返回有延迟
  283. memcpy((char*)recvbuf,(char*)uart_recv.start_addr,uart_recv.len);
  284. splitCharLimit((char*)recvbuf,',',recvdiff,4);
  285. data_len = my_atoi(recvdiff[2]);
  286. minLen = data_len < valid_data_size-1? data_len : valid_data_size-1;
  287. valid_data.len = minLen;
  288. memcpy(valid_data.buf,(char*)recvdiff[3]+1,minLen); //有效数据前后多了一个双引号
  289. UsartPrintf(USART_DEBUG, "bc26_recv_event\r\n");
  290. }
  291. void bc26_error_event(void)
  292. {
  293. UsartPrintf(USART_DEBUG, "error_event:%s\r\n",uart_recv.buf);
  294. if(err_cout == 5) //连续出错5次UsartPrintf,重启模块
  295. {
  296. err_cout= 0;
  297. module_start_status = MODULE_FAIL;
  298. module_init_status = MODULE_FAIL;
  299. }
  300. }
  301. void bc26_sleep_event(void)
  302. {
  303. UsartPrintf(USART_DEBUG, "ENTER DEEPSLEEP\r\n",uart_recv.buf);
  304. }
  305. static void bc26_restart_event(void)
  306. {
  307. UsartPrintf(USART_DEBUG, "bc26_restart_event:%s\r\n",uart_recv.buf);
  308. module_start_status = MODULE_OK; //bc260启动成功
  309. module_init_status = MODULE_FAIL; //重新配置参数
  310. tcp_connect_status = TCP_CLOSED;//TCP 需要重连
  311. bc26_config();//配置
  312. }
  313. at_event_t bc26_at_event[] = {
  314. { "+IP:", bc26_restart_event}, //tcp连接成功
  315. { "+QIOPEN: 0,0", bc26_tcp_online_event}, //tcp连接成功
  316. { "+QIURC: \"closed\",0", bc26_tcp_close_event}, //tcp断开链接
  317. { "+QIURC: \"recv\",0", bc26_recv_event},
  318. { "ERROR", bc26_error_event},
  319. { "+QNBIOTEVENT: \"ENTER DEEPSLEEP\"", bc26_sleep_event}
  320. };
  321. static void bc26_handle_event(void)
  322. {
  323. int i = 0;
  324. char *start_addr;
  325. if(uart_recv.len ==0) return;
  326. for(i=0;i<sizeof(bc26_at_event)/sizeof(bc26_at_event[0]);i++)
  327. {
  328. at_event_t* event = &bc26_at_event[i];
  329. start_addr = strstr(uart_recv.buf, event->event_header);
  330. if(start_addr)
  331. {
  332. if(event->event_callback == bc26_error_event)
  333. {
  334. err_cout++;
  335. }
  336. else
  337. {
  338. err_cout=0;
  339. }
  340. uart_recv.start_addr = start_addr;
  341. event->event_callback();
  342. uart_recv_clear();
  343. break;
  344. }
  345. }
  346. }
  347. at_module_t at_module_bc26 = {
  348. .start = bc26_restart,
  349. .init = bc26_init,
  350. .connect = bc26_tcp_connect,
  351. .reconnect = bc26_tcp_reconnect,
  352. .udpreopen = bc26_udp_reopen,
  353. .tcpstate = bc26_tcp_state,
  354. .send = bc26_send_data,
  355. .send_rai = bc26_send_data_rai,
  356. .recv_timeout = bc26_get_data,
  357. .close = bc26_tcp_close,
  358. .handle_event = bc26_handle_event,
  359. .cmd_back = at_send_cmd_back,
  360. .cmd = at_send_simple_cmd,
  361. .low_power = bc26_ue_down,
  362. .udpopen = bc26_udp_open,
  363. };
  364. int bc26_sal_init()
  365. {
  366. if(at_module_register(&at_module_bc26))
  367. {
  368. module_init_status = MODULE_FAIL;
  369. return -1;
  370. }
  371. if(at_module_init())
  372. {
  373. module_init_status = MODULE_FAIL;
  374. return -1;
  375. }
  376. module_init_status = MODULE_OK;
  377. return 0;
  378. }
  379. void bc26_sal_register()
  380. {
  381. at_module_register(&at_module_bc26);
  382. }