蓝牙和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, NU
LL);
我们的设备类似蓝牙音箱的功能,在使用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模式;
这两种方案都需要较多的开发。