iOS開發之BLE(二)——外設鏈接與斷開

iOS開發之BLE(一)——理論知識一文中,主要對iOS開發中BLE的基本理論知識進行了介紹,本文以中心模式爲例講解藍牙的鏈接過程,並進行案例實踐。數組

步驟

  1. 引入CoreBluetooth,初始化中心管理者CBCentralManager並設置CBCentralManagerDelegate
  2. 監聽CBCentralManager的狀態,當是On的時候進行外設搜索
  3. 發現外設CBPeripheral後,對其進行標記或者存儲到外設數組中
  4. 選擇外設進行鏈接
  5. 斷開鏈接

案例

本文案例以一個UITableView展現周圍可用的外設,經過點擊UITableViewCell選擇外設進行藍牙的鏈接,經過點擊按鈕進行藍牙的斷開。app

  • StoryBoard界面 ide

    StoryBoard界面.png

  • ViewController 代碼 重點是CBCentralManagerDelegate中的代理方法,這些方法會隨着CBCentralManager方法的調用進行對應的回調,代碼註釋已經很是明白。post

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 {
       
        return  self.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")
    }    
}

複製代碼
  • 運行結果測試

    • 手機界面,對三個設備進行鏈接與斷開操做

手機操做.gif

  • 後臺打印

後臺打印.png

注意問題

  1. 必定要真機測試
  2. 斷開的時候,必定要將 self.peripheral賦值爲nil,不然第一次鏈接以後就再也鏈接不上了
相關文章
相關標籤/搜索