我声明了一个notify的cccd,初始值为:DNA_BLE_GATT_CLIENT_CHAR_CONFIG_NOTIFY,代码如下
/* 6 读取服务CCCD初始化 */
{
DNA_BLE_ATTRIB_FLAG_VALUE_INCL | DNA_BLE_ATTRIB_FLAG_CCCD_APPL,
{
DNA_BLE_LO_WORD(DNA_BLE_GATT_UUID_CHAR_CLIENT_CONFIG),
DNA_BLE_HI_WORD(DNA_BLE_GATT_UUID_CHAR_CLIENT_CONFIG),
DNA_BLE_LO_WORD(DNA_BLE_GATT_CLIENT_CHAR_CONFIG_NOTIFY),
DNA_BLE_HI_WORD(DNA_BLE_GATT_CLIENT_CHAR_CONFIG_NOTIFY)
},
2,
NULL,
(DNA_BLE_GATT_PERM_READ | DNA_BLE_GATT_PERM_WRITE)
}
通过手机蓝牙调试助手,连接设备,获取服务器后,开启notify,无法接收到数据
手机APP,发送cccd为 1,即可接收数据,但是我在代码中已经初始化为DNA_BLE_GATT_CLIENT_CHAR_CONFIG_NOTIFY,为什么还需要再发送一次,我现在想实现手机不发送cccd 为1,即可收数据,请问该如何实现
wyy
3
按照 BLE 规格,CCCD 的默认值是 0x0000.
只有在 Bond 了之后,CCCD 的状态才能保留,下次链接可以恢复 CCCD 上次断开前的状态,直接发送数据。
你也可以尝试不理 CCCD 值,直接发送数据 notification。但是有没有效果应该就要看 APP 了。
我已经尝试过直接发送数据,底层回调直接显示错误,cause:0x0c0a,APP也收不到,现在的做法手机连接成功后,主动发一次cccd为1,但是我们用的其他芯片都不存在这个问题,在代码中无法修改么
wyy
5
问了一下,麻烦你试试在开启 BLE 时调用这个 function:
typedef enum
{
CONFIG_GATT_CCCD_CHECK, /**< Check cccd when server sends notification or indication. */
CONFIG_GATT_CCCD_NOT_CHECK, /**< Not check cccd when server sends notification or indication. */
} T_GAP_CONFIG_GATT_CCCD_NOT_CHECK;
/**
* @brief Configure whether to check cccd when server sends notification or indication.
*
* @param[in] cccd_not_check_flag Whether to check cccd: @ref T_GAP_CONFIG_GATT_CCCD_NOT_CHECK
*
* <b>Example usage</b>
* \code{.c}
void bt_stack_config_init(void)
{
gap_config_cccd_not_check(CONFIG_GATT_CCCD_NOT_CHECK);
}
* \endcode
*/
void gap_config_cccd_not_check(T_GAP_CONFIG_GATT_CCCD_NOT_CHECK cccd_not_check_flag);
好的,谢谢,之前的版本直接让APP增加了一条设置cccd的命令,我后面在试试,看说明,应该能解决