分階段了解:
- 掃描
- 連接
- 發(fā)現(xiàn)服務(wù)和特征,寫入或讀取數(shù)據(jù)
連接類
BTConnectionPool
此類是基于CBCentralManager連接外設(shè)的方法connect和CBCentralManagerDelegate的代理方法.在調(diào)用connect方法之后,系統(tǒng)會通過下面的代理方法自動回調(diào)結(jié)果,我們可以根據(jù)結(jié)果來確認(rèn)中心設(shè)備與外圍設(shè)備連接的狀態(tài).
centralManager.connect(peripheral, options: nil)
/// 中心設(shè)備與外設(shè)已連接上
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral)
/// 中心設(shè)備連接外設(shè)失敗
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?)
/// 中心設(shè)備與外設(shè)連接已斷開
func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?)
我們需要做的工作是在中心設(shè)備依次連接多臺外圍設(shè)備時(shí),可以清楚了解每臺外圍設(shè)備是否連接成功,以及避免同一臺外圍設(shè)備在已經(jīng)連接后重復(fù)連接的情況.首先聲明兩個(gè)數(shù)組類型的成員變量,來分別管理多臺外設(shè),其中:
- connectPeripherals管理所有已經(jīng)連接上的外設(shè),當(dāng)設(shè)備已被中心設(shè)備連接,會加入到此數(shù)組中,當(dāng)設(shè)備與中心設(shè)備斷開連接后,再將這臺外設(shè)從數(shù)組中移除掉
- connectAttempts管理所有等待連接的外設(shè),當(dāng)設(shè)備已被中心設(shè)備連接或連接失敗,都會將這臺外設(shè)從數(shù)組中移除掉
centralManager在執(zhí)行connect方法后,它的代理方法是異步執(zhí)行的,并不會立即返回結(jié)果,為避免中心設(shè)備連接外設(shè)長時(shí)間無響應(yīng),我們需要創(chuàng)建一個(gè)定時(shí)器,這樣在超時(shí)時(shí)間過后,如發(fā)現(xiàn)連接的代理方法沒走,就調(diào)用方法centralManager.cancelPeripheralConnection(peripheral)手動取消對此外設(shè)的連接.