iOS 7 ANCS:发现主要的ANCS服务UUID

时间:2013-10-01 14:20:57

标签: objective-c ios7 bluetooth-lowenergy

在iOS7下,主要的ANCS服务是否经常被宣传,或是否需要在模糊设置中启用/使用自定义CBPeripheralManager(使用Apple指定的服务和特性UUID)为潜在的通知消费者实现成功发现并订阅?

Apple文档(CoreBluetooth Programming GuideANCS Specification)令人惊讶地丢失了有关此内容的任何信息。他们似乎暗示要求自定义实现,但这只是我们的推测。

鉴于主要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."

因此,似乎Apple保留了服务UUID(应该如此),我们无法以这种方式启用它。

非常感谢任何见解;我们已就此与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];

6 个答案:

答案 0 :(得分:6)

作为对这个问题迟来的答案,现在小牛队已经出局了,这就是我们想出来的。

我们最初在两个iOS设备之间实现ANCS规范的努力,其中一个是作为Central的外围设备,但未成功。一段时间后,苹果回应了我们(向他们的福音传道者提示),并告诉我们这是不可能的。

通过将CBPeripheralManager类和CBPeripheralManagerDelegate协议添加到OSX Mavericks上的IOBluetooth.framework中嵌入的CoreBluetooth.framework(深呼吸),我们现在可以在OSX设备上使用BLE无线电来实现和宣传ANCS。 / p>

因此,此代码段属于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];
}

此代码段属于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];
}

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

快乐狩猎

答案 1 :(得分:2)

原因是因为您将广告数据字典的UUID设置为字符串而不是CBUUID,我认为该密钥需要一组CBUUID。

因此,这应该有效:

NSDictionary *advertisementData = @{
                                        CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0"]],
                                        CBAdvertisementDataLocalNameKey:@"ANCS",
                                        };
编辑:哦,是的,我的坏!我忘了提到如果你试图从另一个iOS设备发现这个ANCS服务你将无法看到它,而不是在iOS 7下。不知何故,操作系统正在为自己保留该服务,并且不会出现在你的didDiscoverServices回调中,即使您可能会在广告数据上看到它。但是,如果您有外部设备,如非iOS设备或类似鹅卵石的设备,它将起作用。这是您公开ANCS功能的方式,但实现的其余部分取决于服务的使用者。

答案 2 :(得分:2)

根据这篇博文:

http://blog.punchthrough.com/post/63658238857/the-apple-notification-center-service-or-wtf-is

您可以使用“服务请求”进行广告配对和访问ANCS,而无需在iPhone上编写任何代码!

我没有尝试过,但很快就会尝试。

答案 3 :(得分:2)

对于目前正在使用Google搜索类似问题的任何人:通过CoreBluetooth的ANCS似乎在iOS 9中不再有效。具体来说,

  

此功能已从OS X和iOS中删除。

     

使用CoreBluetooth,这两个平台都不能用于使用ANCS服务。

https://forums.developer.apple.com/thread/24336

给出

答案 4 :(得分:1)

ANCS未在iOS上做广告,我使用以下方式与ANCS建立长时间连接:

我的外围设备使用虚拟服务,该服务已公布。 iOS应用程序用于发现具有此服务的设备并创建连接。您可以编写自己的应用程序,也可以使用免费的应用程序(例如LightBlue)。

建立连接后,外围设备将枚举连接的iOS设备上存在的所有服务。除了其他人之外,还有ANCS文档中提到的那三个。

如果您为他们注册通知,您将获得ANCS数据。

如果您绑定设备(iOS和外围设备),如果发现绑定设备被广告,ANCS将随时自动关注连接(重新)建立。

答案 5 :(得分:0)

我在iPhone上使用ANCS而没有任何代码使用“类似鹅卵石”的原型硬件。 使用上面记录的方法来解决这个问题。 该视频是一个笑话节目,并称为“区域范围通知”的概念的笑话:-)而不是所有的技术。但可能在某种程度上提供了信息。

http://www.youtube.com/watch?v=O-YWMl7IS-g

我不从我的YouTube BTW中赚钱。

我没有成功使用iOS - iOS尝试。