蓝牙简介
大家认识的可能有蓝牙1.0、2.0、3.0、4.0以至于5.x的以数字结尾的蓝牙版本号,而实际上,在最新的标准中,已经不再使用数字版本号作为蓝牙版本的区分了,取而代之的是经典蓝牙与低功耗蓝牙(BLE)这两种区别。
蓝牙设备工作流程
1.发现设备
2.配对/绑定设备
3.建立连接
4.数据通信
1.发现设备
- 经典蓝牙:发现其蓝牙设备调用BluetoothAdapter的startDiscovery()方法
- 低功耗蓝牙:发现其蓝牙设备调用BluetoothAdapter的startLeScan()方法在实际应用中,StartDiscovery和StartLeScan分开扫,前者扫传统蓝牙,后者扫低功耗蓝牙。
2.配对/绑定
配对是建立两者的对应关系,产生一个密钥用来加密与鉴别连接,绑定指允许两台设备配对的时候给对方一个长期的一套安全密钥,把这层关系保存固定下来并进行了强化
3.建立连接
在蓝牙设备中,存在着物理地址,也叫作蓝牙的MAC地址,这个地址是唯一的,就像咱们网络上的IP地址。同时还存在着一个叫做UUID的东西,可以把它理解为是IP地址中的端口号,这两者合起来就是蓝牙的唯一身份标识。
- 经典蓝牙建立连接就是Socket的连接的建立,找到对应的BluetoothDevice,createRfcommSocketToServiceRecord(UUID) 再调用方法connect()建立了经典蓝牙设备之间的连接通道。
-
BLE设备建立连接
1.PROFILE profile可以理解为一种规范,一个标准的通信协议,它存在于蓝牙设备中。蓝牙组织规定了一些标准的profile,每个profile中会包含多个service,每个service代表设备的一种能力。
2、SERVICE service可以理解为一个服务,在ble设备中,通过有多个服务,例如电量信息服务、系统信息服务等,每个service中又包含多个characteristic特征值。每个具体的characteristic特征值才是ble通信的主题。比如当前的电量是80%,所以会通过电量的characteristic特征值存在从机的profile里,这样主机就可以通过这个characteristic来读取80%这个数据
3、CHARACTERISTIC characteristic特征值,ble设备的通信均是通过characteristic来实现,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。
4、UUID UUID,统一识别码,我们刚才提到的service和characteristic,都需要一个唯一的uuid来标识
4.数据通信
经典蓝牙数据通信
- 当建立连接后,就可以使用BluetoothSocket的两个方法
1.getOutputStream()方法写入需要发送的数据。
2.getInputStream()读取发送回来的数据。 - 想要实现主设备对从设备的数据发送,则需要直接读取获取到的从设备的Characteristic
1.通过BLE从设备对应的Service_UUID获取对应的BluetoothGattService
2.调用BluetoothGattService和对应的Characteristic_UUID获取相应的BluetoothGattCharacteristic,
3.设置需要发送的命令值,调用BluetoothGattCharacteristic的方法setValue(value)进行设置,其中value一般为byte[]
4.BLE设备的返回值,还需要设置开启Notification,然后调用readCharacteristic(characteristic)方法进行数据的读取
微信小程序Api
1.初始化设备蓝牙模块 openBluetoothAdapter()
|
2. 获取蓝牙适配器状态:判断蓝牙是否可用 getBluetoothAdapterState()
|
3. 开始搜寻附近的蓝牙外围设备 startBluetoothDevicesDiscovery()
|
4.获取蓝牙外围设备列表 getBluetoothDevices()
|
5. 创建连接 连接低功耗蓝牙设备 createBLEConnection(deviceId)
|
6.获取蓝牙设备所有服务 getBLEDeviceServices(deviceId)
|
7.获取蓝牙设备某个服务中所有特征值 getBLEDeviceCharacteristics(deviceId,serviceId)
|
8. 启用低功耗蓝牙设备特征值变化时的 notify 功能 notifyBLECharacteristicValueChange(deviceId,serviceId,characteristicId)
|
9. 发送信息到蓝牙设备 writeBLECharacteristicValue(deviceId,serviceId,characteristicId,buffer)
接收数据和发送数据时,注意BLE限制了发送数据包的大小,现在20byte。具体参考官方文档: https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.writeBLECharacteristicValue.html
|
总结
1.初始化蓝牙,
2.开始搜寻附近的蓝牙外围设备,
3.监听寻找到新设备的事件,
4.搜寻到需要的蓝牙,停止搜寻附近的蓝牙外围设备,
5.连接蓝牙设备,
6.获取蓝牙设备所有服务(service),
7.获取蓝牙设备某个服务中所有特征值(characteristic),
8.启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值。注意:必须设备的特征值支持 notify 或者 indicate 才可以成功调用
9.向低功耗蓝牙设备特征值中写入二进制数据
PS:该流程只适用于低功耗(BLE)蓝牙设备的连接/信息传输