问题:连接蓝牙后,调用小程序writeBLECharacteristicValue,返回传输数据成功,查询硬件响应发现没有存储进去?
解决:一直以为是这个write方法的问题,找了很多相关贴,后续进行硬件日志查询,发现传输的数据确实传成功了,但是只传输了二分之一。
原因:微信小程序对于传输Value有默认字节限制,默认是20,传输内容超过了20,所以只传过去了前20个字节。超过字节限制,不会报错,也会报传输成功。
行动:查询小程序字节限制(wx.getBLEMTU),对传输内容做分包处理再传输
function stringToAsciiCodesAndSplit(str: string, mtuSize = 20): Uint8Array[] {
// 将字符串转换为 ASCII 码的 ArrayBuffer
const asciiCodes: number[] = []
for (let i = 0; i < str.length; i++) {
asciiCodes.push(str.charCodeAt(i))
}
const uint8Array = new Uint8Array(asciiCodes)
console.log('uint8Array.buffer', uint8Array.buffer)
// 定义一个 packets 数组,它将存储多个 Uint8Array 类型的元素
const packets: Uint8Array[] = []
// 根据 MTU字节 大小拆分数据
for (let i = 0; i < uint8Array.length; i += mtuSize) {
packets.push(uint8Array.slice(i, i + mtuSize))
}
return packets
}
const command = `atxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyy`
//mtu为字节限制
const buffer = stringToAsciiCodesAndSplit(command, mtu)
buffer.forEach((packet, index) => {
// 将每个包转换为 ArrayBuffer
const addBuffer = packet.buffer
Taro.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
value: addBuffer,
success: function (res) {
console.log(`第 ${index + 1} 个WIFI添加包发送成功:`, res)
},
fail: function (err) {
console.log(`第 ${index + 1} 个WIFI添加包发送失败:`, err)
}
})
})