在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, 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")
}
}
复制代码
-
运行结果
- 手机界面,对三个设备进行连接与断开操作
- 后台打印
注意问题
- 一定要真机测试
- 断开的时候,一定要将
self.peripheral
赋值为nil
,否则第一次连接之后就再也连接不上了