当前位置: 代码迷 >> 综合 >> ESP8266(2)
  详细解决方案

ESP8266(2)

热度:56   发布时间:2023-11-26 02:05:53.0

文章目录

      • TCP/IP
        • 应用层
        • 传输层
        • 网络层
        • 网络接口层
    • ESP8266
      • apsta.c
      • 主函数

TCP/IP

Transmission Control ProTocol/Internet Protocl
传输控制协议与网络协议

是由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇
其中TCP/IP最为代表性

四层体系结构 应用层 传输层 网络层 数据链路层

应用层:Telnet FTP SMTP
传输层:UDP TCP
网络层:ICMP IP IGMP
网络访问层(网络接口层 数据链路层):ARP RARP
在这里插入图片描述

应用层

不同种类的应用程序根据需要来使用应用层的不同协议
邮件传输:SMTP协议 万维网:HTTP协议 远程登录服务应用:TELNET协议

应用层可以加密解密格式化数据
建立解除与其他结点的关系

传输层

负责向两个主机中进程之间的通信提供服务
运输层有复用和分用功能
在终端用户之间提供透明的数据传输 向上层提供可靠的数据传输服务
信息传送的协议数据单元就是段 或 报文

网络层

进行网络连接的建立终止 以及IP地址的寻找
向传输层提供最基本的端到端的数据透明传送服务

内容有 虚电路分组交换和数据报分组交换 路由选择算法 阻塞控制方法 X.25协议 综合业务数据网
异步传输模式

数据链路层主要作用是负责解决两个相邻结点之间的通信 但是不负责解决数据经过通信子网中多个转接节点的通信问题。
让源端数据以最佳路径透明地通过通信子网中的多个转接节点到达目地端
网络层的功能:
分组与分组交换(传输层的报文)、路由(选择算法)、网络连接复用、差错检测与恢复、数据报服务、网络管理、流量控制(流量整形技术)、拥塞控制、网络互连、分片重组

网络接口层

兼并了物理层和数据链路层
完成添加报头准备发送、通过物理媒介实际发送的数据链路功能

ESP8266

apsta.c

ATK—ESP8266 AP+STA 模式 TCP/UDP 连接

包括AP+STA模式各个子模式
TCP服务器 TCP客户端 UDP

u8 atk_8266_apsta_test(void)
{
    
u8 netpro;
u8 key=0;
u8 timex=0; 
u8 ipbuf[16]; //IP 缓存
u8 *p;
u16 t=999; //加速第一次获取链接状态
u8 res=0;
u16 rlen=0;
u8 constate=0;//连接状态
p=mymalloc(SRAMIN,100); //申请 32 字节内存
atk_8266_send_cmd("AT+CWMODE=3","OK",50); //设置 WIFI AP+STA 模式
//设置模块 AP 模式的 WIFI 网络名称/加密方式/密码,这几个参数看自己喜好设置
sprintf((char*)p,"AT+CWSAP=\"%s\",\"%s\",1,4",wifiap_ssid,wifiap_password);
//设置无线参数:ssid,密码
atk_8266_send_cmd(p,"OK",1000); //设置 AP 模式参数
//设置连接到的 WIFI 网络名称/加密方式/密码,这几个参数需要根据您自己的路由
//器设置进行修改!! 
sprintf((char*)p,"AT+CWJAP=\"%s\",\"%s\"",wifista_ssid,wifista_password);
//设置无线参数:ssid,密码
atk_8266_send_cmd(p,"WIFI GOT IP",1000); //连接目标路由器
while(atk_8266_send_cmd("AT+CIFSR","STAIP",20)); //检测是否获得 STA IP
while(atk_8266_send_cmd("AT+CIFSR","APIP",20)); //检测是否获得 AP IP
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str(30,30,200,16,"ATK-ESP AP+STA 模式测试",16,0); 
atk_8266_send_cmd("AT+CIPMUX=1","OK",50); //0:单连接,1:多连接
delay_ms(500);
sprintf((char*)p,"AT+CIPSERVER=1,%s",(u8*)portnum);
atk_8266_send_cmd(p,"OK",50); //开启 Server 模式,端口号为 8086
delay_ms(500);
atk_8266_send_cmd("AT+CIPSTO=1200","OK",50); //设置服务器超时时间
PRESTA:
netpro=atk_8266_netpro_sel(50,30,(u8*)ATK_ESP8266_CWMODE_TBL[0]);
//AP+STA 模式网络模式选择
if(netpro&0X02) //STA UDP
{
    
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str_Mid(0,30,"ATK-ESP WIFI-STA 测试",16,240); 
Show_Str(30,50,200,16,"正在配置 ATK-ESP 模块,请稍等...",12,0);
if(atk_8266_ip_set("WIFI-STA 远端 UDP IP 设置","UDP 模式
",(u8*)portnum,ipbuf))goto PRESTA; //IP 输入
sprintf((char*)p,"AT+CIPSTART=0,\"UDP\",\"%s\",%s",ipbuf,(u8*)port
num); 
//配置目标 UDP 服务器,及 ID 号,STA 模式下为 0
LCD_Clear(WHITE);
Show_Str_Mid(0,30,"ATK-ESP WIFI-STA 测试",16,240); 
Show_Str(30,50,200,16,"正在配置 ATK-ESP 模块,请稍等...",12,0);
atk_8266_send_cmd(p,"OK",200);
netpro=atk_8266_mode_cofig(netpro); //AP 模式网络模式配置
}
else //TCP
{
    
if(netpro&0X01) //STA TCP Client 
{
    
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str_Mid(0,30,"ATK-ESP WIFI-STA 测试",16,240); 
Show_Str(30,50,200,16,"正在配置 ATK-ESP 模块,请稍等...",12,0);
if(atk_8266_ip_set("WIFI-STA 远端 IP 设置",(u8*)ATK_ESP8266_WO
RKMODE_TBL[netpro],(u8*)portnum,ipbuf))goto PRESTA;
//IP 输入sprintf((char*)p,"AT+CIPSTART=0,\"TCP\",\"%s\",%s",ipbuf,(u8*)portnum); 
//配置目标 TCP 服务器,及 ID 号,STA 模式下为 0
while(atk_8266_send_cmd(p,"OK",200))
{
    
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str_Mid(0,40,"WK_UP:返回重选",16,240);
Show_Str(30,80,200,12,"ATK-ESP 连接 UDP 失败",12,0); //连接失败
key=KEY_Scan(0);
if(key==4)goto PRESTA;
}
netpro=atk_8266_mode_cofig(netpro); //AP 模式网络模式配置
}
else netpro=atk_8266_mode_cofig(netpro); //TCP SERVER 不用配置
}
LCD_Clear(WHITE);
POINT_COLOR=RED;
Show_Str_Mid(0,30,"ATK-ESP WIFI-STA+AP 测试",16,240);
Show_Str(15,50,200,16,"正在配置 ATK-ESP 模块,请稍等...",12,0);
LCD_Fill(15,50,239,50+12,WHITE); //清除之前的显示
Show_Str_Mid(0,50,"WK_UP:退出 KEY0:ID0 发送 KEY1:ID1 发送",12,240);
LCD_Fill(15,80,239,80+12,WHITE);
atk_8266_get_ip(15,65); //STA+AP 模式,获取 IP,并显示
Show_Str(15,95,200,12,"连接状态:",12,0); //连接状态
Show_Str(15,110,200,12,"STA 模式:",12,0); //STA 连接状态
Show_Str(120+15,110,200,12,"AP 模式:",12,0); //AP 连接状态
Show_Str(15,125,200,12,"发送数据:",12,0); //发送数据
Show_Str(15,140,200,12,"接收数据:",12,0); //接收数据
atk_8266_wificonf_show(15,195,"请设置路由器无线参数
为:",(u8*)wifista_ssid,(u8*)wifista_encryption,(u8*)wifista_password);
POINT_COLOR=BLUE;
Show_Str(48+15,110,200,12,(u8*)ATK_ESP8266_WORKMODE_TBL[netpro&0X03],
12,0); //STA 连接状态
Show_Str(162+15,110,200,12,(u8*)ATK_ESP8266_WORKMODE_TBL[netpro>>4],1
2,0); //AP 连接状态
USART3_RX_STA=0;
while(1)
{
    
key=KEY_Scan(0);
if(key==4) //WK_UP 退出测试
{
     
res=0;
break;
}
else if(key==1) //KEY0 向 ID0 发送数据
{
    sprintf((char*)p,"ATK-8266 模块 ID0 发数据%02d\r\n",t/10);//测试数据Show_Str(15+54,125,200,12,p,12,0);atk_8266_send_cmd("AT+CIPSEND=0,25","OK",200); 
//发送指定长度的数据delay_ms(200);atk_8266_send_data(p,"OK",100); //发送指定长度的数据timex=100;
}
else if(key==2) //KEY1 向 ID1 发送数据
{
    sprintf((char*)p,"ATK-8266 模块 ID1 发数据%02d\r\n",t/10);//测试数据Show_Str(15+54,125,200,12,p,12,0);atk_8266_send_cmd("AT+CIPSEND=1,25","OK",200); 
//发送指定长度的数据delay_ms(200);atk_8266_send_data(p,"OK",100); //发送指定长度的数据timex=100;
}
if(timex)timex--;
if(timex==1)LCD_Fill(30+54,125,239,122,WHITE);
t++;
delay_ms(10);
if(USART3_RX_STA&0X8000) //接收到一次数据
{
     
rlen=USART3_RX_STA&0X7FFF; //得到本次接收到的数据长度
USART3_RX_BUF[rlen]=0; //添加结束符
printf("%s",USART3_RX_BUF); //发送到串口 
sprintf((char*)p,"收到%d 字节,内容如下",rlen);//接收到的字节数
LCD_Fill(15+54,140,239,130,WHITE);
POINT_COLOR=BRED;
Show_Str(15+54,140,156,12,p,12,0); //显示接收到的数据长度
POINT_COLOR=BLUE;
LCD_Fill(15,155,239,319,WHITE);
Show_Str(15,155,180,190,USART3_RX_BUF,12,0);//显示接收到的数据 
USART3_RX_STA=0;
if(constate!='+')t=1000; //状态为还未连接,立即更新连接状态
else t=0; //状态为已经连接了,10 秒后再检查
} 
if(t==1000)//连续 10 秒钟没有收到任何数据,检查连接是不是还存在.
{
    
LCD_Fill(15+54,125,239,140,WHITE);
constate=atk_8266_consta_check();//得到连接状态
if(constate=='+')Show_Str(15+54,95,200,12,"连接成功",12,0); //连接状态
else Show_Str(15+54,95,200,12,"连接失败",12,0); 
t=0;
}
if((t%20)==0)LED0=!LED0;
atk_8266_at_response(1);
}
myfree(SRAMIN,p); //释放内存
return res;
} 

主函数

初始化 ESP8266模块的串口3 (115200)
调用stk_8266_test函数 初始化串口2 后调用atk_rm04_test函数 进行主测试程序

数代码如下:
int main(void)
{
    
u8 key,fontok=0; 
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz 
delay_init(168); //延时初始化 
uart_init(84,115200); //初始化串口波特率为 115200 
usart3_init(42,115200); //串口 3 初始化
LED_Init(); //初始化 LED 
LCD_Init(); //LCD 初始化 
KEY_Init(); //按键初始化 
W25QXX_Init(); //初始化 W25Q128
tp_dev.init(); //初始化触摸屏
usmart_dev.init(168); //初始化 USMART
my_mem_init(SRAMIN); //初始化内部内存池
my_mem_init(SRAMCCM); //初始化 CCM 内存池
exfuns_init(); //为 fatfs 相关变量申请内存 f_mount(fs[0],"0:",1); //挂载 SD 卡
f_mount(fs[1],"1:",1); //挂载 FLASH.
key=KEY_Scan(0); 
if(key==KEY0_PRES) //强制校准
{
    
LCD_Clear(WHITE); //清屏
TP_Adjust(); //屏幕校准
TP_Save_Adjdata(); 
LCD_Clear(WHITE); //清屏
}
fontok=font_init(); //检查字库是否 OK
if(fontok||key==KEY1_PRES) //需要更新字库
{
    
LCD_Clear(WHITE); //清屏
POINT_COLOR=RED; //设置字体为红色 
LCD_ShowString(60,50,200,16,16,"ALIENTEK STM32");
while(SD_Init()) //检测 SD 卡
{
    
LCD_ShowString(60,70,200,16,16,"SD Card Failed!");
delay_ms(200);
LCD_Fill(60,70,200+60,70+16,WHITE);
delay_ms(200); 
} 
LCD_ShowString(60,70,200,16,16,"SD Card OK");
LCD_ShowString(60,90,200,16,16,"Font Updating...");
key=update_font(20,110,16,"0:"); //从 SD 卡更新
while(key) //更新失败
{
     
LCD_ShowString(60,110,200,16,16,"Font Update Failed!");
delay_ms(200);
LCD_Fill(20,110,200+20,110+16,WHITE);
delay_ms(200); 
} 
LCD_ShowString(60,110,200,16,16,"Font Update Success!");
delay_ms(1500);
LCD_Clear(WHITE); //清屏 
} 
atk_8266_test();
}```
  相关解决方案