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 设备?

iOS 中的蓝牙 LE 和 ANCS

降低蓝牙 LE 发射功率 iOS 7

如何从 iPhone 向蓝牙 LE 设备发送电子邮件、短信通知?

蓝牙 LE iOS 无法在后台扫描

如何以编程方式在 iOS 11 中打开蓝牙设置