iOS藍牙外設(shè)管理器

雖然做藍牙項目有一段時間了颁井,最近才真正的接觸藍牙模塊。剛開始寫了個作為中心設(shè)備的demo蠢护,發(fā)現(xiàn)周圍硬件太多雅宾,也不知道哪個是哪個了,所以就又寫了個作為外設(shè)管理器的demo葵硕,參考的是http://liuyanwei.jumppo.com/2015/09/07/ios-BLE-3.html眉抬。

好了,說說我的思路吧懈凹。

1蜀变、創(chuàng)建外圍設(shè)備CBPeripheralManager對象

self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];

queue:表示的是分派事件的隊列,外設(shè)的事件將在提供的隊列上分派介评,如果設(shè)為nil库北,將使用主隊列。

當(dāng)創(chuàng)建了peripheralManager后们陆,和中心設(shè)備一樣寒瓦,會調(diào)用一個- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral的方法,這個方法必須實現(xiàn)坪仇。

2杂腰、給外設(shè)添加服務(wù)與特征

用CBMutableCharacteristic的initWithType:properties:value:permissions來創(chuàng)建特征,根據(jù)自己的需求寫定特征的UUID椅文、值和許可喂很。

// 可通知的特征

CBMutableCharacteristic *notifyCharacteristic = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:KBNotiyCharacteristicUUID] properties:CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable];

// 可讀寫的特征

CBMutableCharacteristic *readAndWriteCharacteristic = [[CBMutableCharacteristic alloc]initWithType:[CBUUID UUIDWithString:KBReadAndWriteCharacteristicUUID] properties:CBCharacteristicPropertyWrite | CBCharacteristicPropertyRead value:nil permissions:CBAttributePermissionsReadable | CBAttributePermissionsWriteable];

// service初始化加入兩個characteristics

CBMutableService *service = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:KBKBServiceUUID] primary:YES];

[service setCharacteristics:@[notifyCharacteristic,readAndWriteCharacteristic]];

// 將服務(wù)及其關(guān)聯(lián)的特性發(fā)布到本地數(shù)據(jù)庫

// 在調(diào)用addService方法后惜颇,會調(diào)用peripheralManager:didAddService:error:方法

[self.peripheralManager addService:service];

3、成功把服務(wù)和特征添加到數(shù)據(jù)庫中后少辣,開始廣播外設(shè)的服務(wù)或特征凌摄,調(diào)用startAdvertising:方法,使centralManager可以掃描到此外設(shè)毒坛。

[self.peripheralManager startAdvertising:@{

CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:KBServiceUUID]],

CBAdvertisementDataLocalNameKey:KBPeripheralLocalNameKey

}];

startAdvertising: 后面的參數(shù)是個字典類型望伦,里面放入需要廣播的數(shù)據(jù),具體的可以看CBAdvertisementData.h煎殷,但是對于我們創(chuàng)建的藍牙外設(shè)管理器,我們只能廣播這兩個key “CBAdvertisementDataLocalNameKey”和“?CBAdvertisementDataServiceUUIDsKey”腿箩。

當(dāng)外設(shè)開始廣播時豪直,會調(diào)用代理peripheralManagerDidStartAdvertising:error:。

4珠移、連上中心設(shè)備后的響應(yīng)

當(dāng)中心設(shè)備連上此外設(shè)弓乙,會對外設(shè)的讀、寫钧惧、監(jiān)聽的特征進行讀暇韧、寫、監(jiān)聽的操作浓瞪,作為外設(shè)管理器懈玻,需要對這些請求作出回應(yīng)。

1)收到中心設(shè)備讀特征請求后的回應(yīng)

中心設(shè)備對可讀的特征進行讀請求時乾颁,會調(diào)用代理peripheralManager:didReceiveReadRequest:涂乌。根據(jù)傳入的CBATTRequest對象的特征的properties屬性是否可讀,如果滿足英岭,可以通過外設(shè)的特征的值賦給請求的值(默認(rèn)是nil)湾盒,并告訴中心設(shè)備已經(jīng)設(shè)置成功,調(diào)用CBPeripheralManager的respondToRequest:withResult:的方法诅妹。

//判斷是否有讀數(shù)據(jù)的權(quán)限

if (request.characteristic.properties & CBCharacteristicPropertyRead) {

NSData *data = request.characteristic.value;

[request setValue:data];

//對請求作出成功響應(yīng)

[peripheralManager respondToRequest:request withResult:CBATTErrorSuccess];

}

但是罚勾,如果不滿足,也需要調(diào)用respondToRequest:withResult:的方法吭狡,給中心設(shè)備反饋一個失敗的原因尖殃。

[self.peripheralManager respondToRequest:request withResult:CBATTErrorWriteNotPermitted];

2)收到中心設(shè)備寫特征請求后的回應(yīng)

中心設(shè)備對可寫的特征進行寫請求時,會調(diào)用代理peripheralManager:didReceiveWriteRequests:赵刑。和讀的請求回應(yīng)差不多分衫,也需要去判斷CBATTRequest對象的特征的properties是否滿足可寫的,可能會有多個請求對象般此,requests是個數(shù)組蚪战,取傳入數(shù)組中的第一個請求作為參數(shù)牵现,如果滿足,寫入值邀桑,

CBATTRequest *request = requests[0];

//轉(zhuǎn)換成CBMutableCharacteristic對象才能進行寫值

CBMutableCharacteristic *characteristic =(CBMutableCharacteristic *)request.characteristic;

characteristic.value = request.value;

[self.peripheralManager respondToRequest:request withResult:CBATTErrorSuccess];

如果不滿足的話瞎疼,調(diào)用respondToRequest:withResult:的方法,給中心設(shè)備反饋一個失敗的原因壁畸。

[self.peripheralManager respondToRequest:request withResult:CBATTErrorWriteNotPermitted];

注意:對于多個請求對象只有一次請求,只要任意的一個請求對象得不到滿足,你任意一個都不要滿足,而是立即調(diào)用respondToRequest:withResult:方法提供一個結(jié)果,告訴失敗的原因.

3)收到中心設(shè)備訂閱請求后的回應(yīng)

當(dāng)中心設(shè)備訂閱一個或多個特征值的話贼急,外設(shè)需要將發(fā)生改變的特征值告訴中心設(shè)備,調(diào)用代理peripheralManager:central:didSubscribeToCharacteristic:捏萍。在代理方法中獲取最新的特征值并調(diào)用updateValue:forCharacteristic:onSubscribedCentrals:方法向中心設(shè)備發(fā)送數(shù)據(jù)太抓。如果失敗,會調(diào)用代理peripheralManagerIsReadyToUpdateSubscribers:令杈,可在該代理中再次傳送數(shù)據(jù)走敌。

取消訂閱的話,調(diào)用代理peripheralManager:central:didUnsubscribeFromCharacteristic:逗噩。

嗯掉丽,就到這了,可能有些地方寫的不夠?qū)I(yè)异雁,也希望大家指正捶障,謝謝!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纲刀,一起剝皮案震驚了整個濱河市项炼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柑蛇,老刑警劉巖芥挣,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異耻台,居然都是意外死亡空免,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門盆耽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹋砚,“玉大人,你說我怎么就攤上這事摄杂“痈溃” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵析恢,是天一觀的道長墨坚。 經(jīng)常有香客問我,道長映挂,這世上最難降的妖魔是什么泽篮? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任盗尸,我火速辦了婚禮,結(jié)果婚禮上帽撑,老公的妹妹穿的比我還像新娘泼各。我一直安慰自己,他們只是感情好亏拉,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布扣蜻。 她就那樣靜靜地躺著,像睡著了一般及塘。 火紅的嫁衣襯著肌膚如雪莽使。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天笙僚,我揣著相機與錄音吮旅,去河邊找鬼。 笑死味咳,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的檬嘀。 我是一名探鬼主播槽驶,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鸳兽!你這毒婦竟也來了掂铐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤揍异,失蹤者是張志新(化名)和其女友劉穎全陨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衷掷,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡辱姨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了戚嗅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雨涛。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖懦胞,靈堂內(nèi)的尸體忽然破棺而出替久,到底是詐尸還是另有隱情,我是刑警寧澤躏尉,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布蚯根,位于F島的核電站,受9級特大地震影響胀糜,放射性物質(zhì)發(fā)生泄漏颅拦。R本人自食惡果不足惜蒂誉,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望矩距。 院中可真熱鬧拗盒,春花似錦、人聲如沸锥债。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哮肚。三九已至登夫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間允趟,已是汗流浹背恼策。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留潮剪,地道東北人涣楷。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像抗碰,于是被迫代替她去往敵國和親狮斗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容