NORDIC GATT事件

假设有两个服务,每个服务注册相应事件

注册的事件为ble_dev_cfg_on_ble_evt、ble_lora_cfg_on_ble_evt

当在任何一个服务中发生GATT特征读或写的时候,注册的这两个服务事件都会发生而不是只发生在相应特征项所属的事件

这点在特征项读写权限访问的时候需要注意,因为会在两个服务事件中发生,所以要避免重复回复的问题,否则会导致权限功能异常

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事件而不是在每个服务事件中处理:

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;
 }
}

 

posted @ 2019-08-14 14:48  yeshenmeng  阅读(891)  评论(0编辑  收藏  举报