ESP8266 - WIFI模块
芯片介绍
基础介绍\引脚介绍
ESP8266是一款物联网WiFi芯片,基于ESP8266可以开发物联网串口WiFi模块,像SKYLAB的WG219/WG229专为移动设备和物联网应用设计,可将用户的物理设备连接到WiFi无线网络上,进行互联网或局域网通信,实现联网功能。另外WG219/WG229仅需要通过出串口使用AT指令控制,就能满足大部分的网络功能需求。
以下为其引脚图:
ESP8266可以通过乐鑫官方提供的ESP8266SDK进行开发,也可通过Arduino进行开发,本教程仅将ESP8266作为STM32的WIFI连接外设使用,使用STM32的串口与其进行连接,通过AT指令操作ESP8266进行联网等相关操作。
如对ESP8266独立开发感兴趣,详见ESP8266编程开发笔记,该笔记使用Arduino作为编程开发方式进行相关开发,在该笔记中,ESP8266将作为主机连接外设等使用。
由于其在此作为外设,除必要的电源等引脚需连接外,仅需要两根串口线与STM32相连接。
关于串口相关内容,详见协议使用笔记串口篇。
AT指令
AT指令是应用于终端设备与PC应用之间的连接与通信的指令。AT 即Attention。每个AT命令行中只能包含一条AT指令;对于AT指令的发送,除AT两个字符外,最多可以接收1056个字符的长度(包括最后的空字符)。
每个AT命令行中只能包含一条AT指令;对于由终端设备主动向PC端报告的URC指示或者response响应,也要求一行最多有一个,不允许上报的一行中有多条指示或者响应。AT指令以回车作为结尾,响应或上报以回车换行为结尾。
由于AT指令命令众多,每款设备的AT指令也不尽相同,因此本篇仅介绍ESP8266相关的几个常用AT指令。
基础指令
指令 | 参数 | 响应 | 说明 |
---|---|---|---|
AT | - | OK | 测试指令 |
AT+RST | - | OK | 重启模块 |
AT+GMR | - | 信息 | 查询版本信息 |
AET0/AET1 | - | OK | 关闭/开启回显 |
AT+RESTORE | - | OK | 恢复出厂设置 |
ESP8266特有指令
1.AT+CWMODE_CUR=<mode>
—设置当前 Wi-Fi 模式,不保存到 Flash
参数说明:
‣ 1:Station 模式
‣ 2:SoftAP 模式
‣ 3:SoftAP+Station 模式
2.AT+CWMODE_DEF=<mode>
—设置当前 Wi-Fi 模式并保存到 Flash
参数同上
3.AT+CWJAP_CUR=<ssid>,<pwd>,[<bssid>][,<pci_en>]
—设置 ESP8266 Station 需连接的 AP,不保存到 Flash
参数说明:
•
<ssid>
:⽬标 AP 的 SSID•
<pwd>
:密码最⻓ 64 字节 ASCII•
[<bssid>]
:选填参数,⽬标 AP 的 MAC 地址,⼀般⽤于有多个 SSID 相同的 AP 的情况•
[<pci_en>]
:选填参数,不允许连接 WEP 和 open 的路由器,可⽤于 PCI 认证•
<error code>
:(仅供参考,并不可靠)‣ 1:连接超时
‣ 2:密码错误
‣ 3:找不到⽬标 AP
‣ 4:连接失败
参数设置需要开启 Station 模式,若 SSID 或者password 中含有特殊符号,例如 , 或者 “ 或者 \ 时,需要进⾏转义,其它字符转义⽆效。
4.AT+CWJAP_DEF=<ssid>,<pwd>[,<bssid>][,]
—连接 AP,保存到 Flash
参数同上
5.AT+CIFSR
—查询本地 IP 地址
响应:
+CIFSR:APIP,<SoftAP IP address> +CIFSR:APMAC,<SoftAP MAC address> +CIFSR:STAIP,<Station IP address> +CIFSR:STAMAC,<Station MAC address> OK
参数说明:
<IP address>
:ESP8266 SoftAP 的 IP 地址
ESP8266 Station 的 IP 地址
<MAC address>
:ESP8266 SoftAP 的 MAC 地址
ESP8266 Station 的 MAC 地址
ESP8266 Station IP 需连上 AP 后,才可以查询
6.AT+CIPMUX=<mode>
—设置多连接
参数说明:
<mode>
:‣ 0:单连接模式
‣ 1:多连接模式
注意:
• 默认为单连接;
• 只有⾮透传模式 (AT+CIPMODE=0),才能设置为多连接;
• 必须在没有连接建⽴的情况下,设置连接模式;
• 如果建⽴了 TCP 服务器,想切换为单连接,必须关闭服务器 (AT+CIPSERVER=0),服务器仅⽀
持多连接。
7.AT+CIPSTART
—建⽴ TCP 连接,UDP 传输或 SSL 连接
TCP 单连接 (AT+CIPMUX=0) 时:AT+CIPSTART=,,[,]
TCP 多连接 (AT+CIPMUX=1) 时:AT+CIPSTART=,,,[]
响应:
OK 或 ERROR,如果连接已经存在,则返回ALREADY CONNECTED
参数说明:
•
<link ID>
:⽹络连接 ID (0 ~ 4),⽤于多连接的情况•
<type>
:字符串参数,连接类型,“TCP”,“UDP"或"SSL”•
<remote IP>
:字符串参数,远端 IP 地址•
<remote port>
:远端端⼝号•
[<TCP keep alive>]
:TCP keep-alive 侦测时间,默认关闭此功能‣
0
:关闭 TCP keep-alive 功能‣
1 ~7200
:侦测时间,单位为 1s
8.AT+CIPSEND
—发送数据
- 设置指令:
单连接时:(+CIPMUX=0)
AT+CIPSEND=<length>
多连接时:(+CIPMUX=1)
AT+CIPSEND=<link ID>,<length>
如果是 UDP 传输,可以设置远端 IP 和端⼝:
AT+CIPSEND=[<link ID>,]<length> [,<remote IP>,<remote port>]
功能:在普通传输模式时,设置发送数据的⻓度。
响应:
发送指定⻓度的数据。
收到此命令后先换⾏返回
>
,然后开始接收串⼝数据,当数据⻓度满 时发送数据,回到普通指令模式,等待下⼀条 AT 指令。如果未建⽴连接或连接被断开,返回:ERROR
如果数据发送成功,返回:SEND OK
如果数据发送失败,返回:SEND FAIL
参数说明:
•
<link ID>
:⽹络连接 ID 号 (0 ~ 4),⽤于多连接的情况•
<length>
:数字参数,表明发送数据的⻓度,最⼤⻓度为 2048•
[<remote IP>]
:UDP 传输可以设置对端 IP•
[<remote port>]
:UDP 传输可以设置对端端⼝
- 执⾏指令:
AT+CIPSEND
功能:在透传模式时,开始发送数据。
响应:
收到此命令后先换⾏返回
>
。进⼊透传模式发送数据,每包最⼤ 2048 字节,或者每包数据以 20 ms 间隔区分。当输⼊单独⼀包 +++ 时,返回普通 AT 指令模式。发送 +++ 退出透传时,请⾄少间隔 1 秒再发下⼀条 AT 指令。本指令必须在开启透传模式以及单连接下使⽤。若为 UDP 透传,指令 AT+CIPSTART 参数<UDP mode>
必须为0。
其它指令请查询官方手册。
代码示例
变量介绍
USARTx_Send_String() //串口发送字符串函数
USARTx_Receive_String() //串口接收字符串函数
char USART3_words[1024] //接收到的字符串保存的地址
printf() //将信息打印至电脑(已重定向)
ESP8266发送命令
u8 ESP8266_Send_ATCmd(char *CMD,char *ack)
{
u8 i;
u16 j;
for(i=0; i<5; i++)
{
USARTx_Send_String(USART3,CMD); //把命令发出去
for(j=0; j<10*1000; j++) //60s
{
if(j%50==0) printf(">");
if(USART3_Flag) //确认是否收到回复
{
USART3_Flag = 0;
if(strstr((char *)USART3_words, ack)) //确认收到的回复是否正确
{
return 1;
}
}
delayMs(1);
}
}
return 0;
}
ESP8266 TCP服务器模式
u8 ESP8266_AP_TcpServerMode_Init(char *ssid, char *pwd)
{
char *p1 = NULL;
char *p2 = NULL;
//1,发送AT测试指令
if(!ESP8266_Send_ATCmd("AT\r\n","OK")) return 0xE1;
//2,配置WIFI的工作模式:AP模式
if(!ESP8266_Send_ATCmd("AT+CWMODE=2\r\n","OK")) return 0xE2;
//3,设置AP模式下的相关信息:SSID,PWD,PORT
snprintf(buff, sizeof(buff), "AT+CWSAP_DEF=\"%s\",\"%s\",5,4\r\n", ssid, pwd);
if(!ESP8266_Send_ATCmd(buff,"OK")) return 0xE3;
//4,查询本地IP地址
if(!ESP8266_Send_ATCmd("AT+CIFSR\r\n","OK")) return 0xE4;
/*
+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"86:f3:eb:be:8e:f6"
OK
*/
//解析IP
p1 = strstr((char *)USART3_words, "APIP");
if(p1)
{
p2 = strstr(p1+6, "\""); //获取第二个引号的地址
strncpy(ip, p1+6, p2-(p1+6));
}
//解析MAC地址
p1 = strstr(p2, "APMAC");
if(p1)
{
strncpy(mac, p1+7, 17);
}
//5,开启多连接模式
if(!ESP8266_Send_ATCmd("AT+CIPMUX=1\r\n","OK")) return 0xE5;
//6,建立TCP服务器,等待客户端连接
if(!ESP8266_Send_ATCmd("AT+CIPSERVER=1\r\n","OK")) return 0xE6;
//相关信息
printf("WIFI_SSID: %s\n", ssid);
printf("WIFI_PWD: %s\n", pwd);
printf("IP: %s\n", ip);
printf("MAC: %s\n", mac);
printf("duankou: 333\n");
return 0;
}
u8 ESP8266_AP_TcpServer_SendData(u8 clientId, char *txData)
{
snprintf(buff, sizeof(buff), "AT+CIPSEND=%d,%d\r\n", clientId, strlen(txData));
if(!ESP8266_Send_ATCmd(buff, ">")) return 1;
if(!ESP8266_Send_ATCmd(txData, "SEND OK")) return 2;
return 0;
}
ESP8266 TCP客户端模式
u8 ESP8266_STA_TCPClientMode_Init(char *ssid, char *pwd, char *ip, u16 port)
{
//1,发送AT测试指令
if(!ESP8266_Send_ATCmd("AT\r\n", "OK")) return 0xE1;
printf("1\n");
//2,配置WIFI工作模式:STA模式
if(!ESP8266_Send_ATCmd("AT+CWMODE=1\r\n", "OK")) return 0xE2;
printf("2\n");
USARTx_Send_String(USART3,"AT+RST\r\n");
delayS(3);
//3,连接热点
snprintf(buff, sizeof(buff), "AT+CWJAP_DEF=\"%s\",\"%s\"\r\n", ssid, pwd);
if(!ESP8266_Send_ATCmd(buff, "OK")) return 0xE3;
printf("3\n");
//4,查询本机IP
if(!ESP8266_Send_ATCmd("AT+CIFSR\r\n", "OK")) return 0xE4;
printf("4\n");
//5,开启单连接
if(!ESP8266_Send_ATCmd("AT+CIPMUX=0\r\n", "OK")) return 0xE5;
printf("5\n");
//6,连接服务器
snprintf(buff, sizeof(buff), "AT+CIPSTART=\"TCP\",\"%s\",%d\r\n", ip, port);
if(!ESP8266_Send_ATCmd(buff, "OK")) return 0xE6;
printf("6\n");
printf("WIFI name: %s\n", ssid);
printf("WIFI password: %s\n", pwd);
printf("IP address: %s\n", ip);
printf("duankou: %d\n", port);
return 0;
}
u8 ESP8266_STA_TCPClient_SendData(char *txData)
{
//AT+CIPSEND=<length> >
snprintf(buff, sizeof(buff), "AT+CIPSEND=%d\r\n", strlen(txData));
if(!ESP8266_Send_ATCmd(buff, ">")) return 1;
if(!ESP8266_Send_ATCmd(txData, "SEND OK")) return 2;
printf("%s\n",USART3_words);
return 0;
}