十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
iOS BLE開發(fā)調(diào)用的是CoreBluetooth系統(tǒng)原生庫,基本用到的類有:
創(chuàng)新互聯(lián)建站專注于多倫網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供多倫營銷型網(wǎng)站建設(shè),多倫網(wǎng)站制作、多倫網(wǎng)頁設(shè)計(jì)、多倫網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造多倫網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供多倫網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
CBCentralManager //系統(tǒng)藍(lán)牙設(shè)備管理對象
CBPeripheral //外圍設(shè)備
CBService //外圍設(shè)備的服務(wù)或者服務(wù)中包含的服務(wù)
CBCharacteristic //服務(wù)的特性
CBDescriptor //特性的描述符
myCentralManager = CBCentralManager()
myCentralManager.delegate = self
myCentralManager.scanForPeripherals(withServices: nil, options: nil)
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
central.connect(self.myPeripheral, options: nil)
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
}
func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
}
func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?){
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
for s in peripheral.services!{
peripheral.discoverCharacteristics(nil, for: s)
}
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
print("----發(fā)現(xiàn)特征------")
for c in service.characteristics! {
if c.uuid.uuidString == CHARACTERISTIC{
self.writeCharacteristic = c
peripheral.setNotifyValue(true, for: c)
}
}
}
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?){
}
func writeToPeripheral(_ bytes:[UInt8]) {
if writeCharacteristic != nil {
let data1:Data = dataWithHexstring(bytes)
self.myPeripheral.writeV? ? alue(data1, for: writeCharacteristic, type: CBCharacteristicWriteType.withResponse)
} else{
}
}
func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) {
print("didWriteValueForCharacteristic")
}
以上只是作為藍(lán)牙從連接打到發(fā)送數(shù)據(jù)接收數(shù)據(jù)的一個(gè)簡單流程,藍(lán)牙也可以作為多連接,在數(shù)據(jù)返回的方法可以對返回的藍(lán)牙設(shè)備和你連接的所有藍(lán)牙設(shè)備進(jìn)行一個(gè)判斷,根據(jù)判斷來斷定是哪個(gè)藍(lán)牙設(shè)備返回過來的信息。
另外關(guān)于藍(lán)牙的UUID,聽說是每個(gè)手機(jī)連接同一個(gè)藍(lán)牙設(shè)備的UUID會不同,這方面安卓那邊比較簡單的能獲取到藍(lán)牙的Mac地址,iOS好像要和廠家那邊協(xié)商一下,我以為你懶得去弄 了所有就暫時(shí)這樣;手上我也只有1個(gè)手機(jī)所有沒有做這方面的測試,有看到這篇文件的朋友或者知道的大神可以留言告訴我是否是這樣的。
只連接到最好的
藍(lán)牙開發(fā)連接最好用Mac地址
iOS獲取藍(lán)牙外設(shè)的Mac地址的兩種方法
iOS 獲取藍(lán)牙外設(shè)的Mac地址的兩種方法 -
iOS 藍(lán)牙開發(fā)(一)
iOS 藍(lán)牙開發(fā)(二)
iOS 藍(lán)牙開發(fā)(四)
前面記錄了藍(lán)牙如何進(jìn)行掃描、鏈接、以及獲取外設(shè)的服務(wù)和特征,本篇筆記我將記錄如何實(shí)現(xiàn) 與外設(shè)做數(shù)據(jù)交互(explore and interact) 。
構(gòu)建方法流程:鏈接成功-獲取指定的服務(wù)與特征-訂閱指定的特征值-通過具有寫權(quán)限的特征值來寫數(shù)據(jù)-最后在函數(shù) didUpdateValueForCharacteristic 中獲取藍(lán)牙的反饋信息;
總結(jié):
本篇筆記大概就是在接收到服務(wù)和特征后對數(shù)據(jù)進(jìn)行寫入的操作的過程,筆記中的重點(diǎn)在于要熟悉構(gòu)建特征和服務(wù)的方法流程。熟悉流程,我們就能清楚知道當(dāng)在寫入數(shù)據(jù)時(shí),系統(tǒng)藍(lán)牙會在函數(shù) didUpdateValueForCharacteristic 方法中給我們反饋寫入是否成功的反饋信息。
GAP(Generic Access Profile):它用來控制設(shè)備連接和廣播,GAP 使你的設(shè)備被其他設(shè)備可見,并決定了你的設(shè)備是否可以或者怎樣與合同設(shè)備進(jìn)行交互。
GATT(Generic Attribute Profile):BLE連接都是建立在GATT協(xié)議之上的。GATT 是一個(gè)在藍(lán)牙連接之上的發(fā)送和接收很短的數(shù)據(jù)段的通用規(guī)范,這些很短的數(shù)據(jù)段被稱為屬性(Attribute)。
BLE中主要有兩個(gè)角色:外圍設(shè)備(Peripheral)和中心設(shè)備(Central)。一個(gè)中心設(shè)備可以連接多個(gè)外圍設(shè)備,一個(gè)外圍設(shè)備包含一個(gè)或多個(gè)服務(wù)(services),一個(gè)服務(wù)包含一個(gè)或多個(gè)特征(characteristics)。
使用CoreBluetooth庫,創(chuàng)建CBPeripheralManager,實(shí)現(xiàn)CBPeripheralManagerDelegate代理
創(chuàng)建完該對象,會回調(diào)peripheralManagerDidUpdateState:方法判斷藍(lán)牙狀態(tài),藍(lán)牙可用,給外設(shè)配置服務(wù)和特征
注意CBAttributePermissions
當(dāng)中心設(shè)備讀寫設(shè)置CBAttributePermissionsReadEncryptionRequired/CBAttributePermissionsWriteEncryptionRequired權(quán)限的Characteristic時(shí),會彈出彈框,請求建立安全連接
給外設(shè)配置服務(wù)特征后,會調(diào)用peripheralManager:didAddService:error: 服務(wù)特征全部添加完后發(fā)起廣播,如果在廣播時(shí)設(shè)置CBAdvertisementDataServiceUUIDsKey,會把該service廣播出去,中心設(shè)備在掃描時(shí)可根據(jù)該uuid找到該設(shè)備。外圍設(shè)備靠不斷發(fā)廣播,使中心設(shè)備發(fā)現(xiàn)它。
當(dāng)中央端連接上了此設(shè)備并訂閱了特征時(shí)會回調(diào) didSubscribeToCharacteristic:
當(dāng)接收到中央端讀的請求時(shí)會調(diào)用didReceiveReadRequest:
創(chuàng)建CBCentralManager對象,實(shí)現(xiàn)CBCentralManagerDelegate代理
回調(diào)centralManagerDidUpdateState:代理方法,當(dāng)central.state==CBManagerStatePoweredOn時(shí),開啟掃描,設(shè)置serviceUUIDs可掃描特定外設(shè),CBCentralManagerScanOptionAllowDuplicatesKey設(shè)為NO不重復(fù)掃描已發(fā)現(xiàn)設(shè)備,YES是允許
掃描到設(shè)備會回調(diào)centralManager:didDiscoverPeripheral:advertisementData:RSSI:,RSS絕對值越大,表示信號越差,設(shè)備離的越遠(yuǎn)
關(guān)閉掃描
連接設(shè)備
發(fā)現(xiàn)服務(wù)
發(fā)現(xiàn)特征
iOS 藍(lán)牙開發(fā)(二)
iOS 藍(lán)牙開發(fā)(三)
iOS 藍(lán)牙開發(fā)(四)
在iOS中藍(lán)牙相關(guān)實(shí)現(xiàn)都是在CoreBluetooth這個(gè)framework中的,所以我們創(chuàng)建一個(gè)單例類中需要先導(dǎo)入 #import CoreBluetooth/CoreBluetooth.h ,再后即可使用這個(gè)單例類進(jìn)行管理我們藍(lán)牙的掃描、連接、狀態(tài)等實(shí)現(xiàn)。
當(dāng) central.state 為CBManagerStatePoweredOn即可開始掃描, 具體方法 [self.centralManager scanForPeripheralsWithServices:nil options:nil] 當(dāng)調(diào)用 scanForPeripheralsWithServices:options: 函數(shù)時(shí)就會實(shí)時(shí)調(diào)用其代理方法 - (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
peripheral 是外設(shè)類 advertisementData 是廣播的值,一般攜帶設(shè)備名, serviceUUID 等信息。 RSSI 絕對值越大,表示信號越差,設(shè)備離的越遠(yuǎn)。如果想裝換成百分比強(qiáng)度, (RSSI+100)/1001 (這是一個(gè)約數(shù),藍(lán)牙信號值并不一定是-100 - 0的值)
藍(lán)牙的連接是當(dāng)中心設(shè)備掃描到可用外設(shè)后, 利用函數(shù) [self.centralManager connectPeripheral:peripheral options:nil]; 進(jìn)行鏈接, 當(dāng)函數(shù)被調(diào)用后, 就會回調(diào)其對應(yīng)的代理函數(shù)。
本篇筆記主要是記錄如何初始化藍(lán)牙的 CBCentralManager 的中心管理類,并記錄如何實(shí)現(xiàn)掃描周邊外設(shè)、如何鏈接、獲取藍(lán)牙當(dāng)前狀態(tài)。