gpt4 book ai didi

ios - 订阅来自 CBCharacteristic 的通知不起作用

转载 作者:可可西里 更新时间:2023-11-01 03:31:07 40 4
gpt4 key购买 nike

首要任务:运行 OSX 10.10.4、iOS 4、Xcode 6.3.2、iPhone 6、Swift

短篇小说:我这里有一个特定的蓝牙 LE 设备,当特性值发生变化时,我想从中接收通知,例如通过用户输入。尝试订阅它没有成功,而是产生错误 Error Domain=CBATTErrorDomain Code=10 "The attribute could not be found."

长话短说:所以,我有一个 BluetoothManager 类,只要我的 $CBCentralManager.state.PoweredOn,我就会在其中开始扫描外围设备。这很简单,我什至是一个好公民,专门扫描那些拥有我想要的服务的人

centralManager.scanForPeripheralsWithServices([ServiceUUID], options: nil)

希望这会成功,我实现了以下委托(delegate)方法:

func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI: NSNumber!) {

if *this is a known device* {
connectToPeripheral(peripheral)
return
}

[...] // various stuff to make something a known device, this works
}

继续前进,我们得到:

func connectToPeripheral(peripheral: CBPeripheral) {
println("connecting to \(peripheral.identifier)")

[...] // saving the peripheral in an array along the way so it is being retained

centralManager.connectPeripheral(peripheral, options: nil)
}

Yupp,这成功了,所以我得到确认并开始发现服务:

func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!) {        
println("Connected \(peripheral.name)")

peripheral.delegate = self

println("connected to \(peripheral)")
peripheral.discoverServices([BluetoothConstants.MY_SERVICE_UUID])
}

这也有效,因为该委托(delegate)方法也被调用了:

func peripheral(peripheral: CBPeripheral!, didDiscoverServices error: NSError!) {

if peripheral.services != nil {
for service in peripheral.services {
println("discovered service \(service)")
let serviceObject = service as! CBService

[...] // Discover the Characteristic to send controls to, this works
peripheral.discoverCharacteristics([BluetoothConstants.MY_CHARACTERISTIC_NOTIFICATION_UUID], forService: serviceObject)

[...] // Some unneccessary stuff about command caches
}
}
}

你知道什么:特征得到被发现!

func peripheral(peripheral: CBPeripheral!, didDiscoverCharacteristicsForService service: CBService!, error: NSError!) {
for characteristic in service.characteristics {
let castCharacteristic = characteristic as! CBCharacteristic

characteristics.append(castCharacteristic) // Retaining the characteristic in an Array as well, not sure if I need to do this

println("discovered characteristic \(castCharacteristic)")
if *this is the control characteristic* {
println("control")
} else if castCharacteristic.UUID.UUIDString == BluetoothConstants.MY_CHARACTERISTIC_NOTIFICATION_UUID.UUIDString {
println("notification")
peripheral.setNotifyValue(true, forCharacteristic: castCharacteristic)
} else {
println(castCharacteristic.UUID.UUIDString) // Just in case
}
println("following properties:")

// Just to see what we are dealing with
if (castCharacteristic.properties & CBCharacteristicProperties.Broadcast) != nil {
println("broadcast")
}
if (castCharacteristic.properties & CBCharacteristicProperties.Read) != nil {
println("read")
}
if (castCharacteristic.properties & CBCharacteristicProperties.WriteWithoutResponse) != nil {
println("write without response")
}
if (castCharacteristic.properties & CBCharacteristicProperties.Write) != nil {
println("write")
}
if (castCharacteristic.properties & CBCharacteristicProperties.Notify) != nil {
println("notify")
}
if (castCharacteristic.properties & CBCharacteristicProperties.Indicate) != nil {
println("indicate")
}
if (castCharacteristic.properties & CBCharacteristicProperties.AuthenticatedSignedWrites) != nil {
println("authenticated signed writes ")
}
if (castCharacteristic.properties & CBCharacteristicProperties.ExtendedProperties) != nil {
println("indicate")
}
if (castCharacteristic.properties & CBCharacteristicProperties.NotifyEncryptionRequired) != nil {
println("notify encryption required")
}
if (castCharacteristic.properties & CBCharacteristicProperties.IndicateEncryptionRequired) != nil {
println("indicate encryption required")
}

peripheral.discoverDescriptorsForCharacteristic(castCharacteristic) // Do I need this?
}
}

现在控制台输出到这里看起来是这样的:

connected to <CBPeripheral: 0x1740fc780, identifier = $FOO, name = $SomeName, state = connected>
discovered service <CBService: 0x170272c80, isPrimary = YES, UUID = $BAR>
[...]
discovered characteristic <CBCharacteristic: 0x17009f220, UUID = $BARBAR properties = 0xA, value = (null), notifying = NO>
control
following properties:
read
write
[...]
discovered characteristic <CBCharacteristic: 0x17409d0b0, UUID = $BAZBAZ, properties = 0x1A, value = (null), notifying = NO>
notification
following properties:
read
write
notify
[...]
discovered DescriptorsForCharacteristic
[]
updateNotification: false

嘿!它说 updateNotificationfalse。那是从哪里来的?为什么,这是我对 setNotify... 的回调:

func peripheral(peripheral: CBPeripheral!, didUpdateNotificationStateForCharacteristic characteristic: CBCharacteristic!, error: NSError!) {

println("updateNotification: \(characteristic.isNotifying)")
}

什么给了?我告诉它要通知!为什么不通知?让我们在 println 行中设置一个断点并检查错误对象:

(lldb) po error
Error Domain=CBATTErrorDomain Code=10 "The attribute could not be found." UserInfo=0x17026eac0 {NSLocalizedDescription=The attribute could not be found.}

好的,所以这让我失去了想法。我无法找到有关该错误代码的相关线索。描述本身我无法理解,因为我试图为我之前发现的特征设置通知,因此它必须存在,对吗?此外,在 Android 上似乎可以订阅通知,所以我想我可以排除设备问题……或者我可以吗?非常感谢有关此的任何线索!

最佳答案

对我来说,问题是我正在使用另一个 Android 设备作为外围设备并且需要实现配置描述符。看这里: https://stackoverflow.com/a/25508053/599743

关于ios - 订阅来自 CBCharacteristic 的通知不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31275013/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com