扩展程序通过 MHBluetooth 模块与支持小米蓝牙协议的设备交互。此模块中封装了与米家对接的蓝牙设备连接、断开、发现服务、读写、监听广播等功能。使用方式类似于 CoreBluetooth。
如果该模块中的 API 不能全部满足业务需求,可使用 MHBluetoothLE
加 MHXiaomiBLE
模块来实现。
注意扩展程序需要正确处理蓝牙的连接与断开。用户退出插件时,必须断开连接。
// 模块初始化
var MHBluetooth = require('NativeModules').MHBluetooth;
我们提供了一个蓝牙示例插件,见 com.xiaomi.bledemo.ios 目录
无
苹果的 CoreBluetooth 框架中,调用 CBCentralManager 与 CBPeripheral 的方法,分别通过 CBCentralManagerDelegate 与 CBPeripheralDelegate 的回调方法返回结果。MHBluetooth 采用与此类似的方式,由插件注册监听事件通知来处理相应的回调。
MHBluetooth 只会接收当前插件控制的设备的事件。
蓝牙事件的规则如下:
-
CBCentralManagerDelegate 以及 CBPeripheralDelegate 中的大部分回调方法(简称 CB 回调 )在 MHBluetooth 中都有对应的通知事件(简称 M 事件 )。目前有部分不常用的方法没有对应的通知事件
-
M 事件 与其对应的 CB 回调 的含义、功能以及调用时机完全相同。
-
单参数的 CB 回调,M 事件 名称与 CB 回调 名相同(字母、大小写均相同)。如: CB 回调 :
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
对应的 M 事件 为:
MHBluetooth.centralManagerDidUpdateState
-
多参数的 CB 回调,M 事件名称为每段CB 回调名以下划线"_"连接。如: CB 回调 :
- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error
对应的 M 事件 为:
MHBluetooth.centralManager_didDisconnectPeripheral_error
-
CB 回调 的参数,会通过 M 事件 携带在通知中广播给插件,但 centralManager 和 peripheral 参数会被过滤掉。
// 监听事件示例代码
var {DeviceEventEmitter} = require('react-native');
var subscription = DeviceEventEmitter.addListener(MHBluetooth.peripheral_didDiscoverServices,(notification) => {
console.log(JSON.stringify(notification));
MHBluetooth.serviceUUIDsWithCallback((uuids) => {
console.log(uuids);
});
});
注意 与其他普通事件一样,监听的事件通知,需要在 componentWillUnmount 方法中取消监听。
// 取消监听事件示例代码
componentWillUnmount() {
if (subscription)
{
subscription.remove();
}
}
具体可以参见 SDK 中附带的蓝牙示例插件 com.xiaomi.bledemo.ios
蓝牙开关状态改变
设备已连接
设备连接失败
设备断开连接
设备服务发现完毕
服务的特征发现完毕
服务特征值发生更新(被 read 之后,或收到设备 notify 通知)
服务特征值写入完毕
服务特征值 notify 状态发生改变
读到新的 RSSI
RSSI 更新
无
发现当前设备peripheral的services。
var {DeviceEventEmitter} = require('react-native');
var subscription = DeviceEventEmitter.addListener(MHBluetooth.peripheral_didDiscoverServices,(notification) => {
console.log(JSON.stringify(notification));
MHBluetooth.serviceUUIDsWithCallback((uuids) => {
console.log(uuids);
});
});
MHBluetooth.discoverServices();
发现当前设备peripheral的指定service的characteristics
serviceUUID
服务的 UUID 字符串
读取当前设备peripheral的指定characteristic的值(base64编码)
characteristicUUID
指定characteristic的UUID字符串serviceUUID
指定service的UUID字符串callback
回调方法 (bool isSuccess, [characteristicUUID, serviceUUID])注意 该方法的 callback 并不能返回数据,只是返回读取是否成功,数据的返回与 CoreBluetooth 一样,会通过对应的回调方法。
var {DeviceEventEmitter} = require('react-native'); // 订阅特征值更新通知 var subscription = DeviceEventEmitter.addListener(MHBluetooth.peripheral_didUpdateValueForCharacteristic_error,(notification) => { console.log(JSON.stringify(notification)); }); // 读取特征值 MHBluetooth.readBase64DataWithCallback("0001", "fe95", (isSuccess, loopbackParams) => { // });
向当前设备peripheral的指定characteristic写入值(base64编码)
data
写入的数据,用base64编码,写入时会自动解码characteristicUUID
指定characteristic的UUID字符串serviceUUID
指定service的UUID字符串type
写入方式(0=需要response, 1=不需要response)callback
回调方法 (bool isSuccess, [data, characteristicUUID, serviceUUID, type])注意 该方法的 callback 并不能返回设备侧是否写入成功,只是返回APP侧写入命令执行是否成功,与 CoreBluetooth 一样,会通过对应的回调方法返回写入成功( type=0 的情况下)。
向当前设备peripheral的指定characteristic写入值(16进制字符串格式)
data
写入的数据,用16进制字符串格式,写入时会自动解码characteristicUUID
指定characteristic的UUID字符串serviceUUID
指定service的UUID字符串type
写入方式(0=需要response, 1=不需要response)callback
回调方法 (bool isSuccess, [data, characteristicUUID, serviceUUID, type])注意 该方法的 callback 并不能返回设备侧是否写入成功,只是返回APP侧写入命令执行是否成功,与 CoreBluetooth 一样,会通过对应的回调方法返回写入成功( type=0 的情况下)。
设置当前设备peripheral的指定characteristic的通知状态
needNotify
是否打开通知characteristicUUID
指定characteristic的UUID字符串serviceUUID
指定service的UUID字符串callback
回调方法 (bool isSuccess, [needNotify, characteristicUUID, serviceUUID])
当前设备所有已发现的service的UUIDs
callback
回调方法 (Array serviceUUIDs)
当前设备所有发现了的指定service的characteristic的UUIDs
serviceUUID
指定service的UUID字符串callback
回调方法 (Array characteristicUUIDs, [serviceUUIDs])
开始监听当前设备的广播
可通过监听MHBluetooth.receivedBroadcastEventName事件收到广播中的数据
开始监听当前设备的广播(重复的peripheral只回调一次)
可通过监听MHBluetooth.receivedBroadcastEventName事件收到广播中的数据
停止监听当前设备的广播
重新连接设备
callback
回调方法 (bool isSuccess)
断开设备
非小米协议的蓝牙设备扫描发现 callback 回调方法**(error.code)** 200为成功发现,404为未发现,其他为错误码
seconds 超时时间秒数 callback 回调方法**(error.code)** 200为成功发现,404为未发现,其他为错误码,错误码为3时需要重新注册
小米协议的蓝牙设备注册 callback 回调方法**(error.code)** 200为成功发现,404为未发现,其他为错误码
获取自定义数据 callback 回调方法**(base64ManufaxtureData)** 自定义数据的base64编码值
设置设备列表离线状态(蓝牙未连接)副标题 desc 字符串
设置设备列表在线状态(蓝牙连接)副标题 desc 字符串
设置设备列表默认副标题 desc 字符串
获取蓝牙状态
MHBluetooth.getBluetoothStateCallback((state)=>{
//CBManagerStateUnknown = 0,
//CBManagerStateResetting,
//CBManagerStateUnsupported,
//CBManagerStateUnauthorized,
//CBManagerStatePoweredOff,
//CBManagerStatePoweredOn,
});
获取蓝牙peripheral信息
MHBluetooth.getPeripheralInfo((success,peripheral)=>{
if(success){
console.warn(peripheral);
}
});
获取蓝牙peripheral rssi信息
peripheral_didReadRSSI_error 通过此事件监听rssi值回调
peripheralDidUpdateRSSI_error 通过此事件监听rssi error信息
//添加监听
...
MHBluetooth.readRSSI();