在iOS開發之BLE(一)——理論知識一文中,主要對iOS開發中BLE的基本理論知識進行了介紹,本文以中心模式爲例講解藍牙的鏈接過程,並進行案例實踐。數組
CoreBluetooth
,初始化中心管理者CBCentralManager
並設置CBCentralManagerDelegate
CBCentralManager
的狀態,當是On
的時候進行外設搜索CBPeripheral
後,對其進行標記或者存儲到外設數組中本文案例以一個UITableView
展現周圍可用的外設,經過點擊UITableViewCell
選擇外設進行藍牙的鏈接,經過點擊按鈕進行藍牙的斷開。app
StoryBoard界面 ide
ViewController 代碼 重點是CBCentralManagerDelegate
中的代理方法,這些方法會隨着CBCentralManager
方法的調用進行對應的回調,代碼註釋已經很是明白。post
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
,不然第一次鏈接以後就再也鏈接不上了