iOS蓝牙开发 OAD升级

在做蓝牙开发的时候,基本上都需要对蓝牙设备进行升级。当时蓝牙模块应用的是CC2640,查阅了许多空中升级的相关资料。在查阅的过程中,发现关于iOS蓝牙开发空中升级的材料非常少(也可能是我没找到),TI公司也没有提供iOS空中升级的源码,只提供了Android的源码git。于是参考了Android的OAD源码,并结合《CC2640 BLE OAD User's Guide》,最终实现了OAD升级。

  • OAD升级涉及到的服务及特征值
    • OAD Service: F000FFC0-0451-4000-B000-000000000000
      1. FFC1 F000FFC1-0451-4000-B000-000000000000
      2. FFC2 F000FFC2-0451-4000-B000-000000000000

Off-Chip OAD升级大致过程

升级前准备:下载蓝牙设备待升级的Bin文件,称之为Image

  1. 开启OAD相关特征值的通知。
  2. App向蓝牙设备发送Image的Metadata
  3. App得到响应后,开始发送一块Image block信息
  4. 得到响应后继续发送下一块信息
  5. 直到所有的Image Block信息发送成功,蓝牙设备升级也就完成了。

Off-Chip OAD升级详解

  • 开启OAD相关特征值的通知。

      为了能够得到蓝牙设备的响应信息开启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向蓝牙设备发送Image的Metadata

      (1)写入到哪里?
      FFC1负责接收Metadata,将Metadata写入FFC1特征。
      (2)如何得到Metadata?
      需要根据Metadata数据格式自己生成。
      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;
    

}

* 写入成功后,蓝牙设备会响应第一个要写入的Image Block块数,一般为0

      (1)何为Image Block?
          一个Block被规定为16个字节
          比如:Image文件的大小为115k
          115k*1024/16 = 7360块
          0就代表Image的前16个字节
      (2)从哪里得到响应信息?
          因为OADService服务下已经开启了FFC2的通知,Block信息会从FFC2特征值响应
      (3)得到0后该如何做?
          从Image提取第一块Block,写入FFC2特征。
      (4)写入Block的数据格式是什么?
          2Byte + 16Bye = 18Byte
          前两个字节代表第几个Block后16个字节表示Block内容
   
      

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)]];

* 得到响应后继续发送下一块信息
       
       写入成功后会得到响应1,从Image提取下一块信息,写入        FFC2特征……直到所有的Block都写入成功,升级结束。
(5)如何判断升级成功?
       
       升级完成后,蓝牙设备会断开连接,说明升级已成功了。
       
通过代理可监测升级进度

@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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容