BLE esp_ble_gatts_send_response() clarification

zazas321
Posts: 64
Joined: Mon Feb 01, 2021 9:41 am

BLE esp_ble_gatts_send_response() clarification

Postby zazas321 » Wed Sep 15, 2021 9:10 am

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

zazas321
Posts: 64
Joined: Mon Feb 01, 2021 9:41 am

Re: BLE esp_ble_gatts_send_response() clarification

Postby zazas321 » Thu Sep 16, 2021 11:04 am

Still hoping to get clarification regarding this issue. I have not managed to solve it yet.

Who is online

Users browsing this forum: No registered users and 29 guests