蓝牙扩展协议(RCSP/广播/无线麦克风)
本文档介绍杰理(Jieli)AC79 AIoT SDK 中基于 BLE 的私有扩展协议体系,包括 RCSP(Remote Control and Service Protocol)主协议、广播(Broadcast)扩展以及无线麦克风等衍生能力。这些扩展建立在标准 BLE GATT 之上,为手机 APP 与设备(耳机、音箱、手表等)之间提供远程控制、状态同步、OTA 升级与数据透传通道。
Purpose and Scope
本页覆盖 apps/common/third_party_profile/jieli/rcsp/ 目录下 RCSP 扩展协议栈的完整机制:
- RCSP 协议的 GATT 服务定义(
ae00私有服务、ae01/ae02特征值)与数据收发通道; - 广播(Broadcast)扩展模块
ble_rcsp_adv,负责广播数据(ADV/Scan Response)的组织与版本协商; - 命令分发体系
cmd_data_deal下的功能模块(音乐、蓝牙、FM、LineIn、浏览器等); - 多连接透传框架
ble_rcsp_multi_*(多客户端、多设备间数据转发); - 无线麦克风等场景在扩展通道上的承载方式。
以下主题属于其他页面,不在本页展开:经典蓝牙(BR/EDR)协议栈、标准 BLE GAP/GATT 协议栈底层、TWS 经典蓝牙互联(见 TWS 相关页面)、OTA 升级的具体镜像流程(rcsp_update,仅在本页提及接口边界)。
Overview
RCSP 是杰理为自家蓝牙 SoC 定义的私有 BLE 应用层协议,设计目标是为 APP 提供一个统一、可靠、可扩展的设备控制通道。与标准 HID/ANCS 等 Profile 不同,RCSP 通过自定义服务 0xAE00 承载全部控制指令,把「音乐控制、音量调节、EQ 设置、设备信息查询、固件升级、消息推送」等能力统一收敛到一对读写特征值上,从而:
- 降低 APP 适配成本:APP 只需连接一个服务、订阅一个通知特征即可获得全部能力;
- 支持能力扩展:功能以「功能模块 + 命令字」方式组织(
rcsp_music_func、rcsp_bt_func等),新增能力无需改动 GATT 表; - 兼顾低功耗与实时性:使用 Write Without Response 上行、Notify 下行,配合 247 字节 ATT 载荷,兼顾吞吐与功耗;
- 与广播能力结合:
ble_rcsp_adv将设备信息、版本号等放入广播包,使 APP 在连接前即可识别设备身份与能力(如「先连 BLE 再连 EDR」的握手策略)。
无线麦克风(Wireless Mic)与广播(Broadcast)能力在 SDK 中复用同一扩展通道:设备间通过 RCSP 多连接透传(ble_rcsp_multi_trans)或广播 ADV 数据交换实现音频路由/状态同步,属于同一协议族的衍生应用场景。
Architecture
flowchart TD
subgraph sg_App["手机 APP 侧"]
APP["杰理 APP / 第三方 APP"]
end
subgraph sg_BLE["BLE 协议栈层"]
GATT["GATT Server (profile_data)"]
AE00["私有服务 0xAE00"]
AE01["特征 ae01 WRITE_NO_RSP<br/>handle 0x0082"]
AE02["特征 ae02 NOTIFY<br/>handle 0x0084"]
CCCD["CCCD handle 0x0085"]
end
subgraph sg_RCSP["RCSP 主模块 (ble_rcsp_module)"]
MODULE["BLE RCSP Module"]
ADV["广播扩展 ble_rcsp_adv<br/>ADV/ScanRsp 31B×2"]
MULTI["多连接透传 ble_rcsp_multi_*"]
UPDATE["OTA 升级 rcsp_update"]
end
subgraph sg_CMD["命令分发 (cmd_data_deal)"]
CMD_COMMON["rcsp_func_cmd_common"]
MUSIC["rcsp_music_func"]
BT["rcsp_bt_func"]
FM["rcsp_fm_func"]
LINEIN["rcsp_linein_func"]
BROWSER["rcsp_browser"]
end
subgraph sg_Device["设备功能域"]
PLAYER["音乐播放器"]
STACK["BT 连接管理 / TWS"]
TUNER["FM/LineIn"]
HEARING["助听/辅听等扩展"]
end
APP -->|"BLE Connect"| GATT
GATT --> AE00
AE00 --> AE01
AE00 --> AE02
AE02 --> CCCD
AE01 --> MODULE
MODULE --> ADV
MODULE --> MULTI
MODULE --> UPDATE
MODULE --> CMD_COMMON
CMD_COMMON --> MUSIC
CMD_COMMON --> BT
CMD_COMMON --> FM
CMD_COMMON --> LINEIN
CMD_COMMON --> BROWSER
MUSIC --> PLAYER
BT --> STACK
FM --> TUNER
LINEIN --> TUNER
BROWSER --> HEARING
架构说明:整条链路以 ble_rcsp_module 为中枢。上行方向,APP 通过 ae01(Write Without Response)把命令帧写入 GATT,模块解析后交给 cmd_data_deal 中的功能模块执行;下行方向,功能模块的执行结果/事件经 ae02(Notify)回推给 APP。ble_rcsp_adv 在连接建立之前就承担「设备身份广播」职责,而 ble_rcsp_multi_* 则把同一套协议扩展到多客户端/多设备(例如耳机双耳、无线麦克风场景)。
依据:ble_rcsp_module.h 中的 profile_data 与特征句柄定义;ble_rcsp_module.c 中的模块配置;ble_rcsp_adv.c 中的广播配置。
RCSP GATT 服务与特征值
服务表结构
RCSP 的 GATT 表由杰理专用工具 jieli gatt_inc_generator.exe 生成,以二进制 profile_data[] 数组形式固化在 ble_rcsp_module.h 中。整个 profile 由工具生成的 ATT 记录序列组成,每条记录包含属性类型、权限、句柄与值。编译期宏决定哪些服务被实际包含:
| 服务 UUID | 用途 | 包含条件 | 关键特征 |
|---|---|---|---|
0x1800 GAP | 设备名等通用访问 | 始终包含 | 2a00(READ/WRITE/DYNAMIC) |
0x1801 GATT | 服务变更指示 | RCSP_MODE == RCSP_MODE_WATCH(手表模式) | 2a05 INDICATE |
0x3802 | 支付宝(AliOS Pay)统一 Profile | TCFG_PAY_ALIOS_ENABLE | 4a02(READ/WRITE/NOTIFY/DYNAMIC) |
0xAE00 | RCSP 私有服务(核心) | 始终包含 | ae01 写通道、ae02 通知通道 |
其中 0xAE00 服务是 RCSP 协议的全部承载点:
//////////////////////////////////////////////////////
//
// 0x0004 PRIMARY_SERVICE ae00
//
//////////////////////////////////////////////////////
0x0a, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x28, 0x00, 0xae,
/* CHARACTERISTIC, ae01, WRITE_WITHOUT_RESPONSE | DYNAMIC, */
// 0x0040 CHARACTERISTIC ae01 WRITE_WITHOUT_RESPONSE | DYNAMIC
0x0d, 0x00, 0x02, 0x00, 0x81, 0x00, 0x03, 0x28, 0x04, 0x82, 0x00, 0x01, 0xae,
// 0x0041 VALUE ae01 WRITE_WITHOUT_RESPONSE | DYNAMIC
0x08, 0x00, 0x04, 0x01, 0x82, 0x00, 0x01, 0xae,
/* CHARACTERISTIC, ae02, NOTIFY, */
// 0x0042 CHARACTERISTIC ae02 NOTIFY
0x0d, 0x00, 0x02, 0x00, 0x83, 0x00, 0x03, 0x28, 0x10, 0x84, 0x00, 0x02, 0xae,
// 0x0043 VALUE ae02 NOTIFY
0x08, 0x00, 0x10, 0x00, 0x84, 0x00, 0x02, 0xae,
// 0x0044 CLIENT_CHARACTERISTIC_CONFIGURATION
0x0a, 0x00, 0x0a, 0x01, 0x85, 0x00, 0x02, 0x29, 0x00, 0x00,
设计意图:ae01 采用 Write Without Response 上行,因为 RCSP 命令帧多为「即发即弃」的控制指令(播放/暂停/调音量),无需等待 ATT 层确认,可显著降低 APP 与设备之间的交互时延;ae02 采用 Notify 下行,避免设备端在无事件时占用无线资源,同时允许 APP 通过订阅 CCCD 精确控制通知开关。
特征句柄映射
#define ATT_CHARACTERISTIC_2a00_01_VALUE_HANDLE 0x0003
#define ATT_CHARACTERISTIC_2a05_01_VALUE_HANDLE 0x0006
#define ATT_CHARACTERISTIC_2a05_01_CLIENT_CONFIGURATION_HANDLE 0x0007
#define ATT_CHARACTERISTIC_ae01_01_VALUE_HANDLE 0x0082
#define ATT_CHARACTERISTIC_ae02_01_VALUE_HANDLE 0x0084
#define ATT_CHARACTERISTIC_ae02_01_CLIENT_CONFIGURATION_HANDLE 0x0085
这些宏在协议栈事件处理中直接用于匹配读写/通知句柄:0x0082(ae01 VALUE)是 APP 上行命令的落点,0x0084(ae02 VALUE)是设备下行通知的源点,0x0085(ae02 CCCD)用于使能/去使能通知。
数据通道与收发缓冲
ble_rcsp_module.c 为 ATT 通道分配了固定内存块,并定义了三个关键尺寸参数:
#define ATT_LOCAL_PAYLOAD_SIZE (247)//(517) //note: need >= 20
#define ATT_SEND_CBUF_SIZE (512*2) //note: need >= 20,缓存大小,可修改
#define ATT_RAM_BUFSIZE (ATT_CTRL_BLOCK_SIZE + ATT_LOCAL_PAYLOAD_SIZE + ATT_SEND_CBUF_SIZE) //note:
static u8 att_ram_buffer[ATT_RAM_BUFSIZE] __attribute__((aligned(4)));
要点:
ATT_LOCAL_PAYLOAD_SIZE = 247:对应 4.2+ 的 251 字节 MTU(247 = MTU − 4 字节 ATT 头),是单帧数据载荷上限;注释中的 517 为 5.0 长帧预留值;ATT_SEND_CBUF_SIZE = 1024:发送环形缓存,用于吸收功能模块产生的事件突发(如歌词推送、OTA 数据流),缓存不足时通知会暂存排队;att_ram_buffer以 4 字节对齐分配,保证 DMA/协议栈对缓冲区对齐的要求。
模块入口与编译开关
整个 RCSP 扩展栈由编译开关 TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_RCSP_DEMO 门控,只有选择了 RCSP Demo 的工程才会编译该目录下的代码:
#if (TCFG_BLE_DEMO_SELECT == DEF_BLE_DEMO_RCSP_DEMO)
//ANCS profile enable
#define TRANS_ANCS_EN 0//1
//AMS profile enable
#define TRANS_AMS_EN 0
...
#if 1
#define log_info(x, ...) printf("[LE-RCSP]" x " ", ## __VA_ARGS__)
#define log_info_hexdump put_buf
#else
#define log_info(...)
#define log_info_hexdump(...)
#endif
这一设计把「协议栈选择」下沉到编译期:同一份 SDK 源码可以编译出支持 RCSP、或支持其他 Demo(如标准 HID/ANCS)的不同固件,互不干扰。TRANS_ANCS_EN/TRANS_AMS_EN 标识是否附带 Apple ANCS/AMS 通知服务(当前默认关闭,可在需要时开启)。日志宏统一带 [LE-RCSP] 前缀,便于抓取协议栈日志时过滤。
广播扩展(ble_rcsp_adv)
bt_trans_data/ble_rcsp_adv.c 负责设备在连接建立前的身份广播,即「广播(Broadcast)」扩展的核心:
static u8 adv_data_len;
static u8 adv_data[ADV_RSP_PACKET_MAX];//max is 31
static u8 scan_rsp_data_len;
static u8 scan_rsp_data[ADV_RSP_PACKET_MAX];//max is 31
#if RCSP_ADV_EN
static u32 ble_timer_handle = 0;
u16 sibling_ver_info = 0;
u16 cur_ver_info = 0;
#define BLE_TIMER_SET (500)
广播包(ADV)与扫描响应包(Scan Response)各 31 字节上限(ADV_RSP_PACKET_MAX)。ble_timer_handle 与 BLE_TIMER_SET(500ms) 表明广播内容(如版本信息、设备状态)会以约 500ms 周期刷新;cur_ver_info/sibling_ver_info 用于双耳设备间版本协商——一侧(如耳机副耳)把自身版本写入广播,另一侧(主耳)读取后与自身比对,从而在连接前就确定 OTA 升级策略。
广播中还携带杰理私有 Tag,用于 APP 快速识别设备归属:
#define EIR_TAG_STRING 0xd6, 0x05, 0x08, 0x00, 'J', 'L', 'A', 'I', 'S', 'D','K'
static const char user_tag_string[] = {EIR_TAG_STRING};
连接顺序策略
广播模块还定义了 BLE 与 BR/EDR 的连接顺序标志,决定「先 BLE 后 EDR」还是「iOS 一次连接」等交互策略:
#if TCFG_USER_BLE_CTRL_BREDR_EN
#define VER_FLAG_BLE_CTRL_BREDR BIT(0) // 先连接ble再连接edr
#else
#define VER_FLAG_BLE_CTRL_BREDR 0
#endif
#define VER_FLAG_IOS_BLE_LINK_BREDR BIT(1) // ios一次连接
这些标志会被写入广播数据并作为握手信息被 APP 解析:例如 VER_FLAG_BLE_CTRL_BREDR 使 APP 在 BLE 连接建立后再引导用户连接经典蓝牙,避免双链路同时建立造成的配对混乱;iOS 平台由于系统限制要求一次连接完成 BLE+BR/EDR,对应 VER_FLAG_IOS_BLE_LINK_BREDR。
命令分发体系(cmd_data_deal)
RCSP 协议帧在 ble_rcsp_module 完成 GATT 层解析后,进入 cmd_data_deal/function_modules 下的功能模块按「模块号 + 命令字」分发。该目录按功能域组织:
| 功能模块 | 文件 | 职责 |
|---|---|---|
| 音乐 | device_info/func_cmd/rcsp_music_func.c | 播放/暂停、上下曲、音量、EQ、歌词/歌曲信息同步 |
| 蓝牙 | device_info/func_cmd/rcsp_bt_func.c | BR/EDR 连接管理、设备列表、配对控制 |
| FM | device_info/func_cmd/rcsp_fm_func.c | 收音机频点、搜索、收藏 |
| LineIn | device_info/func_cmd/rcsp_linein_func.c | LineIn 通道控制、音源切换 |
| 浏览器 | browser/rcsp_browser.c | 设备文件浏览(TF 卡/U 盘目录枚举、文件操作) |
| 公共 | device_info/func_cmd/rcsp_func_cmd_common.h | 命令字定义与公共数据结构 |
分发层在 rcsp_manage / rcsp_bt_manage(ble_rcsp_adv.c 引用的头文件)中注册,各 func_cmd 模块以统一的函数表形式挂接,新增一个功能域只需实现并注册新的命令表,无需改动 GATT profile——这正是 RCSP 可扩展性的核心:协议栈与业务解耦,业务按模块增量演进。
多连接透传框架(ble_rcsp_multi_*)
bt_trans_data/ 下的 ble_rcsp_multi_* 系列把 RCSP 从「单 APP ↔ 单设备」扩展为「多客户端 / 多设备」拓扑:
| 文件 | 职责 |
|---|---|
ble_rcsp_multi_client.c | 多客户端管理(多个 APP/主机同时连接时的资源分配) |
ble_rcsp_multi_common.c/h | 多连接公共数据与工具(共享状态、缓存管理) |
ble_rcsp_multi_trans.c/h | 多设备间数据转发(设备↔设备透传通道) |
该框架是无线麦克风(Wireless Mic)与广播音频等衍生场景的协议基础:例如「一拖二」无线麦克风场景中,拾音设备把音频/控制数据经 RCSP 透传通道转发给主机,主机再通过 ae02 通知通道上报 APP;双耳/多设备间则通过 multi_trans 完成状态与数据的相互同步。SDK 中 rcsp_adv_bluetooth.h 与 ASSISTED_HEARING_CUSTOM_TRASNDATA(助听/辅听自定义透传,见 ble_rcsp_module.c)进一步表明这些场景以「自定义透传」方式挂接在 RCSP 通道之上。
注:无线麦克风具体的数据帧格式与音频路由算法实现细节未在本页所读源文件中展开,相关逻辑位于
rcsp_adv_bluetooth与助听扩展模块中,可在对应模块源码中进一步确认。
连接参数与安全管理
ble_rcsp_module.c 对 BLE 连接的加密与连接参数做了出厂级预设:
static hci_con_handle_t con_handle;
//加密设置
static const uint8_t sm_min_key_size = 7;
//连接参数设置
static const uint8_t connection_update_enable = 1; ///0--disable, 1--enable
static uint8_t connection_update_cnt = 0;
static const struct conn_update_param_t connection_param_table[] = {
{16, 24, 16, 600},
{12, 28, 14, 600},//11
sm_min_key_size = 7:Security Manager 最小密钥长度 7 字节(56 bit),在安全性与兼容性之间取平衡,过低无法满足加密强度,过高则部分老手机无法配对;connection_param_table:连接参数表{interval_min, interval_max, latency, timeout},首组为{16×1.25ms, 24×1.25ms, 16, 600×10ms},即 20ms~30ms 间隔、16 个从延迟、6s 超时;第二组收紧到 12~28 间隔、14 延迟。模块在连接建立后按序尝试更新连接参数,兼顾低时延(数据交互期)与低功耗(待机期)。
Core Flow
sequenceDiagram
participant APP as 手机 APP
participant BLE as BLE 协议栈 (GATT)
participant MOD as ble_rcsp_module
participant ADV as ble_rcsp_adv
participant CMD as cmd_data_deal 功能模块
participant DEV as 设备功能域 (播放器/BT/FM)
APP->>BLE: Scan & Connect
BLE->>ADV: 读取广播/扫描响应 (版本、JL Tag、连接策略)
ADV-->>APP: 识别设备能力 (BLE_CTRL_BREDR / iOS 一次连接)
APP->>BLE: 订阅 ae02 CCCD (0x0085)
BLE-->>MOD: ATT notify 使能事件
APP->>BLE: Write ae01 (0x0082) 命令帧 (WRITE_NO_RSP)
BLE-->>MOD: 收到命令帧
MOD->>MOD: 拆帧/校验 (log_info "[LE-RCSP]")
MOD->>CMD: 按模块号+命令字分发
CMD->>DEV: 执行 (播放/切歌/调音量/查状态)
DEV-->>CMD: 结果/事件
CMD-->>MOD: 组帧上行
MOD->>BLE: Notify ae02 (0x0084)
BLE-->>APP: 通知到达 (结果/状态推送)
loop 广播周期刷新
ADV->>BLE: 每 500ms 更新 ADV (cur_ver_info/sibling_ver_info)
end
流程说明:整个交互分为「连接前」(广播识别)与「连接后」(命令-响应)两个阶段。连接前,APP 通过解析广播包中的杰理 Tag、版本号与连接策略标志决定握手方式;连接后,APP 订阅 ae02 通知并持续向 ae01 写入命令帧,模块完成拆帧分发,功能模块执行后经 ae02 异步回推——因此 RCSP 是典型的异步请求/响应 + 事件推送模型,APP 侧不应假定命令与通知一一对应同步返回。
Usage Examples
示例 1:GATT Profile 中 RCSP 私有服务的声明
//////////////////////////////////////////////////////
//
// 0x0004 PRIMARY_SERVICE ae00
//
//////////////////////////////////////////////////////
0x0a, 0x00, 0x02, 0x00, 0x80, 0x00, 0x00, 0x28, 0x00, 0xae,
/* CHARACTERISTIC, ae01, WRITE_WITHOUT_RESPONSE | DYNAMIC, */
0x0d, 0x00, 0x02, 0x00, 0x81, 0x00, 0x03, 0x28, 0x04, 0x82, 0x00, 0x01, 0xae,
该段声明了 RCSP 服务(UUID 0xAE00)及其写特征 ae01(权限 0x04 = Write Without Response,0x01 = DYNAMIC)。每个字节对 {长度, 类型} 构成一条 ATT 记录,是协议栈启动时加载的静态 profile。
示例 2:广播缓冲与周期刷新
static u8 adv_data_len;
static u8 adv_data[ADV_RSP_PACKET_MAX];//max is 31
static u8 scan_rsp_data_len;
static u8 scan_rsp_data[ADV_RSP_PACKET_MAX];//max is 31
#if RCSP_ADV_EN
static u32 ble_timer_handle = 0;
u16 sibling_ver_info = 0;
u16 cur_ver_info = 0;
#define BLE_TIMER_SET (500)
RCSP_ADV_EN 使能广播扩展后,模块维护 31 字节 ADV 与 31 字节 Scan Response 两份缓存,并以 500ms 定时器周期刷新版本信息。双耳设备的 cur_ver_info(本耳版本)与 sibling_ver_info(对耳版本)在此处更新,供主机/APP 在连接前决策 OTA。
示例 3:ATT 载荷与发送缓存配置
#define ATT_LOCAL_PAYLOAD_SIZE (247)//(517) //note: need >= 20
#define ATT_SEND_CBUF_SIZE (512*2) //note: need >= 20,缓存大小,可修改
#define ATT_RAM_BUFSIZE (ATT_CTRL_BLOCK_SIZE + ATT_LOCAL_PAYLOAD_SIZE + ATT_SEND_CBUF_SIZE)
static u8 att_ram_buffer[ATT_RAM_BUFSIZE] __attribute__((aligned(4)));
调整 ATT_LOCAL_PAYLOAD_SIZE 可改变单帧数据吞吐(如需推送大图/歌词可改大),调整 ATT_SEND_CBUF_SIZE 可改变事件突发缓冲深度。注意缓冲为静态分配,改大需评估 RAM 开销。
Configuration Options
以下配置项均来自所读源文件的编译期宏/常量,改动后需重新编译固件。
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
TCFG_BLE_DEMO_SELECT | 枚举 | 需为 DEF_BLE_DEMO_RCSP_DEMO | 门控整个 RCSP 扩展栈是否编译 |
RCSP_MODE | 枚举 | — | 设备形态,RCSP_MODE_WATCH 时附加 0x1801 服务(手表) |
TCFG_PAY_ALIOS_ENABLE | bool | 0 | 使能支付宝统一 Profile(0x3802/4a02)时置 1(UPAY_ONE_PROFILE) |
TRANS_ANCS_EN / TRANS_AMS_EN | bool | 0 | 是否附带 Apple ANCS/AMS 通知服务 |
RCSP_ADV_EN | bool | — | 使能广播扩展(ADV/ScanRsp 管理) |
TCFG_USER_BLE_CTRL_BREDR_EN | bool | — | 置 1 时广播 VER_FLAG_BLE_CTRL_BREDR(先 BLE 后 EDR) |
ATT_LOCAL_PAYLOAD_SIZE | 常量 | 247 | 单帧 ATT 载荷上限(需 ≥ 20) |
ATT_SEND_CBUF_SIZE | 常量 | 1024 | 发送环形缓存大小 |
ADV_INTERVAL_MIN | 常量 | 800(×0.625ms ≈ 500ms) | 最小广播间隔 |
sm_min_key_size | 常量 | 7 | SM 最小密钥长度(字节) |
connection_update_enable | 常量 | 1 | 是否在连接后更新连接参数 |
connection_param_table | 表 | {16,24,16,600} 等 | 连接参数(interval_min/max、latency、timeout) |
BLE_TIMER_SET | 常量 | 500 | 广播版本信息刷新周期(ms) |
Failure Modes, Edge Cases & Concurrency
连接/广播异常
- 双链路握手失败:广播中的
VER_FLAG_BLE_CTRL_BREDR声明「先 BLE 再 EDR」,若用户跳过 BLE 直接配对经典蓝牙,可能出现状态不一致。设计上由 APP 依据广播标志引导连接顺序,固件侧不做强制。 - 广播包超限:ADV 与 Scan Response 均为 31 字节上限(
ADV_RSP_PACKET_MAX),当自定义透传数据与版本信息叠加时可能溢出;代码以独立缓存分别组织adv_data与scan_rsp_data,扩展新字段时必须控制长度。 - 通知未订阅:
ae02的 NOTIFY 依赖 APP 先写0x0085CCCD;APP 未订阅时设备侧下行事件会被丢弃或缓存,功能模块需能容忍「上报无订阅」场景。
并发与共享资源
- 静态缓冲互斥:
att_ram_buffer由 ATT 控制块、载荷与发送缓存共享,是全局单实例;多客户端场景(ble_rcsp_multi_client)必须串行化对该缓冲区的访问,否则命令帧与事件帧可能互相覆盖。 - 广播定时器与命令处理并发:
ble_timer_handle(500ms 刷新)与 GATT 回调在协议栈线程内运行,版本信息读写(cur_ver_info/sibling_ver_info)应保证原子性,避免刷新中途被读取到撕裂值。 - 写通道无流控:
ae01为 Write Without Response,协议栈不提供 ATT 层流控;APP 侧高频写入时,若超出模块拆帧速度,需依赖上层命令序号/应答机制纠错。
边界情况
- MTU 协商:
ATT_LOCAL_PAYLOAD_SIZE=247仅在连接协商出大 MTU 后可用;若对端仅支持 23 字节 MTU,单帧有效载荷退化为 ~20 字节,上层分帧/重组逻辑必须按最小 MTU 设计。 - 手表模式差异:
RCSP_MODE_WATCH下附加0x1801服务(2a05服务变更指示),其 CCCD(0x0007)需在连接早期正确配置,否则 GATT 缓存失效时 APP 无法感知服务表变更。
Performance & Operational Considerations
- 吞吐路径:上行命令经
ae01(无响应写)直达模块,下行事件经ae02Notify + 1024 字节发送缓存,适合歌词推送、OTA 数据流等中低速率场景;如需更高吞吐,可增大ATT_LOCAL_PAYLOAD_SIZE(参考注释中的 517 长帧值)并评估功耗。 - 功耗:广播间隔 500ms(
ADV_INTERVAL_MIN = 160*5单位 0.625ms)兼顾被发现时延与待机功耗;连接参数表提供 20ms~30ms 活跃态与 12~28 间隔的低功耗档,模块按阶段切换。 - 日志观测:协议栈日志统一带
[LE-RCSP]前缀、广播模块带[BLE-RCSP-ADV]前缀,可通过串口日志过滤定位命令帧收发与广播刷新行为;log_info_hexdump用于打印原始帧。 - 内存占用:
att_ram_buffer为静态分配(约 247 + 1024 + 控制块),调整ATT_SEND_CBUF_SIZE直接改变 RAM 占用,量产固件需在 RAM 预算内权衡。
Extension Points
- 新增功能模块:在
cmd_data_deal/function_modules下仿照rcsp_music_func/rcsp_bt_func实现新的命令表,并在rcsp_manage/rcsp_bt_manage注册模块号,即可扩展新能力,无需改动 GATT profile——这是 RCSP 协议族的主要扩展方式。 - 自定义透传通道:
ASSISTED_HEARING_CUSTOM_TRASNDATA(助听/辅听)模式展示了如何在 RCSP 通道上承载私有数据流;无线麦克风、广播音频等场景可参照该模式挂接。 - 广播能力位:在
ble_rcsp_adv的广播数据中追加自定义能力标志(类似VER_FLAG_*),APP 侧在连接前即可识别新能力,实现「广播即服务发现」。 - 多设备拓扑:通过
ble_rcsp_multi_*框架扩展客户端/设备数量,承载耳机双耳、一拖二麦克风等拓扑;扩展时注意共享缓冲的串行化访问。
Tests
所读源文件中未包含针对 RCSP 扩展栈的独立单元测试目录;协议验证主要依赖:
- 编译期开关切换(
TCFG_BLE_DEMO_SELECT)验证不同 Demo 的隔离性; - 串口日志(
[LE-RCSP]/[BLE-RCSP-ADV]前缀)与log_info_hexdump进行帧级联调; - 双耳版本协商(
cur_ver_info/sibling_ver_info)与 OTA 场景的整机验证。
注:测试用例与自动化脚本的具体实现细节未在本页所读源文件中发现,建议结合 SDK 的 demo 工程与工具链(gatt_inc_generator 等)进行验证。
Related Links
- RCSP 主模块头文件(GATT Profile 定义)
- RCSP 主模块实现(数据通道/连接参数)
- 广播扩展实现(ble_rcsp_adv)
- 多连接透传(ble_rcsp_multi_trans)
- 多客户端管理(ble_rcsp_multi_client)
- 音乐功能命令(rcsp_music_func)
- 蓝牙功能命令(rcsp_bt_func)
- 设备文件浏览器(rcsp_browser)
相关目录页:蓝牙协议栈基础(见 4-bluetooth 下其他页面)、TWS 经典蓝牙互联、OTA 升级流程(rcsp_update)。