• ESP32开发日志记录


    用过一段时间的ESP8266开发, 是在ubunut下建立的开发环境,现在ESP32更简单,直接在Window下IDE即可完成系统配置、新建工程及编译下载工作,使用起来更加简便
    在这里插入图片描述

    一、生成ESP32的工程运行出错

    在这里插入图片描述
    大概意思的芯片是单核芯片,但程序是多核,没法运行
    在这里插入图片描述
    修改freertos配置,程序只运行在第一个核上
    在这里插入图片描述
    程序运行正常

    二、使用小米ESP32模块,不知明错误

    在这里插入图片描述
    在这里插入图片描述

    三、esp32主要型号及区别

    ESP32主要型号有:

    1. ESP32-S2:ESP32-S2是单芯片系统,采用XTensa? Dual-Core 32位LX7处理器,具有高达240 MHz的处理速度,支持Wi-Fi 802.11b / g / n / e / i,可支持蓝牙BR / EDR / BLE / LE2M / LE2MP。

    2. ESP32-S3:ESP32-S3是一款支持Wi-Fi 802.11b / g / n的双核32位MCU,采用Xtensa? Dual-Core 32位LX7处理器,具有高达80 MHz的处理速度,可支持蓝牙BR / EDR / BLE / LE2M / LE2MP。

    3. ESP32-C3:ESP32-C3是一款支持Wi-Fi 802.11b / g / n的双核32位MCU,采用Xtensa? Dual-Core 32位LX7处理器,具有高达240 MHz的处理速度,可支持蓝牙BR / EDR / BLE / LE2M / LE2MP。

    4. ESP32-S4:ESP32-S4是一款支持Wi-Fi 802.11b / g / n的双核32位MCU,采用Xtensa? Dual-Core 32位LX6处理器,具有高达240 MHz的处理速度,可支持蓝牙BR / EDR / BLE / LE2M / LE2MP。

    5. ESP32-WROVER:ESP32-WROVER是一款支持Wi-Fi 802.11b / g / n的双核32位MCU,采用Xtensa? Dual-Core 32位LX6处理器,具有高达240 MHz的处理速度,可支持蓝牙BR / EDR / BLE / LE2M / LE2MP。

    ESP32各型号的主要区别在于:处理器类型、最高工作频率和支持的蓝牙协议不同。
      
    在这里插入图片描述

    四、接入oneonet平台

    https://zhuanlan.zhihu.com/p/538606041?utm_id=0&wd=&eqid=c191609a0001803b0000000664915bb8
    需要用到获取unix时间戳及生成token两个工具
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    onenet平台只支持mqttv3.11及以下,ESP-IDF不能选用MQTTV5版本
    在这里插入图片描述

    五、构建工具

    idf.py menuconfig:配置项目
    idf.py build:构建当前目录找到的项目,增量式构建,没有修改过的文件不需要再次编译
    idf.py clean:清理构建目录, 不删除CMake配置输出和其它文件
    idf.py fullclean:清理构建目录,包括CMake配置和其它文件
    idf.py flash:下载程序到ESP32
    idf.py monitor:打开串口监视器
    idf.py -p PORT erase_flash:擦除整个esp32的flash
    idf.py reconfigure:重新运行CMake,用在源码树增加/删除文件或修改CMake cache时

    建议用构建工具编译,比eclipse快很多

    六、驱动RGB 565 LCD

    修改PLCK频率及分辨率,PLCK最大值15,修改对应的引脚信号
    在这里插入图片描述
    询问LCD厂家获取屏参,修改屏参
    在这里插入图片描述
    简单驱动电路,HC04用于有些信号需要反相,屏是666,但ESP32-S3输出是565需把低位信号去掉
    在这里插入图片描述
    在这里插入图片描述

    驱动显示例程正常输出

    在这里插入图片描述

    七、分区表

    partitions.csv

    # Name,     Type,     SubType,     Offset,      Size,     Flags
    nvs,         data,     nvs,         0x9000,     0x4000
    otadata,     data,     ota,         0xd000,     0x2000
    phy_init,    data,     phy,         0xf000,     0x1000
    factory,     app,      factory,     0x10000,    8M
    ota_0,       app,      ota_0,       ,           1M
    ota_1,       app,      ota_1,       ,           1M
    nvs_key,     data,     nvs_keys,    ,           0x1000
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    八、vscode安装IDF出错

    在这里插入图片描述
    打开命令窗口使用命令:python -m pip install --upgrade,
    出现提示No module named pip,使用python -m ensurepip重新安装pip

    九、SD卡连接方式

    1、4 位 SD 总线模式
    硬件连线方式:

    | NodeMCU32s | SD Card |
    | --------------------------------------------
    | GPIO12 | D02 |
    | GPIO4 | D01 |
    | GPIO15 | CMD(MOSI) |
    | GPIO2 | D00(MISO) |
    | GPIO14 | CLK(SCK) |
    | GPIO13 | D03(SS) |
    | GND | GND |
    | VCC(3.3v) | VCC |

    2、1 位 SD 总线模式
    硬件连线方式:

    | NodeMCU32s | SD Card |
    | --------------------------------------------
    | - | D02 |
    | - | D01 |
    | GPIO15 | CMD(MOSI) |
    | GPIO2 | D00(MISO) |
    | GPIO14 | CLK(SCK) |
    | - | D03(SS) |
    | GND | GND |
    | VCC(3.3v) | VCC |

    3、HSPI 总线模式
    硬件连线方式:

    | NodeMCU32s | SD Card |
    | --------------------------------------------
    | - | D02 |
    | - | D01 |
    | GPIO13 | CMD(MOSI) |
    | GPIO12 | D00(MISO) |
    | GPIO14 | CLK(SCK) |
    | GPIO15 | D03(SS) |
    | GND | GND |
    | VCC(3.3v) | VCC |

    4、VSPI 总线模式
    硬件连线方式:

    | NodeMCU32s | SD Card |
    | --------------------------------------------
    | - | D02 |
    | - | D01 |
    | GPIO23 | CMD(MOSI) |
    | GPIO19 | D00(MISO) |
    | GPIO18 | CLK(SCK) |
    | GPIO5 | D03(SS) |
    | GND | GND |
    | VCC(3.3v) | VCC |

    九、接收蓝牙游戏手柄遥控测试代码

    可通过IDF自行创建
    在这里插入图片描述

    /*
     * SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD
     *
     * SPDX-License-Identifier: Unlicense OR CC0-1.0
     */
    
    
    
    /****************************************************************************
    *
    * This demo showcases BLE GATT client. It can scan BLE devices and connect to one device.
    * Run the gatt_server demo, the client demo will automatically connect to the gatt_server demo.
    * Client demo will enable gatt_server's notify after connection. The two devices will then exchange
    * data.
    *
    ****************************************************************************/
    
    #include 
    #include 
    #include 
    #include 
    #include "nvs.h"
    #include "nvs_flash.h"
    
    #include "esp_bt.h"
    #include "esp_gap_ble_api.h"
    #include "esp_gattc_api.h"
    #include "esp_gatt_defs.h"
    #include "esp_bt_main.h"
    #include "esp_gatt_common_api.h"
    #include "esp_log.h"
    #include "freertos/FreeRTOS.h"
    
    #define GATTC_TAG "GATTC_DEMO"
    #define REMOTE_SERVICE_UUID        0x2A4D
    #define REMOTE_NOTIFY_CHAR_UUID    0xFF01
    #define PROFILE_NUM      1
    #define PROFILE_A_APP_ID 0
    #define INVALID_HANDLE   0
    
    static const char remote_device_name[] = "MOCUTE-052Fe-AUTO";
    static bool connect    = false;
    static bool get_server = false;
    static esp_gattc_char_elem_t *char_elem_result   = NULL;
    static esp_gattc_descr_elem_t *descr_elem_result = NULL;
    
    /* Declare static functions */
    static void esp_gap_cb(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param);
    static void esp_gattc_cb(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param);
    static void gattc_profile_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param);
    
    
    static esp_bt_uuid_t remote_filter_service_uuid = {
        .len = ESP_UUID_LEN_16,
        .uuid = {.uuid16 = REMOTE_SERVICE_UUID,},
    };
    
    static esp_bt_uuid_t remote_filter_char_uuid = {
        .len = ESP_UUID_LEN_16,
        .uuid = {.uuid16 = REMOTE_NOTIFY_CHAR_UUID,},
    };
    
    static esp_bt_uuid_t notify_descr_uuid = {
        .len = ESP_UUID_LEN_16,
        .uuid = {.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG,},
    };
    
    static esp_ble_scan_params_t ble_scan_params = {
        .scan_type              = BLE_SCAN_TYPE_ACTIVE,
        .own_addr_type          = BLE_ADDR_TYPE_PUBLIC,
        .scan_filter_policy     = BLE_SCAN_FILTER_ALLOW_ALL,
        .scan_interval          = 0x50,
        .scan_window            = 0x30,
        .scan_duplicate         = BLE_SCAN_DUPLICATE_DISABLE
    };
    
    struct gattc_profile_inst {
        esp_gattc_cb_t gattc_cb;
        uint16_t gattc_if;
        uint16_t app_id;
        uint16_t conn_id;
        uint16_t service_start_handle;
        uint16_t service_end_handle;
        uint16_t char_handle;
        esp_bd_addr_t remote_bda;
    };
    
    /* One gatt-based profile one app_id and one gattc_if, this array will store the gattc_if returned by ESP_GATTS_REG_EVT */
    static struct gattc_profile_inst gl_profile_tab[PROFILE_NUM] = {
        [PROFILE_A_APP_ID] = {
            .gattc_cb = gattc_profile_event_handler,
            .gattc_if = ESP_GATT_IF_NONE,       /* Not get the gatt_if, so initial is ESP_GATT_IF_NONE */
        },
    };
    
    static void gattc_profile_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param)
    {
        esp_ble_gattc_cb_param_t *p_data = (esp_ble_gattc_cb_param_t *)param;
    
        switch (event) {
        case ESP_GATTC_REG_EVT:
            ESP_LOGI(GATTC_TAG, "REG_EVT");
            esp_err_t scan_ret = esp_ble_gap_set_scan_params(&ble_scan_params);
            if (scan_ret){
                ESP_LOGE(GATTC_TAG, "set scan params error, error code = %x", scan_ret);
            }
            break;
        case ESP_GATTC_CONNECT_EVT:{
            ESP_LOGI(GATTC_TAG, "ESP_GATTC_CONNECT_EVT conn_id %d, if %d", p_data->connect.conn_id, gattc_if);
            gl_profile_tab[PROFILE_A_APP_ID].conn_id = p_data->connect.conn_id;
            memcpy(gl_profile_tab[PROFILE_A_APP_ID].remote_bda, p_data->connect.remote_bda, sizeof(esp_bd_addr_t));
            ESP_LOGI(GATTC_TAG, "REMOTE BDA:");
            esp_log_buffer_hex(GATTC_TAG, gl_profile_tab[PROFILE_A_APP_ID].remote_bda, sizeof(esp_bd_addr_t));
            esp_err_t mtu_ret = esp_ble_gattc_send_mtu_req (gattc_if, p_data->connect.conn_id);
            if (mtu_ret){
                ESP_LOGE(GATTC_TAG, "config MTU error, error code = %x", mtu_ret);
            }
            break;
        }
        case ESP_GATTC_OPEN_EVT:
            if (param->open.status != ESP_GATT_OK){
                ESP_LOGE(GATTC_TAG, "open failed, status %d", p_data->open.status);
                break;
            }
            ESP_LOGI(GATTC_TAG, "open success");
            break;
        case ESP_GATTC_DIS_SRVC_CMPL_EVT:
            if (param->dis_srvc_cmpl.status != ESP_GATT_OK){
                ESP_LOGE(GATTC_TAG, "discover service failed, status %d", param->dis_srvc_cmpl.status);
                break;
            }
            ESP_LOGI(GATTC_TAG, "discover service complete conn_id %d", param->dis_srvc_cmpl.conn_id);
            esp_ble_gattc_search_service(gattc_if, param->cfg_mtu.conn_id, &remote_filter_service_uuid);
            break;
        case ESP_GATTC_CFG_MTU_EVT:
            if (param->cfg_mtu.status != ESP_GATT_OK){
                ESP_LOGE(GATTC_TAG,"config mtu failed, error status = %x", param->cfg_mtu.status);
            }
            ESP_LOGI(GATTC_TAG, "ESP_GATTC_CFG_MTU_EVT, Status %d, MTU %d, conn_id %d", param->cfg_mtu.status, param->cfg_mtu.mtu, param->cfg_mtu.conn_id);
            break;
        case ESP_GATTC_SEARCH_RES_EVT: {
            ESP_LOGI(GATTC_TAG, "SEARCH RES: conn_id = %x is primary service %d", p_data->search_res.conn_id, p_data->search_res.is_primary);
            ESP_LOGI(GATTC_TAG, "start handle %d end handle %d current handle value %d", p_data->search_res.start_handle, p_data->search_res.end_handle, p_data->search_res.srvc_id.inst_id);
            if (p_data->search_res.srvc_id.uuid.len == ESP_UUID_LEN_16 && p_data->search_res.srvc_id.uuid.uuid.uuid16 == REMOTE_SERVICE_UUID) {
                ESP_LOGI(GATTC_TAG, "service found");
                get_server = true;
                gl_profile_tab[PROFILE_A_APP_ID].service_start_handle = p_data->search_res.start_handle;
                gl_profile_tab[PROFILE_A_APP_ID].service_end_handle = p_data->search_res.end_handle;
                ESP_LOGI(GATTC_TAG, "UUID16: %x", p_data->search_res.srvc_id.uuid.uuid.uuid16);
            }
            break;
        }
        case ESP_GATTC_SEARCH_CMPL_EVT:
            if (p_data->search_cmpl.status != ESP_GATT_OK){
                ESP_LOGE(GATTC_TAG, "search service failed, error status = %x", p_data->search_cmpl.status);
                break;
            }
            if(p_data->search_cmpl.searched_service_source == ESP_GATT_SERVICE_FROM_REMOTE_DEVICE) {
                ESP_LOGI(GATTC_TAG, "Get service information from remote device");
            } else if (p_data->search_cmpl.searched_service_source == ESP_GATT_SERVICE_FROM_NVS_FLASH) {
                ESP_LOGI(GATTC_TAG, "Get service information from flash");
            } else {
                ESP_LOGI(GATTC_TAG, "unknown service source");
            }
            ESP_LOGI(GATTC_TAG, "ESP_GATTC_SEARCH_CMPL_EVT");
            if (get_server){
                uint16_t count = 0;
                esp_gatt_status_t status = esp_ble_gattc_get_attr_count( gattc_if,
                                                                         p_data->search_cmpl.conn_id,
                                                                         ESP_GATT_DB_CHARACTERISTIC,
                                                                         gl_profile_tab[PROFILE_A_APP_ID].service_start_handle,
                                                                         gl_profile_tab[PROFILE_A_APP_ID].service_end_handle,
                                                                         INVALID_HANDLE,
                                                                         &count);
                if (status != ESP_GATT_OK){
                    ESP_LOGE(GATTC_TAG, "esp_ble_gattc_get_attr_count error");
                }
    
                if (count > 0){
                    char_elem_result = (esp_gattc_char_elem_t *)malloc(sizeof(esp_gattc_char_elem_t) * count);
                    if (!char_elem_result){
                        ESP_LOGE(GATTC_TAG, "gattc no mem");
                    }else{
                        status = esp_ble_gattc_get_char_by_uuid( gattc_if,
                                                                 p_data->search_cmpl.conn_id,
                                                                 gl_profile_tab[PROFILE_A_APP_ID].service_start_handle,
                                                                 gl_profile_tab[PROFILE_A_APP_ID].service_end_handle,
                                                                 remote_filter_char_uuid,
                                                                 char_elem_result,
                                                                 &count);
                        if (status != ESP_GATT_OK){
                            ESP_LOGE(GATTC_TAG, "esp_ble_gattc_get_char_by_uuid error");
                        }
    
                        /*  Every service have only one char in our 'ESP_GATTS_DEMO' demo, so we used first 'char_elem_result' */
                        if (count > 0 && (char_elem_result[0].properties & ESP_GATT_CHAR_PROP_BIT_NOTIFY)){
                            gl_profile_tab[PROFILE_A_APP_ID].char_handle = char_elem_result[0].char_handle;
                            esp_ble_gattc_register_for_notify (gattc_if, gl_profile_tab[PROFILE_A_APP_ID].remote_bda, char_elem_result[0].char_handle);
                        }
                    }
                    /* free char_elem_result */
                    free(char_elem_result);
                }else{
                    ESP_LOGE(GATTC_TAG, "no char found");
                }
            }
             break;
        case ESP_GATTC_REG_FOR_NOTIFY_EVT: {
            ESP_LOGI(GATTC_TAG, "ESP_GATTC_REG_FOR_NOTIFY_EVT");
            if (p_data->reg_for_notify.status != ESP_GATT_OK){
                ESP_LOGE(GATTC_TAG, "REG FOR NOTIFY failed: error status = %d", p_data->reg_for_notify.status);
            }else{
                uint16_t count = 0;
                uint16_t notify_en = 1;
                esp_gatt_status_t ret_status = esp_ble_gattc_get_attr_count( gattc_if,
                                                                             gl_profile_tab[PROFILE_A_APP_ID].conn_id,
                                                                             ESP_GATT_DB_DESCRIPTOR,
                                                                             gl_profile_tab[PROFILE_A_APP_ID].service_start_handle,
                                                                             gl_profile_tab[PROFILE_A_APP_ID].service_end_handle,
                                                                             gl_profile_tab[PROFILE_A_APP_ID].char_handle,
                                                                             &count);
                if (ret_status != ESP_GATT_OK){
                    ESP_LOGE(GATTC_TAG, "esp_ble_gattc_get_attr_count error");
                }
                if (count > 0){
                    descr_elem_result = malloc(sizeof(esp_gattc_descr_elem_t) * count);
                    if (!descr_elem_result){
                        ESP_LOGE(GATTC_TAG, "malloc error, gattc no mem");
                    }else{
                        ret_status = esp_ble_gattc_get_descr_by_char_handle( gattc_if,
                                                                             gl_profile_tab[PROFILE_A_APP_ID].conn_id,
                                                                             p_data->reg_for_notify.handle,
                                                                             notify_descr_uuid,
                                                                             descr_elem_result,
                                                                             &count);
                        if (ret_status != ESP_GATT_OK){
                            ESP_LOGE(GATTC_TAG, "esp_ble_gattc_get_descr_by_char_handle error");
                        }
                        /* Every char has only one descriptor in our 'ESP_GATTS_DEMO' demo, so we used first 'descr_elem_result' */
                        if (count > 0 && descr_elem_result[0].uuid.len == ESP_UUID_LEN_16 && descr_elem_result[0].uuid.uuid.uuid16 == ESP_GATT_UUID_CHAR_CLIENT_CONFIG){
                            ret_status = esp_ble_gattc_write_char_descr( gattc_if,
                                                                         gl_profile_tab[PROFILE_A_APP_ID].conn_id,
                                                                         descr_elem_result[0].handle,
                                                                         sizeof(notify_en),
                                                                         (uint8_t *)¬ify_en,
                                                                         ESP_GATT_WRITE_TYPE_RSP,
                                                                         ESP_GATT_AUTH_REQ_NONE);
                        }
    
                        if (ret_status != ESP_GATT_OK){
                            ESP_LOGE(GATTC_TAG, "esp_ble_gattc_write_char_descr error");
                        }
    
                        /* free descr_elem_result */
                        free(descr_elem_result);
                    }
                }
                else{
                    ESP_LOGE(GATTC_TAG, "decsr not found");
                }
    
            }
            break;
        }
        case ESP_GATTC_NOTIFY_EVT:
            if (p_data->notify.is_notify){
                ESP_LOGI(GATTC_TAG, "ESP_GATTC_NOTIFY_EVT, receive notify value:");
            }else{
                ESP_LOGI(GATTC_TAG, "ESP_GATTC_NOTIFY_EVT, receive indicate value:");
            }
            esp_log_buffer_hex(GATTC_TAG, p_data->notify.value, p_data->notify.value_len);
            break;
        case ESP_GATTC_WRITE_DESCR_EVT:
            if (p_data->write.status != ESP_GATT_OK){
                ESP_LOGE(GATTC_TAG, "write descr failed, error status = %x", p_data->write.status);
                break;
            }
            ESP_LOGI(GATTC_TAG, "write descr success ");
            uint8_t write_char_data[35];
            for (int i = 0; i < sizeof(write_char_data); ++i)
            {
                write_char_data[i] = i % 256;
            }
            esp_ble_gattc_write_char( gattc_if,
                                      gl_profile_tab[PROFILE_A_APP_ID].conn_id,
                                      gl_profile_tab[PROFILE_A_APP_ID].char_handle,
                                      sizeof(write_char_data),
                                      write_char_data,
                                      ESP_GATT_WRITE_TYPE_RSP,
                                      ESP_GATT_AUTH_REQ_NONE);
            break;
        case ESP_GATTC_SRVC_CHG_EVT: {
            esp_bd_addr_t bda;
            memcpy(bda, p_data->srvc_chg.remote_bda, sizeof(esp_bd_addr_t));
            ESP_LOGI(GATTC_TAG, "ESP_GATTC_SRVC_CHG_EVT, bd_addr:");
            esp_log_buffer_hex(GATTC_TAG, bda, sizeof(esp_bd_addr_t));
            break;
        }
        case ESP_GATTC_WRITE_CHAR_EVT:
            if (p_data->write.status != ESP_GATT_OK){
                ESP_LOGE(GATTC_TAG, "write char failed, error status = %x", p_data->write.status);
                break;
            }
            ESP_LOGI(GATTC_TAG, "write char success ");
            break;
        case ESP_GATTC_DISCONNECT_EVT:
            connect = false;
            get_server = false;
            ESP_LOGI(GATTC_TAG, "ESP_GATTC_DISCONNECT_EVT, reason = %d", p_data->disconnect.reason);
            break;
        default:
            break;
        }
    }
    
    static void esp_gap_cb(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param)
    {
        uint8_t *adv_name = NULL;
        uint8_t adv_name_len = 0;
        switch (event) {
        case ESP_GAP_BLE_SCAN_PARAM_SET_COMPLETE_EVT: {
            //the unit of the duration is second
            uint32_t duration = 30;
            esp_ble_gap_start_scanning(duration);
            break;
        }
        case ESP_GAP_BLE_SCAN_START_COMPLETE_EVT:
            //scan start complete event to indicate scan start successfully or failed
            if (param->scan_start_cmpl.status != ESP_BT_STATUS_SUCCESS) {
                ESP_LOGE(GATTC_TAG, "scan start failed, error status = %x", param->scan_start_cmpl.status);
                break;
            }
            ESP_LOGI(GATTC_TAG, "scan start success");
    
            break;
        case ESP_GAP_BLE_SCAN_RESULT_EVT: {
            esp_ble_gap_cb_param_t *scan_result = (esp_ble_gap_cb_param_t *)param;
            switch (scan_result->scan_rst.search_evt) {
            case ESP_GAP_SEARCH_INQ_RES_EVT:
                esp_log_buffer_hex(GATTC_TAG, scan_result->scan_rst.bda, 6);
                ESP_LOGI(GATTC_TAG, "searched Adv Data Len %d, Scan Response Len %d", scan_result->scan_rst.adv_data_len, scan_result->scan_rst.scan_rsp_len);
                adv_name = esp_ble_resolve_adv_data(scan_result->scan_rst.ble_adv,
                                                    ESP_BLE_AD_TYPE_NAME_CMPL, &adv_name_len);
                ESP_LOGI(GATTC_TAG, "searched Device Name Len %d", adv_name_len);
                esp_log_buffer_char(GATTC_TAG, adv_name, adv_name_len);
    
    #if CONFIG_EXAMPLE_DUMP_ADV_DATA_AND_SCAN_RESP
                if (scan_result->scan_rst.adv_data_len > 0) {
                    ESP_LOGI(GATTC_TAG, "adv data:");
                    esp_log_buffer_hex(GATTC_TAG, &scan_result->scan_rst.ble_adv[0], scan_result->scan_rst.adv_data_len);
                }
                if (scan_result->scan_rst.scan_rsp_len > 0) {
                    ESP_LOGI(GATTC_TAG, "scan resp:");
                    esp_log_buffer_hex(GATTC_TAG, &scan_result->scan_rst.ble_adv[scan_result->scan_rst.adv_data_len], scan_result->scan_rst.scan_rsp_len);
                }
    #endif
                ESP_LOGI(GATTC_TAG, "\n");
    
                if (adv_name != NULL) {
                    if (strlen(remote_device_name) == adv_name_len && strncmp((char *)adv_name, remote_device_name, adv_name_len) == 0) {
                        ESP_LOGI(GATTC_TAG, "searched device %s\n", remote_device_name);
                        if (connect == false) {
                            connect = true;
                            ESP_LOGI(GATTC_TAG, "connect to the remote device.");
                            esp_ble_gap_stop_scanning();
                            esp_ble_gattc_open(gl_profile_tab[PROFILE_A_APP_ID].gattc_if, scan_result->scan_rst.bda, scan_result->scan_rst.ble_addr_type, true);
                        }
                    }
                }
                break;
            case ESP_GAP_SEARCH_INQ_CMPL_EVT:
                break;
            default:
                break;
            }
            break;
        }
    
        case ESP_GAP_BLE_SCAN_STOP_COMPLETE_EVT:
            if (param->scan_stop_cmpl.status != ESP_BT_STATUS_SUCCESS){
                ESP_LOGE(GATTC_TAG, "scan stop failed, error status = %x", param->scan_stop_cmpl.status);
                break;
            }
            ESP_LOGI(GATTC_TAG, "stop scan successfully");
            break;
    
        case ESP_GAP_BLE_ADV_STOP_COMPLETE_EVT:
            if (param->adv_stop_cmpl.status != ESP_BT_STATUS_SUCCESS){
                ESP_LOGE(GATTC_TAG, "adv stop failed, error status = %x", param->adv_stop_cmpl.status);
                break;
            }
            ESP_LOGI(GATTC_TAG, "stop adv successfully");
            break;
        case ESP_GAP_BLE_UPDATE_CONN_PARAMS_EVT:
             ESP_LOGI(GATTC_TAG, "update connection params status = %d, min_int = %d, max_int = %d,conn_int = %d,latency = %d, timeout = %d",
                      param->update_conn_params.status,
                      param->update_conn_params.min_int,
                      param->update_conn_params.max_int,
                      param->update_conn_params.conn_int,
                      param->update_conn_params.latency,
                      param->update_conn_params.timeout);
            break;
        default:
            break;
        }
    }
    
    static void esp_gattc_cb(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param)
    {
        /* If event is register event, store the gattc_if for each profile */
        if (event == ESP_GATTC_REG_EVT) {
            if (param->reg.status == ESP_GATT_OK) {
                gl_profile_tab[param->reg.app_id].gattc_if = gattc_if;
            } else {
                ESP_LOGI(GATTC_TAG, "reg app failed, app_id %04x, status %d",
                        param->reg.app_id,
                        param->reg.status);
                return;
            }
        }
    
        /* If the gattc_if equal to profile A, call profile A cb handler,
         * so here call each profile's callback */
        do {
            int idx;
            for (idx = 0; idx < PROFILE_NUM; idx++) {
                if (gattc_if == ESP_GATT_IF_NONE || /* ESP_GATT_IF_NONE, not specify a certain gatt_if, need to call every profile cb function */
                        gattc_if == gl_profile_tab[idx].gattc_if) {
                    if (gl_profile_tab[idx].gattc_cb) {
                        gl_profile_tab[idx].gattc_cb(event, gattc_if, param);
                    }
                }
            }
        } while (0);
    }
    
    void app_main(void)
    {
        // Initialize NVS.
        esp_err_t ret = nvs_flash_init();
        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();
        }
        ESP_ERROR_CHECK( ret );
    
        ESP_ERROR_CHECK(esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT));
    
        esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
        ret = esp_bt_controller_init(&bt_cfg);
        if (ret) {
            ESP_LOGE(GATTC_TAG, "%s initialize controller failed: %s\n", __func__, esp_err_to_name(ret));
            return;
        }
    
        ret = esp_bt_controller_enable(ESP_BT_MODE_BLE);
        if (ret) {
            ESP_LOGE(GATTC_TAG, "%s enable controller failed: %s\n", __func__, esp_err_to_name(ret));
            return;
        }
    
        ret = esp_bluedroid_init();
        if (ret) {
            ESP_LOGE(GATTC_TAG, "%s init bluetooth failed: %s\n", __func__, esp_err_to_name(ret));
            return;
        }
    
        ret = esp_bluedroid_enable();
        if (ret) {
            ESP_LOGE(GATTC_TAG, "%s enable bluetooth failed: %s\n", __func__, esp_err_to_name(ret));
            return;
        }
    
        //register the  callback function to the gap module
        ret = esp_ble_gap_register_callback(esp_gap_cb);
        if (ret){
            ESP_LOGE(GATTC_TAG, "%s gap register failed, error code = %x\n", __func__, ret);
            return;
        }
    
        //register the callback function to the gattc module
        ret = esp_ble_gattc_register_callback(esp_gattc_cb);
        if(ret){
            ESP_LOGE(GATTC_TAG, "%s gattc register failed, error code = %x\n", __func__, ret);
            return;
        }
    
        ret = esp_ble_gattc_app_register(PROFILE_A_APP_ID);
        if (ret){
            ESP_LOGE(GATTC_TAG, "%s gattc app register failed, error code = %x\n", __func__, ret);
        }
        esp_err_t local_mtu_ret = esp_ble_gatt_set_local_mtu(500);
        if (local_mtu_ret){
            ESP_LOGE(GATTC_TAG, "set local  MTU failed, error code = %x", local_mtu_ret);
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378
    • 379
    • 380
    • 381
    • 382
    • 383
    • 384
    • 385
    • 386
    • 387
    • 388
    • 389
    • 390
    • 391
    • 392
    • 393
    • 394
    • 395
    • 396
    • 397
    • 398
    • 399
    • 400
    • 401
    • 402
    • 403
    • 404
    • 405
    • 406
    • 407
    • 408
    • 409
    • 410
    • 411
    • 412
    • 413
    • 414
    • 415
    • 416
    • 417
    • 418
    • 419
    • 420
    • 421
    • 422
    • 423
    • 424
    • 425
    • 426
    • 427
    • 428
    • 429
    • 430
    • 431
    • 432
    • 433
    • 434
    • 435
    • 436
    • 437
    • 438
    • 439
    • 440
    • 441
    • 442
    • 443
    • 444
    • 445
    • 446
    • 447
    • 448
    • 449
    • 450
    • 451
    • 452
    • 453
    • 454
    • 455
    • 456
    • 457
    • 458
    • 459
    • 460
    • 461
    • 462
    • 463
    • 464
    • 465
    • 466
    • 467
    • 468
    • 469
    • 470
    • 471
    • 472
    • 473
    • 474
    • 475
    • 476
    • 477
    • 478
    • 479
    • 480
    • 481
    • 482
    • 483
    • 484
    • 485
    • 486
    • 487
    • 488
    • 489
    • 490
    • 491
    • 492
    • 493
    • 494
    • 495
    • 496
    • 497
    • 498
  • 相关阅读:
    【雕爷学编程】Arduino动手做(105)---压电陶瓷振动模块
    TS编译选项——TS文件编译后消除注释
    软件工程毕业设计课题(10)基于python的毕业设计python助农商城系统毕设作品源码
    No authorization token was found
    模块化Common JS 和 ES Module
    如何设置网络访问 SQL Express?
    什么是文件格式的幻数
    【业务功能篇106】 微服务-springcloud-springboot-电商订单模块--秒杀服务-定时任务【下篇】
    【金融】经济崛起之中的东南亚
    2010年11月10日 Go生态洞察:回顾Go语言的一年发展
  • 原文地址:https://blog.csdn.net/dmjkun/article/details/134076322