zoukankan      html  css  js  c++  java
  • STM32F103+ESP8266(WiFi)模块 实现AP模式下的TCP C/S 和 UDP Client

    @

    前言

    参考资料:
        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("未检测到模块!!!
    ");
            delay_ms(800);
            printf("尝试连接模块...
    ");
        }
        while(atk_8266_send_cmd("ATE0","OK",20));//关闭回显
        printf("ATK_ESP8266 WIFI模块测试
    ");
        printf("WIFI AP
    ");
        atk_8266_msg_show(0, 0, 0);
    
        while(1)
        {
            delay_ms(10);
            atk_8266_at_response(1);//检查ATK-ESP8266模块发送过来的数据,及时上传给电脑
            printf("ATK-ESP WIFI-AP 测试
    ");
            printf("正在配置ATK-ESP8266模块,请稍等...
    ");
    
            p=mymalloc(SRAMIN,32);							//申请32字节内存
    
    PRESTA:
            if(netpro&0X02)   //UDP
            {
                printf("ATK-ESP WIFI-AP 测试
    ");
                printf("正在配置ATK-ESP模块,请稍等...
    ");
    
                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 测试
    ");
                    printf("正在配置ATK-ESP模块,请稍等...
    ");
                    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 测试
    ");
                    printf("正在配置ATK-ESP模块,请稍等...
    ");
                    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模块成功!
    ");
            delay_ms(200);
            printf("WK_UP:退出测试  KEY0:发送数据
    ");
            atk_8266_get_wanip(ipbuf);//服务器模式,获取WAN IP
            sprintf((char*)p,"IP地址:%s 端口:%s",ipbuf,(u8*)portnum);
            printf("%s
    ",p);				//显示IP地址和端口
            atk_8266_wificonf_show(30,180,"请用设备连接WIFI热点:",(u8*)wifiap_ssid,(u8*)wifiap_encryption,(u8*)wifiap_password);
            printf("状态:%s
    ",(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
    ",ATK_ESP8266_WORKMODE_TBL[netpro],t/10);//测试数据
                        printf("发送数据:%s
    ",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
    ",ATK_ESP8266_WORKMODE_TBL[netpro],t/10);//测试数据
                        printf("发送数据:%s
    ",p);
                        u3_printf("%s",p);
                        timex=100;
                    }
                    else    //TCP Server
                    {
                        sprintf((char*)p,"ATK-8266%s测试%02d
    ",ATK_ESP8266_WORKMODE_TBL[netpro],t/10);//测试数据
                        printf("发送数据:%s
    ",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
    ",p); 			//显示接收到的数据长度
                    printf("接收数据:%s
    ",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("连接成功
    ");  //连接状态
                    else printf("连接失败
    ");
                    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.catk_8266_wifista_test(void) ,IP改成另一个手机的IP(这里给客户端模式用的,暂时没用)

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

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

    TCP客户端

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

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

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

  • 相关阅读:
    Nero8刻录引导系统光盘镜像图文教程
    C#多线程与并行编程方面的电子书,中英文版本
    [转]C#通过委托更新UI(异步加载)
    [PHP] 6种负载均衡算法
    [GIt] 团队工作效率分析工具gitstats
    [Git] git代码统计
    [Git] 写文章 史上最全文献检索、阅读及管理攻略
    [Git] 谷歌的代码管理
    [JQuery] jQuery选择器ID、CLASS、标签获取对象值、属性、设置css样式
    [Mongo] 解决mongoose不支持条件操作符 $gt$gte:$lte$ne $in $all $not
  • 原文地址:https://www.cnblogs.com/ikaros-521/p/15323411.html
Copyright © 2011-2022 走看看