iOS藍(lán)牙開(kāi)發(fā)-2-按協(xié)議開(kāi)發(fā)

一般來(lái)說(shuō)和藍(lán)牙外設(shè)硬件交互都會(huì)有簡(jiǎn)單的協(xié)議,一是規(guī)范通信券时,二是對(duì)數(shù)據(jù)加密。
我公司的協(xié)議都是由算法定義的伏伯,算法會(huì)給到一份詳細(xì)的協(xié)議文檔橘洞,上面會(huì)詳細(xì)的寫(xiě)清楚數(shù)據(jù)解析及交互。


協(xié)議結(jié)構(gòu).png

例如:讀取電量功能


讀取電量.png

因?yàn)樯婕暗焦井a(chǎn)品说搅,所以打碼炸枣。

按上面的協(xié)議結(jié)構(gòu)來(lái):
假如幀頭是0x01,功能碼是0x02,校驗(yàn)和是0xxx(具體如何計(jì)算适肠,公司內(nèi)部確定)
APP 發(fā)送給 藍(lán)牙外設(shè)的數(shù)據(jù)(讀取電量指令)應(yīng)為:

0x01 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xxx(校驗(yàn)碼)

藍(lán)牙外設(shè)收到讀取電量指令后霍衫,返回電量數(shù)據(jù)應(yīng)為:

0x01 0x02 0x5A 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xxx(校驗(yàn)碼)

注意,第三個(gè)字節(jié)為電量值侯养,解析代碼:

const u_int8_t *bytes = [data bytes];
NSInteger powerValue = bytes[2];
//得到的 powerValue 即為電量值敦跌,接下來(lái)寫(xiě)個(gè)if判斷就好了
if (powerValue == 120) {
        //充電中
    }else{
        //顯示電量即可
}

我自己做的項(xiàng)目中,CBCentralManager逛揩、CBPeripheral都是有單獨(dú)寫(xiě)了一個(gè)類


單獨(dú)的類.png

WSBLECenterManager:搜索外設(shè)柠傍、連接設(shè)備、自動(dòng)重連等等邏輯辩稽,內(nèi)含:

/**
 藍(lán)牙狀態(tài)更新
 
 @param central central
 */
- (void)centralManagerDidUpdateState:(CBCentralManager *)central{
}

/**
 發(fā)現(xiàn)設(shè)備
 
 @param central central
 @param peripheral 外設(shè)
 @param advertisementData 廣播
 @param RSSI 信號(hào)值
 */
- (void)centralManager:(CBCentralManager *)central
 didDiscoverPeripheral:(CBPeripheral *)peripheral
     advertisementData:(NSDictionary *)advertisementData
                  RSSI:(NSNumber *)RSSI{
//找到自己需要的設(shè)備后惧笛,可在此處連接,調(diào)用以下方法
  [_myCentralManager connectPeripheral:peripheral options:nil];
}

/**
 連接成功

 @param central central
 @param peripheral 外設(shè)
 */
- (void)centralManager:(CBCentralManager *)central
  didConnectPeripheral:(CBPeripheral *)peripheral{
}

/**
 連接失敗

 @param central central
 @param peripheral 外設(shè)
 @param error error
 */
- (void)centralManager:(CBCentralManager *)central
didFailToConnectPeripheral:(CBPeripheral *)peripheral
                 error:(NSError *)error{
}

/**
 斷開(kāi)連接

 @param central central
 @param peripheral 外設(shè)
 @param error error
 */
- (void)centralManager:(CBCentralManager *)central 
didDisconnectPeripheral:(CBPeripheral *)peripheral 
                 error:(NSError *)error{
}

WSBLESensor:發(fā)送指令逞泄、收取數(shù)據(jù)患整、解析數(shù)據(jù)等等功能
內(nèi)含:

/**
 發(fā)現(xiàn)服務(wù)

 @param peripheral peripheral
 @param error error
 */
-(void)peripheral:(CBPeripheral *)peripheral
didDiscoverServices:(NSError *)error{
}

/**
 發(fā)現(xiàn)特征

 @param peripheral peripheral
 @param service service
 @param error error
 */
- (void)peripheral:(CBPeripheral *)peripheral
didDiscoverCharacteristicsForService:(CBService *)service
             error:(NSError *)error {
}

/**
 收到數(shù)據(jù)

 @param peripheral peripheral
 @param characteristic characteristic
 @param error error
 */
-(void)peripheral:(CBPeripheral *)peripheral
didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic
            error:(NSError *)error{
}

//發(fā)送數(shù)據(jù)到外設(shè),調(diào)用
[self.peripheral writeValue:data
          forCharacteristic:self.writeCharacteristic
                       type:CBCharacteristicWriteWithResponse];

上面發(fā)送讀取電量指令時(shí)炭懊,如下:

    Byte bytes[20];
    bytes[0] = (Byte)(1);//幀頭
    bytes[1] = (Byte)(2);//讀取電量的功能碼
    for (NSInteger i = 2; i < 19; i++) {
        bytes[i] = (Byte)(0);
    }
    bytes[19] = (Byte)(/*校驗(yàn)和*/);
    NSData *data = [NSData dataWithBytes:bytes length:sizeof(bytes)];
    [self.peripheral writeValue:data
              forCharacteristic:self.writeCharacteristic
                           type:CBCharacteristicWriteWithResponse];

我的設(shè)計(jì)藍(lán)牙設(shè)計(jì)思路:

WSBLECenterManager:
  包含CBCentralManager單例對(duì)象:  _myCentralManager
  設(shè)置代理并级、實(shí)現(xiàn)CBCentralManagerDelegate協(xié)議及其方法拂檩。這樣搜索到的設(shè)備都能在WSBLECenterManager獲取到侮腹,同時(shí)連接成功、連接失敗稻励、斷開(kāi)連接等等也都可以通過(guò) CBCentralManagerDelegate 協(xié)議中的代理方法知曉
如果是需要連接設(shè)備父阻,我的做法是在 WSBLECenterManager 中定義了一個(gè)可變數(shù)組,用于存儲(chǔ)連接上的設(shè)備望抽。
  查找到的設(shè)備加矛、連接設(shè)備是否成功、斷開(kāi)設(shè)備的提示等都是通過(guò)block或者代理回調(diào)到viewController中

WSBLESensor:
  這是外設(shè)模型煤篙,存儲(chǔ)了廣播數(shù)據(jù)斟览,信號(hào)值等等
  CBPeripheralDelegate 協(xié)議中的代理方法都在這個(gè)類中實(shí)現(xiàn)。查找服務(wù)辑奈、查找特征苛茂、收取數(shù)據(jù)、解析數(shù)據(jù)鸠窗、發(fā)送數(shù)據(jù)都在這個(gè)類中實(shí)現(xiàn)
  數(shù)據(jù)處理結(jié)果妓羊、數(shù)據(jù)發(fā)送結(jié)果等都是通過(guò)block或者代理回調(diào)到viewController中

以上,即可將CBCentralManager稍计、CBPeripheral拆分開(kāi)來(lái)
其他的就是一些枚舉躁绸、block等定義了,可以單獨(dú)寫(xiě)一個(gè).h文件
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市净刮,隨后出現(xiàn)的幾起案子剥哑,更是在濱河造成了極大的恐慌,老刑警劉巖淹父,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件星持,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡弹灭,警方通過(guò)查閱死者的電腦和手機(jī)督暂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)穷吮,“玉大人逻翁,你說(shuō)我怎么就攤上這事〖裼悖” “怎么了八回?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)驾诈。 經(jīng)常有香客問(wèn)我缠诅,道長(zhǎng),這世上最難降的妖魔是什么乍迄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任管引,我火速辦了婚禮,結(jié)果婚禮上闯两,老公的妹妹穿的比我還像新娘褥伴。我一直安慰自己,他們只是感情好漾狼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布重慢。 她就那樣靜靜地躺著,像睡著了一般逊躁。 火紅的嫁衣襯著肌膚如雪似踱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天稽煤,我揣著相機(jī)與錄音核芽,去河邊找鬼。 笑死念脯,一個(gè)胖子當(dāng)著我的面吹牛狞洋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绿店,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吉懊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼庐橙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起借嗽,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤态鳖,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后恶导,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體浆竭,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年惨寿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邦泄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡裂垦,死狀恐怖顺囊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蕉拢,我是刑警寧澤特碳,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站晕换,受9級(jí)特大地震影響午乓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闸准,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一益愈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恕汇,春花似錦腕唧、人聲如沸或辖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)颂暇。三九已至缺谴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耳鸯,已是汗流浹背湿蛔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留县爬,地道東北人阳啥。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像财喳,于是被迫代替她去往敵國(guó)和親察迟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子斩狱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • Guide to BluetoothSecurity原文 本出版物可免費(fèi)從以下網(wǎng)址獲得:https://doi.o...
    公子小水閱讀 7,986評(píng)論 0 6
  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,980評(píng)論 3 119
  • 即使瘦成了一根小棍重量忽略不計(jì)頭顱點(diǎn)燃后仍舊從黑暗的手中奪取一方時(shí)空光芒大于自己陰影低于自己活著靜等燃燒死了扎瓶,化光...
    龍千鈞閱讀 332評(píng)論 0 1
  • 人啊所踊,這一輩子最后真正擁有的不就是昨憶嘛,那時(shí)想來(lái)一輩子實(shí)在太短概荷,很多都似那昨天般秕岛。 而記憶里那最珍貴的就是個(gè)情!...
    朱超_85閱讀 257評(píng)論 0 0
  • 01 雙因素理論,由美國(guó)心理學(xué)家赫茨伯格提出愈捅。雙因素理論把引起人們工作動(dòng)機(jī)的因素主要有兩個(gè):一是激勵(lì)因素惋增,二是保健...
    海濤筆記閱讀 1,704評(píng)論 0 5