藍牙和WIFI是ESP32的核心功能,藍牙和wifi的共存也是esp32的獨門武功,但時候后續也會發現共存的時候會有很多問題。不管怎樣,藍牙和wifi在esp-idf中有很多的例子,大家都可以參考。本篇只做簡單的流程介紹。
1、藍牙a2dp sink的初始化
藍⽛牙是⼀一種短距通信系統,其關鍵特性包括魯棒性、低功耗、低成本等。藍⽛系統分為兩種不不同的技術:經典藍牙 (Classic Bluetooth) 和藍⽛牙低功耗 (Bluetooth Low Energy)。ESP32 支持雙模藍⽛,即同時⽀支持經典藍⽛和藍牙低功耗。
我們的項目藍牙方面只是用了A2DP,基本上從esp-idf/examples/bluetooth/a2dp_sink的示例代碼修改來的,大部分未做改動,
esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
if (esp_bt_controller_init(&bt_cfg) != ESP_OK) {
ESP_LOGE(BT_AV_TAG, "%s initialize controller failed\n", __func__);
return;
}
if (esp_bt_controller_enable(ESP_BT_MODE_BTDM) != ESP_OK) {
ESP_LOGE(BT_AV_TAG, "%s enable controller failed\n", __func__);
return;
}
if (esp_bluedroid_init() != ESP_OK) {
ESP_LOGE(BT_AV_TAG, "%s initialize bluedroid failed\n", __func__);
return;
}
if (esp_bluedroid_enable() != ESP_OK) {
ESP_LOGE(BT_AV_TAG, "%s enable bluedroid failed\n", __func__);
return;
}
/* create application task */
bt_app_task_start_up();
/* Bluetooth device name, connection mode and profile set up */
bt_app_work_dispatch(bt_av_hdl_stack_evt, BT_APP_EVT_STACK_UP, NULL, 0, NULL);
我們的設備類似藍牙音箱的功能,在使用a2dp的過程中也是有很多bug的,比方說暫停后雜音、藍牙聲音卡頓、系統panic等,希望后續的esp-idf都已經解決了,如果遇到類似的問題,我們也可以在博客中討論,在此就不一一贅述了。
2、Wifi的初始化
Wifi的初始化比較簡單,所調用的API如下,后續的Wifi狀態就是用回調處理的。
esp-idf示例: esp-idf/examples/wifi/simple_wifi
void initialise_wifi()
{
tcpip_adapter_init();
global_wifi_event_group = xEventGroupCreate();
ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
ESP_ERROR_CHECK( esp_wifi_start() );
status.wifi_init_done = true;
}
ESP32所支持的Wifi的模式還是很豐富的:
Station模式、AP模式、Station和AP共存模式、混雜模式(用於監聽Wifi包)、
3、WIFI的配置
IOT設備通常沒有界面交互,所以當他作為station的時候,都面臨一個問題,Wifi所連接的AP的ssid和密碼如何配置呢?
ESP已經貼心的為我們想到了,並且提供了集中方式:
1)、SmartConfig
SmartConfig 需要手機上一個APP來配合,手機APP來廣播AP的SSID和PASSWORD,ESP32來監聽空口上傳輸特定的包,並且從這些包中解析出SSID和PASSWORD。
上層的邏輯大致如此,底層的協議沒有細看,應該是采用了802.11的某些機制來擴展的。
我們項目的配置用的是SmartConfig,目前來看效果還不錯,成功率很高。
2)、ESP NOW
ESP NOW是樂鑫自己定義的無連接的WIFI通訊協議,數據被封裝在vendor-specific的的幀來傳輸。詳細了解的話可以看文檔。
3)、自定義方案
如果支持藍牙的話,也可以通過藍牙來配置WIFI;
也可以設備默認為AP模式,客戶端連上后配置WIFI之后切換成STATION模式;
這兩種方案都需要較多的開發。