实战BLE蓝牙之数据收发

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实战BLE蓝牙之数据收发相关的知识,希望对你有一定的参考价值。

参考技术A BLE蓝牙收发demo
串口收发助手

这个类主要是扫描蓝牙然后或获取蓝牙的地址:

通过蓝牙适配器就可以扫描蓝牙了
mBluetoothAdapter.stopLeScan(mLeScanCallback);

可以看到上面回调当中有三个参数其中device为蓝牙设备,这里面包含蓝牙名称和蓝牙地址,rssi可以通过算出模糊的算出蓝牙直接的距离;

在这个类中包括启动服务和接收服务发送过来的广播,以及蓝牙的连接和对服务的什么周期管理;

启动服务
startService(new Intent(this, BluetoothLeService.class));

注册广播
registerReceiver(mGattUpdateReceiver, makeGattUpdateIntentFilter()); //注册广播

连接蓝牙
final boolean result = mBluetoothLeService.connect(mDeviceAddress); //连接蓝牙

可以看到连接蓝牙只需要蓝牙的地址就可以,通过调用服务中封装好的连接蓝牙方法就可以连接
蓝牙建立好连接,然后通过UUID的读写通道建立读写的关系就可以在广播处接受分发送数据到服务类中将数据发送或接收;

连接蓝牙
// 第二个参数: 如果为false,则直接立即连接。
// 如果为true,则等待远程设备可用时(在范围内,。。)连接。并不是断开后重新连接。
mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
这里mGattCallback是蓝牙的BluetoothGattCallback的回调,这个回调中有几个重要方法,弄懂这几个方法那就弄懂了蓝牙。

CSR8675项目实战:BlueHiFi蓝牙音乐收发器

为了方便大家学习,现与我爱蓝牙网联合推出【QCC300x/CSR867x/QCC30xx/QCC51xx开发板】

技术交流QQ群号:743434463
开发板会员QQ群号:725398389(凭订单号入群,赠独家学习资料)
——————————正文分割线———————————–

1. 引言

蓝牙音乐收发器是一种包含了蓝牙发射器和蓝牙接收器两种工作状态的蓝牙设备,这两种状态可以通过按键或其他方式比较方便地切换,是一种性价比很高的产品形态。

目前市面上主流方案是高通的CSR8675,其支持aptx/aptx-ll/aptxhd/aac等多种编解码格式。CSR8675的ADK提供了source(蓝牙发射器)和sink(蓝牙接收器)这两个例程,如果能将两个例程整合起来,即是一个蓝牙收发器的产品。

客户的需求要更进一步,蓝牙收发器需要支持串口控制,支持USB DFU升级等。

2. 主要功能

功能描述
蓝牙发射AUX 2CH ⇒ BT(SBC/AptX/aptxHD)
与最近的蓝牙设备配对
蓝牙接收BT(SBC/AAC/Aptx/AptxHD) ⇒ I2S 48K/24bit/2CH ⇒ I2S to AUX ES9023
串口控制发射接收模式切换
进入配对/退出配对
获取连接状态
音量控制
上下曲/播放暂停
修改设备名称
当前播放歌曲时长/歌曲名称/播放状态
固件升级USB DFU升级

系统框图如下:

3. 项目难点

需要将source例程的代码文件添加到sink例程,然后屏蔽掉与AGHFP相关的代码,添加aghfp库到sink的工程属性,解决掉aghfp和hfp库的冲突。

编译完成后还需要注意,当编译结果显示stack size > 160时,有很大概率程序时不能运行的。此时需要查看map文件找到占用stack过多的函数。下图可以看出app_msg_hander占用了40的stack,显然是不正常的,就需要单独优化。

在完成上述工作后,需要将source和sink的初始化代码用bootmode模式区分。原本sink的bootmode可以沿用,需要为source创建一个新的Bootmode。每次启动时根据bootmode来选择启用发射还是接收模式。

最后我们如果需要配置source模式的config tool,可以重点看一下ps_read_user函数,通过修改这个函数,可以将配置通过程序来修改。

4. 总结和展望

通过蓝牙收发器的案子,让我加深了对bluestack与VM之间关系的理解。sink和source例程是在bluestack基础上搭建的功能集合,bluestack才是CSR方案的核心,而HCI层是通用的接口,这也解释了为何高通的firmware不开放代码,因为一旦开放这层代码,高通就对方案失去了掌控能力,ADK也就失去了生命力。

很遗憾蓝牙音乐收发器还不能移植到ADK6以上的版本,因为高通没有提供dsp的编码库。从这点也可以看出高通的产品规划是非常到位的,为了尽量拉长每个产品的生命力,使一些特殊功能只在某些平台上能够实现,值得我们在规划产品时充分借鉴。

以上是关于实战BLE蓝牙之数据收发的主要内容,如果未能解决你的问题,请参考以下文章

Android BLE低功耗蓝牙开发极简系列(二)之读写操作

Android项目实战(三十四):蓝牙4.0 BLE 多设备连接

蓝牙4.0BLE协议栈

BLE低功耗蓝牙的广播内容

CSR8675项目实战:BlueHiFi蓝牙音乐收发器

CSR8675项目实战:BlueHiFi蓝牙音乐收发器