物聯(lián)網(wǎng)時(shí)代技術(shù)開(kāi)始規(guī)模化服務(wù)于民眾,方便快捷顯得尤為重要,smartconfig一鍵配網(wǎng)便是一個(gè)典型案例。智能家居/家電現(xiàn)階段還處于普及階段,由于家庭wifi網(wǎng)絡(luò)的普及,目前普遍采用wifi與路由器完成連接,與手機(jī)/云端進(jìn)行數(shù)據(jù)交互智能硬件,如智能插座,智能空調(diào),智能空氣凈化器,智能燈泡,智能門鎖由于不具備人機(jī)交互界面,不能像電腦一樣的搜索/選擇指定路由器,輸入連接SSID和密碼的界面,所以必須先解決正確連接路由問(wèn)題。
1.開(kāi)發(fā)環(huán)境:
esp-idf版本 :master
esp-idf環(huán)境:ESP-IDF開(kāi)發(fā)環(huán)境搭建
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32c3/get-started/index.html
注:官方暫時(shí)沒(méi)有s3的安裝教程,可以參照32系列其他方式選擇master分支即可。
配網(wǎng)例程:esp-idf\examples\wifi\smart_config
2.硬件需求
Esp32-s3 開(kāi)發(fā)板一塊
Usb數(shù)據(jù)線一條
3.一鍵配網(wǎng)(SmartConfig)連接過(guò)程:
1)ESP32 設(shè)備進(jìn)入初始化狀態(tài),開(kāi)啟混監(jiān)聽(tīng)所有網(wǎng)絡(luò)數(shù)據(jù)包。
2)手機(jī)連上 WiFi,開(kāi)啟 APP 軟件,輸入手機(jī)所在 WiFi 密碼,請(qǐng)求配網(wǎng),發(fā)送UDP廣播包。
3)ESP32 通過(guò) UDP 包(長(zhǎng)度)獲取配置信息捕捉到路由 SSID 和 PASSWD,連接路由器。
4. 配網(wǎng)APP
樂(lè)鑫官方:配網(wǎng)APP
https://www.espressif.com/zh-hans/support/download/apps
根據(jù)自己的手機(jī)系統(tǒng)選擇相應(yīng)的APP

例程分析:
//在event_handler中,通過(guò)獲取不同的時(shí)間執(zhí)行相對(duì)應(yīng)的操作。
staticvoidevent_handler(void*arg,esp_event_base_tevent_base,
int32_tevent_id,void*event_data)
{
if(event_base==WIFI_EVENT&&event_id==WIFI_EVENT_STA_START){
xTaskCreate(smartconfig_example_task,"smartconfig_example_task",4096,NULL,3,NULL);
}elseif(event_base==WIFI_EVENT&&event_id==WIFI_EVENT_STA_DISCONNECTED){
esp_wifi_connect();//開(kāi)始連接WiFi
xEventGroupClearBits(s_wifi_event_group,CONNECTED_BIT);
}elseif(event_base==IP_EVENT&&event_id==IP_EVENT_STA_GOT_IP){
xEventGroupSetBits(s_wifi_event_group,CONNECTED_BIT);
}elseif(event_base==SC_EVENT&&event_id==SC_EVENT_SCAN_DONE){
ESP_LOGI(TAG,"Scandone");
}elseif(event_base==SC_EVENT&&event_id==SC_EVENT_FOUND_CHANNEL){
ESP_LOGI(TAG,"Foundchannel");
}elseif(event_base==SC_EVENT&&event_id==SC_EVENT_GOT_SSID_PSWD){
ESP_LOGI(TAG,"GotSSIDandpassword");
smartconfig_event_got_ssid_pswd_t*evt=(smartconfig_event_got_ssid_pswd_t*)event_data;
wifi_config_twifi_config;
uint8_tssid[33]={0};
uint8_tpassword[65]={0};
uint8_trvd_data[33]={0};
bzero(&wifi_config,sizeof(wifi_config_t));
memcpy(wifi_config.sta.ssid,evt->ssid,sizeof(wifi_config.sta.ssid));
memcpy(wifi_config.sta.password,evt->password,sizeof(wifi_config.sta.password));
wifi_config.sta.bssid_set=evt->bssid_set;
if(wifi_config.sta.bssid_set==true){
memcpy(wifi_config.sta.bssid,evt->bssid,sizeof(wifi_config.sta.bssid));
}
memcpy(ssid,evt->ssid,sizeof(evt->ssid));
memcpy(password,evt->password,sizeof(evt->password));
ESP_LOGI(TAG,"SSID:%s",ssid);
ESP_LOGI(TAG,"PASSWORD:%s",password);
if(evt->type==SC_TYPE_ESPTOUCH_V2){
ESP_ERROR_CHECK(esp_smartconfig_get_rvd_data(rvd_data,sizeof(rvd_data)));
ESP_LOGI(TAG,"RVD_DATA:");
for(inti=0;i<33;?i++)?{
printf("%02x",rvd_data[i]);
}
printf("\n");
}
ESP_ERROR_CHECK(esp_wifi_disconnect());
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA,&wifi_config));
esp_wifi_connect();
}elseif(event_base==SC_EVENT&&event_id==SC_EVENT_SEND_ACK_DONE){
xEventGroupSetBits(s_wifi_event_group,ESPTOUCH_DONE_BIT);
}
}
staticvoidinitialise_wifi(void)
{
ESP_ERROR_CHECK(esp_netif_init());//初始化底層TCP/IP堆棧
s_wifi_event_group=xEventGroupCreate(); //創(chuàng)建事件組
ESP_ERROR_CHECK(esp_event_loop_create_default());//創(chuàng)建默認(rèn)事件循環(huán)
esp_netif_t*sta_netif=esp_netif_create_default_wifi_sta();//創(chuàng)建默認(rèn)WIFISTA在初始化錯(cuò)誤的情況下,這個(gè)APl中止
assert(sta_netif);
wifi_init_config_tcfg=WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));//初始化WiFi
//首先調(diào)用esp_event_loop_create_default()創(chuàng)建默認(rèn)事件循環(huán)。
//之后使用esp_event_handler_register()將事件處理程序注冊(cè)到系統(tǒng)事件循環(huán)。
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT,ESP_EVENT_ANY_ID,&event_handler,NULL));
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT,IP_EVENT_STA_GOT_IP,&event_handler,NULL));
ESP_ERROR_CHECK(esp_event_handler_register(SC_EVENT,ESP_EVENT_ANY_ID,&event_handler,NULL));
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); //將ESP32wifi設(shè)置為sta模式
ESP_ERROR_CHECK(esp_wifi_start()); //根據(jù)配置啟動(dòng)WiFi為sta
}
//創(chuàng)建事件組s_wifi_event_group=xEventGroupCreate();,觸發(fā)相關(guān)事件則置標(biāo)志位,在任務(wù)中循環(huán)檢測(cè)標(biāo)志位處理相應(yīng)事件。
//smartconfig_example_task任務(wù)中,獲取CONNECTED_BIT和ESPTOUCH_DONE_BIT表示連接上AP和SmartConfig配置完成。
staticvoidsmartconfig_example_task(void*parm)
{
EventBits_tuxBits;
ESP_ERROR_CHECK(esp_smartconfig_set_type(SC_TYPE_ESPTOUCH)); //設(shè)置SmartConfig的協(xié)議類型
smartconfig_start_config_tcfg=SMARTCONFIG_START_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_smartconfig_start(&cfg));//開(kāi)始smartconfig一鍵配網(wǎng)
while(1){
uxBits=xEventGroupWaitBits(s_wifi_event_group,CONNECTED_BIT|ESPTOUCH_DONE_BIT,true,false,portMAX_DELAY);
if(uxBits&CONNECTED_BIT){
ESP_LOGI(TAG,"WiFiConnectedtoap");
}
if(uxBits&ESPTOUCH_DONE_BIT){
ESP_LOGI(TAG,"smartconfigover");
esp_smartconfig_stop(); //配網(wǎng)結(jié)束,釋放esp_smartconfig_start占用的緩沖區(qū)。
vTaskDelete(NULL);
}
}
}
voidapp_main(void)
{
ESP_ERROR_CHECK(nvs_flash_init());//初始化NVS分區(qū)
initialise_wifi(); //初始化WiFi為sta模式,等待APP進(jìn)行配網(wǎng)
}
配網(wǎng)操作流程:
1.搭建esp-idf環(huán)境
2.編譯smart_config例程
1) 設(shè)置target為S3 idf.py set-target esp32s3
2) 編譯工程 idf.py build

3.燒錄到開(kāi)發(fā)板
idf.py flash
多個(gè)設(shè)備需添加串口號(hào)(idf.py -p PORT [-b BAUD] flash)

4.開(kāi)啟監(jiān)視窗口
idf.py monitor (idf.py-pPORTmonitor)
出現(xiàn)下面的打印就可以用APP進(jìn)行配網(wǎng)

5.打開(kāi)EspTouch APP (配網(wǎng)APP)
1)手機(jī)連接到WiFi (目前ESP32系列只支持2.4G頻段)
2)輸入WiFi密碼
3)點(diǎn)擊確認(rèn),配網(wǎng)成功會(huì)顯示開(kāi)發(fā)板的IP

6.一鍵配網(wǎng)成功
日志輸出如下,成功獲取到WiFi的賬號(hào)密碼
并連接到此WiFi,smartconfig停止

發(fā)布評(píng)論請(qǐng)先 登錄
ESP8266燒錄與機(jī)智云一鍵配網(wǎng)教程

《DNESP32S3使用指南-IDF版_V1.6》第五十一章 WiFi一鍵配網(wǎng)
【AI技術(shù)支持】ESP32-S3芯片重復(fù)異常復(fù)位問(wèn)題處理

【AI技術(shù)支持】ESP32-S3模組EspBleOTA搜索不到ble_ota例程的藍(lán)牙問(wèn)題處理

【新品發(fā)布】啟明云端高性能AI筆筒,基于樂(lè)鑫ESP32-S3開(kāi)發(fā)應(yīng)用

【AI技術(shù)支持】ESP32-S3 JTAG調(diào)試問(wèn)題處理

請(qǐng)問(wèn)ESP32-S3 USB HOST是否支持USB2.0?
請(qǐng)問(wèn)ESP32-S3藍(lán)牙是否支持SPP?
ESP32-S3芯片賦能設(shè)備,打造智能交互新體驗(yàn)

評(píng)論