Discuz! Board

标题: 同一个服务下的多个特征回调 [打印本页]

作者: skystaryz    时间: 2017-6-11 20:16
标题: 同一个服务下的多个特征回调
我在串口例程中添加了几个自定义的特征值,目前只能用特征的通知功能,可是自定义添加的这些特征值怎么用呢,现在还没搞明白
static void nus_data_handler(ble_nus_t * p_nus, uint8_t * p_data, uint16_t length)
{

         for (uint32_t i = 0; i < length; i++)
    {
        while(app_uart_put(p_data[i]) != NRF_SUCCESS);
    }
    while(app_uart_put('\n') != NRF_SUCCESS);
}

接收到的数据是在这串口的回调函数中通过判断p_nus的值来区分吗,还有手机APP读取数据是怎么处理呢,怎么使用有哪位大神可以帮忙解答下





作者: admin    时间: 2017-6-12 09:03
特征值相当于子服务,你定义特征值是干什么的,这个要想清楚。APP读取数据就和按键通知那个一样,蓝牙空中属性是通知类型
作者: skystaryz    时间: 2017-6-12 23:35
admin 发表于 2017-6-12 09:03
特征值相当于子服务,你定义特征值是干什么的,这个要想清楚。APP读取数据就和按键通知那个一样,蓝牙空中 ...

例如将串口例程中的RX和TX特征修改为同时具有Notify,read和write属性,在回调函数中怎么区分read和write数据,数据分别是来自哪个特征的
static void on_write(ble_nus_t * p_nus, ble_evt_t * p_ble_evt)
{
    ble_gatts_evt_write_t * p_evt_write = &p_ble_evt->evt.gatts_evt.params.write;

    if (
        (p_evt_write->handle == p_nus->rx_handles.cccd_handle)
        &&
        (p_evt_write->len == 2)
       )
    {
        if (ble_srv_is_notification_enabled(p_evt_write->data))
        {
            p_nus->is_notification_enabled = true;
        }
        else
        {
            p_nus->is_notification_enabled = false;
        }
    }
    else if (
             (p_evt_write->handle == p_nus->tx_handles.value_handle)
             &&
             (p_nus->data_handler != NULL)
            )
    {
        p_nus->data_handler(p_nus, p_evt_write->data, p_evt_write->len);
    }
    else
    {
        // Do Nothing. This event is not relevant for this service.
    }
}

感觉app给芯片write数据应该是通过p_evt_write->handle == p_nus->tx_handles.value_handle来判断,不知道对不对,那么read(就是APP主动读取数据不是Notify给APP)是怎么处理呢




欢迎光临 Discuz! Board (http://www.qfv8.com/) Powered by Discuz! X3