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

推荐阅读:iOS开发——BAT面试题合集(持续更新中)

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

步骤

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

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

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

  4. 选择外设进行连接

  5. 断开连接

案例

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

  • StoryBoard界面
iOS开发之BLE(二)——外设连接与断开_第1张图片
image
  • 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, 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")
}    

}

  • 运行结果

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

image
  • 后台打印
iOS开发之BLE(二)——外设连接与断开_第2张图片
image

注意问题

  1. 一定要真机测试

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

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:638302184,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

群内提供数据结构与算法、底层进阶、swift、逆向、整合面试题等免费资料
附上一份收集的各大厂面试题(附答案) ! 群文件直接获取
各大厂面试题

image

你可能感兴趣的:(iOS开发之BLE(二)——外设连接与断开)