BLE Gatts Write Event
Posted: Fri Aug 05, 2022 12:42 pm
Hi guys,
I just went through the "Gatt_Server_Example_Walkthrough.md file" provided in the ESP IDF's example folder.
My question is based around this code snippet:
what does
mean? Which values can param->write.value[0] and param->write.value[1] by left shifting and or'ing take such that you will get 0x0001, 0x0002 and 0x0000.
I know that param->write.value is a pointer to uint8_t, but I'm unaware how to receive those 0x0001, 0x0002 or 0x0000 values. Why do we cast to uint16_t (uint16_t descr_value)?
Thanks a lot for clarification
I just went through the "Gatt_Server_Example_Walkthrough.md file" provided in the ESP IDF's example folder.
My question is based around this code snippet:
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;
}
what does
Code: Select all
uint16_t descr_value= param->write.value[1]<<8 | param->write.value[0];
I know that param->write.value is a pointer to uint8_t, but I'm unaware how to receive those 0x0001, 0x0002 or 0x0000 values. Why do we cast to uint16_t (uint16_t descr_value)?
Thanks a lot for clarification