iOS 蓝牙下空中升级操作

涉及到蓝牙操作的一定会接触到升级 我是安照TI 写的不过只是验证了蓝牙升级的功能。

一开始首先需要把升级bin文件在iTunes上拖进APP 然后在APP里面读出来转成data

NSString*path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];

NSString*fileName = [pathstringByAppendingPathComponent:@"KeyV8.bin"];

NSMutableData*reader = [NSMutableDatadataWithContentsOfFile:fileName];

这个数据就是你要准备升级的数据了

然后连接蓝牙

如果是可以升级的蓝牙会在服务下有两个UUID

如图:



FF12不用管

下面的才是有关升级的 那个identity的UUID是进行验证的

BLOCK 是写数据的 然后首先要验证在连接成功后

-(void)peripheral:(CBPeripheral*)peripheral didDiscoverServices:(NSError*)error

{

if(error)

{

NSLog(@">>>Discovered services for %@ with error: %@", peripheral.name, [errorlocalizedDescription]);

return;

}

for(CBService*serviceinperipheral.services)

{

// NSLog(@"service2service2 %@",service);

if([service.UUID.UUIDStringisEqualToString:@"F000FFC0-0451-4000-B000-000000000000"])

{

[peripheraldiscoverCharacteristics:nilforService:service];

}

}

}

在这个代理里面遍历这个服务

拿到那两个UUID

-(void)peripheral:(CBPeripheral*)peripheral didDiscoverCharacteristicsForService:(nonnullCBService*)service error:(nullableNSError*)error

{

//NSLog(@"_disper.state%ld",(long)_disper.state);

if(error)

{

NSLog(@"error Discovered characteristics for %@ with error: %@", service.UUID, [errorlocalizedDescription]);

return;

}

if(service.characteristics.count==2) {

for(CBCharacteristic*characteristicinservice.characteristics)

{

_writechar= characteristic;

if([characteristic.UUIDisEqual:[CBUUIDUUIDWithString:@"F000FFC1-0451-4000-B000-000000000000"]])

{

_writechar1= characteristic;

if(_readChar!= characteristic) {

_readChar= characteristic;

}

[peripheralreadValueForCharacteristic:_readChar];

[peripheralsetNotifyValue:YESforCharacteristic:_readChar];

}

elseif([characteristic.UUIDisEqual:[CBUUIDUUIDWithString:@"F000FFC2-0451-4000-B000-000000000000"]])

{

if(_writechar!= characteristic) {

_writechar= characteristic;

}

}

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.9*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

NSData*data0 = [TOOL_datadataWithHexString:@"00"];

[_disperwriteValue:data0forCharacteristic:characteristictype:CBCharacteristicWriteWithoutResponse];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.9*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

NSData*data0 = [TOOL_datadataWithHexString:@"01"];

[_disperwriteValue:data0forCharacteristic:characteristictype:CBCharacteristicWriteWithoutResponse];

});

});

}

}

}

那两个服务都是可读可写的 先想identity 里面发00 01 得到的数据用


-(NSInteger)please:(Byte)byte1 and:(Byte)byte0

{

inta = ((byte1<<8)&0XFFFF);

return(a + (byte0 &0xff));

}

这个方法计算

Byteb0 = ((Byte*)([characteristic.valuebytes]))[0];

Byteb1 = ((Byte*)([characteristic.valuebytes]))[1];

NSLog(@"%c%c",b0,b1);

NSInteger c =[selfplease:b1and:b0];


Byteb7 = ((Byte*)([characteristic.valuebytes]))[3];

Byteb6 = ((Byte*)([characteristic.valuebytes]))[2];

NSInteger c2 = [selfplease:b7and:b6];


NSInteger type = ((c &1) ==1) ?'B':'A';

NSLog(@"typetype%d",type);

type 是升级哪个服务 值是A或B的ASCII值 c1 和 c2 一个是版本和长度

这拿TI一看就懂



然后把文件哪个data第0个字节和 第一个还有第7个字节和第6个运算

Byteb0 = ((Byte*)([readerbytes]))[5];

Byteb1 = ((Byte*)([readerbytes]))[4];

NSIntegerver =[selfboplease:b0andbo:b1];

NSLog(@"cc %d",ver);

Byteb7 = ((Byte*)([readerbytes]))[7];

Byteb6 = ((Byte*)([readerbytes]))[6];

NSIntegerlen =[selfboplease:b7andbo:b6];

NSLog(@"cc12 %d",len);

-(NSInteger)lou:(NSInteger)a 

{return(a &0xFF);}

-(NSInteger)hi:(NSInteger)a

{return(a >>8);}


NSInteger buf0 = [selflou:ver];

NSInteger buf1 = [selfhi:ver];

NSInteger buf2 = [selflou:len];

NSInteger buf3 = [selfhi:len];

把这4个字节拼接后面在加上s升级bin文件的第9个字节连续在加4后面补0补齐12个字节

03 00 00 9A 42 42 42 42 00 00 00 00

把他发向第一个UUID

然后在把文件发向第2个UUID

每包18个前两个字节是吧包数用

-(NSInteger)lou:(NSInteger)a

{return(a &0xFF);}

-(NSInteger)hi:(NSInteger)a

{return(a >>8);}

这两个方法算出

第一个字节lou 第二个hi这个方法算

后面16个 字节就是文件里的数据往下发送

每包30毫秒 发送完成后蓝牙会断开 然后

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

推荐阅读更多精彩内容