CoreBluetooth - 具有有意义的UUID的CBMutableCharacteristic或CBMutableService

时间:2014-05-06 07:59:06

标签: ios objective-c bluetooth-lowenergy core-bluetooth

我正在为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参数,它可以正常工作,但不适合向用户显示。

有没有办法将CBServiceCBCharacteristic的UUID设置为有意义的字符串?

值得注意的是,在观看时,特征的价值为零,为了看到这个原因的奖励积分。

由于

2 个答案:

答案 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];