Adding more than characteristic to same service

mohamed.elsabagh
Posts: 6
Joined: Wed Apr 04, 2018 1:44 am

Adding more than characteristic to same service

Postby mohamed.elsabagh » Wed Apr 04, 2018 1:50 am

Hello, I am using esp32 esp-idf GATT server example, I would like to add more than one service to the same profile and more than characteristic to the same service, is there is an example how can this be done?

chegewara
Posts: 2376
Joined: Wed Jun 14, 2017 9:00 pm

Re: Adding more than characteristic to same service

Postby chegewara » Wed Apr 04, 2018 5:27 am

This is great info about creating BLE server:
https://github.com/espressif/esp-idf/bl ... through.md

Except this code, because its worst code ever:
https://github.com/espressif/esp-idf/bl ... ite-events

Code: Select all

case ESP_GATTS_WRITE_EVT: {                          
     ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, conn_id %d, trans_id %d, handle %d\n", param->write.conn_id, param->write.trans_id, param->write.handle);
     if (!param->write.is_prep){
        ESP_LOGI(GATTS_TAG, "GATT_WRITE_EVT, value len %d, value :", param->write.len);
        esp_log_buffer_hex(GATTS_TAG, param->write.value, param->write.len);
        if (gl_profile_tab[PROFILE_B_APP_ID].descr_handle == param->write.handle && param->write.len == 2){
            uint16_t descr_value= param->write.value[1]<<8 | param->write.value[0];
            if (descr_value == 0x0001){
                if (b_property & ESP_GATT_CHAR_PROP_BIT_NOTIFY){
                    ESP_LOGI(GATTS_TAG, "notify enable");
                    uint8_t notify_data[15];
                    for (int i = 0; i < sizeof(notify_data); ++i)
                    {
                         notify_data[i] = i%0xff;  
                     }
                     //the size of notify_data[] need less than MTU size
                     esp_ble_gatts_send_indicate(gatts_if, param->write.conn_id,  
                                                 gl_profile_tab[PROFILE_B_APP_ID].char_handle,  
                                                 sizeof(notify_data),  
                                                 notify_data, false);
                }
            }else if (descr_value == 0x0002){
                 if (b_property & ESP_GATT_CHAR_PROP_BIT_INDICATE){
                     ESP_LOGI(GATTS_TAG, "indicate enable");
                     uint8_t indicate_data[15];
                     for (int i = 0; i < sizeof(indicate_data); ++i)
                     {
                         indicate_data[i] = i % 0xff;
                      }
                      //the size of indicate_data[] need less than MTU size
                     esp_ble_gatts_send_indicate(gatts_if, param->write.conn_id,  
                                                 gl_profile_tab[PROFILE_B_APP_ID].char_handle,  
                                                 sizeof(indicate_data),  
                                                 indicate_data, true);
                }
             }
             else if (descr_value == 0x0000){
                 ESP_LOGI(GATTS_TAG, "notify/indicate disable ");
             }else{
                 ESP_LOGE(GATTS_TAG, "unknown value");
             }
        }
    }
    example_write_event_env(gatts_if, &a_prepare_write_env, param);
    break;
}

mohamed.elsabagh
Posts: 6
Joined: Wed Apr 04, 2018 1:44 am

Re: Adding more than characteristic to same service

Postby mohamed.elsabagh » Sat Apr 07, 2018 8:17 am

Thanks so much, I had a look but still can't find how to add several service to the same profile
```
struct gatts_profile_inst {
esp_gatts_cb_t gatts_cb;
uint16_t gatts_if;
uint16_t app_id;
uint16_t conn_id;
uint16_t service_handle;
esp_gatt_srvc_id_t service_id;
uint16_t char_handle;
esp_bt_uuid_t char_uuid;
esp_gatt_perm_t perm;
esp_gatt_char_prop_t property;
uint16_t descr_handle;
esp_bt_uuid_t descr_uuid;
};
```

for a profile there is only one service can be defined in the structure, I think I am missing something

chegewara
Posts: 2376
Joined: Wed Jun 14, 2017 9:00 pm

Re: Adding more than characteristic to same service

Postby chegewara » Sun Apr 08, 2018 4:15 am

https://github.com/espressif/esp-idf/bl ... n-profiles

Profile is a single service and you can have more than one profile. Two profiles means 2 services:

Code: Select all

static struct gatts_profile_inst gl_profile_tab[PROFILE_NUM] = {
    [PROFILE_A_APP_ID] = {
        .gatts_cb = gatts_profile_a_event_handler,
        .gatts_if = ESP_GATT_IF_NONE,
    [PROFILE_B_APP_ID] = {
        .gatts_cb = gatts_profile_b_event_handler,
        .gatts_if = ESP_GATT_IF_NONE,
    },
};
with callback handler registered for each profile (service).

mohamed.elsabagh
Posts: 6
Joined: Wed Apr 04, 2018 1:44 am

Re: Adding more than characteristic to same service

Postby mohamed.elsabagh » Wed Apr 11, 2018 1:43 pm

but shouldn't a profile according the BLE standard can hold more than one service?

Who is online

Users browsing this forum: adarsh-k, Google [Bot] and 133 guests