WiFi基站模式的详细讲解放在了ESP-IDF开发系列当中,点击栏目目录即可跳转找到。
1. API
1.1 初始化
wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true);
- ssid:SSID;
- passphrase:密码;
- channel:信道;
- bssid:AP MAC地址;
- connect:是否立即连接。
1.2 静态IP设置
bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000);
- local_ip:IP地址;
- gateway:网关地址;
- subnet:子网掩码;
- dns1:首选DNS服务器;
- dns2:备用DNS服务器。
1.3 获取状态
static wl_status_t status();
有以下状态:
typedef enum {WL_NO_SHIELD = 255,WL_IDLE_STATUS = 0, // 空闲WL_NO_SSID_AVAIL = 1, // 无此SSIDWL_SCAN_COMPLETED = 2, // 扫描完成WL_CONNECTED = 3, // 成功连接WL_CONNECT_FAILED = 4, // 连接失败WL_CONNECTION_LOST = 5, // 失去连接WL_DISCONNECTED = 6 // 断开连接
} wl_status_t;
1.4 扫描AP
int16_t scanNetworks(bool async = false, bool show_hidden = false, bool passive = false, uint32_t max_ms_per_chan = 300, uint8_t channel = 0, const char * ssid=nullptr, const uint8_t * bssid=nullptr);
- async:是否异步;
- show_hidden:扫描隐藏SSID;
- passive:是否被动扫描;
- max_ms_per_chan:每个信道的最长扫描时间,单位毫秒;
- channel:扫描指定信道;
- ssid:扫描指定SSID;
- bssid:扫描指定AP MAC地址。
返回扫描到的AP数量。
1.5 获取扫描结果
bool getNetworkInfo(uint8_t networkItem, String &ssid, uint8_t &encryptionType, int32_t &RSSI, uint8_t* &BSSID, int32_t &channel);
- networkItem:序号;
- ssid:SSID;
- encrytionType:加密方式;
- RSSI:信号强度;
- BSSID:AP MAC地址;
- channel:信道。
2. 例程
2.1 AP连接
#include <Arduino.h>
#include <WiFi.h>void setup()
{/* 初始化串口 */Serial.begin(115200);/* 初始化WiFi */WiFi.begin("", "");Serial.print("WiFi connecting");while (WiFi.status() != WL_CONNECTED) {Serial.print(".");delay(500);}Serial.println();Serial.printf("Got IP: %s, gateway: %s, submask: %s\r\n",WiFi.localIP().toString().c_str(),WiFi.gatewayIP().toString().c_str(),WiFi.subnetMask().toString().c_str());
}void loop()
{
}
WiFi基站的初始化只需要传入SSID和密码即可。后面通过查询状态等待连接完成,连接成功后通过对应的成员函数可以查询AP的基本信息。
2.2 AP扫描
#include <Arduino.h>
#include <WiFi.h>void setup()
{/* 初始化串口 */Serial.begin(115200);/* 扫描AP */int num = WiFi.scanNetworks();Serial.printf("Scaned %d access points\r\n", num);for (int i = 0; i < num; i++) {String ssid;uint8_t encryption;int rssi;uint8_t *bssid;int channel;WiFi.getNetworkInfo(i, ssid, encryption, rssi, bssid, channel);Serial.printf("SSID: %s, encryption: %d, rssi: %d, bssid: ", ssid.c_str(), encryption, rssi);for (int j = 0; j < 6; j++) {Serial.printf("%02X", bssid[j]);if (j != 5) {Serial.print(":");}}Serial.printf(", channel: %d\r\n", channel);}
}void loop()
{
}
AP扫描就不需要调begin函数了,直接scanNetworks开始扫描即可。通过getNetworkInfo可以获取对应序号的AP信息,如果不想这样一个个变量获取,Arduino也提供了另一个函数——getScanInfoByIndex,它返回的是一个指针,用户需要转成 wifi_ap_record_t 这个结构体的指针。