做蓝牙开发也有一年多的时间了,从单个BLE外设到BLE Mesh开发,想利用开发的空余时间整理一下零零碎碎的蓝牙开发相关的知识点。
关键词解析
BLE
低功耗蓝牙 (bluetooth low energy),蓝牙4.0。它最主要的特点是低功耗,普及率高。现在所说的蓝牙设备,大部分都是在说4.0设备。
最新的蓝牙标准为蓝牙5.0,2017年才开始有芯片出厂,目前还没有普及。
Peripheral、Central
大部分的项目开发中都是central去连接peripheral,比如iPhoneX去连接一个蓝牙灯泡,iPhoneX就是central,蓝牙灯泡就是peripheral。
Peripheral只能被一个Central连接,Central可以连接多个Peripheral。使用iPhone做Central去连接蓝牙设备的时候大概可以连接7个左右(不稳定),设备连接过多的话会导致iPhone蓝牙重启。
service、characteristic
服务和特征关系可以参照下图理解:
1.每一个设备都会包含很多个服务(service),每个服务对应一个uuid。
2.每个service会包含多个characteristic,每个characteristic对应一个uuid.
- characteristic是获取信息的主要来源,有read、write、notify三个权限。
协议
每个具体的智能设备,都约定了一组数据格式,这个就是数据协。如:约定0x01为开灯、0x00为关灯。
外设模式、中心模式
中心模式:app作为中心,连接其他BLE4.0外设
外设模式:app模拟一个BLE4.0外设,可以被其他设备连接和使用
开发流程(中心模式)
- 建立中心角色
- 扫描外设(discover)
- 连接外设(connect)
- 扫描外设中的服务和特征(discover)
- 4.1 获取外设的services
- 4.2 获取外设的Characteristics,获取Characteristics的值,获Characteristics的Descriptor和Descriptor的值
- 与外设做数据交互(explore and interact)
- 订阅Characteristic的通知
- 断开连接(disconnect)
扫描蓝牙设备
打开蓝牙扫描,这时蓝牙会扫描周围的蓝牙广播,这个有效距离会受硬件设备、是否有遮挡物、设备高度的影响。
扫描到设备的同时,我们会得到设备的广播包数据。在大量的实践经验中个人对广播包的理解是,包里的数据分为两种,一种是直接写死在广播包的信息里,另外一种它发现你扫描到它了开始“加载”数据显示给你看(在扫描大量设备时,有些广播包信息会显示不全)。
过滤设备
在CoreBluetooth的框架API里,扫描到的广播包,会在delegate里面以dictionary的数据结构返回给我们。
在advertisementData
的字典中,根据keykCBAdvDataManufacturerData
可以获取到广播包NSData
的信息或keykCBAdvDataLocalName
获取到设备的localName即:
NSString *localName = advertisementData[@"kCBAdvDataLocalName"];
NSData *data = advertisementData[@"kCBAdvDataManufacturerData"];
通常我们会根据这两个属性去判断这个蓝牙设备是否是我们需要连接的外设。
连接设备
CoreBluetooth连接后我们可以拿到一个叫CBPeripheral的外设对象peripheral和CBCentralManager对象,(中心->外设)调用connectPeripheral:
连接。
获取Service和characteristic
成功连接设备之后,需要跟设备通讯就得找到协议里规定的service和characteristic,读取并监听。
写入characteristic
与蓝牙设备交互数据说白了就是读和写,写入数据。characteristic可以理解成写入数据与读取数据的一个通道。每次发送和收到的数据通常称为1包数据,一个包数据最多包含20个byte