3

centralManager:didDiscoverPeripheral:advertisementData:RSSI (以下の完全なコード) で、kCBAdvDataServiceUUIDs と呼ばれる NSDictionary のキーを見つけています。このデータを読み取って、デバイスで利用可能なサービスを判断しようとしています。このデータの形式は何ですか? クラスの説明は簡単です

Unknown (<fff0>)

ソースは次のとおりです。

- (void) centralManager: (CBCentralManager *) central
  didDiscoverPeripheral: (CBPeripheral *) aPeripheral
      advertisementData: (NSDictionary *) advertisementData
                   RSSI: (NSNumber *) RSSI
{
printf("Discovered %s\n", [[aPeripheral name] cStringUsingEncoding: NSUTF8StringEncoding]); // TODO: Remove printfs
    printf("  RSSI: %s\n", [[RSSI stringValue] cStringUsingEncoding: NSUTF8StringEncoding]);
    NSArray *keys = [advertisementData allKeys];
    for (int i = 0; i < [keys count]; ++i) {
        id key = [keys objectAtIndex: i];
        NSString *keyName = (NSString *) key;
        NSObject *value = [advertisementData objectForKey: key];
        if ([value isKindOfClass: [NSArray class]]) {
            printf("   key: %s\n", [keyName cStringUsingEncoding: NSUTF8StringEncoding]);
            NSArray *values = (NSArray *) value;
            for (int j = 0; j < [values count]; ++j) {
                NSObject *aValue = [values objectAtIndex: j];
                printf("       %s\n", [[aValue description] cStringUsingEncoding: NSUTF8StringEncoding]);
                printf("       is NSData: %d\n", [aValue isKindOfClass: [NSData class]]);
            }
        } else {
            const char *valueString = [[value description] cStringUsingEncoding: NSUTF8StringEncoding];
            printf("   key: %s, value: %s\n", [keyName cStringUsingEncoding: NSUTF8StringEncoding], valueString);
        }
    }
}

TI CC2250 ミニ開発キットのキーフォブからの出力は次のとおりです。

Discovered (null)
  RSSI: -36
   key: kCBAdvDataServiceUUIDs
       Unknown (<fff0>)
       is NSData: 0
Discovered SimpleBLEPeripheral
  RSSI: -37
   key: kCBAdvDataServiceUUIDs
       Unknown (<fff0>)
       is NSData: 0
   key: kCBAdvDataLocalName, value: SimpleBLEPeripheral
   key: kCBAdvDataTxPowerLevel, value: 0
4

1 に答える 1

14

いくつか掘り下げた後、ここに私が発見したものがあります:

centralManager:didDiscoverPeripheral:advertisementData:RSSI にパラメーターとして渡されるアドバタイズメント データは、kCBAdvDataServiceUUID と呼ばれる少なくとも 1 つのキーを常に含むように見える NSDictionary です。このキーに関連付けられた値は、タイプ CBUUID のオブジェクトの NSArray です。

CBUUID は、私が見た Bluetooth LE のすべての Apple サンプルを含む多くの場所で使用されているにもかかわらず、iOS 5 のドキュメントには記載されていません。そのメソッドの中にdataは、NSData オブジェクトを返すものがあります。この NSData オブジェクトには、一連のバイトとしてエンコードされた UUID があります。

したがって、BLE アドバタイズメントの UUID のバイトを取得して表示するには、次のようなコードを使用できます。

- (void) centralManager: (CBCentralManager *) central
  didDiscoverPeripheral: (CBPeripheral *) aPeripheral
      advertisementData: (NSDictionary *) advertisementData
                   RSSI: (NSNumber *) RSSI
{
    printf("Discovered %s\n", [[aPeripheral name] cStringUsingEncoding: NSUTF8StringEncoding]); // TODO: Remove printfs
    printf("  RSSI: %s\n", [[RSSI stringValue] cStringUsingEncoding: NSUTF8StringEncoding]);
    NSArray *keys = [advertisementData allKeys];
    for (int i = 0; i < [keys count]; ++i) {
        id key = [keys objectAtIndex: i];
        NSString *keyName = (NSString *) key;
        NSObject *value = [advertisementData objectForKey: key];
        if ([value isKindOfClass: [NSArray class]]) {
            printf("   key: %s\n", [keyName cStringUsingEncoding: NSUTF8StringEncoding]);
            NSArray *values = (NSArray *) value;
            for (int j = 0; j < [values count]; ++j) {
                if ([[values objectAtIndex: j] isKindOfClass: [CBUUID class]]) {
                    CBUUID *uuid = [values objectAtIndex: j];
                    NSData *data = uuid.data;
                    printf("      uuid(%d):", j);
                    for (int j = 0; j < data.length; ++j)
                        printf(" %2X", ((UInt8 *) data.bytes)[j]);
                    printf("\n");
                } else {
                    const char *valueString = [[value description] cStringUsingEncoding: NSUTF8StringEncoding];
                    printf("      value(%d): %s\n", j, valueString);
                }
            }
        } else {
            const char *valueString = [[value description] cStringUsingEncoding: NSUTF8StringEncoding];
            printf("   key: %s, value: %s\n", [keyName cStringUsingEncoding: NSUTF8StringEncoding], valueString);
        }
    }
}
于 2012-07-23T17:53:06.120 に答える