Amebaz2 - BLE CCCD Default

我声明了一个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,即可收数据,请问该如何实现

按照 BLE 规格,CCCD 的默认值是 0x0000.
只有在 Bond 了之后,CCCD 的状态才能保留,下次链接可以恢复 CCCD 上次断开前的状态,直接发送数据。


你也可以尝试不理 CCCD 值,直接发送数据 notification。但是有没有效果应该就要看 APP 了。

我已经尝试过直接发送数据,底层回调直接显示错误,cause:0x0c0a,APP也收不到,现在的做法手机连接成功后,主动发一次cccd为1,但是我们用的其他芯片都不存在这个问题,在代码中无法修改么

问了一下,麻烦你试试在开启 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);