一.TCP协议
1.
TCP:"传输控制协议",是面向连接的,用来保证所有数据都能按顺序接收,如果没有TCP,则部分文件可能丢失或者无序,图像可能丢失或文本向后且无序,有了TCP,则如果发送途中第一个数据发送失败,则要求重新发送。
2.
TCP分为客户端和服务器,TCP客户端是通过TCP服务器的IP和端口号来连接TCP服务器的,TCP服务器用来侦听,只能客户端连接服务器,服务器不能连接客户端(图1见解流程);这个过程可以看成打电话,把客户端看成A,服务器看成B,A打电话时,B是不能打电话的,此时B只能接电话,连接以后就可以说话,也就是发送数据。
3
TCP 服务器=TCP server
TCP客户端=TCP client
二.ESP8266介绍
上图是 esp8266—01s,黄色的是内存条,红圈这块是单片机,与51,32单片机不一样,它内置了WiFi功能,所以他可以和不同设备进行串行通信,单片机周围有许多的引脚但是没有引出来,因此就有了esp8266NodeMUC(下图),esp8266NodeMUC与esp8266—01s对比不但多了usb转ttl接口,还把单片机的引脚引了出来,因此可以直接接外设进行操作,无需接上其他单片机进行外设操作,本文主要讲esp8266—01s。
三.ESP8266初始设置
1.esp8266接线
USB转TLL的RXD和TXD分别接esp8266的TXD和RXD,3.3v接3.3v,GND接GND。
2.管脚说明
3.需要的app
安信可串口调试助手和网络调试助手,可以把安信可看做esp8266,因为这样连接以后发指令反馈都反馈到安信可的接收区,把网络调试助手看成电脑。
3.esp8266初始配置
1.esp8266上电以后出厂波特率是115200 |
2.打开安信可的串口,上电以后串口输出一串系统开机信息,购买的模块可能电压不稳定,导致乱码 |
3.上电以后发送指令AT,会返回OK,说明模块功能正常(要勾上发送新行,否则看不见OK标志) |
4.想重启esp8266则发送AT+RST,返回ready,说明重启成功 |
5.想修改esp8266的波特率则发送AT+UART=9600,8,1,0,0(9600是波特率,8是数据为,1是停止位,两个0分别是校验位和流控) |
三.ESP8266模式介绍
1.esp8266有两种模式,一种是station(设备模式),另一种是AP(路由器模式)。
2.设备模式就是相当于esp8266作为设备(手机)去联网,然后想让esp8266(安信可)发数据给电脑(网络调试助手),esp8266先发到联网的路由器上中转,再发送到电脑上(见解图2).
3.路由器模式就是相当于esp8266作为路由器,打开手机WiFi就可以看见一个没有密码的WiFi,正是esp8266发出的WiFi,,此时想让esp8266发数据给电脑,esp8266直接发给电脑,因为本身就是路由器不需要中转(见解图3)。
注意:无论是设备模式还是AP模式都要保证连接的WiFi一致,设备模式时,电脑连接路由器的WiFi,AP模式时电脑连接esp8266成为WiFi的WiFi!
指令 | 返回 |
AT+CWMODE=1(设备模式) | OK |
AT+CWMODE=2(路由器模式) | OK |
AT+CWMODE=3(双模———设备模式/路由器模式) | OK |
四.ESP8266与TCP协议有什么关联?
1.TCP server 为 AP 模式,TCP client 为 station 模式。
2.网络调试助手(电脑)建立TCP server并设置端口号(下图),esp8266(安信可)为station模式时为TCP client,然后esp8266去连接电脑,此时esp8266为客户端,电脑作为服务器,此时电脑的ip地址为固定,esp8266发指令连接电脑服务器时,需要跟电脑的地址一致。电脑的地址win+r,输入cmd,输入ipconfig,无线局域网的IPV4地址就是电脑地址
3.esp8266为AP模式时,建立TCP server并设置端口号,电脑为TCP client(下图),电脑去连接esp8266,此时esp8266作为服务器,电脑作为客户端,此时esp8266的ip地址为固定,电脑连接服务器时需要esp8266的ip地址。
五.ESP8266作为客户端时入网设置,连接服务器及发送数据(设备模式)
串口透传技术:透传即透明传送,是指在数据传输过程中,通过无线的方式让这组数据不发生任何形式的改变,仿佛传输过程是透明一样,同时保证传输的质量,原封不动的传过去。
//设置esp8266为设备模式
AT+CWMODE=1
返回:OK
//esp8266以设备模式接入家中路由器配置
AT+CWJAP="WiFi名字",“密码”
返回:WIFI CONNECTED
WIFI GOT IP
OK
//连接服务器,连接记得关闭防火墙,此时让esp8266连接的WiFi和电脑连接的WiFi一致才可以连接
AT+CIPSTART="TCP","电脑地址",端口号
配合上图AT+CIPSTART="TCP","192.168.10.9",8888
返回:CONNECT
OK
//设置发送数据长度,返回>后,在>后输入数据则发送,这里输入的是abcd,此时发送完指令以后出现>,需要取消新行按钮,每次发送数据的时候都需要再次发送指令(勾选发送新行)。
AT+CIPSEND=4
返回:OK
>abcd
Respone:SEND OK
//由于这样很麻烦每次都需要发送一次指令,所以可以让esp8266开启透传模式就可以无限发送数据了
AT+CIPMODE=1
返回:Respone OK
在发送AT+CIPSEND
返回:Respone:>
//如果想退出透传模式则输入+++(取消新行按钮),点两下即退出透传模式
注:1.指令符号需要在英文状态下写,电脑地址可以win+r,输入cmd,输入ipconfig回车,无线局域网的IPv4就是电脑IP地址;2.设备模式连接路由器的WiFi必须是2.4GHZWIFI,只支持这个频率
六.ESP8266作为服务器时设置,建立服务器及发送数据(路由器模式)
//路由器模式,设置成路由器模式后,上电就能看见WiFi
AT+CWMODE=2
返回:Respone:OK
//设置esp8266可以多个用户连接(最多五个)或者只能一个用户连接
AT+CIPMUX=1(多连接)
AT+CIPMUX=0(单连接)
返回:Respone:OK
//查询地址,CIFSR:APIP是路由器esp8266的地址
AT+CIFSR
返回:+CIFSR:APIP,"地址"
//建立TCP server
AT+CIPSERVER=1(默认端口号333)或者AT+CIPSERVER=1,8888(端口号为8888)
返回:Respone:OK
//建立完TCP server以后,网络调试助手设置成TCP client,并输入APIP地址和输入端口号即可连接,此时电脑要连接esp8266当作路由器的WiFi,才能连接成功
//发送数据(esp8266发给电脑)
AT+CIPSEND=0,4(发送四个字节在0通道上)
返回>abcd(输入数据)
返回:Respone:SEND OK
//接收数据(电脑发给esp8266)
+IPD,0,n:xxxxxxx (+IPD是固定字符串,0是通道,n是数据长度,xxxxxx是数据)
//断开连接
AT+CIPCLOSE=0
Respone:0,CLOSE OK
七.ESP8266作为客户端与51单片机连接或作为服务器与51单片机连接
图5为esp8266作为客户端与51单片机连接
图6为esp8266作为服务器与51单片机连接
//esp8266作为客户端与单片机连接代码
#include <REGX52.H>
#include <INTRINS.H>
#include <string.h>
sbit AUXR=0x8E;
sbit switcher=P3^6;//继电器开关控制外接led亮灭
sbit led6=P2^5;
sbit led4=P2^3;
char buffer[2];
char AT_ok_flag=0;//设置WiFi模式返回的标志位
char LJmode[]="AT+CWMODE=1\r\n"; //设置成模式1,设备模式
code char LJwifi[]="AT+CWJAP=\"wifi名字\",\"wifi密码\"\r\n";//连接wifi
code char LJfwq[]="AT+CIPSTART=\"TCP\",\"192.168.10.9\",8888\r\n";//让wifi模块连接tcp服务器
char TCmode[]="AT+CIPMODE=1\r\n";//开启透传模式
char Senddata[]="AT+CIPSEND\r\n";//开始发送数据
char RESET[]="AT+RST\r\n";
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Uart_Init()
{
SCON = 0x50;
PCON &= 0x7F;
AUXR = 0x01;
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1;
EA = 1;
}
void Uart_Sendchar(unsigned char Char)
{
SBUF=Char;
while(TI==0);
TI=0;
}
void Uart_Sendstring(unsigned char*string)
{
while(*string!='\0')
{
Uart_Sendchar(*string);
string++;
}
}
void main()
{
led6=1;//没连接服务器和没打开透传模式则灭灯
//51单片机初始化
Uart_Init();
//让单片机发指令给WiFi模块进行设置
Delay1000ms();
Uart_Sendstring(LJmode);
while(!AT_ok_flag);
AT_ok_flag=0;
Uart_Sendstring(LJwifi);
while(!AT_ok_flag);
AT_ok_flag=0;
Uart_Sendstring(LJfwq);
while(!AT_ok_flag);
AT_ok_flag=0;
Uart_Sendstring(TCmode);
while(!AT_ok_flag);
AT_ok_flag=0;
Uart_Sendstring(Senddata);
while(!AT_ok_flag);
if(AT_ok_flag)//连接wifi,服务器和打开透传模式则亮灯
{
led6=0;
}
while(1)
{
Delay1000ms();
Uart_Sendstring("lqy\r\n");
}
}
void Uart_Rountime() interrupt 4
{
static int i=0;
char temp;
if(RI==1)
{
RI=0;
temp=SBUF;
if(temp=='O' ||temp=='F')//让ok的o始终保持在第一位
{
i=0;
}
buffer[i]=temp;
i++;
if(buffer[0]=='O'&& buffer[1]=='K')//连接成功
{
AT_ok_flag=1;
memset(buffer,'\0',2);
}
if(buffer[0]=='F'&& buffer[1]=='A')//连接失败,重新连接
{
for(i=0;i<5;i++)
{
led4=0;
Delay1000ms();
led4=1;
Delay1000ms();
}
Uart_Sendstring(RESET);
memset(buffer,'\0',2);
}
if(buffer[0]=='p'||buffer[1]=='p')//输入p则亮灯
{
switcher=0;
memset(buffer,'\0',2);
}
if(buffer[0]=='h'||buffer[1]=='h')//输入h则灭灯
{
switcher=1;
memset(buffer,'\0',2);
}
if(i==2)
{
i=0;
memset(buffer,'\0',2);
}
}
}
//esp8266作为服务器与单片机连接代码
#include <REGX52.H>
#include <INTRINS.H>
#include <string.h>
sbit AUXR=0x8E;
sbit switcher=P3^6;//继电器开关控制外接led亮灭
sbit led6=P2^5;
sbit led4=P2^3;
char buffer[3];
char AT_ok_flag=0;//设置WiFi模式返回的标志位
char AT_client_connect_flag=0;//客户端接入标志位
char LJmode[]="AT+CWMODE=2\r\n";//模式2,路由器模式
char DLJ[]="AT+CIPMUX=1\r\n";//开启多人连接模式
char LJFW[]="AT+CIPSERVER=1,8080\r\n";//建立服务器
char FSSJ[]="AT+CIPSEND=0,5\r\n";//发送数据
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Uart_Init()
{
SCON = 0x50;
PCON &= 0x7F;
AUXR = 0x01;
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
ES = 1;
EA = 1;
}
void Uart_Sendchar(unsigned char Char)
{
SBUF=Char;
while(TI==0);
TI=0;
}
void Uart_Sendstring(unsigned char*string)
{
while(*string!='\0')
{
Uart_Sendchar(*string);
string++;
}
}
void main()
{
led6=1;//没连接服务器和没打开透传模式则灭灯
//51单片机初始化
Uart_Init();
//让单片机发指令给WiFi模块进行设置
Delay1000ms();//上电不稳定
Uart_Sendstring(LJmode);
while(!AT_ok_flag);
AT_ok_flag=0;
Uart_Sendstring(DLJ);
while(!AT_ok_flag);
AT_ok_flag=0;
Uart_Sendstring(LJFW);
while(!AT_client_connect_flag);
if(AT_client_connect_flag)
{
led6=0;
}
while(1)
{
Uart_Sendstring(FSSJ);//发送数据指令
Delay1000ms();Delay1000ms();
led4=0;
Uart_Sendstring("hello");//单片机发给esp8266,然后在发给网络调试助手
Delay1000ms();Delay1000ms();
led4=1;
}
}
void Uart_Rountime() interrupt 4
{
static int i=0;
char temp;
if(RI==1)
{
RI=0;
temp=SBUF;
//让ok的o始终保持在第一位
//0是连接服务器成功,返回让单片机知道连接成功,:是接收数据成功
if(temp=='O' ||temp=='0' ||temp==':')
{
i=0;
}
buffer[i]=temp;
i++;
if(buffer[0]=='O'&& buffer[1]=='K')//连接成功
{
AT_ok_flag=1;
memset(buffer,'\0',3);
}
if(buffer[0]=='0'&& buffer[2]=='C')//服务器连接成功
{
AT_client_connect_flag=1;
memset(buffer,'\0',3);
}
if(buffer[0]==':'&& buffer[1]=='o'&& buffer[2]=='p')//输入open则开灯
{
switcher=0;
memset(buffer,'\0',3);
}
if(buffer[0]==':'&& buffer[1]=='c'&& buffer[2]=='l')//输入close则灭灯
{
switcher=1;
memset(buffer,'\0',3);
}
if(i==3)
{
i=0;
memset(buffer,'\0',3);
}
}
}
补充指令 |
AT+RESTORE //恢复出厂设置 |
//esp8266作为路由器进行设置密码,第一个x是代表通道号,第二个x代表加密方式 AT+CWSAP="wifi名字","wifi密码",x,x 例如:AT+CWSAP="esp8266","123456789",5,4 |
AT+CWMODE? //查询esp8266模式 |
八.UDP协议
UDP是无连接的,与TCP对比少了连接,但是传输速度快,却不可靠,数据有可能丢失。
九.让ESP8266配置UDP数据传输(设备模式)
1.esp8266设置为设备模式
指令 | 返回 |
AT+CWMODE=1 | OK |
2.重启esp8266
指令 | 返回 |
AT+RST | OK |
3.连接路由器
指令 | 返回 |
AT+CWJAP="WiFi名字","WiFi密码" | OK |
注意:连接的WiFi必须是2.4GHZWIFI
4.让网络调试助手设置成UDP协议,并输入电脑的地址(本地地址)和本地端口号(随便设置,不冲突即可)
5.让esp8266连接刚刚创建的UDP服务器
AT指令格式:UDP+远端IP+远端端口+本地端口 |
//远端的意思就是以自己为基点,对方就是远端,本地就是自己,这里的远端ip是刚刚网络调试助手的电脑地址和电脑的端口号,本地端口号随便设置。 |
指令 | 返回 |
AT+CIPSTART="UDP","远端ip","远端端口","本地端口" | CONNECT OK |
6.开启透传模式
指令 | 返回 |
AT+CIPMODE=1 | OK |
7.发送数据
指令 | 返回 |
AT+CIPSEND | OK > |
8.退出透传模
取消发送新行按钮,发送+++
十.让ESP8266配置UDP数据传输(AP模式)
1.esp8266设置为AP模式
指令 | 返回 |
AT+CWMODE=2 | OK |
2.重启esp8266
指令 | 返回 |
AT+RST | OK |
3.让电脑连接esp8266作为路由器发出的WiFi,之后电脑地址改变了,win+r,输入cmd,输入ipconfig回车,无线局域网的IPv4 地址就是电脑此时的地址,然后打开网络调试助手输入电脑地址,还有端口号(随意设置),如果点击没反应退出app,重新进,在进行连接。
4.让esp8266连接刚刚创建的UDP服务器
AT指令格式:UDP+远端IP+远端端口+本地端口 |
//远端的意思就是以自己为基点,对方就是远端,本地就是自己,这里的远端ip是刚刚网络调试助手的电脑地址和电脑的端口号,本地端口号随便设置。 |
指令 | 返回 |
AT+CIPSTART="UDP","远端ip","远端端口","本地端口" | CONNECT OK |
5.开启透传模式
指令 | 返回 |
AT+CIPMODE=1 | OK |
6.发送数据
指令 | 返回 |
AT+CIPSEND | OK > |
7.退出透传模
取消发送新行按钮,发送+++