前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS开发之BLE(二)——外设连接与断开

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

作者头像
YungFan
发布2019-03-22 16:07:22
2.9K0
发布2019-03-22 16:07:22
举报
文章被收录于专栏:学海无涯学海无涯

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

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

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

  • StoryBoard界面

StoryBoard界面.png

  • ViewController 代码 重点是CBCentralManagerDelegate中的代理方法,这些方法会随着CBCentralManager方法的调用进行对应的回调,代码注释已经非常明白。
代码语言:javascript
复制
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,否则第一次连接之后就再也连接不上了
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.03.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 步骤
  • 案例
  • 注意问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档