2013-08-25 65 views
5

我正在使用iOS 6 Corebluetooth和Alert Notification服務。iOS Corebluetooth服務從未發現,但在廣告中可見代理方法的數據

由於某種原因,服務不會顯示在外設中,儘管delegate方法中的advertData看起來正確。

這裏的委託方法:

(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的兩個UUID。在廣告數據中看到的外設服務從不出現。我究竟做錯了什麼?

回答

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

此外,什麼是在廣告數據並提供什麼是兩個不同的故事。外圍甚至可以做廣告的任何服務那些沒有提供我可以輕鬆地開始在廣告iOS版是這樣的:如果沒有添加任何這些服務的

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

我建議你先嚐試用工作應用發現外設,比如BLEUtility或BLExplr,看看外設是否真的提供這些服務。

+0

謝謝,其實我正在實現的外設:didDiscoverServices:我複製粘貼錯誤的代碼。我將編輯該問題。我會嘗試BLEUtility和BLExplr,並會回來。順便說一下,外圍設備是非iOS設備(如果有的話)。 – Stpn

+0

讓我知道測試的結果,並在外設上添加調用'discoverServices:'方法的代碼。 – allprog

+0

將代碼添加到問題中(而不是didDiscoverCharaceristisc :)並檢查了BLEUtility。該設備確實宣傳一種服務,但只提供最基本的服務。我想解決這個問題需要跳入設備的C代碼? – Stpn

相關問題