Swift語言iOS8的藍牙Bluetooth解析

開發中央步驟:swift

  1.添加CoreBluetooth.framework框架到你的工程數組

  2.繼承兩個協議:CBCentralManagerDelegate和CBPeripheralDelegate框架

  我的寫的demo,有詳細註釋。看不懂的在提出來,這裏就不作過多的解釋了。ide

  

  1 //  2 // ViewController.swift  3 // CoreBluetooth  4 //  5 // Created by fanviwa on 15/4/23.  6 // Copyright (c) 2015年 fanviwa. All rights reserved.  7 //  8  9 import UIKit  10  11 class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate {  12  13 @IBOutlet weak var tableView: UITableView!  14  15 //添加屬性  16 var manager: CBCentralManager!  17 var peripheral: CBPeripheral!  18 var writeCharacteristic: CBCharacteristic!  19 //保存收到的藍牙設備  20 var deviceList:NSMutableArray = NSMutableArray()  21 //服務和特徵的UUID  22 let kServiceUUID = [CBUUID(string:"FFE0")]  23 let kCharacteristicUUID = [CBUUID(string:"FFE1")]  24  25 override func viewDidLoad() {  26  super.viewDidLoad()  27 //1.建立一箇中央對象  28 self.manager = CBCentralManager(delegate: self, queue: nil)  29  }  30  31 //2.檢查運行這個App的設備是否是支持BLE。代理方法  32  func centralManagerDidUpdateState(central: CBCentralManager){  33 switch central.state {  34 case CBCentralManagerState.PoweredOn:  35 //掃描周邊藍牙外設.  36 //寫nil表示掃描全部藍牙外設,若是傳上面的kServiceUUID,那麼只能掃描出FFEO這個服務的外設。  37 //CBCentralManagerScanOptionAllowDuplicatesKey爲true表示容許掃到重名,false表示不掃描重名的。  38 self.manager.scanForPeripheralsWithServices(kServiceUUID, options:[CBCentralManagerScanOptionAllowDuplicatesKey: false])  39 println("藍牙已打開,請掃描外設")  40 case CBCentralManagerState.Unauthorized:  41 println("這個應用程序是無權使用藍牙低功耗")  42 case CBCentralManagerState.PoweredOff:  43 println("藍牙目前已關閉")  44 default:  45 println("中央管理器沒有改變狀態")  46  }  47  }  48  49 //3.查到外設後,中止掃描,鏈接設備  50 //廣播、掃描的響應數據保存在advertisementData 中,能夠經過CBAdvertisementData 來訪問它。  51 func centralManager(central: CBCentralManager!, didDiscoverPeripheral peripheral: CBPeripheral!, advertisementData: [NSObject : AnyObject]!, RSSI : NSNumber!){  52 if(!self.deviceList.containsObject(peripheral)){  53  self.deviceList.addObject(peripheral)  54  }  55  self.tableView.reloadData()  56  }  57  58 //4.鏈接外設成功,開始發現服務  59 func centralManager(central: CBCentralManager!, didConnectPeripheral peripheral: CBPeripheral!){  60 //中止掃描外設  61  self.manager.stopScan()  62 self.peripheral = peripheral  63 self.peripheral.delegate = self  64  self.peripheral.discoverServices(nil)  65  66  }  67  68 //鏈接外設失敗  69 func centralManager(central: CBCentralManager!, didFailToConnectPeripheral peripheral: CBPeripheral!, error: NSError!){  70 println("鏈接外設失敗===\(error)")  71  }  72  73 //5.請求周邊去尋找它的服務所列出的特徵  74 func peripheral(peripheral: CBPeripheral!, didDiscoverServices error: NSError!){  75 if error != nil {  76 println("錯誤的服務特徵:\(error.localizedDescription)")  77 return  78  } 79 var i: Int = 0 80 for service in peripheral.services { 81 println("服務的UUID:\(service.UUID)") 82 i++ 83 //發現給定格式的服務的特性 84 // if (service.UUID == CBUUID(string:"FFE0")) { 85 // peripheral.discoverCharacteristics(kCharacteristicUUID, forService: service as CBService) 86 // } 87 peripheral.discoverCharacteristics(nil, forService: service as! CBService) 88 } 89 } 90 91 //6.已搜索到Characteristics 92 func peripheral(peripheral: CBPeripheral!, didDiscoverCharacteristicsForService service: CBService!, error: NSError!){ 93 //println("發現特徵的服務:\(service.UUID.data) == 服務UUID:\(service.UUID)") 94 if (error != nil){ 95 println("發現錯誤的特徵:\(error.localizedDescription)") 96 return 97 } 98 99 for characteristic in service.characteristics { 100 //羅列出全部特性,看哪些是notify方式的,哪些是read方式的,哪些是可寫入的。 101 println("服務UUID:\(service.UUID) 特徵UUID:\(characteristic.UUID)") 102 //特徵的值被更新,用setNotifyValue:forCharacteristic 103 switch characteristic.UUID.description { 104 case "FFE1": 105 //若是以通知的形式讀取數據,則直接發到didUpdateValueForCharacteristic方法處理數據。 106 self.peripheral.setNotifyValue(true, forCharacteristic: characteristic as! CBCharacteristic) 107 108 case "2A37": 109 //通知關閉,read方式接受數據。則先發送到didUpdateNotificationStateForCharacteristic方法,再經過readValueForCharacteristic發到didUpdateValueForCharacteristic方法處理數據。 110 self.peripheral.readValueForCharacteristic(characteristic as! CBCharacteristic) 111 112 case "2A38": 113 self.peripheral.readValueForCharacteristic(characteristic as! CBCharacteristic) 114 115 case "Battery Level": 116 self.peripheral.setNotifyValue(true, forCharacteristic: characteristic as! CBCharacteristic) 117 118 case "Manufacturer Name String": 119 self.peripheral.readValueForCharacteristic(characteristic as! CBCharacteristic) 120 121 case "6E400003-B5A3-F393-E0A9-E50E24DCCA9E": 122 self.peripheral.setNotifyValue(true, forCharacteristic: characteristic as! CBCharacteristic) 123 124 case "6E400002-B5A3-F393-E0A9-E50E24DCCA9E": 125 self.peripheral.readValueForCharacteristic(characteristic as! CBCharacteristic) 126 self.writeCharacteristic = characteristic as! CBCharacteristic 127 let heartRate: NSString = "ZhuHai XY" 128 let dataValue: NSData = heartRate.dataUsingEncoding(NSUTF8StringEncoding)! 129 //寫入數據 130 self.writeValue(service.UUID.description, characteristicUUID: characteristic.UUID.description, peripheral: self.peripheral, data: dataValue) 131 132 default: 133 break 134 } 135 } 136 } 137 138 //8.獲取外設發來的數據,不管是read和notify,獲取數據都是從這個方法中讀取。 139 func peripheral(peripheral: CBPeripheral!, didUpdateValueForCharacteristic characteristic: CBCharacteristic!, error: NSError!){ 140 if(error != nil){ 141 println("發送數據錯誤的特性是:\(characteristic.UUID) 錯誤信息:\(error.localizedDescription) 錯誤數據:\(characteristic.value)") 142 return 143 } 144 145 146 147 switch characteristic.UUID.description { 148 case "FFE1": 149 println("=\(characteristic.UUID)特徵發來的數據是:\(characteristic.value)=") 150 151 case "2A37": 152 println("=\(characteristic.UUID.description):\(characteristic.value)=") 153 154 case "2A38": 155 var dataValue: Int = 0 156 characteristic.value.getBytes(&dataValue, range:NSRange(location: 0, length: 1)) 157 println("2A38的值爲:\(dataValue)") 158 159 case "Battery Level":          //若是發過來的是Byte值,在Objective-C中直接.getBytes就是Byte數組了,在swift目前就用這個方法處理吧! 160 var batteryLevel: Int = 0 161 characteristic.value.getBytes(&batteryLevel, range:NSRange(location: 0, length: 1)) 162 println("當前爲你檢測了\(batteryLevel)秒!") 163 164 case "Manufacturer Name String":          //若是發過來的是字符串,則用NSData和NSString轉換函數 165 let manufacturerName: NSString = NSString(data: characteristic.value, encoding: NSUTF8StringEncoding)! 166 println("製造商名稱爲:\(manufacturerName)") 167 168 case "6E400003-B5A3-F393-E0A9-E50E24DCCA9E": 169 println("=\(characteristic.UUID)特徵發來的數據是:\(characteristic.value)=") 170 171 case "6E400002-B5A3-F393-E0A9-E50E24DCCA9E": 172 println("返回的數據是:\(characteristic.value)") 173 174 default: 175 break 176 } 177 } 178 179 //7.這個是接收藍牙通知,不多用。讀取外設數據主要用上面那個方法didUpdateValueForCharacteristic。 180 func peripheral(peripheral: CBPeripheral!, didUpdateNotificationStateForCharacteristic characteristic: CBCharacteristic!, error: NSError!){ 181 if error != nil { 182 println("更改通知狀態錯誤:\(error.localizedDescription)") 183 } 184 185 println("收到的特性數據:\(characteristic.value)") 186 //若是它不是傳輸特性,退出. 187 // if characteristic.UUID.isEqual(kCharacteristicUUID) { 188 // return 189 // } 190 //開始通知 191 if characteristic.isNotifying { 192 println("開始的通知\(characteristic)") 193 peripheral.readValueForCharacteristic(characteristic) 194 }else{ 195 //通知已中止 196 //全部外設斷開 197 println("通知\(characteristic)已中止設備斷開鏈接") 198 self.manager.cancelPeripheralConnection(self.peripheral) 199 } 200 } 201 202 //寫入數據 203 func writeValue(serviceUUID: String, characteristicUUID: String, peripheral: CBPeripheral!, data: NSData!){ 204 peripheral.writeValue(data, forCharacteristic: self.writeCharacteristic, type: CBCharacteristicWriteType.WithResponse) 205 println("手機向藍牙發送的數據爲:\(data)") 206 } 207 //用於檢測中心向外設寫數據是否成功 208 func peripheral(peripheral: CBPeripheral!, didWriteValueForCharacteristic characteristic: CBCharacteristic!, error: NSError!) { 209 if(error != nil){ 210 println("發送數據失敗!error信息:\(error)") 211 }else{ 212 println("發送數據成功\(characteristic)") 213 } 214 } 215 216 func numberOfSectionsInTableView(tableView: UITableView) -> Int { 217 // #warning Potentially incomplete method implementation. 218 // Return the number of sections. 219 return 1 220 } 221 222 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 223 // #warning Incomplete method implementation. 224 // Return the number of rows in the section. 225 return self.deviceList.count 226 } 227 228 229 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 230 //PCell,肯定單元格的樣式 231 let cell = tableView.dequeueReusableCellWithIdentifier("FhrCell", forIndexPath: indexPath) as! UITableViewCell 232 var device:CBPeripheral=self.deviceList.objectAtIndex(indexPath.row) as! CBPeripheral 233 //主標題 234 cell.textLabel?.text = device.name 235 //副標題 236 cell.detailTextLabel?.text = device.identifier.UUIDString 237 return cell 238 } 239 240 //經過選擇來鏈接和斷開外設 241 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 242 if(self.peripheralList.containsObject(self.deviceList.objectAtIndex(indexPath.row))){ 243 self.manager.cancelPeripheralConnection(self.deviceList.objectAtIndex(indexPath.row) as! CBPeripheral) 244 self.peripheralList.removeObject(self.deviceList.objectAtIndex(indexPath.row)) 245 println("藍牙已斷開!") 246 }else{ 247 self.manager.connectPeripheral(self.deviceList.objectAtIndex(indexPath.row) as! CBPeripheral, options: nil) 248 self.peripheralList.addObject(self.deviceList.objectAtIndex(indexPath.row)) 249 println("藍牙已鏈接! \(self.peripheralList.count)") 250 } 251 } 252 253 }

  注意:函數

查看特性以什麼方式讀取,就看每一個Characteristic的notifying屬性值,NO說明read方式,YES說明notifying通知方式ui

<CBCharacteristic: 0x17008a0f0, UUID = 6E400003-B5A3-F393-E0A9-E50E24DCCA9E, properties = 0x10, value = (null), notifying = YES>

下面是properties的具體解釋:spa

SWIFT
struct CBCharacteristicProperties : RawOptionSetType { init(_ value: UInt) var value: UInt static var Broadcast: CBCharacteristicProperties { get } static var Read: CBCharacteristicProperties { get } static var WriteWithoutResponse: CBCharacteristicProperties { get } static var Write: CBCharacteristicProperties { get } static var Notify: CBCharacteristicProperties { get } static var Indicate: CBCharacteristicProperties { get } static var AuthenticatedSignedWrites: CBCharacteristicProperties { get } static var ExtendedProperties: CBCharacteristicProperties { get } static var NotifyEncryptionRequired: CBCharacteristicProperties { get } static var IndicateEncryptionRequired: CBCharacteristicProperties { get } } OBJECTIVE-C typedef enum { CBCharacteristicPropertyBroadcast = 0x01, CBCharacteristicPropertyRead = 0x02, CBCharacteristicPropertyWriteWithoutResponse = 0x04, CBCharacteristicPropertyWrite = 0x08, CBCharacteristicPropertyNotify = 0x10, CBCharacteristicPropertyIndicate = 0x20, CBCharacteristicPropertyAuthenticatedSignedWrites = 0x40, CBCharacteristicPropertyExtendedProperties = 0x80, CBCharacteristicPropertyNotifyEncryptionRequired = 0x100, CBCharacteristicPropertyIndicateEncryptionRequired = 0x200, } CBCharacteristicProperties;
相關文章
相關標籤/搜索