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

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

步骤

  1. 引入CoreBluetooth,初始化中心管理者CBCentralManager并设置CBCentralManagerDelegate

  2. 监听CBCentralManager的状态,当是On的时候进行外设搜索

  3. 发现外设CBPeripheral后,对其进行标记或者存储到外设数组中

  4. 选择外设进行连接

  5. 断开连接

案例

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

  • StoryBoard界面

image.png

  • ViewController 代码

重点是CBCentralManagerDelegate中的代理方法,这些方法会随着CBCentralManager方法的调用进行对应的回调,代码注释已经非常明白。

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, UITableViewDelegateextension 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:- CBCentralManagerDelegateextension 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")    }    }
  • 运行结果

手机界面,对三个设备进行连接与断开操作

  • 后台打印

image.png

注意问题

  1. 一定要真机测试

  2. 断开的时候,一定要将 self.peripheral赋值为nil,否则第一次连接之后就再也连接不上了

作者:YungFan

群昵称:ios-Swift/Object C开发上架
群号: 869685378   找ios马甲包开发者合作,有兴趣请添加Q 51259559

猜你喜欢

转载自blog.csdn.net/ios8988/article/details/88776568