關於iOS 藍芽OAD公升級

2021-08-02 21:55:09 字數 4326 閱讀 9071

1. oad公升級機制

oad公升級有兩個bin格式檔案  image-a 和 image-b 

為了防止藍芽公升級

當在公升級的時候,為了防止藍芽公升級出錯,需要先查詢當前藍芽映象 是 image-a 還是 image-b 

如果當前是 a 就取 b檔案去公升級,否則 是b 就取 a檔案去公升級

ffc1 特徵值用來傳送查詢版本資訊  和 傳送公升級通知的藍芽資訊

分別傳送 0  、1 給藍芽裝置

返回裝置映象資訊如:    <0204007c 42424242>     

關於oad執行機制 參考:

2.藍芽映象 型別 版本 大小查詢

查詢映象資訊的特徵  characteristic

#define bt_oad_image_notify@

"f000ffc1-0451-4000-b000-000000000000"    

#define bt_oad_image_block_request @

"f000ffc2-0451-4000-b000-000000000000"

//ffc2 特徵值用來傳輸公升級資訊

cbperipheral

*peripheral;

cbcharacteristic

*characteristic_oad_1; 

cbcharacteristic

*characteristic_oad_2;

//藍芽裝置所以有特徵值

nsdictionary

*dic = [[

bluetoothmanager

sharebluetoothmanager

]connectdic

];characteristic_oad_1

= [dic

objectforkey

:bt_oad_image_notify];

characteristic_oad_2

= [dic

objectforkey

:bt_oad_image_block_request];[

peripheral

setnotifyvalue

:yes

forcharacteristic

:characteristic_oad_1];[

peripheral

setnotifyvalue

:yes

forcharacteristic

:characteristic_oad_2

];3.傳送查詢藍芽裝置資訊

byte

byte0 = ;

nsdata

*data0 = [

nsdata

datawithbytes

:byte0

length

:sizeof

(byte0)];

[peripheral

writevalue

:data0

forcharacteristic

:characteristic_oad_1

type

:cbcharacteristicwritewithresponse

];sleep(1

);byte

byte1 = ;

nsdata

*data1 = [

nsdata

datawithbytes

:byte1

length

:sizeof

(byte1)];

[peripheral

writevalue

:data1

forcharacteristic

:characteristic_oad_1

type

:cbcharacteristicwritewithresponse];

可寫(0或1)、監聽(返回8bytes資料)。

當寫入0時若有8bytes資料返回,則說明當前硬體韌體為映象a,若寫入0無返回資料,而寫入1有8bytes資料返回,則說明當前硬體韌體為映象b。

byte 0 和 byte 1 表示 映象的編譯版本號    高低位要對調   應該為:  0402 =>  4*16*16 + 2  = 1026   

根據嵌入式對應的 應該再除以2  為編譯版本號為513   (具體未去**,知道的朋友告訴我下,暫時沒明白。)

byte 2 和 byte 3 表示 映象的大小        高低位要對調計算  應該為 :   7c00 => 7*16*16*16 + 12*16*16 = 31744 b 

根據幾個實際的bin檔案 應該是 124kb  。    猜想應該是  31744 * 4 = 126976 b = 124 kb 。(知道的朋友告訴我下,暫時沒明白。)

byte 4 - byte 7   表示  當前是b映象    預設情況下,映象a中這4bytes均為a的ascii碼(即4個0x41),而映象b中均為b的ascii碼(即4個0x42)。

4.傳送公升級資訊

根據3可以得知 裝置是映象a還是b 。

選擇對應bin檔案 傳送公升級資訊

nsstring

*filepatha = [[

nsbundle

mainbundle

]pathforresource

:@"image_a(8)"

oftype

:@"bin"

];oaddata

= [nsdata

datawithcontentsoffile

:filepatha];

byte

*dvalue = (

byte

*)[oaddata

bytes

];nsdata

*data = [

oaddata

subdatawithrange

:nsmakerange(4

,8)];nsdata

*senddata = [

nsdata

datawithbytes

:byte

length

:sizeof

(byte)];

[peripheral

writevalue

:senddata

forcharacteristic

:characteristic_oad_1

type

:cbcharacteristicwritewithresponse

];這裡的擷取oaddata  4 —— 12    8個位元組的資訊 實際上是要公升級包的包資訊  傳送給裝置

比如要傳送   a映象 -> 傳送  <0100007c 41414141> 

在cbperipheraldelegate

- (void

)peripheral:(

cbperipheral

*)peripheral didupdatevalueforcharacteristic:(

cbcharacteristic

*)characteristic error:(

nullable

nserror

*)error }

5.分包傳送公升級檔案

- (void

)startsenddata}

- (void

)senddata:(

nstimer

*)telse

else}}

nsdata

*senddata = [

nsdata

datawithbytes

:byte

length

:sizeof

(byte)];

nslog

(@"\n%ld - \n%@",x

,senddata);

[peripheral

writevalue

:senddata

forcharacteristic

:characteristic_oad_2

type

:cbcharacteristicwritewithoutresponse];x

++;float

sendvalue = (

float)x

*16/(float

)oaddata

.length;

nslog

(@"公升級了 %.2f",x

,sendvalue);

// 此時裝置藍芽會斷開 if

(x*16

>=

oaddata

.length) }

關於IOS的藍芽

關於ios的藍芽 首先,你要了解你的目的是什麼,一般的ios藍芽開發有以下三種目的 1.ios裝置和ios裝置之間互動 好訊息是 ios6.0可以把iphone手機當從裝置了,可以兩台iphone通過藍芽通訊傳資料了,有點類似spp協議 壞訊息是 我們需要的不是這種模式 這種模式通常用於兩個使用io...

iOS藍芽學習

在ios中提供4個框架用於藍芽的連線 gamekit.framework 只能用於ios裝置之間連線,且是同乙個應用。ios7之前一般使用這個 multipeerconnectivity.framework 只能用於ios裝置之間連線,且是同乙個應用。ios7之後使用這個來代替gamekit.fra...

ios 藍芽簡介

這裡主要做個記錄。ios中其實提供了四個框架可以讓我們去實現藍芽連線 其中gamekit框架是在ios7的時候過期了,之前常用於遊戲的連線,gamekit框架可以使用藍芽在玩家之間建立乙個對等連線,然後彼此之間可以對戰,蘋果取而代之的是multipeerconnectivity,這兩個框架都只能用於...