ESP32使用MicroPython设置低功耗蓝牙广播,通过微信小程序蓝牙通信


NO.1
NO.1
文档汇总

微信小程序-蓝牙低功耗(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

此图片的alt属性为空;文件名为image-108-1024x498.png

NO.2
问题汇总

ESP32蓝牙代码

参考文章《ESP32使用MicroPython设置低功耗蓝牙广播,通过Chrome Web蓝牙通信

可能涉及到的有

  1. 生成128位UUID(放置到ESP32代码)(默认大写)

  2. 把128位UUID英文字母转小写(Chrome Web Ble或者微信小程序等有些地方会要求小写UUID)

  3. 向蓝牙低功耗设备特征值中写入二进制数据(字符串和二进制数据转换处理)(本文使用Uint8Array,ESP32对应使用UTF-8)

  4. 读取蓝牙低功耗设备特征值的二进制数据(字符串和二进制数据转换处理)(本文使用Uint8Array,ESP32对应使用UTF-8)

  5. Android和Ios的蓝牙配置区别,微信小程序文档有提示

NO.3
生成UUID

搜索引擎搜索UUID在线生成即可

根据蓝牙 4.2 协议规范(Vol 3, Part B, section 2.5.1 UUID),UUID 是一个 128 位的唯一标识符,用来标识 Service 和 Characteristic 等

此图片的alt属性为空;文件名为image-109.png

NO.4
大写转小写

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)
  }
})

同样的搜索引擎搜索 英文字母小写转小写 找个在线工具站即可

NO.5
发送数据

字符串和二进制转码相对比较麻烦

微信小程序文档示例的二进制数据并不是我想要发送的字符串

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个字节
NO.6
接收数据

微信小程序接收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')
NO.7
实际调试

本文已简单开发一个微信小程序

可以扫描蓝牙广播设备,选择设备后,可发送字符串并接收相应信息展示

主要是调试本文ESP32对应代码的设备

此图片的alt属性为空;文件名为image-110.png

使用演示

NO.8
Tips

这个微信小程序原本是用来写ESP32蓝牙配网和设置哔哩哔哔粉丝计数器配置

后来写着写着就变成扫描蓝牙列表和字符串发送接收调试,后期再逐步加上蓝牙配网之类

通信解决了,剩下就是代码配置和交互问题自定义

总之,微信小程序有以下特点

  1. Chrome Web BLE只能在Andorid手机和Windows电脑使用,微信小程序都可以(Iphone和Android没问题,桌面端小程序未测试)

  2. 避免了Iphone和Android各自写APP并适配蓝牙的问题,微信小程序写一次代码通用上架平台,大多数适配问题,微信官方来解决

  3. 个人也可以上架微信小程序,方便调试和产品开发等自定义设置

快速请尝试web蓝牙,兼容请尝试微信小程序,深度请开发APP

END