ESP32 GATTC配置UUID

ESP32 GATTC修改UUID

16bit和32bit UUID

ESP32的GATTC demo可以与GATTS demo实现互相通信,UUID的配置也十分简单。

以下是demo中的UUID配置。

注意:16bit和32bit的UUID只需要设置UUID的前16bit或者32bit,剩余的bit使用的是Bluetooth_Base_UUID:xxxxxxxx-0000-1000-8000-00805F9B34FB

#define REMOTE_SERVICE_UUID        0x00FF
#define REMOTE_NOTIFY_CHAR_UUID    0xFF01
......
//Server UUID
static esp_bt_uuid_t remote_filter_service_uuid = {
    .len = ESP_UUID_LEN_16,
    .uuid = {.uuid16 = REMOTE_SERVICE_UUID,},
};
//notify UUID
static esp_bt_uuid_t remote_filter_char_uuid = {
    .len = ESP_UUID_LEN_16,
    .uuid = {.uuid16 = REMOTE_NOTIFY_CHAR_UUID,},
};
//Characteristic UUID
static esp_bt_uuid_t notify_descr_uuid = {
    .len = ESP_UUID_LEN_16,
    .uuid = {.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG,},
};

128bit UUID

当GATTS所使用的UUID不是Bluetooth_Base_UUID的时候,需要把Server的UUID完整写入。此时,就不能按demo的写法进行修改,因为数据过长,需要使用数组配置UUID。

注意:UUID的数组需要低位写在前,高位写在后。也就是说要倒过来写

typedef struct {
#define ESP_UUID_LEN_16     2
#define ESP_UUID_LEN_32     4
#define ESP_UUID_LEN_128    16
    uint16_t len;							/*!< UUID length, 16bit, 32bit or 128bit */
    union {
        uint16_t    uuid16;
        uint32_t    uuid32;
        uint8_t     uuid128[ESP_UUID_LEN_128];
    } uuid;									/*!< UUID */
} __attribute__((packed)) esp_bt_uuid_t;
.................................................................
//Server UUID
static esp_bt_uuid_t remote_filter_service_uuid = {
    .len = ESP_UUID_LEN_128,
    /* LSB <--------------------------------------------------------------------------------> MSB */
    .uuid = {.uuid128 = {0x9e,0xca,0xdc,0x24,0x0e,0xe5,0xa9,0xe0,0x93,0xf3,0xa3,0xb5,0x01,0x00,0x40,0x6e},},
};
//notify UUID
static esp_bt_uuid_t remote_filter_char_uuid = {
    .len = ESP_UUID_LEN_128,
	/* LSB <--------------------------------------------------------------------------------> MSB */
    .uuid = {.uuid128 = {0x9e,0xca,0xdc,0x24,0x0e,0xe5,0xa9,0xe0,0x93,0xf3,0xa3,0xb5,0x03,0x00,0x40,0x6e},},
};
//Characteristic UUID
static esp_bt_uuid_t notify_descr_uuid = {
    .len = ESP_UUID_LEN_16,
    .uuid = {.uuid16 = ESP_GATT_UUID_CHAR_CLIENT_CONFIG,},
};

Server UUID格式未知

如果不清楚UUID的格式,可以使用nrf connect等手机APP。

也可以通过demo中的回调函数输出目标蓝牙的所有server uuid。(demo通过蓝牙名称进行连接)

1、首先在discover service complete回调中修改server搜索函数,把按server uuid搜索改成NULL,搜索所有uuid。

    case ESP_GATTC_DIS_SRVC_CMPL_EVT:
        if (param->dis_srvc_cmpl.status != ESP_GATT_OK) {
            ESP_LOGE(COEX_TAG, "discover service failed, status %d\n", param->dis_srvc_cmpl.status);
            break;
        }
        ESP_LOGI(COEX_TAG, "discover service complete conn_id %d\n", param->dis_srvc_cmpl.conn_id);

        //esp_ble_gattc_search_service(gattc_if, param->cfg_mtu.conn_id, &remote_filter_service_uuid);
        esp_ble_gattc_search_service(gattc_if, param->cfg_mtu.conn_id, NULL);
        break;

2、然后在service discovery result is got的回调中输出所有服务的uuid长度以及具体数据。

    case ESP_GATTC_SEARCH_RES_EVT: 
        ESP_LOGI(COEX_TAG, "SEARCH RES: conn_id = %x is primary service %d\n", p_data->search_res.conn_id, p_data->search_res.is_primary);
        ESP_LOGI(COEX_TAG, "start handle %d end handle %d current handle value %d\n", p_data->search_res.start_handle, p_data->search_res.end_handle, p_data->search_res.srvc_id.inst_id);
        printf("--------------------------\r\n");
        for(int i=0;i<16;i++){
            printf("%02x",p_data->search_res.srvc_id.uuid.uuid.uuid128[i]);
            
        }
         printf("uuid_len = %d\r\n",p_data->search_res.srvc_id.uuid.len);
         printf("--------------------------\r\n");
        
        if (p_data->search_res.srvc_id.uuid.len == ESP_UUID_LEN_128 && memcmp(p_data->search_res.srvc_id.uuid.uuid.uuid128,remote_uuid,16) == 0/*p_data->search_res.srvc_id.uuid.uuid.uuid16 == REMOTE_SERVICE_UUID*/) {
            ESP_LOGI(COEX_TAG, "service found\n");
            get_server = true;
            gattc_profile_tab[GATTC_PROFILE_C_APP_ID].service_start_handle = p_data->search_res.start_handle;
            gattc_profile_tab[GATTC_PROFILE_C_APP_ID].service_end_handle = p_data->search_res.end_handle;
            ESP_LOGI(COEX_TAG, "UUID16: %s\n", p_data->search_res.srvc_id.uuid.uuid.uuid128);
        }
        break;

3、最后按得到的UUID配置自己的UUID即可。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: ESP32 GATTC_MULTI_CONNECT 是ESP32蓝牙 GATTC(Generic Attribute Profile - Client)库中的一个功能,它允许ESP32与多个GATT服务器建立连接。 GATT是蓝牙技术中的一部分,用于在蓝牙设备之间传输数据。GATT客户端表示蓝牙设备作为数据接收方,它能够连接到一个或多个GATT服务器,并从这些服务器读取数据或向它们写入数据。 ESP32是一款功能强大的蓝牙开发板,其中一个重要的特性是其蓝牙支持。通过使用ESP32的GATTC_MULTI_CONNECT功能,开发人员能够在一个ESP32设备上同时连接到多个GATT服务器。 这个功能有很多实际应用场景。比如,一个智能家居系统可能有多个传感器设备,每个设备都提供了自己的GATT服务器以供数据读取和控制。通过GATTC_MULTI_CONNECT功能,ESP32可以同时连接到所有这些设备,从中读取数据并控制它们。 另一个例子是物联网中的传感器网络。在一个物联网传感器网络中,可能有多个传感器节点,每个节点都可以通过蓝牙与中心节点通信。通过ESP32的GATTC_MULTI_CONNECT功能,中心节点可以同时连接到多个传感器节点,从它们中读取数据并采取相应的措施。 总结而言,ESP32 GATTC_MULTI_CONNECT功能使得ESP32能够同时连接到多个GATT服务器。这个功能在智能家居系统、物联网传感器网络等场景中具有重要意义,可以实现多设备数据读取和控制。 ### 回答2: ESP32 GATTC_MULTI_CONNECT是ESP32蓝牙库中的一个特性,它允许ESP32设备通过GATT客户端同时连接多个GATT服务器。GATT是一种通用属性配置文件,它定义了在蓝牙低功耗设备之间进行数据传输的方式。 通常情况下,蓝牙设备只能与一个GATT服务器进行连接。但是,有些应用场景需要与多个GATT服务器通信,例如在智能家居系统中控制多个设备。这就需要使用到GATTC_MULTI_CONNECT特性。 通过使用GATTC_MULTI_CONNECT,ESP32设备可以同时与多个GATT服务器进行连接,并在这些连接之间切换。在每个连接上,设备可以执行各种GATT操作,如读取属性、写入属性、订阅通知等。 此外,ESP32的GATTC_MULTI_CONNECT还提供了一些优化,以提高多个连接之间的并发性能。例如,设备可以根据每个连接的优先级来动态调整操作的时间分配,从而实现更好的响应速度。 使用ESP32 GATTC_MULTI_CONNECT时,开发人员需要注意以下几点: 1. 需要初始化和配置多个GATT连接。可以使用ESP-IDF提供的API来实现。 2. 可以为每个连接设置不同的处理器回调函数,以处理在每个连接上的GATT事件。 3. 需要关注连接的优先级和操作的时间分配,以实现最佳性能和响应。 4. 需要注意设备的资源和容量限制,以避免连接过多导致性能下降或系统崩溃。 总而言之,ESP32 GATTC_MULTI_CONNECT是ESP32蓝牙库中的一个功能强大的特性,使得ESP32设备可以同时与多个GATT服务器进行连接,为各种应用场景提供了更大的灵活性和可扩展性。 ### 回答3: ESP32的Gattc_multi_connect是一个针对多个连接设备的GATT(通用属性)客户端的功能。ESP32是一种集成了Wi-Fi和蓝牙功能的微控制器,它支持同时与多个蓝牙设备建立连接。 Gattc_multi_connect允许ESP32与多个蓝牙设备同时通信。在使用Gattc_multi_connect之前,我们需要先在ESP32上初始化一个GATT客户端,并为每个要连接的设备创建一个连接配置。接下来,我们可以使用Gattc_multi_connect来连接到多个设备,并同时进行数据交换。 Gattc_multi_connect提供了以下函数用于管理多个GATT连接: 1. esp_ble_gattc_multi_get_service:使用此函数可以获取多个连接中的所有GATT服务。 2. esp_ble_gattc_multi_get_characteristic:此函数可以获取多个连接中的所有GATT特征。 3. esp_ble_gattc_multi_get_descriptor:使用此函数可以获取多个连接中的所有GATT描述符。 4. esp_ble_gattc_multi_register_for_notify:使用此函数可以在多个连接上注册通知事件。 5. esp_ble_gattc_multi_unregister_for_notify:此函数用于取消在多个连接上注册的通知事件。 通过使用Gattc_multi_connect功能,我们可以方便地在ESP32上与多个蓝牙设备进行交互。这对于需要同时与多个设备进行通信的应用程序非常有用,例如智能家居系统或传感器网络。同时,ESP32的Gattc_multi_connect功能还提供了灵活的管理和控制多个连接的能力,以便满足不同应用场景的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值