完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我在做ESP32 BLE透传,通过串口透传数据。看到的例程都是手机app端读操作时触发ESP_GATTS_READ_EVT事件,然后发送数据。我想问如何主动发送数据,当连接后,串口有数据来是如何主动地将数据转发给到手机app端。有无例程参考
|
|
相关推荐
1个回答
|
|
要在ESP32上实现BLE透传并主动发送数据,您需要使用ESP-IDF框架。以下是实现这一功能的步骤:
1. 首先,确保您已经安装了ESP-IDF开发环境。如果没有,请访问 https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html 进行安装。 2. 创建一个新的ESP-IDF项目。在命令行中,输入以下命令: ``` mkdir my_ble_project cd my_ble_project mkdir components ``` 3. 将ESP-IDF的组件复制到您的项目中: ``` cp -r $IDF_PATH/components components ``` 4. 在项目根目录下创建一个名为`main`的文件夹,并在其中创建一个名为`app_main.c`的文件。在这个文件中,编写以下代码: ```c #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "esp_log.h" #include "nvs_flash.h" #include "driver/uart.h" #include "esp_bt.h" #include "esp_gap_ble_api.h" #include "esp_gatts_api.h" #define GATTS_SERVICE_UUID_TEST "4fafc201-1fb5-459e-8fcc-c5c9c331914b" #define GATTS_CHAR_UUID_TEST "beb5483e-36e1-4688-b7f5-ea07361b26a8" static const char *TAG = "BLE_EXAMPLE"; static uint8_t char_data[200]; static esp_gatt_if_t gatts_if = ESP_GATT_IF_NONE; static esp_ble_adv_params_t adv_params = { .adv_int_min = 0x20, .adv_int_max = 0x40, .adv_type = ADV_TYPE_IND, .own_addr_type = BLE_ADDR_TYPE_PUBLIC, .channel_map = ADV_CHNL_ALL, .adv_filter_policy = ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY, }; static void gatts_profile_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t gatts_if, esp_ble_gatts_cb_param_t *param); /* One gatt-based profile one app_id and one gatts_if, this array will store the gatts_if returned by ESP_GATTS_REG_EVT */ static esp_gatt_if_t gatts_profile_tab[PROFILE_A_APP_ID] = {ESP_GATT_IF_NONE}; static void init_ble(void) { esp_err_t ret; // Initialize NVS. 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_bt_controller_config_t bt_cfg = BT_CONTROLLER_CFG_DEFAULT(); ret = esp_bt_controller_init(&bt_cfg); if (ret) { ESP_LOGE(TAG, "%s initialize controller failed: %sn", __func__, esp_err_to_name(ret)); return; } ret = esp_bt_controller_enable(ESP_BT_MODE_BLE); if (ret) { ESP_LOGE(TAG, "%s enable controller failed: %sn", __func__, esp_err_to_name(ret)); return; } ret = esp_bluedroid_init(); if (ret) { ESP_LOGE(TAG, "%s init bluetooth failed: %sn", __func__, esp_err_to_name(ret)); return; } ret = esp_bluedroid_enable(); if (ret) { ESP_LOGE(TAG, "%s enable bluetooth failed: %sn", __func__, esp_err_to_name(ret)); return; } ret = esp_ble_gatts_register_callback(gatts_profile_event_handler); if (ret){ ESP_LOGE(TAG, "gatts register error, error code = %x", ret); return; } ret = esp_ble_gap_register_callback(esp_gap_ble_cb); if (ret){ ESP_LOGE(TAG, "gap register error, error code = %x", ret); return; } ret = esp_ble_gap_set_device_name("ESP32_BLE"); if (ret){ ESP_LOGE(TAG, "set device name failed, error code = %x", ret); return; } ret = esp_ble_gap_config_adv_data_raw((uint8_t *)adv_data, sizeof(adv_data)); if (ret){ ESP_LOGE(TAG, "config adv data failed, error code = %x", ret); return; } esp_ble_gatts_app_register(0x55); esp_err_t local_mtu_ret = esp_ble |
|
|
|
只有小组成员才能发言,加入小组>>
1108 浏览 1 评论
574浏览 6评论
477浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
460浏览 5评论
461浏览 4评论
435浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 17:53 , Processed in 0.761941 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号