CoreBluetooth For Central (5)
BLE Device >> reconnect
ReConnect BLE Device
承前面CoreBluetooth For Central (4)文章了解如何掃描BLE裝置、連線、斷線BLE裝置後,這篇要了解的則是重新連線至BLE裝置,在iOS中,當你有記錄裝置的Device UUID時,我們可以使用UUID直接與裝置連線,省除還需要掃描裝置的步驟。
取得UUID
先前文章CoreBluetooth For Central (3)中,在didDiscoverPeripheral Delegate取得可連線裝置的物件CBPeripheral,
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
NSLog(@"%",peripheral);
}
將CBPeripheral內容印出時會得到下面內容:
<CBPeripheral: 0x14d3f810 identifier = 9D027D39-5A77-3B6B-BC45-5A1E00115269, Name = "TI BLE Keyfob", state = disconnected>
其中identifier為裝置的UUID,將它記錄下來可以在重新連線中使用。
重新連線方法
重新連線的方式依照iOS版本分為兩種如下:
iOS 7 以前
- (void)retrievePeripherals:(NSArray *)peripheralUUIDs
iOS 8 之後
- (NSArray *)retrievePeripheralsWithIdentifiers:(NSArray *)identifiers
iOS 7之前使用上只需利用此方法後,整個過程就會自動連線至裝置,但iOS 8之後分的比較細,個人認為比較有流程,也就是需要使用此方法取得裝置的CBPeripheral物件後,再利用此物件來連線,意思iOS 8需要兩個流程:
取得裝置CBPeripheral
連線至裝置
該方法在使用時可以傳入多個UUID,後續流程也相同,範例中都只針對單一BLE週邊連線做說明。
使用UUID連線至裝置
這裡有兩個版本的程式如下:
iOS 7
CFUUIDRef uuid = CFUUIDCreateFromString(nil, (CFStringRef) @"9D027D39-5A77-3B6B-BC45-5A1E00115269");
[CM retrievePeripherals:[NSArray arrayWithObject:(__bridge id)(uuid) ]];
iOS 8
NSUUID *uuid = [[NSUUID UUID] initWithUUIDString:@"9D027D39-5A77-3B6B-BC45-5A1E00115269"];
NSArray *peripheralArray = [CM retrievePeripheralsWithIdentifiers:[NSArray arrayWithObject:uuid]];
//成功後會返回裝置CBPeripheral物件,範例使用UUID只傳入一個UUID至陣例,所以陣列返回內容只會有一個物件
if (peripheralArray.count>0) {
NSLog(@"%@",[peripheralArray objectAtIndex:0]);
[CM connectPeripheral:[peripheralArray objectAtIndex:0] options:nil];
}else {
NSLog(@"fail");
}
後續的過程、Service的使用需一般方式相同,這裡附帶一提的是,iOS 8後將UUID改由NSUUID物件來管理使用,當然也變的比較方便。
你好,看過了你藍芽的介紹後,讓我對藍芽這塊比較清楚了一些,這是很棒的文章!想請問如果我想傳指令給藍芽裝置與接收藍芽裝置回傳的值,我該怎麼來實作呢?謝謝^^
這部分比較覆雜,需要再分幾篇文章才能完成,正在撰寫中,你也可以先參考一下RAY的文章:
http://www.raywenderlich.com/52080/introduction-core-bluetooth-building-heart-rate-monitor
好der, 謝謝你唷^^
您好想請教一下,我也在作藍芽的配件傳輸,目前遇到問題,當我第一次與手機配對綁定之後,當下可以取得資料,但我再次搜尋時無法搜尋到該資料,而我手機跟藍芽設備已經綁定,是有辦法可以重新溝通嗎?
如果你是指BLE的話,有些BLE週邊會使用配對的方式去配對(需要輸入配對號碼的ex:0000),一旦配對好後有些週邊就會關掉發送配對資訊(關掉這個可以幫忙週邊省電),你需要在當下記住它的UUID後直接使用UUID連線才行。如果你想要重新配對(搜尋的到週邊)時,需要按下週邊的重新配對鍵才行。
感謝您。那我重連的程式碼該放哪邊,這個嗎?- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
這篇就是告訴您如何重新連線的方法,請提出文中哪些疑問點容我再回答
可能我還研究不夠,不知道重新連線的方法要放在哪裡做使用。
您好: 您的教學文章很實用,讓我受益良多,不過目前有個BLE的問題想要請教您,如果裝置在跟APP連線的狀態下斷線,有辦法做什麼處理讓裝置重新出現的時候自動重連嗎?(可能已經斷線3~5分鐘了) 謝謝您
經驗中可能有2個做法: 1.設定設備掃描間隔(每隔N段時間)查看設備在不在。(從掃描後的設備來比對) 2.確定與XX週邊斷線後,執行重連(RECONNECT)流程,具我的經驗iOS進行重連後,設備還沒出現時它會咬住重連流程直到設備出現(當然iOS內部有Timeout機制,時間到會發出FailToConnect method,此時你再發一次重連)。
PS:不過這兩種都會增加iDevice本身的耗電。
你好: 想請教一下BLE連接, 修改BT module service UUID及CHAR_UUID, 就可以在相同APP下換不同solution的BT module了嗎?? 不管是TI or CSR….只要修改這邊就可以用同一支APP??
是的,但這個前提是你要知道該Service /CHAR UUID所傳送、接收的資料是相容的就可以,比如:你可以修改你的BT module將Service/CHAR UUID相容於心跳表所要使用的資訊溝通,但不代表你BT module那端一定要接有關心跳的感測器,只要適當的時間將資訊傳達就行。
您好,最近在寫有關防丟棄的APP,對沒寫過IOS APP的我從您這裡學到了很多。想請教您一個問題,如果裝置與手機距離超過連線距離,或者裝置關機,導致斷線。手機有辦法可以馬上得知斷線嗎?
要知道是否連線已中斷的delegate:
‘- (void)centralManager:(CBCentralManager *)central didDisconnectPeripheral:(CBPeripheral *)peripheral error:(NSError *)error’
在此delegate實作你需要的動作試試。距離超過能正常連線距離是由framework決定的,它的反應是不會那麼即時的,這點要注意。
https://fueled.com/mobile-ecommerce-development/