微信小程序对接 BLE 蓝牙通讯笔记

本贴最后更新于 2401 天前,其中的信息可能已经时异事殊

对接微信蓝牙 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 的有多个。但是不知什么原因。并不是每个都有用。这是一个大坑。
于是找了一个工具一个一个的试。

imagepng

发送消息

那么找到了可用的特征值以后。我们来发送数据,最开始我还在担心怎么发送 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 进行判断消息类型

完成

那么一个小程序的蓝牙通讯就算是完成了。整理出来做一份笔记。

  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    130 引用 • 793 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...