WIFI_func.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. #include "main.h"
  2. //// C lib
  3. //#include <stdlib.h>
  4. //#include <string.h>
  5. //#include <stdio.h>
  6. //// system
  7. //#include "delay.h"
  8. //// wifi
  9. //#include "WIFI_config.h"
  10. //#include "cJSON.h"
  11. static char* ESP8266_check_cmd(char *str);
  12. static char ESP8266_send_cmd(char *cmd,char *ack,uint16_t waittime);
  13. static char ESP8266_consta_check(void);
  14. static void ESP8266_get_wanip(char* ipbuf);
  15. static void WIFI_sendData(char* fmt,...);
  16. // WIFI信息 联网的WIFI名称和密码
  17. const char* WIFI_id="MNIAS";
  18. const char* WIFI_password="0123456789";
  19. /**
  20. * @brief 向WIFI串口发送数据
  21. * @param fmt: 类似printf的数据格式
  22. * @retval None
  23. * @note None
  24. */
  25. void WIFI_sendData(char* fmt,...)
  26. {
  27. uint16_t i,j;
  28. va_list ap;
  29. va_start(ap,fmt);
  30. vsprintf((char*)WIFI_USART_TX_BUF,fmt,ap);
  31. va_end(ap);
  32. i = strlen((const char*)WIFI_USART_TX_BUF);
  33. for(j=0; j<i; j++)
  34. {
  35. while(USART_GetFlagStatus(WIFI_USARTx,USART_FLAG_TC)==RESET);
  36. USART_SendData(WIFI_USARTx,WIFI_USART_TX_BUF[j]);
  37. }
  38. }
  39. /**
  40. * @brief 清零缓存区并清零接收标志
  41. * @param None
  42. * @retval None
  43. * @note None
  44. */
  45. void ESP8266_clear(void)
  46. {
  47. memset(WIFI_USART_RX_BUF, 0, WIFI_USART_MAX_RECV_LEN);
  48. WIFI_USART_RX_STA = 0;
  49. }
  50. /**
  51. * @brief 检测应答
  52. * @param str: 期待的应答结果
  53. * @retval 0: 没有接收到期待应答
  54. * @retval !0: 其他值代表期待应答结果的位置
  55. * @note None
  56. */
  57. static char* ESP8266_check_cmd(char *str)
  58. {
  59. char *strx=0;
  60. // 接收到一次数据了
  61. if(WIFI_USART_RX_STA&0X8000)
  62. {
  63. // 添加结束符
  64. WIFI_USART_RX_BUF[WIFI_USART_RX_STA&0X7FFF]=0;
  65. // 检索字符串
  66. strx=strstr(WIFI_USART_RX_BUF,str);
  67. }
  68. return strx;
  69. }
  70. /**
  71. * @brief 向WIFI发送命令
  72. * @param cmd: 发送的命令字符串
  73. * @param ack: 期待的应答结果,如果为空,则表示不需要等待应答
  74. * @param waittime: 等待时间(单位:10ms)
  75. * @retval 0: 发送成功(得到了期待的应答结果),
  76. * @retval 1: 发送失败
  77. * @note None
  78. */
  79. static char ESP8266_send_cmd(char *cmd,char *ack,uint16_t waittime)
  80. {
  81. char res=0;
  82. WIFI_USART_RX_STA=0;
  83. //发送命令
  84. WIFI_sendData("%s",cmd);
  85. if(ack&&waittime) //需要等待应答
  86. {
  87. while(--waittime) //等待倒计时
  88. {
  89. DelayClass.DelayMs(10);
  90. if(WIFI_USART_RX_STA&0X8000)//接收到期待的应答结果
  91. {
  92. if(*ESP8266_check_cmd(ack))
  93. {
  94. break; // 得到有效数据
  95. }
  96. WIFI_USART_RX_STA=0;
  97. }
  98. }
  99. if(waittime==0)res=1;
  100. }
  101. return res;
  102. }
  103. /**
  104. * @brief 退出透传
  105. * @param None
  106. * @retval 0: 退出成功
  107. * @retval 1: 退出失败
  108. * @note 无后缀发送"+++"退出透传
  109. */
  110. void ESP8266_quit_trans(void)
  111. {
  112. while(ESP8266_send_cmd("AT+CIPMODE=0\r\n","OK",100))
  113. {
  114. while((WIFI_USARTx->SR&0X40)==0); // 等待发送空
  115. WIFI_USARTx->DR='+';
  116. DelayClass.DelayMs(12); // 大于串口组帧时间(10ms)
  117. while((WIFI_USARTx->SR&0X40)==0);
  118. WIFI_USARTx->DR='+';
  119. DelayClass.DelayMs(12);
  120. while((WIFI_USARTx->SR&0X40)==0);
  121. WIFI_USARTx->DR='+';
  122. DelayClass.DelayMs(100); // 等待100ms
  123. ESP8266_send_cmd("AT+CIPCLOSE\r\n","OK",50);
  124. }
  125. }
  126. /**
  127. * @brief 获取WIFI连接状态
  128. * @param None
  129. * @retval 0: 未连接
  130. * @retval 1: 连接成功
  131. * @note None
  132. */
  133. static char ESP8266_consta_check(void)
  134. {
  135. char *p;
  136. char res;
  137. ESP8266_quit_trans(); // 退出透传
  138. //发送AT+CIPSTATUS指令,查询连接状态
  139. ESP8266_send_cmd("AT+CIPSTATUS",":",50);
  140. p=ESP8266_check_cmd("+CIPSTATUS:");
  141. res=*p;
  142. return res;
  143. }
  144. /**
  145. * @brief 获取Client ip地址
  146. * @param ipbuf: ip地址输出缓存区
  147. * @retval None
  148. * @note None
  149. */
  150. static void ESP8266_get_wanip(char* ipbuf)
  151. {
  152. char *p,*p1;
  153. //获取WAN IP地址失败
  154. if(ESP8266_send_cmd("AT+CIFSR","OK",50))
  155. {
  156. ipbuf[0]=0;
  157. return;
  158. }
  159. p=ESP8266_check_cmd("\"");
  160. p1=(char*)strstr((const char*)(p+1),"\"");
  161. *p1=0;
  162. sprintf((char*)ipbuf,"%s",p+1);
  163. }
  164. /**
  165. * @brief 删除指定字符并重组
  166. * @param str[]: 要修改的字符串
  167. * @param target: 要删除的字符
  168. * @retval None
  169. * @note None
  170. */
  171. void Delete_char(char str[],char target)
  172. {
  173. int i,j;
  174. for(i=0, j=0; i < strlen(str); i++)
  175. {
  176. if(str[i] != target)
  177. {
  178. str[j++] = str[i];
  179. }
  180. // printf("J:%c I:%c\n", str[j-1], str[i]);
  181. }
  182. str[j] = '\0';
  183. }
  184. /**
  185. * @brief WIFI复位引脚配置
  186. * @param None
  187. * @retval None
  188. * @note None
  189. */
  190. void WIFI_RESET_GPIO_Congfig(void)
  191. {
  192. GPIO_InitTypeDef GPIO_InitStructure;
  193. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  194. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  195. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  196. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  197. GPIO_Init(GPIOA, &GPIO_InitStructure);
  198. GPIO_SetBits(GPIOA, GPIO_Pin_1);
  199. DelayClass.DelayMs(100);
  200. GPIO_ResetBits(GPIOA, GPIO_Pin_1);
  201. DelayClass.DelayMs(500);
  202. GPIO_SetBits(GPIOA, GPIO_Pin_1);
  203. DelayClass.DelayMs(1000);
  204. }
  205. /**
  206. * @brief 连接WIFI
  207. * @param None
  208. * @retval None
  209. * @note None
  210. */
  211. void Connect_wifi(void)
  212. {
  213. char p[40];
  214. #ifdef DEBUG_printf
  215. printf("1. AT\n");
  216. #endif
  217. while(ESP8266_send_cmd("AT+CWMODE=1\r\n","OK",100)); //设置WIFI STA模式
  218. #ifdef DEBUG_printf
  219. printf("2. AT+CWMODE=1\n");
  220. #endif
  221. while(ESP8266_send_cmd("AT+CIPMUX=0\r\n","OK",100)); //0:单连接,1:多连接
  222. #ifdef DEBUG_printf
  223. printf("3. AT+CIPMUX=0\n");
  224. #endif
  225. sprintf((char*)p,"AT+CWJAP=\"%s\",\"%s\"\r\n",WIFI_id,WIFI_password);//设置无线参数:ssid,密码
  226. while(ESP8266_send_cmd(p,"GOT IP",200)); //连接目标路由器,并且获得IP
  227. #ifdef DEBUG_printf
  228. printf("4. WIFI CONNECT\n");
  229. #endif
  230. }
  231. /**
  232. * @brief 获取实时天气
  233. * @param None
  234. * @retval None
  235. * @note 心知天气API格式
  236. */
  237. void Connect_wea_port(void)
  238. {
  239. char p[40];
  240. char res;
  241. ESP8266_send_cmd("AT+CIPCLOSE\r\n","OK",50);
  242. sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"116.62.81.138\",80\r\n");
  243. res = ESP8266_send_cmd(p,"CONNECT",200);
  244. if(res)
  245. {
  246. #ifdef DEBUG_printf
  247. printf("conncet weather failed\n");
  248. #endif
  249. }
  250. else
  251. {
  252. #ifdef DEBUG_printf
  253. printf("connect weather successed\n");
  254. #endif
  255. }
  256. ESP8266_send_cmd("AT+CIPMODE=1\r\n","OK",100);
  257. res = ESP8266_send_cmd("AT+CIPSEND\r\n","OK",100);
  258. if(res)
  259. {
  260. #ifdef DEBUG_printf
  261. printf("weather data error\n");
  262. #endif
  263. }
  264. else
  265. {
  266. #ifdef DEBUG_printf
  267. printf("weather data start\n");
  268. #endif
  269. }
  270. ESP8266_clear(); //清空
  271. WIFI_sendData("GET https://api.seniverse.com/v3/weather/now.json?key=SKrmB3PfnSu2lVCR6&location=zhengzhou&language=zh-Hans&unit=c\r\n");
  272. DelayClass.DelayMs(500);
  273. if(WIFI_USART_RX_STA&0X8000) //此时再次接到一次数据,为天气的数据
  274. {
  275. WIFI_USART_RX_BUF[WIFI_USART_RX_STA&0X7FFF]=0;//添加结束符
  276. #ifdef DEBUG_printf
  277. printf("%s\n",WIFI_USART_RX_BUF);
  278. #endif
  279. }
  280. }
  281. /**
  282. * @brief 获取实时时间
  283. * @param None
  284. * @retval None
  285. * @note NowAPI格式
  286. */
  287. void Connect_time_port(void)
  288. {
  289. char pp[40];
  290. char res;
  291. ESP8266_send_cmd("AT+CIPCLOSE\r\n","OK",50);
  292. sprintf((char*)pp,"AT+CIPSTART=\"TCP\",\"103.205.5.134\",88\r\n");
  293. res = ESP8266_send_cmd(pp,"CONNECT\r\n",200);
  294. if(res)
  295. {
  296. #ifdef DEBUG_printf
  297. printf("conncet time failed\n");
  298. #endif
  299. }
  300. else
  301. {
  302. #ifdef DEBUG_printf
  303. printf("connect time successed\n");
  304. #endif
  305. }
  306. ESP8266_send_cmd("AT+CIPMODE=1\r\n","OK",100);
  307. res = ESP8266_send_cmd("AT+CIPSEND\r\n","OK",100);
  308. if(res)
  309. {
  310. #ifdef DEBUG_printf
  311. printf("time data error\n");
  312. #endif
  313. }
  314. else
  315. {
  316. #ifdef DEBUG_printf
  317. printf("time data start\n");
  318. #endif
  319. }
  320. ESP8266_clear(); //清空
  321. WIFI_sendData("GET http://api.k780.com:88/?app=life.time&appkey=64669&sign=f6114926ae7705fce3e2eabc4779495b&format=json\r\n");
  322. DelayClass.DelayMs(500);
  323. if(WIFI_USART_RX_STA&0X8000) //此时再次接到一次数据,为json的数据
  324. {
  325. WIFI_USART_RX_BUF[WIFI_USART_RX_STA&0X7FFF]=0;//添加结束符
  326. #ifdef DEBUG_printf
  327. printf("%s\n",WIFI_USART_RX_BUF);
  328. #endif
  329. }
  330. }