欢迎大家来到IT世界,在知识的湖畔探索吧!
NO.1文档汇总
这个文档已经把蓝牙的基础内容和代码片段都整理了,按照文档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)
}
})
欢迎大家来到IT世界,在知识的湖畔探索吧!
同样的搜索引擎搜索 英文字母小写转小写 找个在线工具站即可
NO.5发送数据
字符串和二进制转码相对比较麻烦
微信小程序文档示例的二进制数据并不是我想要发送的字符串
https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth-ble/wx.writeBLECharacteristicValue.html
官方的演示
欢迎大家来到IT世界,在知识的湖畔探索吧!// 向蓝牙设备发送一个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
官方代码
欢迎大家来到IT世界,在知识的湖畔探索吧!// 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对应代码的设备
小程序
使用演示
NO.8Tips
这个微信小程序原本是用来写ESP32蓝牙配网和设置哔哩哔哔粉丝计数器配置
后来写着写着就变成扫描蓝牙列表和字符串发送接收调试,后期再逐步加上蓝牙配网之类
通信解决了,剩下就是代码配置和交互问题自定义
总之,微信小程序有以下特点
- Chrome Web BLE只能在Andorid手机和Windows电脑使用,微信小程序都可以(Iphone和Android没问题,桌面端小程序未测试)
- 避免了Iphone和Android各自写APP并适配蓝牙的问题,微信小程序写一次代码通用上架平台,大多数适配问题,微信官方来解决
- 个人也可以上架微信小程序,方便调试和产品开发等自定义设置
快速请尝试web蓝牙,兼容请尝试微信小程序,深度请开发APP
END
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/34012.html