gpt4 book ai didi

objective-c - iOS 7 自动控制系统 : Discovering the primary ANCS Service UUID

转载 作者:太空狗 更新时间:2023-10-30 03:31:39 27 4
gpt4 key购买 nike

在 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.”

因此,服务 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];

最佳答案

作为对这个问题的迟来的回答,既然 Mavericks 出局了,这就是我们得出的结论。

我们最初在两台 iOS 设备(一台作为外围设备,一台作为中央设备)之间实现 ANCS 规范的努力没有成功。一段时间后,Apple 回复了我们(向他们的布道者致敬)并告诉我们这是不可能的。

通过将 CBPeripheralManager 类和 CBPeripheralManagerDelegate 协议(protocol)添加到嵌入在 OSX Mavericks 上的 IOBluetooth.framework 中的 CoreBluetooth.framework(深呼吸),我们现在可以在 OSX 设备上使用 BLE radio 来实现和宣传 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];
}

鉴于此代码段属于 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 radio ,它实现了 Apple 文档中详述的 ANCS 规范。

<CBCentralManager: 0x14e23280> <CBPeripheral: 0x14d27b40 identifier = 7231B80F-874E-DB5F-2AF9-7F376911E2B7, Name = "ANCS", state = disconnected> {
kCBAdvDataChannel = 39;
kCBAdvDataIsConnectable = 1;
kCBAdvDataLocalName = ANCS;
} -60

快乐狩猎

关于objective-c - iOS 7 自动控制系统 : Discovering the primary ANCS Service UUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19118699/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com