假設有兩個服務,每一個服務註冊相應事件code
註冊的事件爲ble_dev_cfg_on_ble_evt、ble_lora_cfg_on_ble_evtblog
當在任何一個服務中發生GATT特徵讀或寫的時候,註冊的這兩個服務事件都會發生而不是隻發生在相應特徵項所屬的事件事件
這點在特徵項讀寫權限訪問的時候須要注意,由於會在兩個服務事件中發生,因此要避免重複回覆的問題,不然會致使權限功能異常it
void ble_lora_cfg_on_ble_evt(ble_evt_t const * p_ble_evt, void * p_context) //發生GATT特性項讀寫的時候會進入此事件
{
ble_lora_cfg_t * p_lora_cfg = (ble_lora_cfg_t *)p_context;
switch (p_ble_evt->header.evt_id)
{
case BLE_GATTS_EVT_WRITE:
on_write(p_lora_cfg, p_ble_evt);
break;
case BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST:
on_read_write_auth(p_lora_cfg, p_ble_evt);
break;
default:
// No implementation needed.
break;
}
}
void ble_dev_cfg_on_ble_evt(ble_evt_t const * p_ble_evt, void * p_context) //發生GATT特性項讀寫的時候也會進入此事件
{
ble_dev_cfg_t * p_dev_cfg = (ble_dev_cfg_t *)p_context;
switch (p_ble_evt->header.evt_id)
{
case BLE_GATTS_EVT_WRITE:
on_write(p_dev_cfg, p_ble_evt);
break;
case BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST:
on_read_write_auth(p_dev_cfg, p_ble_evt);
break;
default:
// No implementation needed.
break;
}
}
也能夠在ble事件中去處理GATT事件而不是在每一個服務事件中處理:io
static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
{
ret_code_t err_code;
switch (p_ble_evt->header.evt_id)
{
case BLE_GATTS_EVT_WRITE:
//處理GATT寫事件
break;
case BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST:
//處理GATT讀寫權限請求事件
break;
}
}