wifista.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #include "common.h"
  2. #include "stdlib.h"
  3. ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  4. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  5. //ALIENTEK STM32开发板
  6. //ATK-ESP8266 WIFI模块 WIFI STA驱动代码
  7. //正点原子@ALIENTEK
  8. //技术论坛:www.openedv.com
  9. //修改日期:2015/4/3
  10. //版本:V1.0
  11. //版权所有,盗版必究。
  12. //Copyright(C) 广州市星翼电子科技有限公司 2009-2019
  13. //All rights reserved
  14. ///////////////////////////////////////////////////////////////////////////////////////////////////////////
  15. //ATK-ESP8266 WIFI STA测试
  16. //用于测试TCP/UDP连接
  17. //返回值:0,正常
  18. // 其他,错误代码
  19. u8 netpro=0; //网络模式
  20. u8 atk_8266_wifista_test(void)
  21. {
  22. //u8 netpro=0; //网络模式
  23. u8 key;
  24. u8 timex=0;
  25. u8 ipbuf[16]; //IP缓存
  26. u8 *p;
  27. u16 t=999; //加速第一次获取链接状态
  28. u8 res=0;
  29. u16 rlen=0;
  30. u8 constate=0; //连接状态
  31. p=mymalloc(SRAMIN,32); //申请32字节内存
  32. atk_8266_send_cmd("AT+CWMODE=1","OK",50); //设置WIFI STA模式
  33. atk_8266_send_cmd("AT+RST","OK",20); //DHCP服务器关闭(仅AP模式有效)
  34. delay_ms(1000); //延时3S等待重启成功
  35. delay_ms(1000);
  36. delay_ms(1000);
  37. delay_ms(1000);
  38. //设置连接到的WIFI网络名称/加密方式/密码,这几个参数需要根据您自己的路由器设置进行修改!!
  39. sprintf((char*)p,"AT+CWJAP=\"%s\",\"%s\"",wifista_ssid,wifista_password);//设置无线参数:ssid,密码
  40. while(atk_8266_send_cmd(p,"WIFI GOT IP",300)); //连接目标路由器,并且获得IP
  41. PRESTA:
  42. netpro|=atk_8266_netpro_sel(50,30,(u8*)ATK_ESP8266_CWMODE_TBL[0]); //选择网络模式
  43. if(netpro&0X02) //UDP
  44. {
  45. LCD_Clear(WHITE);
  46. POINT_COLOR=RED;
  47. Show_Str_Mid(0,30,"ATK-ESP WIFI-STA 测试",16,240);
  48. Show_Str(30,50,200,16,"正在配置ATK-ESP模块,请稍等...",12,0);
  49. if(atk_8266_ip_set("WIFI-STA 远端UDP IP设置",(u8*)ATK_ESP8266_WORKMODE_TBL[netpro],(u8*)portnum,ipbuf))goto PRESTA; //IP输入
  50. sprintf((char*)p,"AT+CIPSTART=\"UDP\",\"%s\",%s",ipbuf,(u8*)portnum); //配置目标UDP服务器
  51. delay_ms(200);
  52. atk_8266_send_cmd("AT+CIPMUX=0","OK",20); //单链接模式
  53. delay_ms(200);
  54. LCD_Clear(WHITE);
  55. while(atk_8266_send_cmd(p,"OK",500));
  56. }
  57. else //TCP
  58. {
  59. if(netpro&0X01) //TCP Client 透传模式测试
  60. {
  61. LCD_Clear(WHITE);
  62. POINT_COLOR=RED;
  63. Show_Str_Mid(0,30,"ATK-ESP WIFI-STA 测试",16,240);
  64. Show_Str(30,50,200,16,"正在配置ATK-ESP模块,请稍等...",12,0);
  65. if(atk_8266_ip_set("WIFI-STA 远端IP设置",(u8*)ATK_ESP8266_WORKMODE_TBL[netpro],(u8*)portnum,ipbuf))goto PRESTA; //IP输入
  66. atk_8266_send_cmd("AT+CIPMUX=0","OK",20); //0:单连接,1:多连接
  67. sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",ipbuf,(u8*)portnum); //配置目标TCP服务器
  68. while(atk_8266_send_cmd(p,"OK",200))
  69. {
  70. LCD_Clear(WHITE);
  71. POINT_COLOR=RED;
  72. Show_Str_Mid(0,40,"WK_UP:返回重选",16,240);
  73. Show_Str(30,80,200,12,"ATK-ESP 连接TCP失败",12,0); //连接失败
  74. key=KEY_Scan(0);
  75. if(key==WKUP_PRES)goto PRESTA;
  76. }
  77. atk_8266_send_cmd("AT+CIPMODE=1","OK",200); //传输模式为:透传
  78. }
  79. else //TCP Server
  80. {
  81. LCD_Clear(WHITE);
  82. POINT_COLOR=RED;
  83. Show_Str_Mid(0,30,"ATK-ESP WIFI-STA 测试",16,240);
  84. Show_Str(30,50,200,16,"正在配置ATK-ESP模块,请稍等...",12,0);
  85. atk_8266_send_cmd("AT+CIPMUX=1","OK",20); //0:单连接,1:多连接
  86. sprintf((char*)p,"AT+CIPSERVER=1,%s",(u8*)portnum); //开启Server模式(0,关闭;1,打开),端口号为portnum
  87. atk_8266_send_cmd(p,"OK",50);
  88. }
  89. }
  90. LCD_Clear(WHITE);
  91. POINT_COLOR=RED;
  92. Show_Str_Mid(0,30,"ATK-ESP WIFI-STA 测试",16,240);
  93. Show_Str(30,50,200,16,"正在配置ATK-ESP模块,请稍等...",12,0);
  94. LCD_Fill(30,50,239,50+12,WHITE); //清除之前的显示
  95. Show_Str(30,50,200,16,"WK_UP:退出测试 KEY0:发送数据",12,0);
  96. LCD_Fill(30,80,239,80+12,WHITE);
  97. atk_8266_get_wanip(ipbuf);//服务器模式,获取WAN IP
  98. sprintf((char*)p,"IP地址:%s 端口:%s",ipbuf,(u8*)portnum);
  99. Show_Str(30,65,200,12,p,12,0); //显示IP地址和端口
  100. Show_Str(30,80,200,12,"状态:",12,0); //连接状态
  101. Show_Str(120,80,200,12,"模式:",12,0); //连接状态
  102. Show_Str(30,100,200,12,"发送数据:",12,0); //发送数据
  103. Show_Str(30,115,200,12,"接收数据:",12,0); //接收数据
  104. atk_8266_wificonf_show(30,180,"请设置路由器无线参数为:",(u8*)wifista_ssid,(u8*)wifista_encryption,(u8*)wifista_password);
  105. POINT_COLOR=BLUE;
  106. Show_Str(120+30,80,200,12,(u8*)ATK_ESP8266_WORKMODE_TBL[netpro],12,0); //连接状态
  107. USART3_RX_STA=0;
  108. while(1)
  109. {
  110. key=KEY_Scan(0);
  111. if(key==WKUP_PRES) //WK_UP 退出测试
  112. {
  113. res=0;
  114. atk_8266_quit_trans(); //退出透传
  115. atk_8266_send_cmd("AT+CIPMODE=0","OK",20); //关闭透传模式
  116. break;
  117. }
  118. else if(key==KEY0_PRES) //KEY0 发送数据
  119. {
  120. if((netpro==3)||(netpro==2)) //UDP
  121. {
  122. sprintf((char*)p,"ATK-8266%s测试%02d\r\n",ATK_ESP8266_WORKMODE_TBL[netpro],t/10);//测试数据
  123. Show_Str(30+54,100,200,12,p,12,0);
  124. atk_8266_send_cmd("AT+CIPSEND=25","OK",200); //发送指定长度的数据
  125. delay_ms(200);
  126. atk_8266_send_data(p,"OK",100); //发送指定长度的数据
  127. timex=100;
  128. }
  129. else if((netpro==1)) //TCP Client
  130. {
  131. atk_8266_quit_trans();
  132. atk_8266_send_cmd("AT+CIPSEND","OK",20); //开始透传
  133. sprintf((char*)p,"ATK-8266%s测试%d\r\n",ATK_ESP8266_WORKMODE_TBL[netpro],t/10);//测试数据
  134. Show_Str(30+54,100,200,12,p,12,0);
  135. u3_printf("%s",p);
  136. timex=100;
  137. }
  138. else //TCP Server
  139. {
  140. sprintf((char*)p,"ATK-8266%s测试%02d\r\n",ATK_ESP8266_WORKMODE_TBL[netpro],t/10);//测试数据
  141. Show_Str(30+54,100,200,12,p,12,0);
  142. atk_8266_send_cmd("AT+CIPSEND=0,25","OK",200); //发送指定长度的数据
  143. delay_ms(200);
  144. atk_8266_send_data(p,"OK",100); //发送指定长度的数据
  145. timex=100;
  146. }
  147. }else;
  148. if(timex)timex--;
  149. if(timex==1)LCD_Fill(30+54,100,239,112,WHITE);
  150. t++;
  151. delay_ms(10);
  152. if(USART3_RX_STA&0X8000) //接收到一次数据了
  153. {
  154. rlen=USART3_RX_STA&0X7FFF; //得到本次接收到的数据长度
  155. USART3_RX_BUF[rlen]=0; //添加结束符
  156. printf("%s",USART3_RX_BUF); //发送到串口
  157. sprintf((char*)p,"收到%d字节,内容如下",rlen);//接收到的字节数
  158. LCD_Fill(30+54,115,239,130,WHITE);
  159. POINT_COLOR=BRED;
  160. Show_Str(30+54,115,156,12,p,12,0); //显示接收到的数据长度
  161. POINT_COLOR=BLUE;
  162. LCD_Fill(30,130,239,319,WHITE);
  163. Show_Str(30,130,180,190,USART3_RX_BUF,12,0);//显示接收到的数据
  164. USART3_RX_STA=0;
  165. if(constate!='+')t=1000; //状态为还未连接,立即更新连接状态
  166. else t=0; //状态为已经连接了,10秒后再检查
  167. }
  168. if(t==1000)//连续10秒钟没有收到任何数据,检查连接是不是还存在.
  169. {
  170. // // LCD_Fill(30+54,125,239,130,WHITE);
  171. // LCD_Fill(60,80,120,92,WHITE);
  172. constate=atk_8266_consta_check();//得到连接状态
  173. if(constate=='+')Show_Str(30+30,80,200,12,"连接成功",12,0); //连接状态
  174. else Show_Str(30+30,80,200,12,"连接失败",12,0);
  175. t=0;
  176. }
  177. if((t%20)==0)LED0=!LED0;
  178. atk_8266_at_response(1);
  179. }
  180. myfree(SRAMIN,p); //释放内存
  181. return res;
  182. }