iOS藍(lán)牙開發(fā) OAD升級

在做藍(lán)牙開發(fā)的時(shí)候,基本上都需要對藍(lán)牙設(shè)備進(jìn)行升級。當(dāng)時(shí)藍(lán)牙模塊應(yīng)用的是CC2640又沾,查閱了許多空中升級的相關(guān)資料。在查閱的過程中熙卡,發(fā)現(xiàn)關(guān)于iOS藍(lán)牙開發(fā)空中升級的材料非常少(也可能是我沒找到)杖刷,TI公司也沒有提供iOS空中升級的源碼,只提供了Android的源碼git驳癌。于是參考了Android的OAD源碼滑燃,并結(jié)合《CC2640 BLE OAD User's Guide》,最終實(shí)現(xiàn)了OAD升級颓鲜。

  • OAD升級涉及到的服務(wù)及特征值
    • OAD Service: F000FFC0-0451-4000-B000-000000000000
      1. FFC1 F000FFC1-0451-4000-B000-000000000000
      2. FFC2 F000FFC2-0451-4000-B000-000000000000

Off-Chip OAD升級大致過程

升級前準(zhǔn)備:下載藍(lán)牙設(shè)備待升級的Bin文件表窘,稱之為Image

  1. 開啟OAD相關(guān)特征值的通知典予。
  2. App向藍(lán)牙設(shè)備發(fā)送Image的Metadata
  3. App得到響應(yīng)后,開始發(fā)送一塊Image block信息
  4. 得到響應(yīng)后繼續(xù)發(fā)送下一塊信息
  5. 直到所有的Image Block信息發(fā)送成功乐严,藍(lán)牙設(shè)備升級也就完成了熙参。

Off-Chip OAD升級詳解

  • 開啟OAD相關(guān)特征值的通知。

      為了能夠得到藍(lán)牙設(shè)備的響應(yīng)信息開啟FFC1,FFC2的通知
    
-(void)configWithPeripheral:(CBPeripheral *)peripheral characteristics:(CBCharacteristic *)characteristic{
    if([characteristic.service.UUID.UUIDString isEqualToString:OADService]){
        if([characteristic.UUID.UUIDString isEqualToString:OADFFC1]){
            if(!characteristic.isNotifying){
                [peripheral setNotifyValue:YES forCharacteristic:characteristic];
            }
        }
        
        if([characteristic.UUID.UUIDString isEqualToString:OADFFC2]){
            if(!characteristic.isNotifying){
                [peripheral setNotifyValue:YES forCharacteristic:characteristic];
            }
        }
        
        if([characteristic.UUID.UUIDString isEqualToString:OADConfigNotifyCharacter]){
            if(!characteristic.isNotifying){
                [peripheral setNotifyValue:YES forCharacteristic:characteristic];
            }
        }

    }
}
  • App向藍(lán)牙設(shè)備發(fā)送Image的Metadata

      (1)寫入到哪里麦备?
      FFC1負(fù)責(zé)接收Metadata孽椰,將Metadata寫入FFC1特征。
      (2)如何得到Metadata?
      需要根據(jù)Metadata數(shù)據(jù)格式自己生成凛篙。
      CRC的生成方法是在Android源碼中找到的
      Length為Image大小的1/4
    
    Paste_Image.png
    - (Image_header)imageHeader{
      Image_header image_header;
      image_header.crc0 = [self calcImageCRC:0];
      image_header.crc1 = 0xffff;
      image_header.ver = 0;
      image_header.len = self.data.length / 4;
      image_header.uid[0] = image_header.uid[1] = image_header.uid[2] = image_header.uid[3] = 'E';
      image_header.address = 0x1000 / 4;
      image_header.imgType = 1;
      image_header.state = 0xff;
      return image_header;
    

}

* 寫入成功后黍匾,藍(lán)牙設(shè)備會響應(yīng)第一個要寫入的Image Block塊數(shù),一般為0

      (1)何為Image Block?
          一個Block被規(guī)定為16個字節(jié)
          比如:Image文件的大小為115k
          115k*1024/16 = 7360塊
          0就代表Image的前16個字節(jié)
      (2)從哪里得到響應(yīng)信息呛梆?
          因?yàn)镺ADService服務(wù)下已經(jīng)開啟了FFC2的通知锐涯,Block信息會從FFC2特征值響應(yīng)
      (3)得到0后該如何做?
          從Image提取第一塊Block填物,寫入FFC2特征纹腌。
      (4)寫入Block的數(shù)據(jù)格式是什么?
          2Byte + 16Bye = 18Byte
          前兩個字節(jié)代表第幾個Block后16個字節(jié)表示Block內(nèi)容
   
      

requestData[0] = LO_UINT16(self.iBlocks);
requestData[1] = HI_UINT16(self.iBlocks);
memcpy(&requestData[2], &imageFileData[self.iBytes], OAD_BLOCK_SIZE);
[SPBLE writeNoResponseCharacteristic:currentPeripheral sCBUUID:self.oadServiceUUID cCBUUID:self.oadWriteUUID data:[NSData dataWithBytes:requestData length:(2 + OAD_BLOCK_SIZE)]];

* 得到響應(yīng)后繼續(xù)發(fā)送下一塊信息
       
       寫入成功后會得到響應(yīng)1滞磺,從Image提取下一塊信息升薯,寫入        FFC2特征……直到所有的Block都寫入成功,升級結(jié)束击困。
(5)如何判斷升級成功涎劈?
       
       升級完成后,藍(lán)牙設(shè)備會斷開連接阅茶,說明升級已成功了蛛枚。
       
通過代理可監(jiān)測升級進(jìn)度

@protocol SPBLEOADUpdaterDelegate <NSObject>
-(NSData *)updatedImage;
-(CBPeripheral *)updatedPeripheral;
-(void)updater:(SPBLEOADUpdater *)updater progress:(CGFloat)progress;
@end

        

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2286896-6e5be036a09cfdc1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


[源碼地址](https://github.com/somson/BLEOAD)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脸哀,隨后出現(xiàn)的幾起案子蹦浦,更是在濱河造成了極大的恐慌,老刑警劉巖撞蜂,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盲镶,死亡現(xiàn)場離奇詭異,居然都是意外死亡谅摄,警方通過查閱死者的電腦和手機(jī)徒河,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來送漠,“玉大人顽照,你說我怎么就攤上這事。” “怎么了代兵?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵尼酿,是天一觀的道長。 經(jīng)常有香客問我植影,道長裳擎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任思币,我火速辦了婚禮鹿响,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谷饿。我一直安慰自己惶我,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布博投。 她就那樣靜靜地躺著绸贡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪毅哗。 梳的紋絲不亂的頭發(fā)上听怕,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機(jī)與錄音虑绵,去河邊找鬼尿瞭。 笑死,一個胖子當(dāng)著我的面吹牛蒸殿,可吹牛的內(nèi)容都是我干的筷厘。 我是一名探鬼主播鸣峭,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宏所,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摊溶?” 一聲冷哼從身側(cè)響起爬骤,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎莫换,沒想到半個月后霞玄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拉岁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年坷剧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喊暖。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡惫企,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狞尔,我是刑警寧澤丛版,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站偏序,受9級特大地震影響页畦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜研儒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一豫缨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧端朵,春花似錦州胳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碗硬,卻和暖如春瓤湘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恩尾。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工弛说, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翰意。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓木人,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冀偶。 傳聞我的和親對象是個殘疾皇子醒第,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

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