esp32蓝牙控制「ESP32使用MicroPython设置低功耗蓝牙广播通过微信小程序蓝牙通信」

时间:2023-07-03 12:27:41阅读:2952
NO.1文档汇总微信小程序-蓝牙低功耗(BLE)文档这个文档已经把蓝牙的基础内容和代码片段都整理了,按照文档copy方法,基本能蓝牙通信https://developers.weixin.qq.com/miniprogram/dev/frame…
  • 剧情 爱情
  • 茱丽叶特·斯蒂文森马克斯·冯·西多 鲁特格尔·哈尔PriyaDarshini

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

NO.2问题汇总

ESP32蓝牙代码

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

可能涉及到的有

生成128位UUID(放置到ESP32代码)(默认大写)把128位UUID英文字母转小写(Chrome Web Ble或者微信小程序等有些地方会要求小写UUID)向蓝牙低功耗设备特征值中写入二进制数据(字符串和二进制数据转换处理)(本文使用Uint8Array,ESP32对应使用UTF-8)读取蓝牙低功耗设备特征值的二进制数据(字符串和二进制数据转换处理)(本文使用Uint8Array,ESP32对应使用UTF-8)Android和Ios的蓝牙配置区别,微信小程序文档有提示

NO.3生成UUID

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

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

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 注意这个方法使用的是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-clientself.ble.gatts_notify(0, self.tx, data 'n')

NO.7实际调试

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

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

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

小程序

使用演示

NO.8Tips

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

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

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

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

Chrome Web BLE只能在Andorid手机和Windows电脑使用,微信小程序都可以(Iphone和Android没问题,桌面端小程序未测试)避免了Iphone和Android各自写APP并适配蓝牙的问题,微信小程序写一次代码通用上架平台,大多数适配问题,微信官方来解决个人也可以上架微信小程序,方便调试和产品开发等自定义设置

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

END

相关资讯

评论

  • 评论加载中...