iOS開發之BLE(二)——外設連線與斷開
在 iOS開發之BLE(一)——理論知識 一文中,主要對iOS開發中BLE的基本理論知識進行了介紹,本文以中心模式為例講解藍芽的連線過程,並進行案例實踐。
步驟
-
引入CoreBluetooth,初始化中心管理者CBCentralManager並設定CBCentralManagerDelegate
-
監聽CBCentralManager的狀態,當是On的時候進行外設搜尋
-
發現外設CBPeripheral後,對其進行標記或者儲存到外設陣列中
-
選擇外設進行連線
-
斷開連線
案例
本文案例以一個UITableView展示周圍可用的外設,通過點選UITableViewCell選擇外設進行藍芽的連線,通過點選按鈕進行藍芽的斷開。
- StoryBoard介面

image
- ViewController 程式碼
重點是CBCentralManagerDelegate中的代理方法,這些方法會隨著CBCentralManager方法的呼叫進行對應的回撥,程式碼註釋已經非常明白。
<pre class="prettyprint hljs swift" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; word-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">class ViewController: UIViewController {
// 中心管理者 var centralManager :CBCentralManager! // 外設 var peripheral: CBPeripheral? // 外設陣列 var peripherals: [CBPeripheral]! // 表格展示所有可連線裝置 var tabView : UITableView! // 斷開連結 @IBAction func disConnect(_ sender: Any) { self.centralManager.cancelPeripheralConnection(self.peripheral!) self.title = "已斷開" + (self.peripheral!.name)! self.peripheral = nil } override func viewDidLoad() { super.viewDidLoad() self.peripherals = [] tabView = UITableView(frame: self.view.frame) tabView.dataSource = self tabView.delegate = self self.view.addSubview(self.tabView) // 初始化中心管理者 self.centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main, options: nil) }
}
// MARK:- UITableViewDataSource, UITableViewDelegate
extension ViewController: UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { returnself.peripherals.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCell(withIdentifier: "ble") if cell == nil { cell = UITableViewCell(style: .default, reuseIdentifier: "ble") } // 展示所有可連線的裝置 cell?.textLabel?.text = self.peripherals[indexPath.row].name return cell! } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) self.title ="已連上" + (self.peripherals[indexPath.row].name)! // 連線想要的外設 let selPeripheral = self.peripherals[indexPath.row] self.peripheral = selPeripheral //呼叫connect就會回撥代理中連線外設結果的方法 self.centralManager.connect(self.peripheral!, options: nil) }
}
// MARK:- CBCentralManagerDelegate
extension ViewController: CBCentralManagerDelegate {
// 監聽CBCentralManager的狀態 func centralManagerDidUpdateState(_ central: CBCentralManager){ // 藍芽開啟的時候進行掃描 if central.state == .poweredOn { // 傳入nil,掃描所有可以發現的裝置 central.scanForPeripherals(withServices: nil, options: nil) } } // 掃描發現外設就會回撥該方法 func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { if !self.peripherals.contains(peripheral) { self.peripherals?.append(peripheral) // 重新整理表格 self.tabView.reloadData() } } // 連線外設的結果 // 1 連線成功 func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { print("didConnectPeripheral") } // 2 連線失敗 func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) { print("didFailToConnectPeripheral") } // 3 丟失連線 func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { print("didDisconnectPeripheral") }
}</pre>
- 執行結果
手機介面,對三個裝置進行連線與斷開操作

image
- 後臺列印

image
注意問題
-
一定要真機測試
-
斷開的時候,一定要將 self.peripheral賦值為nil,否則第一次連線之後就再也連線不上了
如果你依然在程式設計的世界裡迷茫,不知道自己的未來規劃,小編給大家推薦一個IOS高階交流群:458839238 裡面可以與大神一起交流並走出迷茫。小白可進群免費領取學習資料,看看前輩們是如何在程式設計的世界裡傲然前行!
群內提供資料結構與演算法、底層進階、swift、逆向、整合面試題等免費資料
附上一份收集的各大廠面試題(附答案) ! 群檔案直接獲取
各大廠面試題

image