esp8266.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. /**
  2. * author wulianwei
  3. * title ESP8266模块驱动
  4. */
  5. #include "stm32f10x.h"
  6. //网络设备驱动
  7. #include "esp8266.h"
  8. #include "sys.h"
  9. #include "module_wrapper.h"
  10. #include "at.h"
  11. //C库
  12. #include <string.h>
  13. #include <stdio.h>
  14. extern uart_recv_t uart_recv;
  15. extern uint8 tcp_connect_status;
  16. extern valid_data_t valid_data;
  17. //==========================================================
  18. // 函数名称: esp8266_send_data
  19. //
  20. // 函数功能: 发送数据
  21. //
  22. // 入口参数: data:数据(数组)
  23. // len:长度
  24. //
  25. // 返回参数: 无
  26. //
  27. // 说明:
  28. //==========================================================
  29. static int esp8266_send_data(const void *data, int len)
  30. {
  31. char cmdBuf[SEND_SIZE]={0};
  32. uart_recv_clear(); //清空接收缓存
  33. //esp8266_tcp_reconnect();
  34. snprintf(cmdBuf,SEND_SIZE,"AT+CIPSEND=%d\r\n", len); //发送命令
  35. if(!at_send_cmd(cmdBuf, ">")) //收到‘SEND OK’时可以发送数据
  36. {
  37. // Usart_SendString(USART2, data, len); //发送设备连接请求数据
  38. if(!at_send_byte((char*)data,len,"SEND OK"))
  39. {
  40. return 0;
  41. }
  42. }
  43. return -1;
  44. }
  45. //==========================================================
  46. // 函数名称: esp8266_get_data
  47. //
  48. // 函数功能: 获取平台返回的数据
  49. //
  50. // 入口参数: data:存储有效数据(数组),len:有效数据长度,timeOut:等待的时间(ms)
  51. //
  52. // 返回参数: 平台返回的原始数据
  53. //
  54. // 说明: 不同网络设备返回的格式不同,需要去调试
  55. //==========================================================
  56. static int esp8266_get_data(void *data,int len,int timeOut)
  57. {
  58. int minLen = 0;
  59. char *recvdiff[4] = {0};//分割字符串地址
  60. char recvbuf[RECV_SIZE] = {0};
  61. int data_len = 0;//有效数据长度
  62. char *recvSign = "+IPD";
  63. if(!uart_recv_match_wait(recvSign,timeOut))
  64. {
  65. UsartPrintf(USART_DEBUG, "返回数据:%d,%s\r\n",uart_recv.len,uart_recv.start_addr);
  66. memcpy((char*)recvbuf, (char*)uart_recv.start_addr, uart_recv.len);
  67. split((char*)recvbuf,",",recvdiff,sizeof(recvdiff));
  68. data_len = my_atoi(recvdiff[1]);
  69. minLen = data_len < len? data_len : len;
  70. memcpy(data,(char*)recvdiff[2],minLen);
  71. uart_recv_clear();
  72. return data_len;
  73. }
  74. uart_recv_clear();
  75. return -1;
  76. }
  77. //==========================================================
  78. // 函数名称: esp8266_init
  79. //
  80. // 函数功能: 初始化esp8266
  81. //
  82. // 入口参数: 无
  83. //
  84. // 返回参数: 0 成功 -1失败
  85. //
  86. // 说明:
  87. //==========================================================
  88. static int esp8266_init(void)
  89. {
  90. char recv[300];
  91. GPIO_InitTypeDef GPIO_Initure;
  92. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  93. //ESP8266复位引脚
  94. GPIO_Initure.GPIO_Mode = GPIO_Mode_Out_PP;
  95. GPIO_Initure.GPIO_Pin = GPIO_Pin_7; //GPIOA0-复位
  96. GPIO_Initure.GPIO_Speed = GPIO_Speed_50MHz;
  97. GPIO_Init(GPIOA, &GPIO_Initure);
  98. GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_RESET);
  99. delay_ms(250);
  100. GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_SET);
  101. UsartPrintf(USART_DEBUG, "1.AT\r\n");
  102. at_send_cmd_back(AT,recv,sizeof(recv));
  103. UsartPrintf(USART_DEBUG, "%s\r\n",recv);
  104. UsartPrintf(USART_DEBUG, "2.RESTORE\r\n");
  105. at_send_cmd_back_wait(RESTORE,recv,sizeof(recv),1000);
  106. UsartPrintf(USART_DEBUG, "%s\r\n",recv);
  107. UsartPrintf(USART_DEBUG, "3.CWMODE\r\n");
  108. at_send_cmd_back_wait(CWMODE,recv,sizeof(recv),500);
  109. UsartPrintf(USART_DEBUG, "%s\r\n",recv);
  110. UsartPrintf(USART_DEBUG, "4.禁止回显\r\n");
  111. at_send_cmd_back(ATE0,recv,sizeof(recv));
  112. UsartPrintf(USART_DEBUG, "%s\r\n",recv);
  113. if(!strstr(recv,"OK"))
  114. {
  115. UsartPrintf(USART_DEBUG,"禁止回显失败\r\n");
  116. return -1;
  117. }
  118. UsartPrintf(USART_DEBUG, "5.禁止休眠\r\n");
  119. at_send_cmd_back(NSLEEP,recv,sizeof(recv));
  120. UsartPrintf(USART_DEBUG, "%s\r\n",recv);
  121. UsartPrintf(USART_DEBUG, "6.连接WiFi\r\n");
  122. at_send_cmd_back_wait(CWJAP,recv,sizeof(recv),6000);
  123. UsartPrintf(USART_DEBUG, "%s\r\n",recv);
  124. if(!strstr(recv,"WIFI GOT IP"))
  125. {
  126. UsartPrintf(USART_DEBUG,"连接WiFi失败\r\n");
  127. return -1;
  128. }
  129. UsartPrintf(USART_DEBUG, "\r\n ESP8266 初始化完成\r\n");
  130. return 0;
  131. }
  132. /**
  133. * @Title TCP连接
  134. * @Param ip:地址, port:端口
  135. * @Return 0:成功,-1:失败
  136. */
  137. static void esp8266_tcp_connect(const char *ip, const char *port)
  138. {
  139. char conCmd[200]={0};
  140. UsartPrintf(USART_DEBUG, "连接TCP服务器\r\n");
  141. snprintf(conCmd,sizeof(conCmd),CIPSTART,ip,port);
  142. at_send_simple_cmd(conCmd);
  143. tcp_connect_status = TCP_CONNECTING;
  144. }
  145. /**
  146. * @Title TCP通道关闭
  147. * @Return 0:成功,-1:失败
  148. */
  149. static int esp8266_tcp_close(void)
  150. {
  151. if(at_send_cmd(CIPCLOSE,"CLOSED"))
  152. {
  153. return -1;
  154. }
  155. tcp_connect_status = TCP_CLOSED; //tcp断开
  156. UsartPrintf(USART_DEBUG, "断开TCP服务器\r\n");
  157. return 0;
  158. }
  159. /**
  160. * @Title 判断tcp连接状态
  161. * @Return 0 保持连接,-1 断开连接
  162. */
  163. static int esp8266_tcp_state(void)
  164. {
  165. char *statebuf[8] ={0};
  166. char recvbuf[200] = {0};
  167. at_send_cmd_back(CIPSTATUS,recvbuf,sizeof(recvbuf));
  168. if(strstr(recvbuf,"OK"))
  169. {
  170. if(strstr((char *)recvbuf,"STATUS:"))
  171. {
  172. split((char*)recvbuf,":",statebuf,sizeof(statebuf));
  173. if(statebuf[1])
  174. {
  175. if(*(statebuf[1]) == '3')
  176. {
  177. tcp_connect_status = TCP_OPEN; //tcp连接
  178. UsartPrintf(USART_DEBUG, "TCP服务器保持链接\r\n");
  179. return 0;
  180. }
  181. }
  182. }
  183. }
  184. tcp_connect_status = TCP_CLOSED; //tcp断开
  185. UsartPrintf(USART_DEBUG, "TCP服务器已断开3\r\n");
  186. return -1;
  187. }
  188. static void esp8266_tcp_reconnect(const char *ip, const char *port)
  189. {
  190. if(esp8266_tcp_state())
  191. {
  192. UsartPrintf(USART_DEBUG, "重连服务器\r\n");
  193. esp8266_tcp_close();
  194. esp8266_tcp_connect(ip,port);
  195. }
  196. }
  197. static void esp8266_tcp_online_event(void)
  198. {
  199. UsartPrintf(USART_DEBUG, "esp8266_tcp_online_event\r\n");
  200. tcp_connect_status = TCP_OPEN;// tcp在线
  201. }
  202. static void esp8266_tcp_close_event(void)
  203. {
  204. UsartPrintf(USART_DEBUG, "esp8266_tcp_close_event\r\n");
  205. tcp_connect_status = TCP_CLOSED; //tcp断线
  206. }
  207. static void esp8266_wifi_reconnect_event(void)
  208. {
  209. UsartPrintf(USART_DEBUG, "esp8266_wifi_reconnect_event\r\n");
  210. tcp_connect_status = TCP_CLOSED; //tcp断线
  211. }
  212. static void esp8266_recv_event(void)
  213. {
  214. int minLen = 0;
  215. char *recvdiff[4] = {0};//分割字符串地址
  216. char recvbuf[RECV_SIZE] = {0};
  217. int data_len = 0;//有效数据长度
  218. int valid_data_size = sizeof(valid_data.buf);
  219. uart_recv_wait(15);//有效数据返回有延迟
  220. memcpy((char*)recvbuf,(char*)uart_recv.start_addr,uart_recv.len);
  221. split((char*)recvbuf+strlen("+IPD,"),":",recvdiff,sizeof(uart_recv.buf));
  222. data_len = my_atoi(recvdiff[0]);
  223. minLen = data_len < valid_data_size? data_len : valid_data_size;
  224. valid_data.len = minLen;
  225. memcpy(valid_data.buf,(char*)recvdiff[1],minLen); //有效数据前后多了一个双引号
  226. UsartPrintf(USART_DEBUG, "esp8266_recv_event\r\n");
  227. }
  228. void esp8266_busy_event(void)
  229. {
  230. UsartPrintf(USART_DEBUG, "esp8266_busy_event:%s\r\n",uart_recv.buf);
  231. }
  232. void esp8266_error_event(void)
  233. {
  234. UsartPrintf(USART_DEBUG, "error_event:%s\r\n",uart_recv.buf);
  235. }
  236. at_event_t esp8266_at_event[] = {
  237. { "WIFI GOT IP", esp8266_wifi_reconnect_event},//wifi重连
  238. { "CONNECT\r\n\r\nOK", esp8266_tcp_online_event}, //tcp连接成功
  239. { "ALREADY CONNECTED", esp8266_tcp_online_event}, //tcp连接成功
  240. //{ "CLOSED", esp8266_tcp_close_event}, //tcp断开
  241. { "+IPD,", esp8266_recv_event},
  242. { "busy,", esp8266_busy_event},
  243. { "ERROR", esp8266_error_event}
  244. };
  245. static void esp8266_handle_event(void)
  246. {
  247. int i = 0;
  248. char *start_addr;
  249. if(uart_recv.len ==0) return;
  250. //UsartPrintf(USART_DEBUG, "uart_recv buff:%s\r\n",uart_recv.buf);
  251. for(i=0;i<sizeof(esp8266_at_event)/sizeof(esp8266_at_event[0]);i++)
  252. {
  253. at_event_t* event = &esp8266_at_event[i];
  254. start_addr = strstr(uart_recv.buf, event->event_header);
  255. if(start_addr)
  256. {
  257. uart_recv.start_addr = start_addr;
  258. event->event_callback();
  259. uart_recv_clear();
  260. break;
  261. }
  262. }
  263. }
  264. at_module_t at_module_esp8266 = {
  265. .init = esp8266_init,
  266. .connect = esp8266_tcp_connect,
  267. .reconnect = esp8266_tcp_reconnect,
  268. .tcpstate = esp8266_tcp_state,
  269. .send = esp8266_send_data,
  270. .recv_timeout = esp8266_get_data,
  271. .close = esp8266_tcp_close,
  272. .handle_event = esp8266_handle_event,
  273. .handle_event = esp8266_handle_event,
  274. };
  275. int esp8266_sal_init()
  276. {
  277. if(at_module_register(&at_module_esp8266))
  278. {
  279. return -1;
  280. }
  281. if(at_module_init())
  282. {
  283. return -1;
  284. }
  285. return 0;
  286. }