蓝牙添加子服务问题

Robert-qiao
Posts: 22
Joined: Tue Aug 31, 2021 8:28 am

蓝牙添加子服务问题

Postby Robert-qiao » Fri Nov 26, 2021 3:56 am

蓝牙中开启自定义服务之后,添加了一个子服务,怎么添加第二子服务啊
Image
按照我的理解,在创建第一个子服务时候,改变属性以及UUID后再添加一次就可以,但是不行啊;

Code: Select all

    case ESP_GATTS_CREATE_EVT:
        ESP_LOGE(GATTS_TAG, "CREATE_SERVICE_EVT, status %d,  service_handle %d\n", param->create.status, param->create.service_handle);
        // ESP_LOGI(GATTS_TAG, "CREATE_SERVICE_EVT, status %d,  service_handle %d\n", param->create.status, param->create.service_handle);
        gl_profile_tab[PROFILE_A_APP_ID].service_handle = param->create.service_handle;
        gl_profile_tab[PROFILE_A_APP_ID].char_uuid.len = ESP_UUID_LEN_128;
        // gl_profile_tab[PROFILE_A_APP_ID].char_uuid.uuid.uuid16 = GATTS_CHAR_UUID_TEST_A;
        for (int i = 0; i < 16; i++)
        {
            /* code */
            gl_profile_tab[PROFILE_A_APP_ID].char_uuid.uuid.uuid128[i] = adv_service_uuid128[i];
        }
        

        esp_ble_gatts_start_service(gl_profile_tab[PROFILE_A_APP_ID].service_handle);
        a_property = ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_NOTIFY;//ESP_GATT_CHAR_PROP_BIT_READ | ESP_GATT_CHAR_PROP_BIT_WRITE | ESP_GATT_CHAR_PROP_BIT_NOTIFY;
        esp_err_t add_char_ret = esp_ble_gatts_add_char(gl_profile_tab[PROFILE_A_APP_ID].service_handle, &gl_profile_tab[PROFILE_A_APP_ID].char_uuid,
                                                        ESP_GATT_PERM_WRITE,///ESP_GATT_PERM_READ | ESP_GATT_PERM_WRITE,
                                                        a_property,
                                                        &gatts_demo_char1_val, NULL);

        if (add_char_ret){
            ESP_LOGE(GATTS_TAG, "add char failed, error code =%x",add_char_ret);
        }
Attachments
Screenshot_20211126_114504_no.nordicsemi.android.mcp.jpg.jpg
Screenshot_20211126_114504_no.nordicsemi.android.mcp.jpg.jpg (255.02 KiB) Viewed 17240 times

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: 蓝牙添加子服务问题

Postby ESP_XuLZ » Fri Nov 26, 2021 6:23 am

你好,你是想在一个 profile 下添加多个 service, 还是想在 一个 service 下添加多个 characteristic ?, 后者还需要注意 service 的handle 范围 ,如果 characteristic 不在 service 的handle 范围内也是不显示的

推荐你使用 gatt_server_sercive_table 示例作为参考,这样变动 service 或 characteristic 都很方便

Robert-qiao
Posts: 22
Joined: Tue Aug 31, 2021 8:28 am

Re: 蓝牙添加子服务问题

Postby Robert-qiao » Sat Nov 27, 2021 7:07 am

ESP_XuLZ wrote:
Fri Nov 26, 2021 6:23 am
你好,你是想在一个 profile 下添加多个 service, 还是想在 一个 service 下添加多个 characteristic ?, 后者还需要注意 service 的handle 范围 ,如果 characteristic 不在 service 的handle 范围内也是不显示的

推荐你使用 gatt_server_sercive_table 示例作为参考,这样变动 service 或 characteristic 都很方便

问题是后者,尝试了下,按照例程是可以添加多个Characteristic,但是另一个问题,我怎么修改UUID啊,修改全部的UUID为自定义的,
按照我的理解我将

Code: Select all

    // Service Declaration
    [IDX_SVC]        =
    {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&primary_service_uuid, ESP_GATT_PERM_READ,
      sizeof(uint16_t), sizeof(GATTS_SERVICE_UUID_TEST), (uint8_t *)&GATTS_SERVICE_UUID_TEST}},

修改为:

Code: Select all

    // Service Declaration
    [IDX_SVC]        =
    {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_128, (uint8_t *)&primary_service_uuid, ESP_GATT_PERM_READ,
      sizeof(uint16_t), sizeof(adv1_service_uuid128), (uint8_t *)&adv1_service_uuid128}},
是不行的啊

Robert-qiao
Posts: 22
Joined: Tue Aug 31, 2021 8:28 am

Re: 蓝牙添加子服务问题

Postby Robert-qiao » Sat Nov 27, 2021 7:08 am

其中adv1_service_uuid128为自定义UUID:

Code: Select all

static uint8_t adv1_service_uuid128[16] = {
    /* LSB <--------------------------------------------------------------------------------> MSB */
    //first uuid, 16bit, [12],[13] is the value
    //0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xEE, 0x00, 0x00, 0x00,
    //second uuid, 32bit, [12], [13], [14], [15] is the value
    //0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
    // self define
    0x9d, 0xca, 0xdc, 0x24, 0x0e, 0xe5, 0xa9, 0xe0, 0x93, 0xf3, 0xa3, 0xb5, 0x01, 0x00, 0x40, 0x6e,
};

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: 蓝牙添加子服务问题

Postby ESP_XuLZ » Sun Nov 28, 2021 7:24 am

对于服务声明这条属性,可以修改为以下代码

Code: Select all

    // Service Declaration
    [IDX_SVC]        =
    //   sizeof(uint16_t), sizeof(GATTS_SERVICE_UUID_TEST), (uint8_t *)&GATTS_SERVICE_UUID_TEST}},
    {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&primary_service_uuid, ESP_GATT_PERM_READ,
      sizeof(adv1_service_uuid128), sizeof(adv1_service_uuid128), (uint8_t *)&adv1_service_uuid128}},

对于属性表中的属性,还不支持使用 128bit 的 UUID创建,可以看下 btc_gatts_act_create_attr_tab 中的代码中的逻辑

Robert-qiao
Posts: 22
Joined: Tue Aug 31, 2021 8:28 am

Re: 蓝牙添加子服务问题

Postby Robert-qiao » Mon Nov 29, 2021 9:08 am

ESP_XuLZ wrote:
Sun Nov 28, 2021 7:24 am
对于服务声明这条属性,可以修改为以下代码

Code: Select all

    // Service Declaration
    [IDX_SVC]        =
    //   sizeof(uint16_t), sizeof(GATTS_SERVICE_UUID_TEST), (uint8_t *)&GATTS_SERVICE_UUID_TEST}},
    {{ESP_GATT_AUTO_RSP}, {ESP_UUID_LEN_16, (uint8_t *)&primary_service_uuid, ESP_GATT_PERM_READ,
      sizeof(adv1_service_uuid128), sizeof(adv1_service_uuid128), (uint8_t *)&adv1_service_uuid128}},

对于属性表中的属性,还不支持使用 128bit 的 UUID创建,可以看下 btc_gatts_act_create_attr_tab 中的代码中的逻辑
既然这样是不支持128bitde UUID创建,那请问我如果想将UUID全部修改的话,如何去实现那

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: 蓝牙添加子服务问题

Postby ESP_XuLZ » Mon Nov 29, 2021 9:21 am

我上述所说的可能有些歧义,在服务声明这条属性里面有两个 UUID ,一个 是0x2800, 这是标识这条属性是服务声明的,而另一个UUID 是属性值中的UUID,是你要显示出来的;所以我上述的修改方法是可以让 128bit UUID全部显示为你修改了的;而 0x2800 这类 UUID 是不必要也不需要修改为 128bit 的UUID

Robert-qiao
Posts: 22
Joined: Tue Aug 31, 2021 8:28 am

Re: 蓝牙添加子服务问题

Postby Robert-qiao » Tue Dec 07, 2021 7:26 am

ESP_XuLZ wrote:
Mon Nov 29, 2021 9:21 am
我上述所说的可能有些歧义,在服务声明这条属性里面有两个 UUID ,一个 是0x2800, 这是标识这条属性是服务声明的,而另一个UUID 是属性值中的UUID,是你要显示出来的;所以我上述的修改方法是可以让 128bit UUID全部显示为你修改了的;而 0x2800 这类 UUID 是不必要也不需要修改为 128bit 的UUID
所以说这里面是不是有一种冲突,就是我想加入多个Char但是不能修改UUID;能够修改UUID的话只能添加一个有用的CHAR;
请教是这样的逻辑吗?

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: 蓝牙添加子服务问题

Postby ESP_XuLZ » Tue Dec 07, 2021 8:20 am

不冲突,可以修改多个 CHAR 的 UUID, 也可以修改 SERVICE 的 UUID, 附件中的文件是在 gatt_server_service_table 例程上修改两个 CHAR UUID 和 SERVICE UUID 的操作,你对比下原 DEMO, 然后再进行修改你自己的应用
Attachments
gatts_table_creat_demo.c
(24.67 KiB) Downloaded 743 times

Who is online

Users browsing this forum: Google [Bot] and 79 guests