ESP32那些事儿(六):功能开发之蓝牙及WiFi功能

时间:2024-03-09 20:31:29

蓝牙和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模式;
    这两种方案都需要较多的开发。