简体   繁体   中英

ios ble “Characteristic User Description”

Trying to retrieve readable information from an characteristics by using the function:

peripheral.discoverDescriptors(for: characteristic)

Later the delegate method:

func peripheral(_ peripheral: CBPeripheral, didDiscoverDescriptorsFor characteristic: CBCharacteristic, error: Error?) 

is called but how can I get the string description? When I read the value from the descriptors it's always nil .

let descriptors = characteristic.descriptors! as [CBDescriptor]
for descriptor in descriptors {
    print("\(#function): descriptor = \(descriptor) UUID = \(descriptor.uuid) value = \(descriptor.value)")
}

However, if I'm browsing and connecting with an BLE scanner it can read the characteristic human readable descriptors.

Reading descriptors is a two-step process, much like discovering and then reading characteristics.

Try:

public func peripheral(_ peripheral: CBPeripheral, didDiscoverDescriptorsFor characteristic: CBCharacteristic, error: Error?) {
    guard let descriptors = characteristic.descriptors else { return }

    for descr in descriptors {
        peripheral.readValue(for: descr)
    }
}

And then fill in the blanks of:

public func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor descriptor: CBDescriptor, error: Error?) {
    switch descriptor.uuid.uuidString {
    case CBUUIDCharacteristicExtendedPropertiesString:
        guard let properties = descriptor.value as? NSNumber else {
            break
        }
        print("  Extended properties: \(properties)")
    case CBUUIDCharacteristicUserDescriptionString:
        guard let description = descriptor.value as? NSString else {
            break
        }
        print("  User description: \(description)")
    case CBUUIDClientCharacteristicConfigurationString:
        guard let clientConfig = descriptor.value as? NSNumber else {
            break
        }
        print("  Client configuration: \(clientConfig)")
    case CBUUIDServerCharacteristicConfigurationString:
        guard let serverConfig = descriptor.value as? NSNumber else {
            break
        }
        print("  Server configuration: \(serverConfig)")
    case CBUUIDCharacteristicFormatString:
        guard let format = descriptor.value as? NSData else {
            break
        }
        print("  Format: \(format)")
    case CBUUIDCharacteristicAggregateFormatString:
        print("  Aggregate Format: (is not documented)")
    default:
        break
    }
}

The string constants and the associated data types came from the overview table here .

In my (limited) experience, descriptors don't reveal anything particularly interesting.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM