原文链接:
蓝牙BLE句柄指示\确认(Handle Value Indication\Confirmation)(CH582) - SweetTea_lllpc - 博客园 (cnblogs.com)
前言:
CH583 是集成 BLE 无线通讯的 RISC-V MCU 微控制器。一般在使用BLE协议进行数据传输,会优先考虑Peripheral(外设从机角色例程)。在CH582的SDK中,自定义包含五种不同属性的服务,包含可读、可写、通知、可读可写、安全可读,唯独没有indication属性的特征值。本篇博客针对Indication使用进行讲解。
一、indication属性原理
当Server想要Client发送快速的属性状态更新时,它可以发送一条句柄值通知(Notification)。这是Server能够发给Client的两种消息中的一种,并且是不要求响应的。Server可以在任何时刻发送该Notification,同时该Notification也是不可靠的。
句柄值指示(Indication)类似于Notification,它有着相同的属性句柄字段和数值,不同的是Client收到Indication以后需要回复。Server一次只能发送一条Indication,并且只有在收到确认响应(Confirmation)后才能发起下一条Indication。这些行为都是在GATT层完成。由于有自动确认机制,Indication在很多应用层级的协议制定中有比较广泛应用。
二、CH58x芯片Indication的实现
由于Peripheral例程中已包含了Notification的功能,通道4进行Noti数据传输。本篇博客基于该功能进行修改,对以前只接触过Notification的小白来说更加通俗易懂。
1、特征值4属性修改,给Characteristic 的属性添加indication 属性
static uint8_t simpleProfileChar4Props = GATT_PROP_INDICATE;
按照如上修改配置文件属性后,对应的属性表也配置成功了,不需要再进行修改,默认的Noti已经配置好属性表
// Characteristic Value 4
{
{ATT_BT_UUID_SIZE, simpleProfilechar4UUID},
0,
0,
simpleProfileChar4},
2、配置文件修改,在peripheral.c文件夹中基于Notification进行修改
static void peripheralChar4Notify(uint8_t *pValue, uint16_t len)
{
#if 0 //原始程序是Noti
attHandleValueNoti_t noti;
if(len > (peripheralMTU - 3))
{
PRINT("Too large noti\n");
return;
}
noti.le