2013-10-02 86 views
8

我在更新我的CoreBluetooth代碼從iOS 6到iOS 7時遇到問題。我可以掃描外圍設備並建立連接,但是,我無法使用提供的新CoreBluetooth方法重新連接外設內的iOS 7.下面來看看我如何努力實現重新連接:iOS 7 CoreBluetooth retrievePeripheralsWithIdentifiers not retrieve

- (void)retrievePeripheral:(NSString *)uuidString 
{ 

NSUUID *nsUUID = [[NSUUID UUID] initWithUUIDString:uuidString]; 

if(nsUUID) 
{   
    NSArray *peripheralArray = [centralManager retrievePeripheralsWithIdentifiers:@[nsUUID]]; 

    // Check for known Peripherals 
    if([peripheralArray count] > 0) 
    { 
     for(CBPeripheral *peripheral in peripheralArray) 
     { 
      NSLog(@"Connecting to Peripheral - %@", peripheral); 

      [self connectPeripheral:peripheral]; 
     } 
    } 
    // There are no known Peripherals so we check for connected Peripherals if any 
    else 
    { 
     CBUUID *cbUUID = [CBUUID UUIDWithNSUUID:nsUUID]; 

     NSArray *connectedPeripheralArray = [centralManager retrieveConnectedPeripheralsWithServices:@[cbUUID]]; 

     // If there are connected Peripherals 
     if([connectedPeripheralArray count] > 0) 
     { 
      for(CBPeripheral *peripheral in connectedPeripheralArray) 
      { 
       NSLog(@"Connecting to Peripheral - %@", peripheral); 

       [self connectPeripheral:peripheral]; 
      } 
     } 
     // Else there are no available Peripherals 
     else 
     { 
      // No Dice! 
      NSLog(@"There are no available Peripherals"); 
     } 
    } 
} 

} 

哪裏uuidString是保存的外圍UUID。

我總是進入沒有可用外設的NSLog語句。我想我錯過了一些非常明顯的東西,有人可以指引我朝着正確的方向前進。

另外,我已經閱讀了關於CoreBluetooth iOS 7更新問題的其他文章,並試圖重新設置BLE設備和iOS設備,但無濟於事。

在此先感謝! audible

回答

5

事實證明,我的錯誤處理了我在將消息發送到retrievePeripheral方法之前如何將外設標識符轉換爲NSString格式。

這是不正確的方法:

NSString *uuidString = [NSString stringWithFormat:@"%@", CFUUIDCreateString(NULL, (__bridge CFUUIDRef)([peripheral identifier]))]; 

這是正確的方式(在我的情況下工作):

NSString *uuidString = [NSString stringWithFormat:@"%@", [[peripheral identifier] UUIDString]]; 

根據蘋果文檔的NSUUID類不是免費電話與CoreFoundation的CFUUIDRef橋接,如下所述:

注意:NSUUID類不免費橋接CoreFoundation的CFUUIDRef。如果需要,請使用UUID字符串在CFUUIDNSUUID之間進行轉換。兩個NSUUID對象不保證可以通過指針值進行比較(因爲CFUUIDRef是);使用isEqual:來比較兩個NSUUID實例。

對於那些你們誰喜歡的是什麼,這意味着像我在這裏做一個視覺表現就是一個例子:)

在控制檯內打印的周邊信息:

<CBPeripheral: 0x14699430 identifier = DD2468AB-1865-B926-7FA4-AE3755D479D8, Name = "IDYNAMO EMV-A27F", state = disconnected> 

不正確的方法將外設的標識符轉換爲NSString得出:

1865B926-7FA4-AE37-55D4-79D800000000 

T他正確的外圍設備的識別碼轉換爲NSString收益的方式:

DD2468AB-1865-B926-7FA4-AE3755D479D8 

我希望這可以幫助別人對他們的BLE的旅程,並隨時糾正我,如果我錯了,以任何方式,因爲我還在學習這個東西作爲好。

謝謝!

聽得見

+0

我想知道如果你能幫助我與我的代碼轉換爲retrievePeripheralsWithIdentifiers - (空)centralManager:(CBCentralManager *) didDiscoverPeripheral中心:(CBPeripheral *)aPeripheral advertisementData:(NSDictionary的*)advertisementData RSSI:(NSNumber *)RSSI { NSMutableArray * peripherals = [self mutableArrayValueForKey:@「heartRateMonitors」]; if(![self.heartRateMonitors containsObject:aPeripheral]) [peripherals addObject:aPeripheral]; [self.manager retrievePeripherals:[NSArray arrayWithObject:(id)aPeripheral.UUID]]; } –

1

這是一篇舊帖子,但對於其他人尋找答案。

第二次/下一次調用retrieveConnectedPeripherals實際上需要Service UUID(CBUUID類型),而不是iOS首次連接的NSUUID。檢索的是具有該服務UUID實施的外設的列表。例如,如果您有多個活動臂章,並且除了其他內容外,您還可以檢索所有3個外圍設備。在第一次調用KNOWN外設時,你必須在應用啓動之間存儲NSUUID,因爲該ID是由iOS在第一次連接時創建的。希望幫助