BLE 应用示例:遥控器 / Dongle / 对讲机
本文档介绍 AW30N BLE SDK 中三个典型 BLE 应用示例的实现:基于 HID Over GATT (HOGP) 的遥控器(Consumer Control 键盘)、负责扫描并接收 HID 数据的 Dongle(HID only scan),以及基于 2.4G 射频的对讲机音频双向传输(audio_rf_trans)。三个示例共用同一套 bt_common 应用框架,覆盖了 BLE 从"广播/扫描 → 连接 → 数据传输"的完整链路。
Purpose and Scope
本页面向需要基于 AW30N 开发 BLE 外设(遥控器、接收器、语音对讲设备)的嵌入式工程师,说明:
bt_common/hid应用框架的入口与工程组织方式;- 遥控器示例(
examples/keyboard)的 HID 报告映射、按键表与 BLE 初始化流程; - Dongle 示例(
examples/hid_only_scan)的职责边界; - 对讲机示例(
audio_rf_trans)的音频 RF 收发模块划分。
有意留待其他页面的内容:BLE 协议栈(btstack / btctrler)的内部机制、ble_test 测试用例、各 config/ 目录下的配置文件细节,请参见对应的协议栈与配置类目录页。本页聚焦"应用示例如何调用框架 API 实现具体产品形态",不展开协议栈底层实现。
Overview
AW30N 的 BLE 应用统一构建在 sdk/apps/app/bsp/common/bt_common/ 之下,按产品形态划分为多个示例。所有示例共享同一入口模型:app_main.c 定义应用任务,通过编译宏(如 TRANS_DATA_HID_EN、CONFIG_APP_KEYBOARD)裁剪出不同示例的代码路径。
三种示例在 BLE 体系中的角色截然不同:
| 示例 | 角色 | 数据方向 | 核心机制 |
|---|---|---|---|
| 遥控器 (keyboard) | HOGP 服务端(Peripheral) | 上行:按键 → HID Report | Consumer Control 报告 + GATT Notification |
| Dongle (hid_only_scan) | HOGP 客户端(Central/扫描端) | 下行:接收 HID Report 并转发 | 只扫描、连接后收取报告 |
| 对讲机 (audio_rf_trans) | 点对点 RF 音频链路 | 双向:ADC 采集 → RF → DAC 播放 | 音频打包/解包 + RF 收发队列 |
设计意图:SDK 用"一套框架 + 多个示例目录"的方式复用底层 BLE 栈与音频通路,产品开发只需选择对应示例目录、修改报告映射与按键表即可快速定型;对讲机路径则完全绕开 BLE,走独立的 2.4G RF 音频通道,避免蓝牙协议栈的时延与带宽限制。
Architecture
三个示例在 SDK 中的目录结构与依赖关系如下(节点名对应真实文件/模块):
flowchart TD
subgraph sg_HidApp["bt_common/hid 应用框架"]
Main["app_main.c(应用入口)"]
Cfg["hid_app_config.h(宏裁剪)"]
end
subgraph sg_Remote["遥控器示例 examples/keyboard"]
KeyTable["hid_key_click_table / hid_key_hold_table"]
ReportMap["hidkey_report_map(Consumer Control)"]
BleCfg["hidkey_ble_config"]
Start["hidkey_app_start()"]
Callback["hid_keyboard_recv_callback()"]
end
subgraph sg_Dongle["Dongle 示例 examples/hid_only_scan"]
Scan["ble_only_scan.c(只扫描并接收)"]
end
subgraph sg_Talk["对讲机 audio_rf_trans"]
Send["audio2rf_send.c + trans_packet.c"]
Queue["rf_send_queue.c + rf_pa_port.c"]
Recv["rf2audio_recv.c + trans_unpacket.c"]
end
Main --> Cfg
Cfg --> Start
KeyTable --> ReportMap
ReportMap --> BleCfg
BleCfg --> Start
Start --> Callback
Start -->|"HOGP 服务(GATT)"| Scan
Main --> Send
Send --> Queue
Queue --> Recv
架构要点说明:
- 遥控器:
app_hid_comm.c中静态定义报告映射与按键表,hidkey_app_start()在应用启动时完成 PLL 时钟配置、btstack_ble_start_before_init()注册 BLE 配置、le_hogp_set_reconnect_adv_cfg()设置定向重连广播、le_hogp_set_output_callback()注册下行数据回调,最后btstack_init()启动协议栈。整条链路由宏TRANS_DATA_HID_EN与CONFIG_APP_KEYBOARD双重裁剪。 - Dongle:
ble_only_scan.c位于hid示例树的独立目录,职责是作为扫描端连接遥控器并接收其 HID 报告,随后转发给主机(Host)——与遥控器构成"服务端/客户端"配对关系。 - 对讲机:
audio_rf_trans目录按功能拆分文件——发送(audio2rf_send+ 打包trans_packet)、排队与功放控制(rf_send_queue+rf_pa_port)、接收(rf2audio_recv+ 解包trans_unpacket)、总体管理(audio_rf_mge)。该路径与 BLE 栈解耦,适合对时延敏感的全双工语音场景。
核心流程
遥控器按键上报流程
sequenceDiagram
participant U as 用户按键
participant T as 按键表映射
participant A as hidkey_app_start
participant H as HOGP 服务
participant P as 对端设备(手机/主机)
U->>T: 按键事件(8 键位)
T->>T: 查 hid_key_click_table / hid_key_hold_table
T->>A: 得到 Consumer Usage(如 CONSUMER_VOLUME_INC)
A->>H: 按 Report Map 组装 HID Report
H->>P: GATT Notification(HID Report 特征)
P-->>A: (可选下行)hid_keyboard_recv_callback 回调
对讲机音频收发流程
flowchart LR
subgraph sg_Send["本端(发送方向)"]
ADC["音频 ADC 采集"] --> S1["audio2rf_send.c"]
S1 --> S2["trans_packet.c 打包"]
S2 --> S3["rf_send_queue.c 发送队列"]
S3 --> S4["rf_pa_port.c 功放控制"]
S4 --> RF1["2.4G RF 发射"]
end
subgraph sg_Recv["对端(接收方向)"]
RF2["2.4G RF 接收"] --> R1["rf2audio_recv.c"]
R1 --> R2["trans_unpacket.c 解包"]
R2 --> DAC["音频 DAC 播放"]
end
RF1 -->|"空中射频帧"| RF2
对讲机链路的设计意图:发送方向"采集 → 打包 → 排队 → 发射"、接收方向"接收 → 解包 → 播放"严格分离,便于分别优化缓冲区与功率控制;rf_send_queue 的存在说明 RF 发射是异步、可积压的,队列深度直接决定抗拥塞能力。
遥控器示例实现详解(examples/keyboard)
HID 报告映射(Report Map)
遥控器的核心是 HID 报告描述符。示例使用 Consumer Control (Usage Page 0x0C) 报告,把 8 个按键位映射为音量、播放/暂停、静音、上下曲、快进快退等消费类用法:
static const u8 hidkey_report_map[] = {
0x05, 0x0C, // Usage Page (Consumer)
0x09, 0x01, // Usage (Consumer Control)
0xA1, 0x01, // Collection (Application)
0x85, 0x01, // Report ID (1)
0x09, 0xE9, // Usage (Volume Increment)
0x09, 0xEA, // Usage (Volume Decrement)
0x09, 0xCD, // Usage (Play/Pause)
0x09, 0xE2, // Usage (Mute)
0x09, 0xB6, // Usage (Scan Previous Track)
0x09, 0xB5, // Usage (Scan Next Track)
0x09, 0xB3, // Usage (Fast Forward)
0x09, 0xB4, // Usage (Rewind)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x10, // Report Count (16)
0x81, 0x02, // Input (Data,Var,Abs,...)
0xC0, // End Collection
// 35 bytes
};
Source: app_hid_comm.c
设计意图:选择 Consumer Control 页而非普通键盘页,是因为遥控器面向媒体控制场景,报告仅 35 字节、16 bit 位域即覆盖全部按键,空域开销极小;Logical Minimum=0 / Maximum=1 配合 16 位报告,让每个按键位独立表达"按下/释放"状态。
按键映射表(click / hold 双表)
示例把物理按键抽象为两张 8 项表:hid_key_click_table(单击)与 hid_key_hold_table(长按/按住),支持同一按键"短按一个功能、长按另一个功能"的消费类遥控器惯例:
// consumer key
#define CONSUMER_VOLUME_INC 0x0001
#define CONSUMER_VOLUME_DEC 0x0002
#define CONSUMER_PLAY_PAUSE 0x0004
#define CONSUMER_MUTE 0x0008
#define CONSUMER_SCAN_PREV_TRACK 0x0010
#define CONSUMER_SCAN_NEXT_TRACK 0x0020
#define CONSUMER_SCAN_FRAME_FORWARD 0x0040
#define CONSUMER_SCAN_FRAME_BACK 0x0080
//----------------------------------
static const u16 hid_key_click_table[8] = {
CONSUMER_PLAY_PAUSE,
CONSUMER_SCAN_PREV_TRACK,
CONSUMER_VOLUME_DEC,
CONSUMER_SCAN_NEXT_TRACK,
CONSUMER_VOLUME_INC,
CONSUMER_MUTE,
0,
0,
};
static const u16 hid_key_hold_table[8] = {
0,
CONSUMER_SCAN_FRAME_BACK,
CONSUMER_VOLUME_DEC,
CONSUMER_SCAN_FRAME_FORWARD,
CONSUMER_VOLUME_INC,
0,
0,
0,
};
Source: app_hid_comm.c
设计意图:双表机制把"物理按键"与"逻辑功能"解耦——硬件改键只需改表项顺序;表中 0 表示该键位无对应功能。注意音量键在 click 与 hold 表中都出现,这使"按住连续调节音量"成为可能,而播放/暂停、静音仅响应单击,避免误触发。
BLE 初始化配置与启动
示例通过 ble_init_cfg_t 结构把报告映射与外观声明注册进协议栈,然后在 hidkey_app_start() 中依次完成时钟、重连广播、回调注册与协议栈启动:
static const ble_init_cfg_t hidkey_ble_config = {
.same_address = 0,
.appearance = BLE_APPEARANCE_HID_KEYBOARD,
.report_map = hidkey_report_map,
.report_map_size = sizeof(hidkey_report_map),
};
static int hid_keyboard_recv_callback(u8 *buffer, u16 size);
static void hidkey_app_start()
{
log_info("-------------HID DEMO-----------------");
#if TCFG_USER_BLE_ENABLE
/* wl_and_clk 1:std_48m;wl2adc_clk/wl2dac_clk 2:pll_96m */
SFR(JL_CLOCK->PRP_CON2, 0, 2, 1);
SFR(JL_CLOCK->PRP_CON2, 2, 2, 2);
SFR(JL_CLOCK->PRP_CON2, 4, 2, 2);
SFR(JL_CLOCK->PRP_CON2, 8, 1, 1);
asm("csync");
bt_pll_para(48000000, 48000000, 0, 0);
btstack_ble_start_before_init(&hidkey_ble_config, 0);
le_hogp_set_reconnect_adv_cfg(ADV_DIRECT_IND_LOW, 5000);
//注册hogp数据接收回调函数
le_hogp_set_output_callback(hid_keyboard_recv_callback);
btstack_init();
#endif
}
Source: app_hid_comm.c
逐行说明(设计意图):
same_address = 0:BLE 与经典蓝牙使用不同地址,避免与 EDR 场景地址冲突;appearance = BLE_APPEARANCE_HID_KEYBOARD:通告外观类型,帮助对端(手机/主机)在连接前就识别设备类别;SFR(PRP_CON2, ...)时钟配置:显式把 RF 相关时钟切到标准 48M / PLL 96M,保证射频与音频采样时钟对齐,这是音频/HID 混用的关键;bt_pll_para(48M, 48M, ...):锁定 PLL 参数,避免低功耗模式切换时频偏;le_hogp_set_reconnect_adv_cfg(ADV_DIRECT_IND_LOW, 5000):断线后使用低占空比定向广播重连,5 秒超时,兼顾重连速度与功耗;le_hogp_set_output_callback():注册下行(对端 → 设备)数据回调,示例中为hid_keyboard_recv_callback,用于接收对端发来的 HID 输出报告(如 LED 指示);btstack_init():正式启动协议栈任务,之后 HOGP 服务开始广播并接受连接。
应用入口与内存布局(app_main.c)
HID 应用入口在 app_main.c,其关键点是把 BLE 相关的全局数据放入专用段,并初始化应用状态变量:
static int _bt_nv_ram_min[BT_NV_RAM_SIZE / 4] sec_used(.sec_bt_nv_ram);//最少占用
APP_VAR app_var;
void app_var_init(void)
{
app_var.play_poweron_tone = 1;
app_var.auto_off_time = 0; //TCFG_AUTO_SHUT_DOWN_TIME;
app_var.warning_tone_v = 340;
app_var.poweroff_tone_v = 330;
}
Source: app_main.c
设计意图:sec_used(.sec_bt_nv_ram) 把蓝牙 NV RAM(配对信息等)固定在独立段,保证协议栈掉电保存数据不被应用数据覆盖;app_var_init() 集中管理开机提示音、自动关机时间等产品化参数,厂商可在不改动框架代码的前提下调整行为。文件头部还通过 #pragma bss_seg/.data_seg/.const_seg/.code_seg(".ble_app_*") 将整个 HID 应用代码/数据段隔离,便于链接器规划内存布局与低功耗管理(见 app_main.c)。
Dongle 示例(examples/hid_only_scan)
Dongle 示例位于 HID 示例树的独立目录 hid/examples/hid_only_scan/ble_only_scan.c,与遥控器示例(examples/keyboard)并列。从目录命名与示例组织结构可以确定其职责:
- 只扫描(only scan):作为 BLE Central 主动扫描遥控器等 HID 外设的广播,不参与广播发起;
- 连接后收取 HID 报告:与遥控器的 HOGP 服务建立 GATT 连接,订阅 HID Report 特征,把按键数据接收下来;
- 转发给主机:Dongle 的典型产品形态是"无线接收器"——一端通过 BLE 收遥控器数据,另一端通过 USB/串口/HID over USB 上报给 PC 或机顶盒主机。
flowchart TD
Sub["遥控器(HID 服务端)"] -->|"广播/定向重连"| Scan["ble_only_scan.c 扫描"]
Scan --> Conn["GATT 连接 + 订阅 HID Report"]
Conn --> Report["接收 HID 报告"]
Report --> Host["USB/串口转发到主机"]
与遥控器的配对关系:遥控器使用 le_hogp_set_reconnect_adv_cfg(ADV_DIRECT_IND_LOW, 5000) 发起定向重连广播,Dongle 侧对应地需要响应这类定向广播并建立连接——两者构成典型的"外设 + 接收器"产品组合。
说明:本页撰写时未展开
ble_only_scan.c的逐行实现;以上职责划分依据目录结构(hid_only_scan与keyboard并列于examples/下)与 HID 应用框架的通用流程得出。如需深入该文件,请直接阅读 ble_only_scan.c。
对讲机示例(audio_rf_trans)
对讲机(语音双向传输)示例位于 sdk/apps/app/bsp/common/audio_rf_trans/,是一个与 BLE 协议栈完全解耦的 2.4G RF 音频通道。目录内文件按职责划分:
| 文件 | 职责(依据文件命名与目录结构) |
|---|---|
audio_rf_mge.c | 音频 RF 传输的总体管理(初始化、任务调度、状态协调) |
audio2rf_send.c | 发送方向:把音频数据送入 RF 链路 |
rf2audio_recv.c | 接收方向:从 RF 链路取出音频数据 |
trans_packet.c / trans_unpacket.c | 空中帧的打包 / 解包(协议编解码) |
rf_send_queue.c | 发送队列管理(缓冲积压、流量控制) |
rf_pa_port.c | 射频功放(PA)端口控制(发射使能/功率) |
设计意图与工程要点:
- 收发分离:
audio2rf_send与rf2audio_recv独立成文件,使全双工对讲的发送/接收通路可以独立调优缓冲区与中断优先级,互不阻塞; - 打包/解包对称设计:
trans_packet与trans_unpacket成对出现,表明空中帧协议有严格的对称性——任何一侧的帧格式变更必须同步另一侧,这是点对点 RF 链路的常见约束; - 队列解耦:
rf_send_queue把"音频采集"与"RF 发射"在时间上解耦。当 RF 信道忙或 PA 退避时,音频帧先入队,避免丢帧;队列深度即抗拥塞能力上限; - PA 端口独立:
rf_pa_port单独管理功放,便于针对不同天线/发射功率做硬件适配,且可在低占空比对讲时快速关断 PA 省电。
说明:本页撰写时未逐行读取上述文件;表格中职责依据文件名与
audio_rf_trans目录结构推断,属于该目录的模块级索引。对讲机具体帧格式、队列深度等实现细节,请直接阅读 audio_rf_trans 目录。
Configuration Options
三个示例通过编译宏与配置结构控制行为,主要选项如下:
| 选项 | 类型 | 默认/典型值 | 说明 |
|---|---|---|---|
TRANS_DATA_HID_EN | 编译宏 | 0/1 | HID 透传数据总开关;app_main.c 与 app_hid_comm.c 均以此宏包住整个 HID 应用代码 |
CONFIG_APP_KEYBOARD | 编译宏 | 0/1 | 选择键盘(遥控器)示例代码路径,并引入 edr_hid_user.h、standard_hid.h 等头文件 |
TCFG_USER_BLE_ENABLE | 编译宏 | 0/1 | 用户 BLE 功能使能;关闭时 hidkey_app_start() 的协议栈初始化整体跳过 |
RCSP_BTMATE_EN | 编译宏 | 0/1 | RCSP(杰理私有协议)使能,用于手机 App 联调/OTA,见 app_hid_comm.c 头部条件包含 |
ble_init_cfg_t.same_address | u8 | 0 | BLE 是否与 EDR 使用同一地址;示例置 0 |
ble_init_cfg_t.appearance | 枚举 | BLE_APPEARANCE_HID_KEYBOARD | 通告中的外观类型,对端据此识别设备类别 |
ble_init_cfg_t.report_map | u8* | hidkey_report_map | HID 报告描述符指针 |
ble_init_cfg_t.report_map_size | u16 | 35 | 报告描述符字节数 |
le_hogp_set_reconnect_adv_cfg 参数 | (u8, u32) | (ADV_DIRECT_IND_LOW, 5000) | 重连广播类型与超时(ms);示例用低占空比定向广播 |
app_var.auto_off_time | u32 | 0 | 自动关机时间(s),0 表示禁用 |
app_var.play_poweron_tone | u8 | 1 | 开机是否播放提示音 |
app_var.warning_tone_v / poweroff_tone_v | u16 | 340 / 330 | 低电/关机提示音音量 |
配置来源:app_hid_comm.c 与 app_main.c
API Reference
以下 API 均为遥控器示例中直接调用的框架接口(签名以示例调用方式为准):
btstack_ble_start_before_init(const ble_init_cfg_t *cfg, u8 param)
在协议栈初始化前注册 BLE 配置(报告映射、外观等)。示例传 &hidkey_ble_config 与 0。必须在 btstack_init() 之前调用。
参数:
cfg(const ble_init_cfg_t *):BLE 初始化配置,含same_address、appearance、report_map、report_map_size;param(u8):保留参数,示例传0。
调用时机: 完成 RF 时钟配置(SFR(PRP_CON2,...)、bt_pll_para())之后、btstack_init() 之前。
le_hogp_set_reconnect_adv_cfg(u8 adv_type, u32 adv_timeout)
设置 HOGP 断线重连的广播类型与超时。示例使用 ADV_DIRECT_IND_LOW(低占空比定向广播)+ 5000 ms 超时,兼顾重连速度与功耗。
le_hogp_set_output_callback(void *cb)
注册 HOGP 下行数据接收回调(对端 → 设备方向)。示例注册 hid_keyboard_recv_callback(u8 *buffer, u16 size),用于接收对端发来的输出报告。
btstack_init()
启动 BTStack 协议栈任务,之后 HOGP 服务开始广播并接受连接。示例在注册完所有回调后最后调用。
bt_pll_para(u32 osc, u32 sys, u8 low_power, u8 xosc)
配置蓝牙 PLL 参数。示例传 (48000000, 48000000, 0, 0),将振荡器与系统时钟锁定为 48M,避免低功耗切换导致频偏。
app_var_init(void)
初始化应用全局变量 app_var(开机提示音、自动关机时间、提示音音量)。由应用启动流程调用,见 app_main.c。
Failure Modes, Edge Cases & Concurrency
断线重连
遥控器断线后依赖 ADV_DIRECT_IND_LOW 定向广播重连,5 秒超时。边界情况:
- 若对端(Dongle/手机)在 5 秒内未响应定向广播,设备将停止重连广播,需上层策略(如用户按键)触发重新进入可连接状态;
- 定向广播只对上次连接的设备地址有效,换设备连接需先清除配对信息(NV RAM 中保存)。
时钟配置错误导致 RF 异常
hidkey_app_start() 中 SFR(JL_CLOCK->PRP_CON2, ...) 与 bt_pll_para() 是强制的时序依赖:若跳过,RF 时钟可能停留在非标准频率,表现为扫描/连接不稳定。修改时钟源(如改用 24M 晶振)时必须同步调整 bt_pll_para 参数。
宏裁剪导致的空入口
TRANS_DATA_HID_EN、CONFIG_APP_KEYBOARD、TCFG_USER_BLE_ENABLE 任一关闭,对应代码路径整体不编译(hidkey_app_start 内部被 #if 隔离)。切换示例时若发现"编译通过但无行为",应先检查这三个宏的组合。
对讲机 RF 发送队列拥塞
rf_send_queue.c 的存在表明 RF 发射异步可积压。当信道占用或 PA 退避导致队列满时,音频帧将丢失(对讲机场景通常容忍短时丢帧以换取实时性);全双工对讲需保证收发通路各自独立,避免接收中断长时间阻塞发送队列。
并发与内存布局
_bt_nv_ram_min[BT_NV_RAM_SIZE / 4]使用专用段.sec_bt_nv_ram,协议栈与应用对 NV RAM 的访问天然隔离,避免配对信息被应用数据覆盖;- 整个 HID 应用通过
#pragma *seg(".ble_app_*")独立分段,链接器可将其放入特定 RAM 区域(低功耗/掉电保持场景),修改段布局时需同步调整链接脚本,否则会出现未定义符号或覆盖冲突。
Performance & Operational Considerations
- 报告尺寸最优:遥控器报告描述符仅 35 字节、报告体 16 bit,单个 GATT Notification 即可承载,空中开销小、响应快;
- 低功耗重连:
ADV_DIRECT_IND_LOW相比ADV_IND占空比更低(示例注释中给出了切换ADV_IND, 5000的备选方案),批量生产/长时间待机场景建议保持 LOW 模式; - 对讲机实时性:audio_rf_trans 路径绕开 BLE 协议栈,直接走 2.4G RF + 音频通路,是低时延语音的首选;BLE 路径用于控制/数据,两条链路可并行;
- 调试入口:HID 示例开启了
LOG_ERROR/DEBUG/INFO/CLI(见 app_hid_comm.c),可用日志 tag[HID_KEY]过滤运行日志。
Extension Points
- 自定义按键功能:修改
hid_key_click_table/hid_key_hold_table两张表即可重映射 8 个键位的单击/长按行为,无需改动协议栈代码; - 扩展报告描述符:若需要普通键盘键(如方向键、媒体键之外的按键),在
hidkey_report_map中追加 Usage 并调整Report Count/Report Size,同时更新report_map_size; - 更换设备外观:修改
ble_init_cfg_t.appearance(如BLE_APPEARANCE_HID_MOUSE)可让对端按鼠标/键盘等不同类别枚举设备; - 下行控制:通过
le_hogp_set_output_callback注册的回调实现 LED 指示、锁键等对端 → 设备控制功能; - 对讲机硬件适配:
rf_pa_port.c独立管理功放,适配不同天线/功率等级时只改该文件;rf_send_queue深度可按音频采样率与 RF 带宽调整。
Tests
SDK 未在示例目录内提供独立单元测试;示例本身即"可运行参考实现",验证方式为编译后烧录并配合对端设备联调:
- 遥控器:使用手机 BLE 调试工具(或杰理 RCSP App,
RCSP_BTMATE_EN使能时)连接,验证音量/播放等 Consumer 用法是否生效、断线后 5 秒内重连是否成功; - Dongle:与遥控器配对,验证报告接收与转发到主机的链路;
- 对讲机:双设备互通,验证全双工语音时延与丢帧表现(可调整
rf_send_queue深度对比)。
Related Links
- HID 应用配置目录 config/ — 各
lib_*_config.c为协议栈/驱动裁剪配置,属于配置类页面的范围 - BLE 测试用例 ble_test/ —
ble_master/ble_slave透传测试,与示例应用互补,参见 BLE 测试相关页面 - 音频 RF 传输 audio_rf_trans/ — 对讲机链路全部源码
- 遥控器示例 app_hid_comm.c — 本页核心参考文件
- HID 应用入口 app_main.c — 任务入口与内存布局
- Dongle 扫描示例 ble_only_scan.c