【调研学习】蓝牙-音频-协议栈
项目需要使用蓝牙传输较多的数据,配置完发现带宽不够,所以找了市面上的嵌入式蓝牙模块,即使能找到最大带宽的模块,也只有60k byte/S,而且是基于蓝牙2.0 ble双模模块HC-04,SSP协议下才能实现这么高带宽的传输。完成项目通讯需求,仅仅换一个能支持这个带宽的模块也许就完事儿了,但这对于技术的进步显然是不够的。在此,提出一些相关的问题,并尝试通过调研给出可能的答案。
问题的提出
1.是什么限制了蓝牙通信的带宽?蓝牙耳机是如何实现高质量音频数据传输的?
2.调研时发现ESP系列MCU芯片可以支持蓝牙wifi通信,ESP32 系列MCU比起模块化的蓝牙芯片有什么优势,可以自己改协议栈吗?
3.各个协议栈到底是怎么回事,如果想根据要求自定义蓝牙协议栈,有无比较快上手的方法?
4.目前高性能鼠标会采用2.4G通信模块,比起蓝牙2.4G通信有什么优势,为什么2.4G通信没有蓝牙应用的广?
5.买的蓝牙模块在十几块到上百块不等,而且还都不能实现高带宽数据传输。为什么蓝牙耳机中,传音频的蓝牙模块能做的这么便宜,支持蓝牙耳机最小功能的蓝牙芯片大概长啥样?
1.什么限制了蓝牙通信的带宽
是功率,或者说物理层PHY协议栈。
蓝牙最初设计的初衷就是代替近红外无线遥控,走音视频实在难为人家。蓝牙和Wifi虽然同处于2.4G频段,但功率差了好几个量级,蓝牙设计时目标就是低功率无线通信,因此,[物理层协议栈]中的数据处理速率受到限制,以适配这种低功耗。
Wi-Fi has a maximum speed that is much faster than Bluetooth: at least 54 Mbps for Wi-Fi, vs. only 3 Mbps for Bluetooth. As a result, Bluetooth is typically used for transferring small chunks of data, such as numerical values from IoT sensors. Wi-Fi, on the other hand, is better for sending large data files, such as videos and photos.
目前物理层所能处理的极限速率是[54 M bps],也就是在”理想信道条件”下PHY级别可实现的最大原始吞吐量,但实际应用中,最高也就 BT3.0 HighSpeed模式曾经实现的24M bps,3M bytes/S。蓝牙具体的空中传输速率众说纷纭,甚至还有蓝牙版本越高传输速度越大的,怀疑是无量厂商宣传时不懂具体技术,然后做科普时也没弄懂就照搬了。
从蓝牙联盟官网找到的传输速率:
对于上电工作而非电池供电的系统,功率显然不是硬指标,所以低版本的蓝牙可能更适合。当然蓝牙5.2的传输速率在大多数时候也是够的,目前ble 5.0就可以传输高质量音频,但是需要一定的压缩编码。比如说48kHz 16位深双声道,数据量就有192kHz ,1.536Mbps,以及非常接近ble的物理极限了。实际应用中不可能在物理极限传输,如果做音频传输需要配置A2DP(Advanced Audio Distribution)蓝牙音乐协议,这个协议在蓝牙5.2的带宽是1Mbps,不支持48kHz 16位深双声道的音频传输。
目前高质量音频都需要编码解码,类似于压缩解压。
压缩编码主要在A2DP协议层中进行,主要包括:AAC、SBC、APTX、LDAC等。
简要介绍一下:
SBC,标准音质编码,A2DP强制规定的编码格式,也就是人们说的子带编码,所有蓝牙都支持这一编码。比特率较低,压缩率不高。
“AAC”, (Advanced Audio Coding,高级音频编码),属于高级音频的编码,高压缩比的编码算法。
“apt-X”,属于一种子带ADPCM的数字音频压缩算法,CSR发展,后被高通收购,后来衍生出低延时、HD两种编码方式。
“LDAC”,索尼所研发推出的一种“无线”编码技术,非常粗暴地提高信道,带宽:质量最优的990Kbps、默认的660Kbps普通版本,以及最后的标准330Kbps
HWA(HiRes Wireless Audio)高音质蓝牙协定,由华为提出,基于LHDC的编码协议。
好的音质不仅取决于蓝牙版本,更多地是编码的方式,这需要芯片有更高的算力。而蓝牙的带宽是基础协议栈决定的,比较难改,只能在压缩编码上下功夫。所以对于更高带宽追求,可以换成传统蓝牙的HighSpeed协议(不过目前还没找到这个模块,开发模块厂商HC2.0 4.0 5.0都有就是没有3.0)如果换不了,拿只能在协议栈上下功夫了
2.ESP32 系列MCU比起模块化的蓝牙芯片有什么优势,可以自己改协议栈吗?
ESP32可以改协议栈,但是只能改Host中的协议栈。当然,加入蓝牙功能后,controller的协议栈肯定是有的,但是改起来学习成本很大。
比起蓝牙模块,使用ESP32实现蓝牙功能,可以省一个MCU。ESP32的flash、SRAM都比同价位的STM32芯片大,而且主频也更高,就是IO口不够,往往需要功能复用。同时,虽然同价位的ESP32SRAM和ROM都比STM23大,近一倍,但是如果加入了蓝牙协议栈,几乎就占用了70%的SRAM,其余的可用空间也就和同价位STM32差不多了。
ESP32也是系列芯片,目前产品还没有STM23系列多,但是官方不止卖芯片,还买贴片模组和开发板,还很便宜!不过大多数芯片都不带DAC功能,可能需要IIC接口外接DAC芯片。不过ESP32基本都带IIS协议接口,这个可用接音频解码播放芯片,具体的播放芯片还没有调研选型,不过大概知道他能干这件事儿。
3.各个协议栈到底是啥关系,如何快速改成想要的样子?
协议栈的组成也是众说纷纭,具体原因的经典蓝牙、ble蓝牙的协议栈会有不同,而其他人搬过去的时候也只是机械地翻译 ,协议栈有多少多少层,每层有什么功能,对初学者非常不友好,看完往往是一头雾水。
后来找到一篇讲得好的教程:CSDN:一篇文章足够你学习蓝牙技术
大致的原理都是类似的:controller于底层RF交互、HCI交连controller和Host,Host中搭建应用功能服务协议。架构都是相似的,其中controller层的协议决定了是BLE还是经典BT。手机、电脑中大多都是双模的底层协议。
transport层决定了controller和Host交互的通信协议,片外通信。常见的有UART USB SDIO。USB是D+、D-,用的是差分线,这样的话可以支持的速率更高,虽然和UART都是异步串行协议,但是USB通过差分稳定以及打包发送能实现更快的速度;SDIO是SD卡的读取协议,属于同步串行协议。SDIO和USB协议的通信速度都比UART高,但是对于2Mbps的底层速率,UART显然够用了。
之前买的很多模块,HC-05 ATK-BLE HC-08等等,大多都只是在无线收发芯片中封装了底层协议,给出了UART接口,然后就可以接入单片机使用了。但是这种使用方法,由于没有Host协议栈,即使能匹配上电脑的蓝牙,也无法通信。可以在单片机中完善Host协议栈,配置SSP协议,在与电脑内置蓝牙配对后,那么蓝牙设备会被识别出一个串口,可以生成对应的串口号进行通信了。亦或者配置A2DP协议,这一与电脑蓝牙匹配后会被识别出蓝牙耳机,进行音频数据传输。
协议栈给出了更多功能服务的协议组成,例如想搭载A2DP协议,就得先有AVDTP协议。在搭载了LE协议的同时,也有A2DP协议,则设备会被主机识别为音频播放设备。
在ESP32的开发平台中,有基于espressif IDF的框架和基于Arduino的框架。如果使用Espressif框架,在SDK configuration editor给出了无代码、选择配置的界面。
在创建工程时可以选择是否开启蓝牙协议栈、controller模式、运行内核、HCI接口、最大连接数等等。当然也可以基于协议栈代码自己改。
4.目前高性能鼠标会采用2.4G通信模块,比起蓝牙2.4G通信有什么优势,为什么2.4G通信没有蓝牙应用的广?
蓝牙的标准比2.4G多 拥有IEEE标准,可以实现多设备传输,可以一对多,不需要外置专门的接收器。蓝牙计数可以使可连接的设备更加广泛,工作模式也更加便捷。蓝牙增加了自适应调频计数,一般只要有蓝牙模块即可连接,但是速度慢,带宽较小。
2.4G信号传输频率更高,需要专用的一对一接收器,且只能一对一通信,但是在单点性能上比蓝牙更好。需要和自带的USB接收器对码才能使用,一般来说不是自己的接收器无法使用。不过它占用的频宽大,响应快,中高端产品已经做到和USB有线一样的1000HZ,也就是1ms一个包,而蓝牙不行,最多每秒百次。
现在自己的鼠标MS Master基于 罗技USB UNIFYING RECEIVER ,这个模块基于nEF24L 2.4G通信模块。相对于蓝牙,其接收器需要占用USB口。早期罗技的U联接受只支持鼠标,后来加入了键盘、耳机。LIGHTSPEED计数在鼠标中更是天花板,UR相较而言会差一些,但能多设备接收,同时比蓝牙速度更快。
5.支持蓝牙耳机最小功能的蓝牙芯片大概长啥样?
某宝搜蓝牙耳机,最便宜的30块钱就能买到。是怎么做到这么便宜的?
降低蓝牙耳机成本的关键是芯片选型。找到一款便宜的WT2605-24SS 蓝牙MP3芯片:
像上面这一款,集成了蓝牙通信、扬声器播放、麦克风输入、UART通信配置、USB、SPI-SD卡数据读取。这是一款几乎集成了所有蓝牙MP3播放器功能的芯片。
有一个16 bit DAC音频解码器,通讯速率高达1Mbps 。具体的解码方式应该是最基础的SBC ,AAC带宽不支持。
也有其他的蓝牙-音频芯片,价格几块钱到几十块不等。支持不同的蓝牙版本、编解码方式。