关于蓝牙开发必须知道的概念及开发中的常见的问题

本文详细介绍了蓝牙开发的基础概念,包括central和peripheral的角色、广播与连接、数据交互、OTA更新及常见问题。以iOS和Android为例,阐述了蓝牙应用开发流程、数据传输、自动重连和连接失败处理技巧。
摘要由CSDN通过智能技术生成

蓝牙技术凭借其普遍性与简洁性改变了设备之间的无线通信。由于其功耗与成本较低,在健康医疗、体育健身、家庭楼宇自动化、信标等应用领域的发展过程中发挥着至关重要的作用。

蓝牙给我们带来很多方便,不过对于一些新手,在进行蓝牙开发之前,有必要对其相关的知识有详细的了解,这里主要介绍一些蓝牙应用开发的知识点和开发流程。

一、蓝牙开发必须知道的概念

1.central和peripheral

蓝牙在应用开发过程中,有两种角色,分别是central和peripheral,中文就是中心和外设。比如手机去连接智能设备,那手机就是central,智能设备就是peripheral。大多时候都是central去连接peripheral的场景,所以我们就来说他的流程。

2.广播和连接

peripheral会发出广播(advertisement),central扫描到广播后,可以对设备进行连接,发出connect请求,peripheral接收到请求并同意连接后,central和peripheral就建立了连接。

3.协议

每个具体的智能设备,都约定了一组数据格式,这个就是数据协议。需要注意的是,设备端都是小端模式,所以在读取数据的时候,高字节在前低字节在后。

 

二、蓝牙应用的一般开发流程

已iOS为例,android也和这个是类似的。

1. 建立中心角色

2. 扫描外设(discover)

3. 连接外设(connect)

4. 扫描外设中的服务和特征(discover)

* 4.1 获取外设的services

* 4.2 获取外设的Characteristics,获取Characteristics的值,获取Characteristics的Descriptor和Descriptor的值

5. 与外设做数据交互(explore and interact)

6. 订阅Characteristic的通知

7. 断开连接(disconnect)

 

 

三、蓝牙的数据交互

write,read,notify,indecate,response or not … 读写大家都是容易理解的,indecate和notify对应的是长连接,建立indecate后,peripheral可以随时往central发送数据。

indecate和notify的区别就在于,indecate是一定会收到数据,notify有可能会丢失数据(不会有central收到数据的回应),write也分为response和noresponse,如果是response,那么write成功回收到peripheral的确认消息,但是会降低写入的速率。

对于一个charateristic,他的读写订阅的权限是peripheral决定的,熟悉可以被同时设置,一般会根据外设的功能来决定。

 

四、蓝牙ota DFU

蓝牙ota,DFU(Device Firmware Update)指的是蓝牙设备的固件升级,其实是一整套流程,不同的蓝牙芯片,ota的流程有不同之处。用Ti的芯片举例,步骤为:切系统,重启,传输数据,验证数据,切系统,重启,完成。

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

 

五、ota存在的问题

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

 

六、蓝牙开发中的常见的问题

1.应用如何做自动重连

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

 

2.连接失败处理

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

 

3.后台运行

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

 

4.同时连接多个设备

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

 

5.扫描广播包

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

 

6.提高蓝牙连接速度

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

 

7.定向扫描

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

 

8.如何获取mac地址

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

 

9.Babybluetooth蓝牙库的使用

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值