在iOS开发之BLE(一)——理论知识一文中,主要对iOS开发中BLE的基本理论知识进行了介绍,本文以中心模式为例讲解蓝牙的连接过程,并进行案例实践。
步骤
-
引入CoreBluetooth,初始化中心管理者CBCentralManager并设置CBCentralManagerDelegate
-
监听CBCentralManager的状态,当是On的时候进行外设搜索
-
发现外设CBPeripheral后,对其进行标记或者存储到外设数组中
-
选择外设进行连接
-
断开连接
案例
本文案例以一个UITableView展示周围可用的外设,通过点击UITableViewCell选择外设进行蓝牙的连接,通过点击按钮进行蓝牙的断开。
-
StoryBoard界面
-
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") } }
-
运行结果
手机界面,对三个设备进行连接与断开操作
-
后台打印
注意问题
-
一定要真机测试
-
断开的时候,一定要将 self.peripheral赋值为nil,否则第一次连接之后就再也连接不上了
作者:YungFan
群昵称:ios-Swift/Object C开发上架
群号: 869685378 找ios马甲包开发者合作,有兴趣请添加Q 51259559