Arduino: 在 bpibit 上使用 WIFI (7)

@[toc]

目的

使用 ESP32 一般是用它的 WIFI 功能,使用 WIFI 功能大概就是建立网络、连接网络、搜索网络等基础操作。

建立网络(AP)

基础使用

下面是 wifi 连接最基础的代码。将代码烧入模块中,便能在 wifi 列表中搜索到名为 “ESP32_WIFI_AP” 的无密码 WIFI。

#include <WiFi.h>

void setup()
{
  WiFi.softAP("ESP32_WIFI_AP");
}

void loop()
{
}

主要函数

  • bool WiFi.softAP(const char* ssid, const char* passphrase, int channel, int ssid_hidden, int max_connection)使用此方法开启 AP 模式,在成功开启后会返回 ture
参数 介绍
ssid AP 网络的名称,至少需一个字节,最大一般不超过32字节
passphrase 所建立AP网络的密码,可以为 NULL(无密码)或不小于8字节且不大于63字节的密码
channel WiFi网络信道,可选值1~13
ssid_hidden 是否对外隐藏SSID,0-不隐藏,1-隐藏
max_connection 最大可接入数,可选值1~4
  • bool softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet)
    设置 AP 地址
参数 介绍
local_ip 本地地址,默认为 192.168.4.1
gateway 网关地址,默认为 192.168.4.1
subnet 子网掩码,默认为 255.255.255.0
  • bool softAPdisconnect(bool wifioff = false)
    关闭当前AP,若wifioff为true则还将还原网络设置

  • uint8_t softAPgetStationNum()
    返回连接到 AP 的客户端数量

  • IPAddress softAPIP()
    返回当前模块IP

  • bool softAPsetHostname(const char * hostname)
    设置主机名字

  • const char * softAPgetHostname()
    返回主机名字

  • uint8_t* softAPmacAddress(uint8_t* mac) String softAPmacAddress(void)
    返回 mac 地址

使用示例

将下方代码烧入模块中测试

#include <WiFi.h>

IPAddress local_IP(192,168,4,22);
IPAddress gateway(192,168,4,22);
IPAddress subnet(255,255,255,0);

const char *ssid = "ESP32_AP_TEST";
const char *password = "12345678";

void setup()
{
  Serial.begin(115200);
  Serial.println();
  
  WiFi.mode(WIFI_AP); //设置工作在AP模式

  WiFi.softAPConfig(local_IP, gateway, subnet); //设置AP地址
  while(!WiFi.softAP(ssid, password)){}; //启动AP
  Serial.println("AP startup success");

  Serial.print("IP address: ");
  Serial.println(WiFi.softAPIP()); // 打印IP地址

  WiFi.softAPsetHostname("myHostName"); //设置主机名
  Serial.print("HostName: ");
  Serial.println(WiFi.softAPgetHostname()); //打印主机名

  Serial.print("mac Address: ");
  Serial.println(WiFi.softAPmacAddress()); //打印mac地址
}

void loop()
{
  delay(1000);
  Serial.println(WiFi.softAPgetStationNum()); //打印客户端连接数
}

连接网络(STA)

基础使用

将下方代码烧入板子中就可连接指定的网络

#include <WiFi.h>

const char *ssid = "********"; //你的网络名称
const char *password = "********"; //你的网络密码

void setup()
{
  Serial.begin(115200);
  Serial.println();

  WiFi.begin(ssid, password); //连接网络

  while (WiFi.status() != WL_CONNECTED) //等待网络连接成功
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected!");

  Serial.println("IP address: ");
  Serial.println(WiFi.localIP()); //打印模块IP
}

void loop()
{
}

主要函数

  • wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true)
    该方法用来接入网络;
  • bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000)
    设置网络地址;
  • bool disconnect(bool wifioff = false, bool eraseap = false)
    断开网络连接,若wifioff为true则还将还原网络设置,若eraseap为true则将清除保存于flash中的网络参数;
  • bool isConnected()
    返回是否已接入网络;
  • bool setAutoReconnect(bool autoReconnect)
    设置断网自动重连接;
  • bool getAutoReconnect()
    返回是否自动重连接;
  • IPAddress localIP()
    返回模块地址;
  • IPAddress subnetMask()
    返回子网掩码;
  • IPAddress gatewayIP()
    返回网关地址;
  • IPAddress dnsIP(uint8_t dns_no = 0)
    返回DNS地址;
  • uint8_t * macAddress(uint8_t* mac) and
    String macAddress()
    返回MAC地址;
  • const char * getHostname()
    返回主机名字;
  • bool setHostname(const char * hostname)
    设置主机名字;
  • wl_status_t status()
    返回联网状态,状态如下:
返回值 含义
255 WL_NO_SHIELD不用在意(兼容WiFi Shield而设计)
0 WL_IDLE_STATUS正在WiFi工作模式间切换;
1 WL_NO_SSID_AVAIL无法访问设置的SSID网络;
2 WL_SCAN_COMPLETED扫描完成;
3 WL_CONNECTED连接成功;
4 WL_CONNECT_FAILED连接失败;
5 WL_CONNECTION_LOST丢失连接;
6 WL_DISCONNECTED断开连接;

使用示例

#include <WiFi.h>

const char *ssid = "*****";   //你的网络名称
const char *password = "*****";  //你的网络密码

void setup()
{
  Serial.begin(115200);
  Serial.println();

  WiFi.mode(WIFI_STA); //设置工作在STA模式

  WiFi.begin(ssid, password); //连接网络

  while (!WiFi.isConnected()) //等待网络连接成功
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected!");

  Serial.print("IP address: ");
  Serial.println(WiFi.localIP()); //打印模块IP

  Serial.print("subnetMask: ");
  Serial.println(WiFi.subnetMask()); //打印子网掩码

  Serial.print("gateway: ");
  Serial.println(WiFi.gatewayIP()); //打印网关地址

  Serial.print("dns: ");
  Serial.println(WiFi.dnsIP()); //打印DNS地址

  Serial.print("mac Address: ");
  Serial.println(WiFi.macAddress()); //打印mac地址

  WiFi.setHostname("myHostName"); //设置主机名
  Serial.print("HostName: ");
  Serial.println(WiFi.getHostname()); //打印主机名

  Serial.println(WiFi.status());
  WiFi.disconnect(); //断开当前网络
  delay(1000);
  Serial.println(WiFi.status());
}

void loop()
{
}

搜索网络

有时候在实际操作中,都要先搜索周围环境的 wifi 后再进行下一步的操作。下面用的是异步搜索,异步搜索相较于同步搜索不会阻塞程序的运行

主要函数

  • int16_t scanNetworks(bool async = false, bool show_hidden = false, bool passive = false, uint32_t max_ms_per_chan = 300)
    启动搜索,各项参数如下:
参数 介绍
async 异步扫描,该值为true时将启动异步扫描,该方法将不阻塞
show_hidden 是否扫描不广播的网络
passive 影响扫描速度,该值为true时扫描速度较快(不确定)
max_ms_per_chan 每通道扫描时间
  • int16_t scanComplete()
    异步模式下用于获取扫描到的网络数量,如果返回值为-1,表示还在进行扫描,如果返回值为-1,表示未进行扫描或扫描失败
  • void scanDelete()
    删除内存中的扫描结果
  • String SSID(uint8_t networkItem)
    返回扫描到的网络名称
  • wifi_auth_mode_t encryptionType(uint8_t networkItem)
    返回扫描到的网络加密类型
  • int32_t RSSI(uint8_t networkItem)
    返回扫描到的网络信号强度
  • int32_t channel(uint8_t networkItem)
    返回扫描到的网络信道号

使用示例


#include <WiFi.h>

void setup()
{
  Serial.begin(115200);
  Serial.println();

  WiFi.mode(WIFI_STA); //设置为STA模式
  WiFi.disconnect();   //断开当前可能的连接
  delay(100);

  Serial.println("Strat scanning");
  WiFi.scanNetworks(true); //启动异步扫描
}

void loop()
{
  delay(1000);
  int n = WiFi.scanComplete(); //获取扫描状态
  if (n >= 0)
  {
    Serial.println("Scan over");
    for (int i = 0; i < n; ++i)
    {
      Serial.println();
      Serial.print(i + 1);
      Serial.print(":       ");
      Serial.print(WiFi.SSID(i)); //打印网络名称
      Serial.print("        ");
      Serial.print(WiFi.RSSI(i)); //打印信号强度
      Serial.print("        ");
      Serial.print((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? "unencrypted" : "encryption"); //打印是否加密
      delay(10);
    }
    WiFi.scanDelete(); //清除内存中的扫描结果
  }
  else if (n == -1)
  {
    Serial.println("Scanning now");
  }
  else if (n == -2)
  {
    Serial.println("Not scanned");
  }
}



总结

学会了 wifi 功能就能实现联网,真正开始开发网络应用,并且创造出更多新的创意产品。