2016-11-09 107 views
0

我試圖讓我的中央(iOS設備)與兩個外圍設備(一個iOS設備,一個不是)通信。單獨它們工作正常,但我發現一旦涉及到兩個外圍設備,只有最近連接的外圍設備才能夠從中央設備接收數據。有沒有辦法將數據從中央設備發送到每個外設,而無需斷開和重新連接外設?一次與多個外設通信

這是我寫外設代碼:

- (void) peripheral: (CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBChatacteristic *)characteristic error:(NSError *)error{ 
    NSString *newValue = [[NSString alloc] initWithData:characteristic.value encoding:NSUTF8StringEncoding]; 
    NSLog(@"Received: %@ from %@", newValue, peripheral.name); 
    CBPeripheral *sender = peripheral; 
    if([newValue isEqualToString:@"ready"]){ 
     NSData *messageValue = [@"challenge dataUsingNSUTF8StringEncoding]; 
     [sender writeValue:messageValue forCharacteristic:_writeCharacteristic type:CBCharacteristicWriteWithResponse]; 
     NSLog(@"Challenge sent to %@", sender.name); 
    } 

斷點表示正在執行的代碼和日誌顯示「發出挑戰」,以正確的外圍,它只是外圍從來沒有收到它。

代碼外圍接收:

-(void)peripheralManager:(CBPeripheralManager *)peripheral didReceiveWriteRequests:(NSArray<CBATTRequest *> *) requests{ 
    for(int i=0; i<requests.count; i++){ 
     CBATTRequest *request = requests[i]; 
     if([request.characteristic.UUID isEqual:_writeCharacteristic.UUID]){ 
      NSString *stringValue = [[NSString alloc] initWithData:request.value encoding:NSASCIIStringEncoding]; 
      NSLog(@"Write Request: %@", stringValue); 
     } 
    } 
+0

你如何參考外設?你如何將你的數據發送到兩個外設(因爲我猜你是向兩者發送相同的數據)? – Larme

+0

請顯示一些代碼 – Paulw11

+0

這裏有很多代碼,它遍佈所以很難分享。哪部分代碼是相關的?我正在向外圍設備發送不同的數據。本質上,一個外設用於觸發中央向另一個發送數據。中央總是能夠從每個外設接收數據,而不是同時發送給兩者。通過發送我的意思是[外圍writeValue:forCharacteristic:類型:]並通過接收我的意思是外圍didUpdateValueForCharacteristic回調。 – Hester

回答

0

要回答你的問題:是的,它是可能的,你可以有不同的外設多個連接和讀/寫他們。 iOS設備最多可以處理8個同時連接。

有關實施,請參閱Apple的Core Bluetooth Programming Guide。所有你需要的東西在那裏解釋。

正如一個建議:如果多個設備(我們稱之爲B和C)應該從1個設備(稱爲A)接收數據,我會在設備A上使用外設角色,需要將數據發送給其他設備。因爲然後設備B和C可以掃描,連接和訂閱特徵並接收更新而不必再次讀取。

+0

Hi p2pkit。我不能將A作爲外設的原因是,如果B連接,則C將無法看到它,反之亦然。 Core藍牙指南中是否有特別的參考?我一直在使用它,並沒有找到任何指定如何處理多個連接的內容。 – Hester