? ? ? ? ?上篇文章iOS藍牙4.0開發(fā)Central(CoreBluetooth) - 簡書已經講述了作為中央設備的客戶端,現在來講講CoreBluetooth作為外圍設備的情況粱锐。外圍設備(Peripheral)負責發(fā)布廣播服務才顿,告訴周邊中央設備它的可以服務及特征逝变。
一般流程:
1嗤瞎、創(chuàng)建外圍設備管理器CBPeripheralManager并設置代理
2欧引、設置外圍設備的服務和特征怀各,并添加到數據庫中
3倔韭、對外發(fā)布服務的廣播
4、接收來自連接上的中心設備的各種請求(讀和寫)
5瓢对、向訂閱了特征值改變的中心設備發(fā)送通知
詳細步驟(附帶部分代碼):
要求:在Xcode導入CoreBluetooth動態(tài)庫寿酌;
在你的類中引用CoreBluetooth/CoreBluetooth.h;
iOS10還需要加入藍牙的權限說明NSBluetoothPeripheralUsageDescription
a硕蛹、創(chuàng)建外圍設備的管理對象份名,并指定代理
b、創(chuàng)建了CBPeripheralManager妓美,會執(zhí)行它的第一個代理peripheralManagerDidUpdateState:僵腺,通過藍牙的狀態(tài)來執(zhí)行下一步動作,當藍牙開啟狀態(tài)下可以去設置服務和特征壶栋。
c辰如、設置外圍設備的服務和特征,并添加到數據庫
? ? ? ? 設置服務和特征贵试,外設的服務和特征通常是通過一個128位的藍牙UUID來表示的琉兜,但是通過SIG定義或分發(fā)的通用UUID可以被縮短為16位,例如:服務的16位UUID180D,這個UUID是UUID0000180D-0000-1000-8000-00805F9B34FB簡便形式.
這里我先定義幾個UUID
構建服務和特征樹毙玻,創(chuàng)建可變特征時豌蟋,可以指定它的屬性、value值和許可桑滩。當你給某個特征指定一個值梧疲,如果你需要這個該特征的值是可寫的或希望這個特征的值在其所屬服務的生命周期中是可以改變的,你必須指定這個value值為nil运准。這樣做來確保這個值是動態(tài)的和當外設管理器接收來自中心設備的讀和寫請求是可以被外設管理器請求幌氮。
到此就有了兩個服務了,第一個服務有一個通知特征和一個可讀寫的特征胁澳,另一個服務只有一個只讀的特征该互。
d、添加服務和特征到數據庫中
e韭畸、數據庫添加成功后會調用- (void)peripheralManager:(CBPeripheralManager *)peripheral didAddService:(CBService *)service error:(NSError *)error代理方法宇智,在代理方法中就可以開始對外廣播了
到此蔓搞,外部的中央設備就可以搜索并連接上了。
f随橘、響應來自連接上的中心設備的讀和寫請求
當中心設備針對你的可讀特征的服務發(fā)送請求時喂分,會執(zhí)行didReceiveReadRequest:的回調,通過判斷是否有可讀的權限太防,返回請求成功的響應
寫的請求跟讀相類似
在這個代理方法中可以取到中心設備寫入的值妻顶,通過寫入的值我們可以編好一些指令,實現某些動作蜒车,從而來實現交互讳嘱。
g、給已經訂閱的中心設備發(fā)送更新特征的值(Notify)
當中心設備訂閱了特征上的值酿愧,外設管理器會調用peripheralManager:central:didSubscribeToCharacteristic:方法
需要給中心設備更新數據沥潭,都可用CBPeripheralManager 的 updateValue:forCharacteristic:onSubscribedCentrals:把更新數據發(fā)送過去,作為外設可以定時給中心設備發(fā)送狀態(tài)更新嬉挡,也就實現了外設跟中心設備的交互钝鸽。
中心設備如取消了訂閱,外設一樣會接收到回調消息
如果需要Demo的請到這GitHub - zshuo50/BLEFollow下載參考庞钢,希望對你的學習有所幫助拔恰。可以在AppStore下載LightBlue這個軟件來作為調試工具基括,不論是中央設備還是外部設備它都能滿足你的需求颜懊。