美文网首页iOS进阶+实战
iOS开发之BLE(二)——外设连接与断开

iOS开发之BLE(二)——外设连接与断开

作者: YungFan | 来源:发表于2019-03-21 22:34 被阅读6次

    iOS开发之BLE(一)——理论知识一文中,主要对iOS开发中BLE的基本理论知识进行了介绍,本文以中心模式为例讲解中心设备与外设的连接过程,并进行案例实践。

    中心模式连接步骤

    1. 引入CoreBluetooth,初始化中心管理者并设置CBCentralManagerDelegate
    2. 监听CBCentralManager的状态,当是On的时候进行外设搜索
    3. 发现外设后,对其进行标记或者存储到外设数组中
    4. 选择外设进行连接
    5. 断开连接

    案例介绍

    本文案例以一个UITableView展示周围可用的外设,通过点击UITableViewCell选择外设进行蓝牙的连接,通过点击按钮进行蓝牙的断开。

    • StoryBoard界面


      StoryBoard界面.png
    • ViewController 代码
    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,否则第一次连接之后就再也连接不上了

    相关文章

      网友评论

        本文标题:iOS开发之BLE(二)——外设连接与断开

        本文链接:https://www.haomeiwen.com/subject/mpbhvqtx.html