蓝牙遥控器*
本文基于Linux环境下编译蓝牙语音遥控器工程
1. 编译目标APP和板级*
cd apus
make app=ble_remote_control board=gx8301a_rc_demo
编译成功后,在 output 目录下会生成一个 apus.bin。
mkimg...
boot bin size: 0x1000
app bin size: 0x394a8
flash total size: 0x80000
flash zone:
bootloader: 0x0, 0x1000
bootenv : 0x1000, 0x1000
app bankA : 0x2000, 0x3e000
app bankB : 0x40000, 0x3e000
kvs env : 0x7e000, 0x2000
buildtime: 1709176672
-rw-rw-r-- 1 sunyb sunyb 242856 2月 29 11:17 ./output/apus.bin
2. 烧录固件到开发板*
2.1 烧录前介绍*
开始烧录前需要准备:
- Micro USB连接线
- usb to ttl 转接器,用于烧录
- 8302A_NRE_RC_DMOE 板或 APUS_DEV_QFN32 板
- 固件包
usb 连接PC
连接示意图
2.2 烧录步骤*
a. 选择对应的串口号和波特率, 选择合适的串口波特率(影响烧录的稳定性和耗时,默认115200)
sudo ./tools/bootx/bootx -m auto -t s -d /dev/ttyUSB0 -c download 0 output/apus.bin -r 1000000
b. 按住boot 键,点击复位按键进入烧录模式,回车开始烧录。
c. 烧录成功,出现 SUCCESS 字样
3. 遥控器相关命令*
命令 | 描述 |
---|---|
ble_pair | 配对 |
ble_unpair | 取消配对 |
ble_terminate | 断开连接,下次连接不需要配对 |
ble_peers | 已配对设备数量 |
list_bonded | 已绑定的设备列表 |
delete_bonded | 删除绑定信息 |
read_current_phy | 读取当前物理层的传输速率 |
set_current_phy | 设置当前物理层的传输速率 Mbps /2Mbps |
set_default_phy | 设置当默认物理层的传输=率1 Mbps /2Mbps |
read_default_dlen | 读取配置蓝牙控制器的建议默认数据长度和传输时间 |
set_default_dlen | 设置默认配置蓝牙控制器的建议默认数据长度和传输时间 |
set_current_dlen | 读取当前蓝牙控制器的建议默认数据长度和传输时间 |
update_conn | 更新设备连接参数,由丛机发起更新请求,主机可以拒接 |
update_mtu | 丛机发起更新MTU 数据 |
ble_re_establish | 重新连接 |
3.1 功能验证*
- 广播配对
用Android手机蓝牙搜索蓝牙设备,或者iPhone nRF Connect软件可以搜索到设备
- 用蓝牙dongle连接测试
准备一台linux pc机并带蓝牙功能的。如果PC不支持,可以购买绿联的USB蓝牙dongle,链接:https://item.jd.com/100022743908.html
遥控器终端输⼊ble_pair进⾏⼴播配对
linux PC端输入: ./nimble-linux-client -i 0 -d apus_rc_xxx 进行连接。apus_rc_xxx 是遥控器的设备名,根据实际情况修改。nimble-linux-client 工具在SDK对应的 apus\apps\ble_remote_control\client-demo 目录下
- 按键功能接收
- 语音功能
3.2 蓝牙语音传输*
音频传输过程,会先通过mSBC压缩,减小数据量
- 音频:16K 16bit 单声道PCM
- 音频传输编码:mSBC 或 ADPCM
- 音频传输Profile:
- 服务uuid {6E400001-B5A3-F393-E0A9-E50E24DCCA9E}
- 特征uuid {6E400003-B5A3-F393-E0A9-E50E24DCCA9E}
- 类型: NOTIFY
- 描述: server端传输音频到client端
语音包格式:
head/1Byte | data/nByte | 校验位/1Byte |
---|---|---|
seq | data0,data1,data2...datan | sum |
seq:发送端每次加一,接收端可以通过这个判断是否出现了丢包问题
data:mSBC压缩后的音频数据
sum:包含seq和data一起的累加和
sum代码实现如下:
unsigned char calculate_sum(unsigned char *data, int len)
{
unsigned char sum = 0;
for(int i = 0; i < len; i++) {
sum += data[i];
}
return sum;
}
SDK默认格式:
- head: 1 Byte
- data: 228 Byte
- check_sum: 1 Byte
- 每次notify一包数据 230字节,其中228字节是音频数据。一包数据是把30ms(960字节)PCM音频(16K 16bit 单声道)mSBC压缩为228字节
- 编码是:每240字节PCM mSBC编码为57字节作为一帧,因此228字节的数据包含4个57字节的帧数据;解码处理需要每57字节解码一次,连续解码四次
示例代码:
/*
in_buf 是压缩的音频数据
buffer_size 是压缩的音频数据长度
out_buf 是用于保存解码后的pcm音频buf
*/
#define msbc_size 57
while (buffer_size >= msbc_size) {
sbc_dec_msbc_decode(in_buf, msbc_size, out_buf);
buffer_size = buffer_size - msbc_size;
in_buf = in_buf + msbc_size;
}
3.3 遥控器厂测功能*
测试环境:
测试专用的usb dongle,国芯微提供。在win7上需要按照对应的驱动,win10及以上系统免驱
dongle见下图:
PC机,支持win7/win10及以上系统
PC测试上位机软件,见下图:
PC测试上位机软件下载链接:http://yun.nationalchip.com:10000/l/CFK7q6
注意:win7的驱动安装包和上位机的使用文档,都在上位机的帮助说明里