对接微信蓝牙 API
需要用上的接口
接口 | 描述 |
---|---|
wx.openBluetoothAdapter | 初始化小程序蓝牙模块,在程序初始化的时候调用,可以在这里判断蓝牙是否开启 |
wx.getBluetoothAdapterState | 获取本机蓝牙适配器状态,查看本机蓝牙可否正常使用 |
wx.startBluetoothDevicesDiscovery | 开始搜寻附近的蓝牙外围设备 |
wx.stopBluetoothDevicesDiscovery | 停止搜寻附近的蓝牙外围设备,不需要搜索后应停止,搜索蓝牙消耗比较大 |
wx.getBluetoothDevices | 获取在小程序蓝牙模块生效期间所有已发现的蓝牙设备 |
wx.createBLEConnection | 连接低功耗蓝牙设备 |
wx.getBLEDeviceServices | 获取蓝牙设备所有 service(服务) |
wx.getBLEDeviceCharacteristics | 获取蓝牙设备某个服务中的所有 characteristic(特征值) |
wx.onBLEConnectionStateChange | 监听低功耗蓝牙连接状态的改变事件,包括开发者主动连接或断开连接,设备丢失,连接异常断开等 |
步骤
初始化
调用 openBluetoothAdapter
接口初始化蓝牙模块以及获取本机蓝牙适配器(getBluetoothAdapterState
)状态
搜索蓝牙
开始搜索周围蓝牙设备 wx.startBluetoothDevicesDiscovery
打开后,可获取以搜索到的蓝牙列表 wx.getBluetoothDevices
var that = this;
wx.getBluetoothDevices({
success: function (res) {
that.setData({
devices: res.devices
});
}
});
含有设备名称,型号强度,设备 ID,具体参数详见官方文档
不需要搜索后,那么就停止搜寻附近的设备 wx.stopBluetoothDevicesDiscovery
连接蓝牙
这一步简单,只需要调用 wx.createBLEConnection
将设备 ID 传进来就好了。
建立通讯
到了最重要的一步了。
它首先需要调用 wx.getBLEDeviceServices
获取一下蓝牙的 service
,这一步提供设备 ID 就好了。这里会返回服务的一个 UUID
接下来通过 wx.getBLEDeviceCharacteristics
是获取 service
的特征值。需要用上 UUID。返回内容中含有一个 characteristics
Array 对象。结构如下
[
uuid : "",
properties : {
read : false, //允许读操作
write : false, //允许写操作
notify : false, //允许通知
indicate : false //允许indicate...
}
]
那么用到什么操作。则需要再这个数组里面找到你需要进行的操作,且值为 True
的特征值 ID,保存起来。
就拿写操作来说。等于 True 的有多个。但是不知什么原因。并不是每个都有用。这是一个大坑。
于是找了一个工具一个一个的试。
发送消息
那么找到了可用的特征值以后。我们来发送数据,最开始我还在担心怎么发送 16 进制的通讯数据。
后来发现有一个 ArrayBuffer
对象。
let buffer = new ArrayBuffer(7);
let dataView = new DataView(buffer);
dataView.setUint8(0, 0xaa);
dataView.setUint8(1, 0x04);
dataView.setUint8(2, (1 << 7));
dataView.setUint8(3, (1 << 3 | 1));
dataView.setUint8(4, 1);
dataView.setUint8(5, 1 << 2);
实例一个 ArrayBuffer,申请一个 7 字节大小的内存。通过 DataView 向内存的位置写入数据。
这里有一个小技巧。假设通讯协议是某一个字节,拆分为八个位
bit7 | bit6 | bit5-bit3 | bit2-bit0 | |
---|---|---|---|---|
功能一(1 开 0 关) | 功能二(1 开 0 关) | 功能一挡位:(三档)100, (二档)010, (一档)001 | 功能二值:(三档)100,(二档)010,(一档)001 |
再 JS 中,那么我们可以这样子组装这个字节。
//定义全局的变量
var fun_1_switch_on = 1 << 7; //功能1开 关的话不需要定义,0自动补充
var fun_2_switch_on = 1 << 6; //功能2开
var fun_1_lv_3 = 1 << 5; //功能一 三档
var fun_1_lv_2 = 1 << 4; //功能一 二档
var fun_1_lv_1 = 1 << 3; //功能一 一档
var fun_2_lv_3 = 1 << 2; //功能二 三档
var fun_2_lv_2 = 1 << 1; //功能二 二档
var fun_2_lv_1 = 1; //功能二 一档
那么,我们发送命令的时候就方便很多了。
//假设我们只需要打开功能一且档位为二
var val = fun_1_switch_on | fun_1_lv_2;
//假设我们需要打开功能一和二且档位都为三
var val = fun_1_switch_on | fun_1_switch_on | fun_1_lv_3 | fun_2_lv_3
也就是说我们需要什么功能就与把定义好的内容 按位或
一下就好了。
接收消息
同样,我们需要得到一个 notify 的特征值 ID。并且调用 wx.notifyBLECharacteristicValueChange
接口启动通知监听。
启动成功后,我们还需要设置一个回掉函数进行接收
wx.onBLECharacteristicValueChange(function(res) {
var uuid = res.characteristicId;//特征值ID
var value = res.value; //值
});
在里面需要根据特征值 ID 进行判断消息类型
完成
那么一个小程序的蓝牙通讯就算是完成了。整理出来做一份笔记。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于