1.ESP8266简介
ESP8266是一款高性能的WIFI串口模块,内部集成MCU能实现单片机之间串口通信,是目前使用最广泛的一种WIFI模块之一。可以简单理解为一个WIFI转串口的设备,不用知道太多WIFI相关知识,只需要知道串口怎么使用就可以。
ESP8266 支持 softAP 模式,station 模式,softAP + station 共存模式三种。利用 ESP8266 可以实现十分灵活的组网方式和网络拓扑。(SoftAP:即无线接入点,是一个无线网络的中心节点。通常使用的无线路由器就是一个无线接入点。Station:即无线终端,是一个无线网络的终端端。)
ESP8266支持TCP和UDP传输协议。
2.UDP协议
UDP协议采用无连接的方式,不管发送的数据包是否到达目的主机,数据包是否出错。收到数据包的主机也不会告诉发送方是否正确收到了数据,它的可靠性是由上层协议来保障的。
UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768 [1] 是UDP的正式规范。UDP在IP报文的协议号是17。
UDP是无连接的服务。在无连接服务的情况下,两个实体之间的通信不需先建立好一个连接,因此其下层的有关资源不需要事先进行预定保留。这些资源将在数据传输时动态地进行分配。无连接服务的另一特征就是它不需要通信的两个实体同时是活跃的(即处于激活态)。当发送端的实体正在进行发送时,它才必须是活跃的。优点是灵活方便和比较迅速,但不能防止报文的丢失、重复或失序,特别适合于传送少量零星的报文。
UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。
3.ESP8266配置UDP模式
ESP8266是通过串口通讯协议,利用AT指令集完成模式配置。通过以下命令即可完成UDP模式配置:
"AT\r\n",//测试指令
"AT+RST\r\n",
"ATE0\r\n",
"AT+CWMODE=1\r\n",//STA模式
"AT+CWJAP=\"360WIFI_123\",\"12345678\"\r\n",//连接WIFI
"AT+CIFSR\r\n",//查询IP
"AT+CIPSTART=\"UDP\",\"172.20.7.2\",10500,8080,0\r\n",//建立UDP
"AT+CIPMODE=1\r\n",//设置透传模式
"AT+CIPSEND\r\n",//发送数据
3.1 STA+UDP模式配置函数设计
封装UDP模式配置函数,传入WIFI名字、密码、远端IP地址、远端端口号,本地端口号,即可实现UDP模式配置。设置透传模式,即可实现数据收发。
/*******************************************************************************************************************
**形参: wifi_name --WIFI名
** password --密码
** remote_ip --远端IP地址(255.255.255.255为广播地址)
** remote_prot --远端端口号
** localhost ---本地端口号
**返回值:0 --成功,
** 其它值 --失败
**示例:ESP8266_UDP_STA_Mode("360WIFI_123","12345678","172.20.7.2",10500,8080);
*********************************************************************************************************************/
u8 ESP8266_UDP_STA_Mode(u8 *wifi_name,u8 *password,u8 *remote_ip,u16 remote_prot,u16 localprot)
{
char buff[100];
u8 i=0;
for(i=0;i<5;i++)
{
USARTx_SendStr(USART3,(u8 *)"+++"); //退出透传模式
Delay_Ms(1000);
printf("1.测试指令.......\r\n");
if(ESP8266_SendCmd((u8 *)"AT\r\n",(u8 *)"OK")==0)break;
}
if(i==5)return 1;
printf("2.重启模块.......\r\n");
USARTx_SendStr(USART3,(u8 *)"AT+RST\r\n");
Delay_Ms(1000);
Delay_Ms(1000);
printf("3.关回显.......\r\n");
if(ESP8266_SendCmd((u8 *)"ATE0\r\n",(u8 *)"OK"))return 2;
printf("4.设置为STA模式.......\r\n");
if(ESP8266_SendCmd((u8 *)"AT+CWMODE=1\r\n",(u8 *)"OK"))return 3;
printf("6.连接WIFI.......\r\n");
snprintf(buff,sizeof(buff),"AT+CWJAP=\"%s\",\"%s\"\r\n",wifi_name,password);
if(ESP8266_SendCmd((u8 *)buff,(u8 *)"OK"))return 5;
printf("7.查询IP.......\r\n");
if(ESP8266_SendCmd((u8 *)"AT+CIFSR\r\n",(u8 *)"OK"))return 6;
ESP8266_GetData((char *)usart3_rx_buff,esp8266_info.ipaddr,"STAIP");
printf("8.建立UDP连接.....\r\n");
snprintf(buff,sizeof(buff),"AT+CIPSTART=\"UDP\",\"%s\",%d,%d,0\r\n",remote_ip,remote_prot,localprot);
if(ESP8266_SendCmd((u8 *)buff,(u8 *)"OK"))return 7;
printf("9.设置透传.......\r\n");
if(ESP8266_SendCmd((u8 *)"AT+CIPMODE=1\r\n",(u8 *)"OK"))return 8;
printf("10.发送数据.......\r\n");
if(ESP8266_SendCmd((u8 *)"AT+CIPSEND\r\n",(u8 *)">"))return 9;
esp8266_info.port=localprot;
return 0;
}
3.2 UDP模式调用测试
本示例是以STM32f103作为主控MCU,ESP8266 WIFI模块与开发板串口3相连,通讯速率为115200,1个起始位+8位数据位+1位停止位,无校验位的数据帧格式。
int main()
{
u8 key;
u8 ret;
LED_Init();//LED初始化
USARTx_Init(USART1,115200,72);
TIMx_Init(TIM2,72,20000);//定时器辅助串口1接收,计数一个周期时间为20ms
USARTx_Init(USART3,115200,36);
TIMx_Init(TIM4,72,20000);//定时器辅助串口3接收,计数一个周期时间为20ms
KEY_Init();//按键初始化
Beep_Init();//蜂鸣器初始化
printf("WIFI模式配置中。。。。\r\n");
while(1)
{
ret=ESP8266_UDP_STA_Mode((u8 *)"wbyq_wifi",(u8 *)"12345678",(u8 *)"172.20.7.1",10500,8266);
if(ret==0)break;
printf("ret:%d\r\n",ret);
}
printf("IP:%s\r\n",esp8266_info.ipaddr);
printf("port:%d\r\n",esp8266_info.port);
while(1)//轮询
{
key=KEY_GetVal();
if(key==2)
{
BEEP=1;
Delay_Ms(50);
BEEP=0;
USARTx_SendStr(USART3,(u8 *)"UDP+STA模式数据传输测试\r\n");
}
if(usart3_rx_flag)
{
usart3_rx_buff[usart3_rx_cnt]='\0';//字符串结束符
usart3_rx_cnt=0;
usart3_rx_flag=0;
printf("rx3:%s\r\n",usart3_rx_buff);
}
}
}
- 运行效果:
通过网络调试助手软件,建立UDP通讯,实现UDP数据收发。