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];
u8 *p;
u16 t=999;
u8 res=0;
u16 rlen=0;
u8 constate=0;
p=mymalloc(SRAMIN,100);
atk_8266_send_cmd("AT+CWMODE=3","OK",50);
sprintf((char*)p,"AT+CWSAP=\"%s\",\"%s\",1,4",wifiap_ssid,wifiap_password);
atk_8266_send_cmd(p,"OK",1000);
sprintf((char*)p,"AT+CWJAP=\"%s\",\"%s\"",wifista_ssid,wifista_password);
atk_8266_send_cmd(p,"WIFI GOT IP",1000);
while(atk_8266_send_cmd("AT+CIFSR","STAIP",20));
while(atk_8266_send_cmd("AT+CIFSR","APIP",20));
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);
delay_ms(500);
sprintf((char*)p,"AT+CIPSERVER=1,%s",(u8*)portnum);
atk_8266_send_cmd(p,"OK",50);
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]);
if(netpro&0X02)
{
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;
sprintf((char*)p,"AT+CIPSTART=0,\"UDP\",\"%s\",%s",ipbuf,(u8*)port
num);
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);
}
else
{
if(netpro&0X01)
{
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;
sprintf((char*)p,"AT+CIPSTART=0,\"TCP\",\"%s\",%s",ipbuf,(u8*)portnum);
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);
}
else netpro=atk_8266_mode_cofig(netpro);
}
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);
Show_Str(15,95,200,12,"连接状态:",12,0);
Show_Str(15,110,200,12,"STA 模式:",12,0);
Show_Str(120+15,110,200,12,"AP 模式:",12,0);
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);
Show_Str(162+15,110,200,12,(u8*)ATK_ESP8266_WORKMODE_TBL[netpro>>4],1
2,0);
USART3_RX_STA=0;
while(1)
{
key=KEY_Scan(0);
if(key==4)
{
res=0;
break;
}
else if(key==1)
{
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)
{
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;
}
if(t==1000)
{
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);
delay_init(168);
uart_init(84,115200);
usart3_init(42,115200);
LED_Init();
LCD_Init();
KEY_Init();
W25QXX_Init();
tp_dev.init();
usmart_dev.init(168);
my_mem_init(SRAMIN);
my_mem_init(SRAMCCM);
exfuns_init();
f_mount(fs[0],"0:",1);
f_mount(fs[1],"1:",1);
key=KEY_Scan(0);
if(key==KEY0_PRES)
{
LCD_Clear(WHITE);
TP_Adjust();
TP_Save_Adjdata();
LCD_Clear(WHITE);
}
fontok=font_init();
if(fontok||key==KEY1_PRES)
{
LCD_Clear(WHITE);
POINT_COLOR=RED;
LCD_ShowString(60,50,200,16,16,"ALIENTEK STM32");
while(SD_Init())
{
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:");
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();
}```
|