ESP8266_14 SOFTAP模式下的服务器端和客户端

ESP8266_01搭建开发环境

ESP8266_02程序的编译与下载

ESP8266_03SDK与Makefile的基本用法

ESP8266_04管脚控制与软件定时器

ESP8266_05 ESP8266有几个串口?

ESP8266_06硬件定时器与IO中断

ESP8266_07基于PWM的呼吸灯

ESP8266_08基于flash的数据掉电保护

ESP8266_09基于IIC控制的OLED屏幕

ESP8266_10 ESP8266的STATION模式

ESP8266_11 ESP8266的UDP广播

ESP8266_12 ESP8266客户端模式下的TCP通信

ESP8266_13服务器端模式下的TCP通信

ESP8266_14 SOFTAP模式下的服务器端和客户端

ESP8266_15天气预报之TCP的GET操作

ESP8266_16天气预报之JSON数据的生成与解析

ESP8266_17简单网络时间协议-SNTP

ESP8266_18 MQTT协议接入ONENET平台

ESP8266_19MQTT协议接入ONENET平台_订阅主题

ESP8266_20 基于ONENET平台的数据上传之TCP的POST操作

ESP8266_21基于ESP8266的一键配网

ESP8266_22基于自身ADC的电压采样

ESP8266_23基于硬件定时器的红外遥控器解码

       前面两节说的都是ESP8266在STATION模式下的TCP通信,这一节说一下SOFTAP模式下的用法。其实两者用法,无论是服务器端还是客户端模式,都是差不多的,只要修改几个细节即可。所以,这一节简单说下这两种方式,并提供代码,大家可以自己动手尝试。

       首先是SOFTAP模式下的TCP服务器端用法,根据手册2c-esp8266_sdk_api_guide_cn_v1.5.4第216页的建议:TCP SERVER模式,ESP8266工作在SOFTAP模式下,可以直接使用TCP侦听。

       步骤和第13节类似,这里简化描写,分为四步:

1、添加头文件

2、设置工作模式为station+ soft-ap模式,并连接到当前环境下的wifi

3、确定TCP服务器端的参数,并初始化

4、定义连接成功的回调函数

       这里只看下user_init里的代码即可:

struct softap_config config;
struct ip_info ap_ip;
uart_init(BIT_RATE_115200, BIT_RATE_115200);
wifi_set_opmode(0x03);
wifi_softap_get_config(&config);
os_memcpy(config.ssid,"ESP8266",strlen("ESP8266"));
os_memcpy(config.password,"123456789",strlen("123456789"));
config.ssid_len=strlen("ESP8266");
config.authmode = AUTH_WPA_PSK; //加密模式
wifi_softap_set_config(&config);
wifi_get_ip_info(SOFTAP_IF,&ap_ip);
server_init(&ap_ip.ip,1025);
system_init_done_cb(to_scan); //设置回调函数

 

       可以看到,在user_init里直接就能调用服务器端初始化函数:

server_init(&ap_ip.ip,1025);

       所以,服务器端部分的代码是相对比较简单的。测试的话,效果如下:

 

 

       因为SOFTAP模式下,ESP8266的IP是192.168.4.1 ,所以网络调试助手里要设置好相应的IP。

 

       可以看到,网络调试助手连接成功后,发送信息,串口助手那里会打印出来。这说明ESP8266已经收到了。

 

       接下来,看一下SOFTAP模式下,做为TCP Client端的代码该如何写。

       根据手册2c-esp8266_sdk_api_guide_cn_v1.5.4第216页的建议:ESP8266工作在SOFTAP模式下,需要确认连接ESP8266的设备已经分配到了IP地址,再启用Client连接。

       所以,咱们需要增加一项工作:判断连接到ESP8266的设备是否已经分配到网址。如何判断?通过以下函数:

wifi_set_event_handler_cb(wifi_event_handler_cb_t cb)

       功能:注册WiFi event 处理回调函数。

       意思是说,通过这个函数来注册一个回调函数,回调函数的功能是什么?但凡wifi状态发生改变,回调函数都能检测到。具体有哪些状态?看下面的枚举类型的定义(拷贝自user_interface.h文件):

enum {
    EVENT_STAMODE_CONNECTED = 0,
    EVENT_STAMODE_DISCONNECTED,
    EVENT_STAMODE_AUTHMODE_CHANGE,
    EVENT_STAMODE_GOT_IP,
    EVENT_STAMODE_DHCP_TIMEOUT,
    EVENT_SOFTAPMODE_STACONNECTED,
    EVENT_SOFTAPMODE_STADISCONNECTED,
    EVENT_SOFTAPMODE_PROBEREQRECVED,
    EVENT_OPMODE_CHANGED,
    EVENT_SOFTAPMODE_DISTRIBUTE_STA_IP,
    EVENT_MAX
};

       咱们这里用到的是“EVENT_SOFTAPMODE_STACONNECTED”这一项,意思是SOFTAP模式下,有STATION接入的时候,这个事件会被检测到。

       除了这一步,其它内容和第12节基本一样,所以步骤简化一下:

1、添加头文件

2、设置工作模式为station+ soft-ap模式,并连接到当前环境下的wifi

3、注册WiFi event 处理回调函数,在回调函数中连接TCP Server。

4、注册系统初始化完成后的回调函数

       所以,相比第12节,这里的变化主要出现在第三步。这里简单看下user_init里的代码,具体内容建议大家下载例程后,再查看。

void ICACHE_FLASH_ATTR
user_init(void)
{
struct softap_config config;
uart_init(BIT_RATE_115200, BIT_RATE_115200);
    wifi_set_opmode(0x03);
    wifi_softap_get_config(&config);
    os_memcpy(config.ssid,"ESP8266",strlen("ESP8266"));
    os_memcpy(config.password,"123456789",strlen("123456789"));
    config.ssid_len=strlen("ESP8266");
    config.authmode = AUTH_WPA_PSK; //加密模式
    wifi_softap_set_config(&config);
    wifi_set_event_handler_cb(wifi_handle_event_cb);
    system_init_done_cb(to_scan); //设置回调函数
}

       可以看到,在倒数第二行的代码那里,注册了WiFi event 处理回调函数。在后续的回调函数里,会判断是否有STATION接入,如果有,那么进行TCP 连接。

       测试的话,效果如下:

 

       然后是网络调试助手:

 

       首先看串口助手,你会发现有很多error信息。有故障信息,并不代表程序有问题。如果有动手操作了的童鞋,很容易就发现:当网络调试助手打开,并点击连接之后,error信息就消失了。

       这是因为当前程序的逻辑是:ESP8266是客户端,当它发现有设备接入它自己的wifi后,就开始进行TCP连接,但这时网络调试助手还没有打开,换句话说,服务器端还没开始工作。所以,此时ESP8266是找不到服务器端的,于是一直在报错。但是,当网络调试助手开始工作以后,SERVER也开始工作了,这时ESP8266自然就连接上了,然后可以进行正常的通信。

 

       好,这一节说完了,欢迎大家动手尝试!

链接:

https://pan.baidu.com/s/12XyHIzTVCGgWaTgIz2b57Q

提取码:i1cv

### ESP8266 局域网透传配置教程 #### 配置模式选择 为了实现局域网内的透明传输(透传),ESP8266可以被设置成不同的工作模式,包括仅接入点(AP)模式、站(Station, STA)模式以及混合模式(AP+STA)[^4]。 #### 设置AP模式并创建Wi-Fi热点 当ESP8266处于AP模式下时,能够创建一个无线网络供其他设备连接。这一步骤对于构建基于ESP8266为中心节点的小型局域网至关重要[^1]。 ```cpp #include <ESP8266WiFi.h> const char* ssid = "YourSSID"; const char* password = "YourPassword"; void setup() { Serial.begin(115200); WiFi.softAP(ssid, password); // 创建软AP IPAddress IP = WiFi.softAPIP(); Serial.println(IP.toString()); // 打印分配给AP的IP地址 } void loop(){} ``` #### 实现TCP服务器端逻辑 为了让ESP8266能够在局域网内接收来自客户端的数据包,需要启动一个监听特定端口号的服务程序,并处理收到的信息流。 ```cpp #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> ESP8266WebServer server(80); void handleRoot() { String htmlPage; htmlPage += "<html><body>"; htmlPage += "<h1>Hello from ESP8266</h1>"; htmlPage += "</body></html>"; server.send(200, "text/html", htmlPage); } void setup(){ Serial.begin(115200); WiFi.softAP("ESP8266_AP"); server.on("/", HTTP_GET, handleRoot); server.begin(); } void loop(){ server.handleClient(); } ``` 上述代码片段展示了如何通过HTTP GET请求响应网页访问;然而,在实际应用中可能更倾向于采用原始套接字接口来直接操作数据帧,从而获得更高的灵活性性能表现。 #### UDP通信实例 除了TCP之外,UDP也是一种常用的协议选项,特别是在实时性要求较高的场景下。下面给出了一段简单的UDP广播发送与接收的例子: ```cpp #include <ESP8266WiFi.h> #include <WiFiUdp.h> #define UDP_PORT 11978 char incomingPacket[255]; WiFiUDP udp; void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); if (udp.beginMulticast(WiFi.localIP(),IPAddress(239,255,255,250),UDP_PORT)){ Serial.println("Joined multicast group."); } } void loop() { int packetSize = udp.parsePacket(); if(packetSize){ int len = udp.read(incomingPacket, 255); if(len > 0){ incomingPacket[len] = '\0'; Serial.printf("Received: %s\n",incomingPacket); udp.beginPacket(udp.remoteIP(), udp.remotePort()); udp.write("Message received!"); udp.endPacket(); } } } ``` 这段代码实现了多播组加入及消息收发的功能,适用于局域网内部的消息传递需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值