当我使用微信小程序中的连接接口连上一个双模芯片的手表之后,使用wx.notifyBLECharacteristicValueChange无法订阅特征值,必须要配对之后才能订阅,希望贵方能够尽快的解决这个问题,这将对我们很重要。双模芯片——既有传统蓝牙,又有低功耗蓝牙
框架类型 | 问题类型 | API/组件名称 | 终端类型 | 微信版本 | 基础库版本 |
---|---|---|---|---|---|
小程序 | Bug | wx.notifyBLECharacteristicValueChange | 微信iOS客户端 | Version 8.0.38 | 2.33.0 |
3 个回答
微信小程序的蓝牙接口都是透传系统蓝牙接口的,中间不会进行拦截或修改数据,可以先使用第三方蓝牙app如nRF Connect来排除是否为手表芯片本身不支持未配对时订阅特征值
"使用wx.notifyBLECharacteristicValueChange无法订阅特征值"
这里有报错吗?是报了什么错?
微信小程序蓝牙API在实际应用中确实存在一些限制和特殊情况。由于你提供的信息有限,我会尝试给出一些可能的解决方案,但具体的解决方式可能需要根据你的设备和代码来确定。
首先,你需要确保你已经正确地连接到蓝牙设备并发现了正确的服务和特征。对于低功耗蓝牙,每个服务和特征都有一个唯一的UUID。你需要先通过
wx.getBLEDeviceServices
和wx.getBLEDeviceCharacteristics
获取到正确的服务和特征的UUID。然后,你需要确保你正在尝试订阅的特征支持notify或者indicate。在你调用
wx.notifyBLECharacteristicValueChange
之前,你可以先调用wx.getBLEDeviceCharacteristics
来获取到特征的属性,然后检查properties
对象中的notify
或者indicate
是否为true。此外,一些蓝牙设备需要在订阅特征值之前先进行配对或者认证。这可能涉及到蓝牙设备的具体实现和协议。你可能需要查阅蓝牙设备的技术文档,或者联系蓝牙设备的制造商,来获取更多的信息和帮助。
/**
* 获取手表服务
*/
function getBLEDeviceServices() {
wx.getBLEDeviceServices({
deviceId: Device.deviceId,
success(res) {
const serviceList = res.services;
for (let i = 0; i < serviceList.length; i++) {
const serviceId = serviceList[i].uuid
const serviceAttr = serviceId.substr(4, 4)
Service[serviceAttr] = serviceId
getBLEDeviceCharacteristics(serviceId, serviceAttr, i == serviceList.length - 1)
}
}
})
}
/**
* 获取手表特征值
*/
function getBLEDeviceCharacteristics(serviceId, isCompleted) {
wx.getBLEDeviceCharacteristics({
deviceId: Device.deviceId,
serviceId: serviceId,
success(result) {
result.characteristics.forEach((item, index) => {
const characteristicAttr = item.uuid.substr(4, 4)
Characteristic[serviceAttr][characteristicAttr] = item
if (item.properties.notify || item.properties.indicate) {
notifyList.push({ serviceId, characteristicId: item.uuid })
}
})
if (isCompleted) {
registerNotify()
console.log('Service', Service)
console.log('Characteristic', Characteristic)
}
}
})
}
/**
* 注册notifyBLECharacteristicValueChange
*/
function registerNotify() {
notifyList.forEach((item, index) => {
wx.notifyBLECharacteristicValueChange({
state: true,
deviceId: Device.deviceId,
serviceId: item.serviceId,
characteristicId: item.characteristicId,
success() {
console.log('notify', res)
},
fail(res) {
console.log('notify', res)
}
})
})
}