微信小程序-蓝牙低功耗(BLE)文档
这个文档已经把蓝牙的基础内容和代码片段都整理了,按照文档copy方法,基本能蓝牙通信
https://developers.weixin.qq.com/miniprogram/dev/framework/device/ble.html
蓝牙-低功耗中心设备-API文档
https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.writeBLECharacteristicValue.html
ESP32蓝牙代码
参考文章《ESP32使用MicroPython设置低功耗蓝牙广播,通过Chrome Web蓝牙通信》
可能涉及到的有
-
生成128位UUID(放置到ESP32代码)(默认大写)
-
把128位UUID英文字母转小写(Chrome Web Ble或者微信小程序等有些地方会要求小写UUID)
-
向蓝牙低功耗设备特征值中写入二进制数据(字符串和二进制数据转换处理)(本文使用Uint8Array,ESP32对应使用UTF-8)
-
读取蓝牙低功耗设备特征值的二进制数据(字符串和二进制数据转换处理)(本文使用Uint8Array,ESP32对应使用UTF-8)
-
Android和Ios的蓝牙配置区别,微信小程序文档有提示
搜索引擎搜索UUID在线生成即可
根据蓝牙 4.2 协议规范(Vol 3, Part B, section 2.5.1 UUID),UUID 是一个 128 位的唯一标识符,用来标识 Service 和 Characteristic 等
Chrome Web BLe使用的是小写UUID
微信小程序使用的是大写UUID
官方文档
https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.startBluetoothDevicesDiscovery.html
/ 以微信硬件平台的蓝牙智能灯为例,主服务的 UUID 是 FEE7。传入这个参数,只搜索主服务 UUID 为 FEE7 的设备
wx.startBluetoothDevicesDiscovery({
services: ['FEE7'],
success (res) {
console.log(res)
}
})
同样的搜索引擎搜索 英文字母小写转小写 找个在线工具站即可
字符串和二进制转码相对比较麻烦
微信小程序文档示例的二进制数据并不是我想要发送的字符串
https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.writeBLECharacteristicValue.html
官方的演示
// 向蓝牙设备发送一个0x00的16进制数据
let buffer = new ArrayBuffer(1)
let dataView = new DataView(buffer)
dataView.setUint8(0, 0)
wx.writeBLECharacteristicValue({
// 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId,
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId,
// 这里的value是ArrayBuffer类型
value: buffer,
success (res) {
console.log('writeBLECharacteristicValue success', res.errMsg)
}
})
本文字符串转二进制数据方法
把函数返回的值给到上面方法的value参数即可
str参数是字符串
// 字符串转byte
stringToBytes(str) {
var array = new Uint8Array(str.length);
for (var i = 0, l = str.length; i < l; i++) {
array[i] = str.charCodeAt(i);
}
// console.log(array);
return array.buffer;
},
注意这个方法使用的是Uint8Array,ESP32用的是buffer.decode(‘UTF-8’)
你也可以改为Uint16Array,buffer.decode(‘UTF-16’)之类的
备注:
ArrayBuffer作为内存区域,可以存放多种类型的数据。不同数据有不同的存储方式
类型 |
描述 |
长度 |
Int8Array | 8位有符号整数 | 长度1个字节 |
Uint8Array | 8位无符号整数 | 长度1个字节 |
Int16Array | 16位有符号整数 | 长度2个字节 |
Uint16Array | 16位无符号整数 | 长度2个字 |
Int32Array | 32位有符号整数 | 长度4个字节 |
Uint32Array | 32位无符号整数 | 长度4个字 |
Float32Array | 32位浮点数 | 长度4个字 |
Float64Array | 64位浮点数 | 长度8个字节 |
微信小程序接收ESP32返回的蓝牙数据响应
官方文档
https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.onBLECharacteristicValueChange.html
官方代码
// ArrayBuffer转16进制字符串示例
function ab2hex(buffer) {
let hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
}
官方文档的代码仍然达不到我想要的字符信息转换
本文转码方法
把ArrayBuffer转为字符串
ab2str(buf) {
return String.fromCharCode.apply(null, new Uint8Array(buf));
},
同样的上面的方法,也要和ESP32的发送格式一一对应,才能解码
ESP32 蓝牙发送数据
# 文档地址:
# https://docs.micropython.org/en/latest/library/bluetooth.html?highlight=irq#gatt-client
self.ble.gatts_notify(0, self.tx, data + '\n')
本文已简单开发一个微信小程序
可以扫描蓝牙广播设备,选择设备后,可发送字符串并接收相应信息展示
主要是调试本文ESP32对应代码的设备
使用演示
这个微信小程序原本是用来写ESP32蓝牙配网和设置哔哩哔哔粉丝计数器配置
后来写着写着就变成扫描蓝牙列表和字符串发送接收调试,后期再逐步加上蓝牙配网之类
通信解决了,剩下就是代码配置和交互问题自定义
总之,微信小程序有以下特点
-
Chrome Web BLE只能在Andorid手机和Windows电脑使用,微信小程序都可以(Iphone和Android没问题,桌面端小程序未测试)
-
避免了Iphone和Android各自写APP并适配蓝牙的问题,微信小程序写一次代码通用上架平台,大多数适配问题,微信官方来解决
-
个人也可以上架微信小程序,方便调试和产品开发等自定义设置
快速请尝试web蓝牙,兼容请尝试微信小程序,深度请开发APP
END