我正在为Core Bluetooth
开发一个基于开源块的包装器。
目前我正在开发外围设备管理器部件。
我有广播,我可以看到服务及其特点。在查看其他服务时,我可以看到它们被赋予了有意义的名称,例如电池和当前时间。
当我尝试为我创建的任何服务或特征提供有意义的名称时,它会返回错误String Characteristic name does not represent a valid UUID
。
到目前为止,我的代码是
[_peripheralManager startAdvertising:@{CBAdvertisementDataLocalNameKey : @"Peripheral name",
CBAdvertisementDataServiceUUIDsKey : [CBUUID UUIDWithNSUUID:[NSUUID UUID]]}];
CBMutableCharacteristic *transferCharacteristic = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"Characteristic name"]
properties:CBCharacteristicPropertyRead
value:[@"Test value" dataUsingEncoding:NSUTF8StringEncoding]
permissions:CBAttributePermissionsReadable];
CBMutableService *transferService = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:@"Service name"]
primary:YES];
[transferService setCharacteristics:@[transferCharacteristic]];
[_peripheralManager addService:transferService];
如果我用[CBUUID UUIDWithNSUUID:[NSUUID UUID]]
替换任何initWithType参数,它可以正常工作,但不适合向用户显示。
有没有办法将CBService
或CBCharacteristic
的UUID设置为有意义的字符串?
值得注意的是,在观看时,特征的价值为零,为了看到这个原因的奖励积分。
由于
答案 0 :(得分:2)
蓝牙组织已接受一些services and their characteristics作为标准。使用核心蓝牙库时,可以通过4个十六进制数字分配号码来引用它们 - 请参阅CBUUID documentation
核心蓝牙库无法识别用户定义的UUID,因为它们未分配编号,因此您只能使用完整的UUID显示它们。
如果您没有发出阅读或收到通知,则该特征的值将为空。
答案 1 :(得分:0)
使用终端命令 uuidgen 创建用户定义的UUID。
正如Paul所提到的,在读取特征值之前,该值将为null。这似乎很多工作但是在您发现外围设备后连接到它(不要忘记保留外围设备并设置外围设备的委托属性),然后发现它的服务,然后发现它的特征服务,然后您可以读取特征的值,如下所示:
[peripheral readValueForCharacteristic:characteristic]; //where peripheral is the connected CBPeripheral
在CBCentralManagerDelegate方法的外围设备:didUpdateValueForCharacteristic:error:可以读取的值:
NSLog(@"%@",[[NSString alloc]initWithData:characteristic.value encoding:NSUTF8StringEncoding]);
根据您提供的代码,您无需在选项词典中包含广告数据服务UUID密钥。如果您要指定特定于您的应用的数据服务UUID,请开始广告,如下所示:
[_peripheralManager startAdvertising:@{CBAdvertisementDataLocalNameKey : @"Peripheral name",
CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:@"generated-string-using-uuidgen"]]}];
然后,您可以将CBCentralManager设置为扫描特定数据服务,如下所示:
[_centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:@"generated-string-using-uuidgen"]] options:nil];