跳转至

蓝牙遥控器*

本文基于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

连接示意图

ble_connect

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 键,点击复位按键进入烧录模式,回车开始烧录。

ble_download

c. 烧录成功,出现 SUCCESS 字样

ble_download2

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 功能验证*

  • 广播配对

ble_pair

用Android手机蓝牙搜索蓝牙设备,或者iPhone nRF Connect软件可以搜索到设备

ble_pair2

  • 用蓝牙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 目录下

ble_dongle

  • 按键功能接收

ble_key

  • 语音功能

ble_audio

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的驱动安装包和上位机的使用文档,都在上位机的帮助说明里