Page 1 of 1

BLE esp_ble_gatts_send_response() clarification

Posted: Wed Sep 15, 2021 9:10 am
by zazas321
Hello. I am learning the BLE and want to confirm regarding the esp_ble_gatts_send_response() method. I use lightblue app to connect between my ESP32 device and my phone.

When I click read on my lightblue APP, the read event is triggered and in my code, the following code is executed:

Code: Select all

case ESP_GATTS_READ_EVT:
ESP_LOGI(GATTS_TABLE_TAG, "ESP_GATTS_READ_EVT");
            esp_gatt_rsp_t rsp;
            memset(&rsp, 0, sizeof(esp_gatt_rsp_t));
            rsp.attr_value.handle = param->read.handle;
            rsp.attr_value.len = 4;
            rsp.attr_value.value[0] = 'r';
            rsp.attr_value.value[1] = 'e';
            rsp.attr_value.value[2] = 'a';
            rsp.attr_value.value[3] = 'd';
            esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, &rsp);
            break;


I can see the string "read" dispalyed on my lightblue app. So the esp_ble_gatts_send_response sends the data to the lightblue app right?

Now during my write event:

Code: Select all

case ESP_GATTS_WRITE_EVT:
            if (!param->write.is_prep){
                // the data length of gattc write  must be less than GATTS_DEMO_CHAR_VAL_LEN_MAX.
                ESP_LOGI(GATTS_TABLE_TAG, "GATT_WRITE_EVT, handle = %d, value len = %d, value :", param->write.handle, param->write.len);
                esp_log_buffer_hex(GATTS_TABLE_TAG, param->write.value, param->write.len);

                if (heart_rate_handle_table[IDX_CHAR_CFG_C] == param->write.handle && param->write.len == 2){
                    printf("inside if statement\n");
                    uint16_t descr_value = param->write.value[1]<<8 | param->write.value[0];
                    if (descr_value == 0x0001){
                        ESP_LOGI(GATTS_TABLE_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, heart_rate_handle_table[IDX_CHAR_VAL_C],
                                                sizeof(notify_data), notify_data, false);
                    }else if (descr_value == 0x0002){
                        ESP_LOGI(GATTS_TABLE_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, heart_rate_handle_table[IDX_CHAR_VAL_C],
                                            sizeof(indicate_data), indicate_data, true);
                    }
                    else if (descr_value == 0x0000){
                        ESP_LOGI(GATTS_TABLE_TAG, "notify/indicate disable ");
                    }else{
                        ESP_LOGE(GATTS_TABLE_TAG, "unknown descr value");
                        esp_log_buffer_hex(GATTS_TABLE_TAG, param->write.value, param->write.len);
                    }

                }


                // THIS WILL NEVER TRIGGER IF AUTO RSP IS SET
                /* send response when param->write.need_rsp is true*/
                if (param->write.need_rsp){
                    printf("******************PARAM NEED RESPONSE****************\n");
                    esp_gatt_rsp_t rsp;
                    memset(&rsp, 0, sizeof(esp_gatt_rsp_t));
                    rsp.attr_value.handle = param->read.handle;
                    rsp.attr_value.len = 5;
                    rsp.attr_value.value[0] = 'w';
                    rsp.attr_value.value[1] = 'r;
                    rsp.attr_value.value[2] = 'i';
                    rsp.attr_value.value[3] = 't';
                    rsp.attr_value.value[4] = 'e';
                    esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, &rsp);
                }
            }else{
                /* handle prepare write */
                printf("before exmaple prepare write event env \n");
                example_prepare_write_event_env(gatts_if, &prepare_write_env, param);
            }
      	    break;
As you can see, in my write event, I have this code:

Code: Select all

                if (param->write.need_rsp){
                    printf("******************PARAM NEED RESPONSE****************\n");
                    esp_gatt_rsp_t rsp;
                    memset(&rsp, 0, sizeof(esp_gatt_rsp_t));
                    rsp.attr_value.handle = param->read.handle;
                    rsp.attr_value.len = 5;
                    rsp.attr_value.value[0] = 'w';
                    rsp.attr_value.value[1] = 'r;
                    rsp.attr_value.value[2] = 'i';
                    rsp.attr_value.value[3] = 't';
                    rsp.attr_value.value[4] = 'e';
                    esp_ble_gatts_send_response(gatts_if, param->write.conn_id, param->write.trans_id, ESP_GATT_OK, &rsp);
                }

Since my characteristic is set to ESP_GATT_RSP_BY_APP this gets triggered and I want to display the string "write" as a response. But this does not get displayed on my lightblue app. Can someone help me understand why

Re: BLE esp_ble_gatts_send_response() clarification

Posted: Thu Sep 16, 2021 11:04 am
by zazas321
Still hoping to get clarification regarding this issue. I have not managed to solve it yet.

Re: BLE esp_ble_gatts_send_response() clarification

Posted: Wed Feb 28, 2024 1:13 am
by shaomingya
esp_ble_gatts_send_indicate(..., ..., ..., ..., ..., false);

Re: BLE esp_ble_gatts_send_response() clarification

Posted: Fri Apr 05, 2024 12:54 am
by jgustavoam
With this piece of code it is difficult to assess the problem.
But why are you activating indications and notifications?
Some data can only be sent if there are indications or notifications.

Good reference about BLE:
https://punchthrough.com/resources/

Re: BLE esp_ble_gatts_send_response() clarification

Posted: Fri May 10, 2024 5:29 pm
by eriksl
The receiver of notifications must have been subscribed to notifications (or indications) to actually receive them.