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,這兩個框架都只能用於...