0xF*_*ADE 8 objective-c bluetooth-lowenergy ios7
在iOS7下,主要的ANCS服务是不断广告,还是需要在模糊设置中启用/使用自定义CBPeripheralManager(使用Apple指定的服务和特性UUID)实现,以便潜在的通知消费者成功发现它和订阅?
Apple文档(CoreBluetooth编程指南和ANCS规范)令人惊讶地丢失了有关此内容的任何信息.他们似乎暗示要求自定义实现,但这只是我们的猜想.
给定主要ANCS服务UUID:7905F431-B5CE-4E99-A40F-4B1E122D00D0执行扫描不会产生命中.按预期扫描整个BLE频谱会产生其他BLE设备的命中,但不会产生单个ANCS设备的命中.
编辑1:
定义自定义CBPeripheralManager并手动添加Apple指定的ANCS服务及其关联的特性失败,并出现NSError: Error Domain=CBErrorDomain Code=8 "The specified UUID is not allowed for this operation."
因此,似乎服务UUID由Apple保留(应该是),我们不能以这种方式启用它.
非常感谢任何见解; 我们已经与Apple联系了这个问题,并会在收到他们的消息时进行更新.
下面的代码重现了上面提到的NSError:
// define the ANCS Characteristics
CBUUID *notificationSourceUUID = [CBUUID UUIDWithString:@"9FBF120D-6301-42D9-8C58-25E699A21DBD"];
CBMutableCharacteristic *notificationSource = [[CBMutableCharacteristic alloc] initWithType:notificationSourceUUID properties:CBCharacteristicPropertyNotifyEncryptionRequired value:nil permissions:CBAttributePermissionsReadEncryptionRequired];
CBUUID *controlPointUUID = [CBUUID UUIDWithString:@"69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9"];
CBMutableCharacteristic *controlPoint = [[CBMutableCharacteristic alloc] initWithType:controlPointUUID properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteEncryptionRequired];
CBUUID *dataSourceUUID = [CBUUID UUIDWithString:@"22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB"];
CBMutableCharacteristic *dataSource = [[CBMutableCharacteristic alloc] initWithType:dataSourceUUID properties:CBCharacteristicPropertyNotifyEncryptionRequired value:nil permissions:CBAttributePermissionsReadEncryptionRequired];
// define the ANCS Service
CBUUID *ANCSUUID = [CBUUID UUIDWithString:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0"];
CBMutableService *ANCS = [[CBMutableService alloc] initWithType:ANCSUUID primary:YES];
ANCS.characteristics = @[notificationSource, controlPoint, dataSource];
// define the Advertisement data
NSMutableDictionary *advertisementData = [NSMutableDictionary dictionary];
[advertisementData setValue:@"CUSTOM_ANCS" forKey:CBAdvertisementDataLocalNameKey];
[advertisementData setValue:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0" forKey:CBAdvertisementDataServiceUUIDsKey];
// publish the ANCS service
[self.peripheralManager addService:ANCS];
Run Code Online (Sandbox Code Playgroud)
作为这个问题的迟来的答案,现在小牛队已经出局了,这就是我们想出来的.
我们最初在两个iOS设备之间实现ANCS规范的努力,其中一个是作为Central的外围设备,但未成功.经过一段时间后,Apple回复了我们(向他们的福音传道者提示)并且告诉我们这是不可能的.
通过将CBPeripheralManager类和CBPeripheralManagerDelegate协议添加到OSX Mavericks(深呼吸)上的IOBluetooth.framework中嵌入的CoreBluetooth.framework,我们现在可以在OSX设备上使用BLE无线电来实现和宣传ANCS.
因此,此代码段属于OSX上的CBPeripheralManager:
- (void) advertiseANCS
{
NSLog(@"%s", __FUNCTION__);
// define the ANCS Characteristics
CBUUID *notificationSourceUUID = [CBUUID UUIDWithString:@"9FBF120D-6301-42D9-8C58-25E699A21DBD"];
CBMutableCharacteristic *notificationSource = [[CBMutableCharacteristic alloc] initWithType:notificationSourceUUID properties:CBCharacteristicPropertyNotifyEncryptionRequired value:nil permissions:CBAttributePermissionsReadEncryptionRequired];
CBUUID *controlPointUUID = [CBUUID UUIDWithString:@"69D1D8F3-45E1-49A8-9821-9BBDFDAAD9D9"];
CBMutableCharacteristic *controlPoint = [[CBMutableCharacteristic alloc] initWithType:controlPointUUID properties:CBCharacteristicPropertyWrite value:nil permissions:CBAttributePermissionsWriteEncryptionRequired];
CBUUID *dataSourceUUID = [CBUUID UUIDWithString:@"22EAC6E9-24D6-4BB5-BE44-B36ACE7C7BFB"];
CBMutableCharacteristic *dataSource = [[CBMutableCharacteristic alloc] initWithType:dataSourceUUID properties:CBCharacteristicPropertyNotifyEncryptionRequired value:nil permissions:CBAttributePermissionsReadEncryptionRequired];
// define the ANCS Service
CBUUID *ANCSUUID = [CBUUID UUIDWithString:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0"];
CBMutableService *ANCS = [[CBMutableService alloc] initWithType:ANCSUUID primary:YES];
ANCS.characteristics = @[notificationSource, controlPoint, dataSource];
// define the Advertisement data
NSMutableDictionary *advertisementData = [NSMutableDictionary dictionary];
[advertisementData setValue:@"ANCS" forKey:CBAdvertisementDataLocalNameKey];
[advertisementData setValue:@[ANCSUUID] forKey:CBAdvertisementDataServiceUUIDsKey];
// publish the ANCS service
[self.peripheralManager addService:ANCS];
[self.peripheralManager startAdvertising:advertisementData];
}
Run Code Online (Sandbox Code Playgroud)
鉴于此代码段属于iOS设备上的CBCentralManager:
- (void) discoverANCS
{
NSLog(@"%s", __FUNCTION__);
NSMutableArray *services = [NSMutableArray array];
[services addObject:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0"];
NSMutableDictionary *options = [NSMutableDictionary dictionary];
[options setValue:[NSNumber numberWithBool:NO] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];
[self.centralManager scanForPeripheralsWithServices:services options:options];
}
Run Code Online (Sandbox Code Playgroud)
iOS设备现在可以查看并连接到OSX无线电,该无线电实现了Apple文档中详述的ANCS规范.
<CBCentralManager: 0x14e23280> <CBPeripheral: 0x14d27b40 identifier = 7231B80F-874E-DB5F-2AF9-7F376911E2B7, Name = "ANCS", state = disconnected> {
kCBAdvDataChannel = 39;
kCBAdvDataIsConnectable = 1;
kCBAdvDataLocalName = ANCS;
} -60
Run Code Online (Sandbox Code Playgroud)
快乐狩猎
| 归档时间: |
|
| 查看次数: |
6968 次 |
| 最近记录: |