前面几期利用.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和获取设备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;


#includeesp_wifi.h#
嘉立创PCB

还没有评论,抢个沙发!