STM32F103+ESP8266(WiFi)模块 实现AP模式下的TCP C/S 和 UDP Client 您所在的位置:网站首页 开发板stm32f103云环境 STM32F103+ESP8266(WiFi)模块 实现AP模式下的TCP C/S 和 UDP Client

STM32F103+ESP8266(WiFi)模块 实现AP模式下的TCP C/S 和 UDP Client

2024-05-23 08:29| 来源: 网络整理| 查看: 265

@

目录前言ESP8266模块 相关资料代码下载:功能介绍:拓展应用功能介绍:接线接ATK MODULE没有ATK MODULE情况效果图TCP 服务端网络调试助手网络测试双管齐下TCP 客户端UDP 客户端核心代码main.c参考用图拓展STA模式TCP服务端TCP客户端

前言

参考资料:     STM32F1开发指南(精英版)-库函数版本_V1.2.pdf     ATK-ESP8266 WIFI用户手册_V1.2.pdf     ATK_ESP8266V1.2.pdf     ATK-ESP8266 WIFI模块使用说明(战舰V3&精英版)_AN1509A.pdf 源码参考:正点原子 (库函数版本,适合战舰V3和精英STM32开发板)扩展实验13 ATK-ESP8266 WIFI模块测试实验) 这个例程功能比较全,也很强大,我对这个例程进行了精简和删改,LCD显示也注释了。 开发板:正点原子 STM32F103 精英版 语言:C语言 开发环境:Keil5 手机:准备的软件是 网络调试助手 或 网络测试 在这里插入图片描述

开发板使用了 LED KEY TFTLCD USART SPI ESP8266模块

ESP8266模块 相关资料

更多参考底部 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

代码下载:

码云 GitHub

功能介绍:

复位1秒后,进入ap_demo()函数,默认配置为AP模式,TCP 服务端,端口为8086。KEY0按下发送测试数据,KEY_UP按下结束测试。期间会有串口打印,最好复位后就把串口打开看信息。 main.c中可以设置网络模式和IP地址。

u8 netpro = 0; //网络模式 0,TCP服务器 1,TCP客户端 2,UDP模式 u8 ipbuf[16] = "192.168.4.2"; //IP (根据你的设备连上模块后分配到的IP填写)

common.c中可以设置 端口 wifi信息等

//连接端口号:8086,可自行修改为其他端口. const u8* portnum="8086"; //WIFI STA模式,设置要去连接的路由器无线参数,请根据你自己的路由器设置,自行修改. const u8* wifista_ssid="wifi_name"; //路由器SSID号 const u8* wifista_encryption="wpawpa2_aes"; //wpa/wpa2 aes加密方式 const u8* wifista_password="password"; //连接密码 //WIFI AP模式,模块对外的无线参数,可自行修改. const u8* wifiap_ssid="ATK-ESP8266"; //对外SSID号 const u8* wifiap_encryption="wpawpa2_aes"; //wpa/wpa2 aes加密方式 const u8* wifiap_password="12345678"; //连接密码 拓展应用 功能介绍:

AP STA STA+AP 模式下,建立tcp/udp连接后,发送指定命令,控制LED1和蜂鸣器的开关。 命令如下:(每行都是一条命令,不要有换行等)具体实现在common.c中

LED1 ON LED1 OFF BEEP ON BEEP OFF GET T&H

参考文章:STM32F103+ESP8266(WiFi)模块 简单应用之远程控制LED和蜂鸣器、读取温湿度

接线 接ATK MODULE

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

没有ATK MODULE情况 VCC -》 5V GND -》 GND TXD -》 PB11 RXD -》 PB10 RST -》 PA4 IO_0 -》 PA15

在这里插入图片描述 在这里插入图片描述

效果图 TCP 服务端 u8 netpro = 0; //main.c ap_demo() 网络模式 0,TCP服务器 1,TCP客户端 2,UDP模式

烧写完后,复位,打开串口调试工具。 在这里插入图片描述 可以从上图中看到,wifi的具体信息

IP地址:192.168.4.1 端口:8086 请用设备连接WIFI热点:SSID:ATK-ESP8266 加密方式:wpawpa2_aes 密码:12345678 状态:TCP服务器

根据上面的信息连接wifi(ATK-ESP8266),连接成功后查看详细信息 在这里插入图片描述

网络调试助手

打开软件,选择顶部“tcp client”,点击“增加”,输入上面的IP地址和端口,进行“增加” 在这里插入图片描述 提示“连接成功”,并且左上角出现 小块显示增加的连接 在这里插入图片描述 此时串口收到连接信息,连接成功 在这里插入图片描述 手机编辑文本“123321”,点击发送,STM32按下KEY0发送测试数据,顶部收到数据。最后长按连接块,“断开”连接。 在这里插入图片描述 串口打印如下 在这里插入图片描述

网络测试

打开手机软件“网络测试”,选择TCP 在这里插入图片描述 右上角 “创建连接”,填入上面串口打印的IP:端口 ,点击“确定” 在这里插入图片描述 右上角显示“已连接”就是连上了,然后我们发送“好家伙”,再STM32按KEY0(发送测试数据) 在这里插入图片描述 最后按右上角“已连接”,断开连接 在这里插入图片描述 串口助手收到的数据如下 在这里插入图片描述

双管齐下

在这里插入图片描述 在这里插入图片描述

TCP 客户端 u8 netpro = 1; //main.c ap_demo() 网络模式 0,TCP服务器 1,TCP客户端 2,UDP模式 u8 ipbuf[16] = "192.168.4.2"; //IP (根据你的设备连上模块后分配到的IP填写)

手机创建TCP 服务端 监听8086端口,等待客户端主动连接 在这里插入图片描述 注意下时间线0.0 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

UDP 客户端 u8 netpro = 2; //main.c ap_demo() 网络模式 0,TCP服务器 1,TCP客户端 2,UDP模式 u8 ipbuf[16] = "192.168.4.2"; //IP (根据你的设备连上模块后分配到的IP填写)

在这里插入图片描述 手机创建UDP server,监听8086端口 在这里插入图片描述

在这里插入图片描述 按下KEY0,主动发送数据 在这里插入图片描述 手机连接建立,点击进入 在这里插入图片描述 在这里插入图片描述

核心代码

完整代码参考 码云 GitHub

main.c #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "lcd.h" #include "key.h" #include "usmart.h" #include "malloc.h" #include "usart3.h" #include "common.h" // AP模式测试 void ap_demo(void); int main(void) { delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 usmart_dev.init(72); //初始化USMART LED_Init(); //初始化与LED连接的硬件接口 KEY_Init(); //初始化按键 //LCD_Init(); //初始化LCD usart3_init(115200); //初始化串口3 my_mem_init(SRAMIN); //初始化内部内存池 //LCD_Clear(BLACK); delay_ms(1000); // atk_8266_test(); //进入ATK_ESP8266测试 ap_demo(); } // AP模式测试 void ap_demo(void) { u8 timex = 0; u8 netpro = 0; //网络模式 0,TCP服务器 1,TCP客户端 2,UDP模式 u8 key; u8 ipbuf[16] = "192.168.4.2"; //IP (根据你的设备连上模块后分配到的IP填写) u8 *p; u16 t = 999; //加速第一次获取链接状态 u16 rlen = 0; u8 constate = 0; //连接状态 while(atk_8266_send_cmd("AT","OK",20))//检查WIFI模块是否在线 { atk_8266_quit_trans();//退出透传 atk_8266_send_cmd("AT+CIPMODE=0","OK",200); //关闭透传模式 printf("未检测到模块!!!\r\n"); delay_ms(800); printf("尝试连接模块...\r\n"); } while(atk_8266_send_cmd("ATE0","OK",20));//关闭回显 printf("ATK_ESP8266 WIFI模块测试\r\n"); printf("WIFI AP\r\n"); atk_8266_msg_show(0, 0, 0); while(1) { delay_ms(10); atk_8266_at_response(1);//检查ATK-ESP8266模块发送过来的数据,及时上传给电脑 printf("ATK-ESP WIFI-AP 测试\r\n"); printf("正在配置ATK-ESP8266模块,请稍等...\r\n"); p=mymalloc(SRAMIN,32); //申请32字节内存 PRESTA: if(netpro&0X02) //UDP { printf("ATK-ESP WIFI-AP 测试\r\n"); printf("正在配置ATK-ESP模块,请稍等...\r\n"); sprintf((char*)p,"AT+CIPSTART=\"UDP\",\"%s\",%s",ipbuf,(u8*)portnum); //配置目标UDP服务器 atk_8266_send_cmd("AT+CIPMUX=0","OK",100); //单链接模式 while(atk_8266_send_cmd(p,"OK",500)); } else //TCP { if(netpro&0X01) //TCP Client 透传模式测试 { printf("ATK-ESP WIFI-AP 测试\r\n"); printf("正在配置ATK-ESP模块,请稍等...\r\n"); atk_8266_send_cmd("AT+CIPMUX=0","OK",20); //0:单连接,1:多连接 sprintf((char*)p,"AT+CIPSTART=\"TCP\",\"%s\",%s",ipbuf,(u8*)portnum); //配置目标TCP服务器 while(atk_8266_send_cmd(p,"OK",200)) { printf("WK_UP:返回重选"); printf("ATK-ESP 连接TCP Server失败"); //连接失败 key=KEY_Scan(0); if(key==WKUP_PRES)goto PRESTA; } atk_8266_send_cmd("AT+CIPMODE=1","OK",200); //传输模式为:透传 } else //TCP Server { printf("ATK-ESP WIFI-AP 测试\r\n"); printf("正在配置ATK-ESP模块,请稍等...\r\n"); atk_8266_send_cmd("AT+CIPMUX=1","OK",20); //0:单连接,1:多连接 sprintf((char*)p,"AT+CIPSERVER=1,%s",(u8*)portnum); atk_8266_send_cmd(p,"OK",20); //开启Server模式,端口号为8086 } } printf("配置ATK-ESP模块成功!\r\n"); delay_ms(200); printf("WK_UP:退出测试 KEY0:发送数据\r\n"); atk_8266_get_wanip(ipbuf);//服务器模式,获取WAN IP sprintf((char*)p,"IP地址:%s 端口:%s",ipbuf,(u8*)portnum); printf("%s\r\n",p); //显示IP地址和端口 atk_8266_wificonf_show(30,180,"请用设备连接WIFI热点:",(u8*)wifiap_ssid,(u8*)wifiap_encryption,(u8*)wifiap_password); printf("状态:%s\r\n",(u8*)ATK_ESP8266_WORKMODE_TBL[netpro]); //连接状态 USART3_RX_STA=0; while(1) { key=KEY_Scan(0); if(key==WKUP_PRES) //WK_UP 退出测试 { atk_8266_quit_trans(); //退出透传 atk_8266_send_cmd("AT+CIPMODE=0","OK",20); //关闭透传模式 myfree(SRAMIN,p); //释放内存 return; } else if(key==KEY0_PRES) //KEY0 发送数据 { if((netpro==3)||(netpro==2)) //UDP { sprintf((char*)p,"ATK-8266%s测试%02d\r\n",ATK_ESP8266_WORKMODE_TBL[netpro],t/10);//测试数据 printf("发送数据:%s\r\n",p); atk_8266_send_cmd("AT+CIPSEND=25","OK",200); //发送指定长度的数据 delay_ms(200); atk_8266_send_data(p,"OK",100); //发送指定长度的数据 timex=100; } else if((netpro==1)) //TCP Client { atk_8266_quit_trans(); atk_8266_send_cmd("AT+CIPSEND","OK",20); //开始透传 sprintf((char*)p,"ATK-8266%s测试%02d\r\n",ATK_ESP8266_WORKMODE_TBL[netpro],t/10);//测试数据 printf("发送数据:%s\r\n",p); u3_printf("%s",p); timex=100; } else //TCP Server { sprintf((char*)p,"ATK-8266%s测试%02d\r\n",ATK_ESP8266_WORKMODE_TBL[netpro],t/10);//测试数据 printf("发送数据:%s\r\n",p); atk_8266_send_cmd("AT+CIPSEND=0,25","OK",200); //发送指定长度的数据 delay_ms(200); atk_8266_send_data(p,"OK",100); //发送指定长度的数据 timex=100; } } if(timex)timex--; t++; delay_ms(5); if(USART3_RX_STA&0X8000) //接收到一次数据了 { rlen=USART3_RX_STA&0X7FFF; //得到本次接收到的数据长度 USART3_RX_BUF[rlen]=0; //添加结束符 sprintf((char*)p,"收到%d字节,内容如下",rlen);//接收到的字节数 printf("%s\r\n",p); //显示接收到的数据长度 printf("接收数据:%s\r\n",USART3_RX_BUF);//显示接收到的数据 USART3_RX_STA=0; if(constate!='+')t=1000; //状态为还未连接,立即更新连接状态 else t=0; //状态为已经连接了,10秒后再检查 } if(t==1000)//连续10秒钟没有收到任何数据,检查连接是不是还存在. { constate=atk_8266_consta_check();//得到连接状态 if(constate=='+')printf("连接成功\r\n"); //连接状态 else printf("连接失败\r\n"); t=0; } if((t%20)==0)LED0=!LED0; atk_8266_at_response(1); } } } 参考用图

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

拓展 STA模式 TCP服务端

准备2个手机,或者能产生wifi信号的设备。 一个手机开启手机热点,设置wifi信息 在这里插入图片描述 另一个手机连接热点,查看详细信息,分配到的ip是 192.168.43.39 在这里插入图片描述 修改main.c,调用 atk_8266_test();

atk_8266_test(); //进入ATK_ESP8266测试 // ap_demo();

修改common.c,填写新的STA模式的wifi信息

//连接端口号:8086,可自行修改为其他端口. const u8* portnum="8086"; //WIFI STA模式,设置要去连接的路由器无线参数,请根据你自己的路由器设置,自行修改. const u8* wifista_ssid="ikaros"; //路由器SSID号 const u8* wifista_encryption="wpawpa2_aes"; //wpa/wpa2 aes加密方式 const u8* wifista_password="12345678"; //连接密码 //WIFI AP模式,模块对外的无线参数,可自行修改. const u8* wifiap_ssid="ATK-ESP8266"; //对外SSID号 const u8* wifiap_encryption="wpawpa2_aes"; //wpa/wpa2 aes加密方式 const u8* wifiap_password="12345678"; //连接密码

修改 wifista.c 的 atk_8266_wifista_test(void) ,IP改成另一个手机的IP(这里给客户端模式用的,暂时没用)

u8 ipbuf[16] = "192.168.43.39"; // IP缓存

程序重编,烧写,打开串口,看到提示按键 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

TCP客户端

这里就用到上面说的ip了 修改 wifista.c 的 atk_8266_wifista_test(void) ,IP改成另一个手机的IP(这里给客户端模式用的,暂时没用)

u8 ipbuf[16] = "192.168.43.39"; // IP缓存

不重复赘述,直接上结果 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有