iOS 蓝牙 LE 无法以编程方式获取通知,但可以在其他应用程序中
Posted
技术标签:
【中文标题】iOS 蓝牙 LE 无法以编程方式获取通知,但可以在其他应用程序中【英文标题】:iOS Bluetooth LE cant get notification programatically but can in other apps 【发布时间】:2015-12-16 21:50:55 【问题描述】:我正在尝试让我的 ios 程序与自定义蓝牙 LE 设备进行通信。我可以连接到它,读取所有服务,并读取每个服务的所有CBCharacteristic
对象。
我试图在一个特定的CBCharacteristic
更新时收到通知。 CBCharacteristic.properties
设置为 0x10(通知),但 CBCharacteristic.isNotifying
为假。
调用下面这行代码后:
myDevice.peripheral.setNotifyValue(true, forCharacteristic: myChar)
我希望通过CBPeripheralDelegate
函数接收通知:
func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?)
但它永远不会被调用。
此外,使用来自PunchThrough.com 的LightBlue Explorer app 我可以收到通知,所以我知道这是可能的。 LightBlue 应用程序在做什么而我不是?
有人见过类似的吗?
作为参考,设备使用WLT2564M蓝牙模块。我也可以使用
读取值myDevice.peripheral.readValueForCharacteristic(myChar)
没有任何问题。
【问题讨论】:
myChar
是如何存储的?它是属性还是局部变量?
Property:它是 ViewController 的本地属性,只要 VC 存在,它就会一直存在。我可以使用 myDevice.peripheral.readValueForCharacteristic(myChar) 读取值没问题。
我想这同样适用于外围设备,并且您连接到它(并且在此期间没有断开连接)?我还想您确实为它正确设置了委托?日志中显示了什么?你实现peripheral:didUpdateNotificationStateForCharacteristic:error:
了吗?有什么错误吗?
@jcaron 就是这样。我把这段代码放在中间,几个月后才回来。没有意识到我还没有设置委托。请发表答案,我会标记为正确的。
【参考方案1】:
需要检查的几件事:
peripheral
属性需要在其使用期间持续存在
您必须已连接到它(并且在此期间没有断开连接)
检查delegate
是否设置正确
查看日志
确保实现 peripheral:didUpdateNotificationStateForCharacteristic:error:
并在此处记录任何错误
【讨论】:
以上是关于iOS 蓝牙 LE 无法以编程方式获取通知,但可以在其他应用程序中的主要内容,如果未能解决你的问题,请参考以下文章
如何在 swift Xcode 中以编程方式绑定/配对蓝牙 LE 设备?