前面几期利用.NET MAUI我们开发了一个Android应用用来接收ESP32的图片数据以及制作了一个摇杆方便我们操控。
但是有一点,我们发送图片以及交流的IP都是固定的。
可是,IP地址会随着网络以及设备发生变换,那么我们怎么知道每次的IP地址呢。
本期我们将介绍ESP32如何开启AP模式来让手机进行连接并且获取所连接的设备的IP地址。
在ESP的AP模式下,设备像一个Wi-Fi网络中的路由器一样,允许其他设备通过Wi-
Fi连接到它,从而建立本地网络。这种模式通常用于创建一个局域网(Local Area
Network,LAN),其中ESP设备充当中心节点,其他设备可以通过该节点相互通信。
通过AP模式,ESP设备可以提供网络连接、数据传输和通信服务,使其他设备能够连接到互联网或者在局域网内进行数据交换。这对于构建物联网应用和连接智能设备非常有用。
代码编写
#include "esp_wifi.h"#include <Wifi.h>
首先需要导入这两个库,分别用来连接WiFi和获取设备IP
WiFi.softAP(ssid, password);//AP模式开启Wifi ip = WiFi.softAPIP();//获取本机IP Serial.println(ip);//打印IP WiFi.onEvent(WiFiEvent);//创建一个事件用来监听事件
使用上述语句开启WiFi AP模式,ssid为Wifi的名字,password为Wifi的密码,注意 这个密码至少八个字符!!
可以看到可以发现一个ESP32的Wifi.
void WiFiEvent(WiFiEvent_t event) { if(event == 13) { wifi_sta_list_t wifi_sta_list; tcpip_adapter_sta_list_t adapter_sta_list;
memset(&wifi_sta_list, 0, sizeof(wifi_sta_list)); memset(&adapter_sta_list, 0, sizeof(adapter_sta_list));
esp_wifi_ap_get_sta_list(&wifi_sta_list); tcpip_adapter_get_sta_list(&wifi_sta_list, &adapter_sta_list);
for (int i = 0; i < adapter_sta_list.num; i++) {
tcpip_adapter_sta_info_t station = adapter_sta_list.sta[i];
Serial.print("station nr "); Serial.println(i + 1);
Serial.print("MAC: "); for (int i = 0; i < 6; i++) {
Serial.printf("%02X", station.mac[i]); if (i < 5) Serial.print(":"); }
Serial.print("nIP: "); ip4_addr_t ip_buf; memcpy((char *)&ip_buf, (char *)&station.ip, sizeof(ip4_addr)); String ipstr = ip4addr_ntoa(&(ip_buf)); Serial.println(ipstr);} }}
接着为Wifi添加事件回调。(这些设备包括:设备断开,设备连接,设备被分配到IP……) 当有Wifi事件触发时,我们打印连接设备的IP地址。
** 这里Wifi连接和赋予地址都会触发回调,我们只处理赋予IP地址的事件 **
wifi_sta_list_t 和 tcpip_adapter_sta_list_t 是结构体,用于存储STA(Station)列表的信息。
memset 函数用于将结构体初始化为零,以确保所有字段的初始值为零。
esp_wifi_ap_get_sta_list 用于获取与当前AP连接的STA列表,并将结果存储在 wifi_sta_list 中。
tcpip_adapter_get_sta_list 则用于将 wifi_sta_list 中的信息转换为 adapter_sta_list 结构体中。
接下来,通过循环遍历 adapter_sta_list 中的STA列表,逐个处理每个STA的信息。
最后是打印IP信息。
一个是本机地址,一个是我手机所连接的IP。
String ipstr = ip4addr_ntoa(&(ip_buf)); if (ipstr== ("0.0.0.0")) { continue; } staIPAddresses[i] = ipstr; STANumber = i; Serial.println(ipstr);
我们比较一下,剔除掉自身的IP,然后保存所有设备的IP。
if (ipstr== ("0.0.0.0")) { continue; } staIPAddresses[i] = ipstr; STANumber = i;