2013-10-01 21 views
8

iOS7では、常にアナウンスされるプライマリANCSサービスであるか、または難読化された設定で有効にする必要がありますか?カスタムCBPeripheralManager(Apple指定のサービスおよび特徴的なUUID)を使用して、それを正常に検出して登録することができますか?iOS 7 ANCS:プライマリANCSサービスUUIDの検出

アップルのドキュメント(CoreBluetooth Programming GuideANCS Specificationの両方)は、これに関する驚くほどの情報に欠けています。彼らはカスタム実装を必要とするように思えるようですが、これは私たちの一部の推測です。

プライマリANCSサービスUUID:7905F431-B5CE-4E99-A40F-4B1E122D00D0が指定されている場合、スキャンを実行するとヒットは発生しません。期待どおりにBLEスペクトル全体をスキャンすると、他のBLEデバイスのヒットが得られますが、単一のANCSデバイスはヒットしません。

EDIT 1

カスタムCBPeripheralManagerを定義して、手動でNSErrorと、それに関連する特性でアップル指定のANCSサービスを失敗した追加:Error Domain=CBErrorDomain Code=8 "The specified UUID is not allowed for this operation."

したがって、サービスUUIDがあることが表示されますAppleが予約しています(そうしなければならない)、このようにして有効にすることはできません。

洞察力があれば幸いです。 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]; 

答えて

5

この質問に対する遅れた回答として、今度はマーベリックスが出てきたので、ここで私たちが思いついたことがあります。

2つのiOSデバイス間でANCS仕様を実装しようとする当初の取り組みは、周辺機器1つ(Central)として失敗しました。アップル社はしばらくして私たちに返答し(彼らの伝道者に帽子の先端)、これは不可能であると私たちに言った。

OSXマーベリックス(深呼吸)のIOBluetooth.frameworkに埋め込まれたCoreBluetooth.frameworkにCBPeripheralManagerクラスとCBPeripheralManagerDelegateプロトコルを追加することで、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]; 
} 

このスニペットは、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 

ハッピー狩猟

+0

Macアプリケーションで "指定されたUUIDはこの操作に使用できません"というエラーメッセージが表示されます。どのように接続できましたか? – thandasoru

2

さてあなたは、文字列としてではなくCBUUIDなどの広告データディクショナリ用のUUIDを設定しているので、理由があり、また、私は鍵がかかると思いますCBUUIDの配列。

ので、これはそれを動作させる必要があります。

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

はEDIT:そうそう私の悪いです!他のiOSデバイスからこのANCSサービスを見つけようとすると、iOS 7ではなく、それを見ることができなくなることを忘れていました。何とかOSがそのサービスを予約していて、didDiscoverServicesコールバックに表示されません広告データに表示されている可能性があります。しかし、iOS以外のデバイスや小石のようなデバイスのような外部デバイスがあれば動作します。これはANCS機能を公開する方法ですが、残りの実装はサービスのコンシューマに任されています。このブログ記事によると

+0

おかげで与え

This functionality was removed from OS X and iOS.

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

を動作するように表示されません。 CBAdvertisementDataは明らかに '1つまたは複数のCBUUIDオブジェクトのリスト 'を示しています – 0xFADE

+0

広告データがaで考慮されるので、NSErrorは削除されません。 '[self.peripheralManager startAdvertising:]'へのそれ以降の呼び出し。ANCS UUIDで '[self.peripheralManager addService:]'を実行することは不可能です。 – 0xFADE

+0

@ 0xFADED私の答えにいくつかの追加情報を追加しました – Dan1one

0

私は「小石のような」プロトタイプのハードウェアを使用してiPhone上の任意のコードなしでANCSを使用しています。 この質問について上記で説明した方法を使用します。 ビデオはある種のジョークショーのためのものであり、「エリア全体の通知」という概念であり、全く技術的ではありません。しかし、いくらか参考になるかもしれません。

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

私はユーチューブからお金を稼ぐことはありませんところで

私はiOSのに成功していない - iOSの試み。

私の周辺機器が公示されたダミーのサービスを、使用しています:ANCSはiOSの上で宣伝されていない

1

は、私がANCSとの長い時間接続を実現するために、以下の方法を使用していました。 iOSアプリケーションを使用して、このサービスを持つデバイスを検出し、接続を作成します。独自のアプリケーションを作成するか、無料で利用できるもの(LightBlueなど)を使用できます。

接続が確立されると、周辺デバイスは、接続されたiOSデバイスに存在するすべてのサービスを列挙します。他にも、ANCSのドキュメントに記載されている3つのものがあります。

登録通知があれば、ANCSデータが届きます。

デバイス(iOSと周辺機器)をボンドすると、ANCSはボンドデバイスがアドバタイズされていることを検出すると、自動的に接続(再設定)を自動的に行います。現在、同様の質問グーグルで誰のための

+0

周辺機器はiOSデバイスですか? – Yazid