2013-08-25 4 views
5

iOS 6 Corebluetoothとアラート通知サービスを使用しています。iOS Corebluetoothサービスは検出されませんでしたが、デリゲートメソッドのadvertisingDataに表示されます

デリゲートメソッドのadvertisingDataが正しいように見えますが、何らかの理由でサービスが周辺機器に表示されません。ここで

(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI 
{ 
    bool ourGuy = NO; 
    NSLog(@"DATA: %@", advertisementData); 

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

      if ([keyName isEqualToString: @"kCBAdvDataServiceUUIDs"]){ 

       NSArray *values = (NSArray *) value; 
       for (int j = 0; j < [values count]; ++j) { 
        if ([[values objectAtIndex: j] isKindOfClass: [CBUUID class]]) { 
         CBUUID *uuid = [values objectAtIndex: j];       

         NSString *uuidString = [uuid representativeString]; 

         NSLog(@"FOUND SERVICE UUID %@", uuidString); 

         if ([uuidString isEqualToString:kalertNotificationServiceUUIDString]){ 

          NSLog(@"Connecting"); 

          if (![foundPeripherals containsObject:peripheral]) { 

           ourGuy = YES;         
          }        
         } 

        } 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); 
     } 
    } 

    if (ourGuy){ 
     [foundPeripherals addObject:peripheral]; 
       peripheral.delegate = self; 
     [centralManager connectPeripheral:peripheral options:nil]; 
    } 


} 

は、ログは次のようになります。:サービス発見のための

2013-08-25 23:30:17.417 myControl[688:907] DATA: { 
    kCBAdvDataLocalName = myTEST; 
    kCBAdvDataServiceUUIDs =  (
     "Unknown (<1811>)", 
     "Unknown (<180f>)" 
    ); 
} 
    key: kCBAdvDataServiceUUIDs 


2013-08-25 23:30:17.419 myControl[688:907] FOUND SERVICE UUID 1811 
2013-08-25 23:30:17.421 myControl[688:907] Connecting 
2013-08-25 23:30:17.422 myControl[688:907] FOUND SERVICE UUID 180f 
    key: kCBAdvDataLocalName, value: myTEST 
    key: kCBAdvDataTxPowerLevel, value: -8 

デリゲートメソッド:

- (void) peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{ 

    for (int i=0; i < peripheral.services.count; i++) { 
     CBService *s = [peripheral.services objectAtIndex:i]; 
     NSLog(@" UUUID %@", [s.UUID representativeString]); 
     //  [peripheral discoverCharacteristics:nil forService:s]; 
    } 
} 

からログここで

は、デリゲートメソッドでありますその方法:

2013-08-25 23:30:18.266 myControl[688:907] UUUID 1800 
2013-08-25 23:30:18.269 myControl[688:907] UUUID 1801 

これらは、BLE GATTとGAPの2つのUUIDです。 advertisingDataに見られる周辺機器のサービスは決して表示されません。私は間違って何をしていますか?

答えて

2

コードについて:peripheral:didDiscoverServices:コールバックを実装していますが、どのように処理しますか?また

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error { 
    /* Find all characteristics for all discovered services */ 
    for (CBService *service in peripheral.services) 
    { 
    [peripheral discoverCharacteristics:nil forService:service]; 
    } 
} 

、二つの異なる物語が何であるかを広告データにだと何を提供されます。最も簡単なケースでは、このようなものでなければなりません。これらのサービスのいずれかを追加することなく、

NSDictionary *data = @{CBAdvertisementDataServiceUUIDsKey: 
     @[[CBUUID UUIDWithString:@"180D"], [CBUUID UUIDWithString:@"FFBC"]]}; 
[peripheralManager startAdvertising:data]; 

:周辺には、私は簡単にこのようなのiOSで広告を開始することができます提供されていないものも含めすべてのサービスを宣伝することができます。

私は、BLEUtilityやBLExplrのような動作中のアプリケーションで周辺機器を最初に見つけて、周辺機器が本当にそれらのサービスを提供しているかどうかを調べることをお勧めします。

+0

ありがとう、実際に私は周辺機器を実装しています。didDiscoverServices:間違ったコードをコピーしました。私は質問を編集します。私はBLEUtilityとBLExplrを試して、戻ってきます。周辺機器は途中で非iOSデバイスです(問題がある場合)。 – Stpn

+0

テストの結果を教えてください。周辺機器で 'discoverServices:'メソッドを呼び出すコードを追加してください。 – allprog

+0

didDiscoverCharaceristiscの代わりに質問にコードを追加して、BLEunityをチェックしました。デバイスは実際には1つのサービスを宣伝しますが、最も基本的なものだけを提供します。私はそれがデバイスのCコードのダイビングを要求するだろうと思う? – Stpn

関連する問題