代码之家  ›  专栏  ›  技术社区  ›  dmerr

CoreBluetooth外围设备.setNotifyValue(true,特征)未通知

  •  1
  • dmerr  · 技术社区  · 9 年前

    我有两个程序,一个用于Mac,另一个用于iOS。当我从Mac连接到iOS设备时,它会找到我想要的服务和我想要的特性。找到特征后,我使用 peripheral.setNotifyValue(true, forCharacteristic: characteristic) ,但 peripheralManager:central:didSubscribeToCharacteristic: 方法未在iOS端调用。当我检查 characteristic.isNotifying 这是错误的。根据我的理解,当我将notify值设置为true时,它应该是notify,而每当我更改值时,它都会更新。为什么它没有更新?提前感谢。

    以下是设置问题特征的代码-

    self.characteristic = CBMutableCharacteristic(type: UUID_CHARACTERISTIC, properties: CBCharacteristicProperties.Read, value: self.dataToSend, permissions: CBAttributePermissions.Readable) 
    theService = CBMutableService(type: UUID_SERVICE, primary: true)
    theService.characteristics = [characteristic]
    self.peripheralManager.addService(theService)
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Paulw11    9 年前

    如果你希望你的特征得到支持 notify 操作,则需要对其属性进行设置-

    self.characteristic = CBMutableCharacteristic(type: UUID_CHARACTERISTIC, properties: CBCharacteristicProperties.Read|CBCharacteristicProperties.Notifiy, value: self.dataToSend, permissions: CBAttributePermissions.Readable);
    

    Core Bluetooth会忽略在不支持通知的特性上设置通知的尝试。

    此外,请注意,通过在创建特性时设置值,您将来将无法更改此特性的值,因此通知有些毫无意义。如果希望能够更改值,则必须指定 nil 对于 value 当您创建特征时。

    CBMutableCharacteristic 文件-

    讨论

    如果为特性指定值,则值为 缓存,其属性和权限设置为 CBCharacteristicPropertyRead和CBAttributePermissionsRead, 分别地因此,如果您需要特性的值 是可写的,或者如果您希望值在生命周期内发生变化 对于特性所属的已发布服务,必须 将值指定为nil。这样做可以确保价值 无论何时,由外围设备管理器动态处理和请求 外围设备管理器从 中心的当外围设备管理器收到读或写请求时 它从中心调用外围设备管理器:didReceiveReadRequest: 或peripheralManager:didReceiveWriteRequests:其方法 委托对象。