图48.3.1 程序流程图
48.3.2 程序解析
在本章节实验中,我们只关心main.c文件内容即可,该文件内容如下:
/* 存储12个WIFI名称 */
#define DEFAULT_SCAN_LIST_SIZE 12
i2c_obj_t i2c0_master;
static const char *TAG = "scan";
/**
* @retval 无
*/
static void print_auth_mode(int authmode)
{
switch (authmode)
{
/* 省略身份认证模式代码 */
}
}
/**
* @brief 打印WIFI密码类型
* @param pairwise_cipher :密码类型
* @param group_cipher :群密码类型
* @retval 无
*/
static void print_cipher_type(int pairwise_cipher, int group_cipher)
{
switch (pairwise_cipher)
{
/* 省略WIFI密码类型代码 */
}
switch (group_cipher)
{
/* 省略WIFI密码类型代码 */
}
}
/**
* @brief 将Wi-Fi初始化为sta并设置扫描方法
* @param 无
* @retval 无
*/
void wifi_scan(void)
{
char lcd_buff[100] = {0};
/* 网卡初始化 */
ESP_ERROR_CHECK(esp_netif_init());
/* 创建新的事件循环 */
ESP_ERROR_CHECK(esp_event_loop_create_default());
/* 用户初始化STA模式 */
esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();
assert(sta_netif);
/* wifi配置初始化 */
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
uint16_t number = DEFAULT_SCAN_LIST_SIZE;
wifi_ap_record_t ap_info[DEFAULT_SCAN_LIST_SIZE];
uint16_t ap_count = 0;
memset(ap_info, 0, sizeof(ap_info));
/* 设置WIFI为STA模式 */
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
/* 启动WIFI */
ESP_ERROR_CHECK(esp_wifi_start());
/* 开始扫描附件的WIFI */
esp_wifi_scan_start(NULL, true);
/* 获取上次扫描中找到的AP列表 */
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&number, ap_info));
/* 获取上次扫描中找到的AP数量 */
ESP_ERROR_CHECK(esp_wifi_scan_get_ap_num(&ap_count));
ESP_LOGI(TAG, "Total APs scanned = %u", ap_count);
/* 下面是打印附件的WIFI信息 */
for (int i = 0; (i < DEFAULT_SCAN_LIST_SIZE) && (i < ap_count); i++)
{
sprintf(lcd_buff, "%s",ap_info.ssid);
lcd_show_string(200, 20 * i, 240, 16, 16, lcd_buff, BLUE);
ESP_LOGI(TAG, "SSID \t\t%s", ap_info.ssid);
ESP_LOGI(TAG, "RSSI \t\t%d", ap_info.rssi);
print_auth_mode(ap_info.authmode);
if (ap_info.authmode != WIFI_AUTH_WEP)
{
print_cipher_type(ap_info.pairwise_cipher
, ap_info.group_cipher);
}
ESP_LOGI(TAG, "Channel \t\t%d\n", ap_info.primary);
}
}
/**
* @brief 程序入口
* @param 无
* @retval 无
*/
void app_main(void)
{
esp_err_t ret;
ret = nvs_flash_init(); /* 初始化NVS */
if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
{
ESP_ERROR_CHECK(nvs_flash_erase());
ret = nvs_flash_init();
}
led_init(); /* 初始化LED */
i2c0_master = iic_init(I2C_NUM_0); /* 初始化IIC0 */
spi2_init(); /* 初始化SPI2 */
xl9555_init(i2c0_master); /* IO扩展芯片初始化 */
lcd_init(); /* 初始化LCD */
lcd_show_string(10, 80, 240, 32, 32, "ESP32-S3", RED);
lcd_show_string(10, 120, 240, 24, 24, "WiFi SCAN Test", RED);
lcd_show_string(10, 150, 240, 16, 16, "ATOM@ALIENTEK", RED);
lcd_draw_line(190,0,190,239,DARKBLUE);
wifi_scan();
while (1)
{
LED_TOGGLE();
vTaskDelay(500);
}
}
在上述源码中,作者从wifi_scan函数开始讲解,该函数首先创建了event loop事件回调,即任务事件处理机制。接着,配置WiFi为STA模式(设备连接热点模式)并设置相应的参数,然后启动WiFi。最后,程序会扫描附近的12个热点,并在LCD上显示热点的名称。此外,读者还可以通过串口查看热点的安全模式等身份认证信息。
48.4 下载验证
程序下载成功后,我们可以看到LCD显示附近20个热点名称,如下图所示: