首页 > 编程知识 正文

蓝牙音箱怎么用(蓝牙基础知识整理)

时间:2023-05-06 16:53:35 阅读:74521 作者:2187

简介2017年1月18日,我进行了我所知道的live的活动。 主题是“知道的live:1小时蓝牙APP研发科普”。 感谢微信公众号。 QQ baby蓝牙发展集团的学生们参加了。 现在活动结束了。 把活动中的声音内容总结成文字是以下内容~

蓝牙4.0是什么,蓝牙的其他标准是什么,以及低功耗蓝牙(低能耗; LE )被视为蓝牙智能或蓝牙核心规范的4.0版。 其特点是节能方便,蓝牙技术专用于物联网(Internet of Things; IOT )开发的技术版本。

因此,最大的特点是耗电量低,普及率高。 现在所谓蓝牙设备,大部分是指4.0设备,ble也特别指4.0设备。 4.0之前的重要版本包括2.1版本-基本速率/扩展数据速率(BR/EDR )和3.0高速蓝牙版本,它们统称为经典蓝牙。

4.0还有4.1101和4.2小版本,其中4.2进一步提高了传输率,使其增长了2.5倍。 苹果使用的是iphone6至4.2。

最新的蓝牙标准是蓝牙5.0

其中最大的特点是连接范围扩大了4倍,速度又提高了2倍,非连接数据广播能力提高了8倍,蓝牙网络的能力增加了。 2017年芯片开始发货了。 我和Ti,诺迪克工程师说过话。 他们的5.0芯片已经完成,准备量产。

APP端iOS和安卓操作系统支持的蓝牙协议苹果从iphone4s、ipad3和pod touch 5支持蓝牙4.0,安卓从4.3或更高版本的系统支持4.0 此外,苹果还从iphone 6支持蓝牙4.2协议,以提高数据传输速度。 如前所述,约为2.5倍。

我很期待蓝牙5.0,但是它可能需要几年的时间才能普及到手机和其他智能设备上。

蓝牙开发中需要知道的概念central和peripheral

蓝牙APP应用程序开发有两个角色:中心和外围设备(p’rfrl ),中文是中心和外围设备。 例如,当移动电话连接到智能设备时,该移动电话是中心,而智能设备是peripheral。 因为这往往是central连接到peripheral的场景,所以我们谈论他的流程

广播和连接

peripheral发出广播(advertisement : dv’taz mnt ),central扫描到广播后,可以连接到设备并发出连接请求,peripheral

连接后的操作

write,read,notify,indecate,response or not …这将在后面详细说明

indecate和notify的区别在于,indecate始终接收数据。 通告可能会丢失数据(central没有接收数据的响应)。 write也分为响应和无响应,如果是响应,则write将成功回收到periponse

协议

对于每个具体的智能设备,都约定了一系列数据格式。 这就是数据协议。 例如,在手环中取得数据0X001023,其中从第2位到第5位表示步数时,2310为步数的16进制数据,转换为10进制时为8976步。 需要注意的是,设备端都是小端序模式,因此取4位时,高位字节为低位字节

蓝牙APP的常见开发流程已经以iOS为例,安卓也与此类似。

建立核心角色并扫描外围设备(discover )连接(connect )扫描外围设备中的服务和特性(discover ) )。

4.1获取外围设备服务4.2获取外围设备的ngdjmgs,获取ngdjmgs的值, 获取ngdjmgs描述符和描述符的值并与外围设备进行数据交换(浏览和交互)订阅ngdjmg的通知断开) disconnect read、notify、indecate、 indecate和notify支持长连接,建立indecate后,peripheral可以随时向中心发送数据。

indecate和notify的区别在于,indecate始终接收数据。 通告可能会丢失数据(central没有接收数据的响应)。 write也分为响应和无响应,如果是响应,则write将成功回收到periponse

对于一个bbdggx,他的读写订阅权限由peripheral确定,熟悉度可以同时设置,并且一般由外围设备的功能确定。

蓝牙蓝牙蓝牙,dfu(devicefirmwareupdate )是蓝牙设备的固件升级,但实际上是一系列过程,通过蓝牙芯片这里以钛的芯片为例。 步骤包括:断开系统、重新启动和传输

数据,验证数据,切系统,重启,完成。

其中数据传输也会分成很多节去发送,没法送一段数据,做一次数据校验。

ota存在的问题

以TI的芯片举例,他需要可以存2个image,数据传输时候需要的空间比较大,而每个智能设备的速率,功耗,存储都会有很多限制,导致很多设备会自己去实现ota的功能,自定义流程和数据传输方式,导致许多设备都是有自己私有的ota模式和协议,所以在做开发的时候,要仔细阅读设备协议中对ota的描述。

蓝牙开发中的常见的问题和坑

应用如何做自动重连

其实自动重连比想象的要简单许多,无论是android还是ios端,只需要在设备断开连接的委托方法中,重新调用gatt.connet或者是centralManager.connet方法就可以了,无论当时设备是否有点,是否在周围,当设备再次开会或者连接到可连接范围内,都会自动被连上,就是这么简单。

连接失败处理

分两个平台来说,iOS端也有连接失败的委托,但是好像几乎不会发生这种情况,至少我从来没遇见过,而对于同款设备,android常常会出现连接失败的情况,status != BluetoothGatt.GATT_SUCCESS ,android端开发请不要把连接失败和断开连接放在一块处理,因为断开连接可以直接尝试重新连接,而连接失败后尝试重新连接,需要加一些延时,并且需要gatt.close,清空一下状态,否则会把gatt阻塞导致手机不重启蓝牙就再也无法连接任何设备的情况。

后台运行

iOS后来运行,需要设备中info.Plist权限,key:Required background modes ,value: bluetooth-central(手机作为central) , bluetooth-peripheral(手机作为外设) 参考链接

同时连接多个设备

android很简单,创建多个gattCallback,每个gattCallback单独管理设备连接后的操作,而iOS也最好不要创建多个CBCentralManager,多个CBCentralManager理论上可以用,但是会存在多个手机版本存在不同的行为,还有一些很容易出错的问题,这块内容不细说了。使用同一个CBCentralManager,通过进入委托的peripheral的identifier区分不同的设备,进行不同的操作和处理。 在阿里的smurfs蓝牙模块中,我使用了一个dispatcher去分发每个连接设备的事件到不同实例中进行处理。

扫描广播包

所有外设,只有在发出广播包的情况下,才能被central发现,绝大多数情况下,外设被连接后就不会发出广播(也有例外),很多人遇到无法找到设备的问题,大多属于这种情况。 重复扫描问题——————

提高蓝牙连接速度

无论是iOS,还是android,都可以通过已绑定的设备,在不开启扫描的情况下进行快速连接,iOS需要的参数是peripheral的identifier,android需要mac地址。但android和iOS还是有一些区别的,比如iOS不能拿到已绑定的设备list,但是可以通过UUID去拿到peripheral的实例。而android可以拿到已绑定的设备list。android绑定过程需要手动调用createBond的方法,而iOS在连接成功一次后会自动绑定。 android在处理createBond时,常常会应为不同手机平台,不同设备,会产生兼容性的问题,这点需要注意。

定向扫描

在扫描时候可以传入serviceUUID,这样可以扫描到特定条件的设备,提高扫描的速度,排除干扰。

如何获取mac地址

android可以直接通过getAddress得到mac地址,而iOS出于苹果的安全策略问题,无法直接获得mac地址,只能得到一个mac地址换算出来的identifier。不过在智能设备开发时,一般都会考虑到这个问题,大多数智能设备会把mac地址保存在广播数据中,不同设备可能会存在不同的位置。

Babybluetooth蓝牙库的使用

Babybluetooth是iOS的蓝牙库的封装,iOS蓝牙委托层级特别讨厌,一个委托接着一个委托,比如先进入扫描的委托,在进入链接的委托,在进入连接成功,发现服务,发现特征,读写操作,一套操作被拆分的很散,容易出错,代码不易维护,上手慢等缺点,Babybluetooth对CoreBluetooth进行了封装,把委托回调进行方法调用的方式,改成了链式方法顺序调用,直接调用dc.enjoy()方法,完成一整套操作。简化了上手难度和代码维护成本。现在开源在github上,有2300个star,蓝牙库中排名第一。

由于时间关系,这里不会详细介绍BabyBluetooth的使用,想连接的可以看github 爱撒娇的钢铁侠的主页。

作者:欣慰的画板,80后,一个全栈工程师,github开源作者,目前就职于阿里巴巴,从事iot智能蓝牙设备应用端和基础框架开发。
原文:知乎live:一小时蓝牙科普 文字整理版
声明:本文首发于作者博客,转载已经作者授权。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。