2013-10-01 14 views
8

Trong iOS7, là Dịch vụ ANCS chính được quảng cáo liên tục hoặc cần được bật trong cài đặt bị bẻ khóa/triển khai bằng CBPeripheralManager tùy chỉnh (sử dụng Dịch vụ do Apple chỉ định và UUID đặc trưng) cho Người tiêu dùng thông báo tiềm năng để khám phá thành công và đăng ký?iOS 7 ANCS: Khám phá Dịch vụ ANCS chính UUID

Tài liệu Apple (cả số CoreBluetooth Programming GuideANCS Specification) đáng ngạc nhiên là bất kỳ thông tin nào về điều này. Họ dường như gợi ý về việc yêu cầu triển khai tùy chỉnh, nhưng đây chỉ là phỏng đoán về phía chúng tôi.

Được cung cấp dịch vụ ANCS chính UUID: 7905F431-B5CE-4E99-A40F-4B1E122D00D0, thực hiện quét không có lần truy cập nào. Quét toàn bộ phổ BLE, như mong đợi, tạo ra các lần truy cập cho các thiết bị BLE khác, nhưng không phải là một thiết bị ANCS đơn lẻ.

EDIT 1:

Xác định một CBPeripheralManager tùy chỉnh và tự thêm Dịch vụ ANCS Apple chỉ định với đặc điểm liên quan của nó thất bại, với NSError: Error Domain=CBErrorDomain Code=8 "The specified UUID is not allowed for this operation."

Do đó, dường như các UUID Dịch vụ là được Apple bảo lưu (vì nó phải là), và chúng tôi không thể kích hoạt nó theo cách này.

Bất kỳ thông tin chi tiết nào được đánh giá cao; chúng tôi đã liên hệ với Apple về vấn đề này và sẽ cập nhật khi chúng tôi nhận được phản hồi từ họ.

Đoạn code dưới đây tái tạo các NSError đề cập ở trên:

// 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]; 

Trả lời

5

Như một câu trả lời muộn màng cho câu hỏi này, bây giờ Mavericks đã ra, đây là những gì chúng tôi đã đưa ra.

Những nỗ lực ban đầu của chúng tôi để triển khai đặc tả ANCS giữa hai thiết bị iOS, một trong những thiết bị ngoại vi như Trung tâm, không thành công. Apple đã trả lời chúng tôi sau một thời gian (hat tip cho các nhà truyền giáo của họ) và nói với chúng tôi điều này là không thể.

Với việc bổ sung lớp CBPeripheralManager và giao thức CBPeripheralManagerDelegate vào CoreBluetooth.framework được nhúng trong IOBluetooth.framework trên OSX Mavericks (hơi thở sâu), giờ đây chúng tôi có thể sử dụng đài BLE trên thiết bị OSX để triển khai và quảng cáo ANCS.

Như vậy, đoạn này thuộc về một CBPeripheralManager trên OSX:

- (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]; 
} 

Trong khi đoạn này thuộc về một CBCentralManager trên thiết bị iOS:

- (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]; 
} 

Các thiết bị iOS bây giờ có thể nhìn thấy và kết nối với radio OSX, thực hiện đặc tả ANCS được mô tả chi tiết trong tài liệu của Apple.

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

Chúc mừng săn

+0

Tôi vẫn nhận được thông báo lỗi "UUID được chỉ định không được phép cho hoạt động này" trong ứng dụng Mac. Bạn có thể kết nối như thế nào? – thandasoru

2

Vâng lý do là bởi vì bạn đang thiết lập các UUID cho quảng cáo Từ điển dữ liệu như là một String và không phải là một CBUUID, tôi cũng nghĩ rằng chìa khóa mất một loạt các CBUUID.

do đó điều này sẽ làm cho nó hoạt:

NSDictionary *advertisementData = @{ 
             CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:@"7905F431-B5CE-4E99-A40F-4B1E122D00D0"]], 
             CBAdvertisementDataLocalNameKey:@"ANCS", 
             }; 

EDIT: Oh yeah xấu của tôi! Tôi quên đề cập rằng nếu bạn đang cố gắng để khám phá dịch vụ ANCS này từ một thiết bị iOS khác, bạn sẽ không thể nhìn thấy nó, chứ không phải dưới iOS 7. Bằng cách nào đó hệ điều hành đã đặt dịch vụ đó cho chính nó và sẽ không hiển thị trên gọi lại didDiscoverServices của bạn mặc dù bạn có thể thấy nó trên dữ liệu quảng cáo của mình. Tuy nhiên, nó sẽ hoạt động nếu bạn có thiết bị bên ngoài, như thiết bị không phải iOS hoặc thiết bị giống như sỏi. Đây là cách bạn vạch trần chức năng ANCS nhưng phần còn lại của việc triển khai là tùy thuộc vào người tiêu dùng của dịch vụ.

+0

Cảm ơn đã dành thời gian để trả lời. Tuyệt vời bắt, tài liệu không chỉ định loại khóa, nhưng CBAdvertisementData rõ ràng nói 'Một danh sách của một hoặc nhiều đối tượng CBUUID ' – 0xFADE

+0

Nó không loại bỏ NSError, vì dữ liệu quảng cáo được đưa vào tài khoản trong một cuộc gọi tiếp theo tới '[self.peripheralManager startAdvertising:]' .. có vẻ như không thể '[self.peripheralManager addService:]' với ANU UUID. – 0xFADE

+0

@ 0xFADED Tôi đã thêm một số thông tin bổ sung về câu trả lời của tôi – Dan1one

0

tôi sử dụng ANCS mà không cần bất kỳ mã trên iPhone sử dụng "cuội giống như" phần cứng nguyên mẫu. Sử dụng các phương pháp được nêu ở trên về câu hỏi này. Video là một loại trò đùa và có nghĩa là một trò đùa như là khái niệm "thông báo toàn khu vực" :-) và không phải ở tất cả các kỹ thuật. Nhưng có thể có phần thông tin.

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

Tôi không kiếm tiền từ youtube của tôi BTW

tôi đã không thành công với iOS - nỗ lực iOS.

1

Các ANCS không được quảng cáo trên iOS, tôi sử dụng một cách sau để đạt được một kết nối thời gian dài với ANCS:

thiết bị ngoại vi của tôi sử dụng một dịch vụ giả, mà được quảng cáo. Ứng dụng iOS được sử dụng để khám phá thiết bị có dịch vụ này và tạo kết nối. Bạn có thể viết ứng dụng của riêng mình hoặc sử dụng một trong các ứng dụng miễn phí (ví dụ như LightBlue).

Sau khi kết nối được thiết lập, thiết bị ngoại vi liệt kê tất cả các dịch vụ hiện có trên thiết bị iOS được kết nối. Ngoài những người khác, có ba tài liệu được đề cập trong tài liệu ANCS.

Nếu thông báo đăng ký của bạn cho họ, bạn sẽ nhận được dữ liệu ANCS.

Nếu bạn kết nối thiết bị (iOS và thiết bị ngoại vi), ANCS sẽ tự động quan tâm đến việc kết nối (lại) thiết lập bất cứ lúc nào, nếu thấy thiết bị ngoại vi được quảng cáo.

+0

Thiết bị ngoại vi của bạn có phải là thiết bị iOS không? – Yazid

2

Đối với bất cứ ai hiện Googling một câu hỏi tương tự: ANCS qua CoreBluetooth dường như không còn làm việc trong iOS 9. Cụ thể,

This functionality was removed from OS X and iOS.

Neither platform can be used to consume the ANCS service anymore using CoreBluetooth.

Given bởi https://forums.developer.apple.com/thread/24336

Các vấn đề liên quan