.net手機(jī)軟件開發(fā)(5)——OBEX介紹
2024-07-10 12:58:41
供稿:網(wǎng)友
 
本文來源于網(wǎng)頁設(shè)計愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。(一) obex介紹
一、什么是obex,它有什么用途?
obex全稱為object exchange,中文對象交換,所以稱之為對象交換協(xié)議。它在此軟件當(dāng)中有著核心地位,文件傳輸和irmc同步都會使用到它。
obex協(xié)議構(gòu)建在irda架構(gòu)的上層. 
obex協(xié)議通過簡單的使用“put”和“get”命令實(shí)現(xiàn)在不同的設(shè)備、不同的平臺之間方便、高效的交換信息。支持的設(shè)備廣泛,例如pc,pda,電話,攝像頭,自動答錄機(jī),計算器,數(shù)據(jù)采集器,手表等等。
obex協(xié)議定義了一種柔性的概念——objects。也即是對象。這些對象可以包括文件,診斷信息,電子商務(wù)卡片,銀行的存款等等。objects在這里沒有高級的技術(shù)含義,而是視你的應(yīng)用而定。
obex協(xié)議小到可作“命令和控制”功能,例如對電視機(jī),錄像機(jī)等的操作。大道可以做很復(fù)雜的操作,例如數(shù)據(jù)庫的事務(wù)處理和同步。
obex能夠具有以下幾個特點(diǎn):
1、 友好的應(yīng)用——可實(shí)現(xiàn)快速開發(fā)。
2、 緊縮——可用在資源有限的小型設(shè)備上。
3、 跨平臺
4、 柔性的數(shù)據(jù)支持。
5、 方便的作為其他internet傳輸協(xié)議的上層協(xié)議。
6、 可擴(kuò)展性——提供了對未來需求的擴(kuò)充支持而不影響以存在的實(shí)現(xiàn)。例如可擴(kuò)展安全,數(shù)據(jù)壓縮等。
7、 可測試可調(diào)試。
更為具體的關(guān)于obex的介紹請查閱irobex協(xié)議。
二、obex對象模型
關(guān)于headers
對象模型回答了對象是如何在obex協(xié)議描述的。這個模型必須包括被傳輸?shù)膶ο蠛蛯ο蟮拿枋觥榱俗龅竭@點(diǎn),obex定義了headers的概念。
一個header反映了對象的一個方面,例如名字、長度、描述文字或者對象本身。例如,一個文件對象demo.txt會包含它的名字,一個類型標(biāo)示為“text”,長度和文件本身。
headers的構(gòu)成
headers簡單的由<header id>和<header value>組成,簡稱為<hi>和<hv>。
hi由一個字節(jié)組成,指出了header包含的內(nèi)容以及它的格式。hv包含了一個或者多個字節(jié),其結(jié)構(gòu)由hi所決定。
所有的header都是可選的,取決于設(shè)備的類型和事務(wù)的種類。你可以使用所有的header,或者一些,或者沒有。id可以使header可解析以及與傳輸順序無關(guān),也可以使不支持的header被忽略掉。
hi又可以分為兩部分,高2位和低6位。高2位確定了hi的編碼方式(見表二),低6位確定了hi的意義(見表三)。兩個表都是我從irobex中的表摘抄并部分翻譯過來的。
表二
hi的第8和第7位
 意義
 
00(0x00)
 以null(0x00)結(jié)尾的的unicode文字。2個字節(jié)的無符號整數(shù)長度前綴。
 
01(0x40)
 byte塊,2個字節(jié)的無符號整數(shù)前綴。
 
10(0x80)
 1byte容量。
 
11(0xc0)
 4byte容量,以高位先傳輸為原則。
 
表三
hi
 header名稱
 描述
 
0xc0
 count
 連接中用于指名對象的數(shù)量。
 
0x01
 name
 對象的名字。一般為文件名。
 
0x42
 type
 對象的類型。例如text,html,binary,manufacture specific
 
0x44
0xc4
 time
 時間戳。iso 8601版本
時間戳。4byte版本(用于兼容)
 
0x05
 description
 對對象的文本描述
 
0x46
 target
 操作的目的服務(wù)名
 
0x47
 http
 一個http1.x頭
 
0x48
 body
 對象的一部分
 
0x49
 end of body
 對象的最后一部分
 
0x4a
 who
 obex application標(biāo)識,用于表明是否是同一個應(yīng)用。
 
0xcb
 connection id
 用于obex多路連接的標(biāo)識
 
0x4c
 app.parameters
 擴(kuò)展的應(yīng)用層請求和回復(fù)信息
 
0x4d
 auth.challenge
 authentication digest-challenge
 
0x4e
 auth.response
 authentication digest-response
 
0x4f
 object class
 對象的obex對象類
 
0x10 to 0x2f
 reserved
 保留
 
0x30 to 0x3f
 user defined
 用戶自定義的。
 
 
關(guān)于常用header的更詳盡的解釋,更詳盡信息請參考irobex
1、name
 name是一個用來描述對象名稱的header,由以null(0x00)結(jié)尾的unicode字符串組成。例如:demo.txt
2、length
 length描述了對象的大小,由4個字節(jié)組成。如果length事先知道,這個header應(yīng)該被用到。這樣可以讓接受者迅速的知道需要分配多少空間,可使處理更為迅速。但這也不是必須的,有些情況下長度無法確認(rèn),但設(shè)備可以通過end-body header知道什么時候結(jié)束。
3、time
time描述了對象的最后修改的時間。使用iso8601格式。
本地時間格式:yyyymmddthhmmss
utc時間格式:yyyymmddthhmmssz
格式中的t可以方便的區(qū)分日期和時間。utc時間使用z作為標(biāo)記。建議使用utc時間。
4、body、end-of-body
 body header由hi、一個2byte長度的描述和整個的對象本身。end-of-body組成和body組成一樣,但標(biāo)識了這是對象的最后一部分。如果對象本來就很小,就直接使用end-of-body。
 
三、請求(request)和回應(yīng)(response)
obex使用request和response作為最基本的操作。請求的每個request必然有一個response,否則可認(rèn)為request失敗。
request由一個或多個的packet(包)組成,每個包的結(jié)構(gòu)如下表
request數(shù)據(jù)包結(jié)構(gòu)
byte 0
 byte 1,2
 byte 3 to n
 
操作碼(opcode)
 packet length(包長度)
 headers或請求信息
 
 
由于每個request可能有多個packet,opcode的最高位稱為final bit。如果被設(shè)置為1,那么說明這是request的最后一個packet。例如:當(dāng)用put操作發(fā)送一個大文件時,會有幾個packet作為一個request。那么只有最后一個packet的finalbit設(shè)置為1。
 
response也由一個或多個packet組成,每個包的結(jié)構(gòu)如下表
response數(shù)據(jù)包結(jié)構(gòu)
byte 0
 byte 1,2
 byte 3 to n
 
response code(返回值)
 response length(回應(yīng)長度)
 responsedata回應(yīng)的數(shù)據(jù)
 
 
同樣的responsecode的最高位也叫做finalbit。responsedata可能包含對象和header,或者其它信息。
下表列出了了常見的opcode和responsecode,更詳盡的請參考irobex 1.2文檔。
opcode
opcode(w/high bit set)
 定義
 意義
 
0x80 *
 connect
 連接
 
0x81 *
 disconnect
 斷開連接
 
0x02(0x82)
 put
 發(fā)送一個對象
 
0x03(0x83)
 get
 取得一個對象
 
0x04(0x84)
 reserved
 保留的
 
0x85 *
 setpath
 設(shè)置路徑
 
0xff *
 abort
 取消當(dāng)前的操作
 
0x06到0x0f
 reserved
 作為擴(kuò)展保留
 
0x10到0x1f
 user definable
 用戶自定義的
 
*總是設(shè)置finalbit
 
responsecode
responsecode
 定義
 
0x10(0x90)
 continue(繼續(xù))
 
0x20(0xa0)
 ok,success
 
0x40(0xc0)
 bad request(服務(wù)端不明白request)
 
0x41(0xc1)
 unauthorized(未授權(quán)的)
 
0x43(0xc3)
 fobidden(禁止——服務(wù)器明白request,但拒絕)
 
0x44(0xc4)
 not found(未找到)
 
 
四、說明。
1、 connect(連接)
此操作初始化會話然后設(shè)置參數(shù)。其request格式為
byte 0
 byte 1,2
 byte 3
 byte 4 
 byte 5,6
 byte 7 to n
 
0x80
 包長度
 obex版本
 標(biāo)志
 最大obex包長度
 可選header
 
注:obex版本現(xiàn)在為1.0。
response格式為:
byte 0
 byte 1,2
 byte 3
 byte 4
 byte 5,6
 byte 7 to n
 
responsecode
 包長度
 obex版本
 標(biāo)志
 最大obex包長度
 可選header
 
對于更多關(guān)于connect的說明請參考irobex
2、 disconnect(斷開當(dāng)前會話)
此操作斷開obex會話。例如斷開當(dāng)前folderlisting service,然后使用connect連接到irmc sync service實(shí)現(xiàn)同步通訊薄等功能。
disconnect格式為:
byte 0
 bytes 1,2
 bytes 3 to n
 
0x81
 包長度
 可選header
 
成功的斷開會返回0xa0,拒絕會返回0xd3
3、 put操作
put操作從客戶端發(fā)送一個對象到服務(wù)端。一般至少含有name和length兩個header。對于文件而言有可能還有date/time header。
put操作的格式如下:
byte 0
 bytes 1,2
 bytes 3 to n
 
0x02(當(dāng)finalbit設(shè)置時為0x82)
 packetlength包長度
 一組header
 
回應(yīng)格式如下:
byte 0
 bytes 1,2
 bytes 3 to n
 
responsecode(要求繼續(xù)為0x90;成功為0xa0)
 包長度
 可選header
 
關(guān)于put操作的更詳細(xì)的用法將在文件傳輸部分作解釋。
4、 get操作
get操作從服務(wù)端返回一個對象。
get操作的格式如下:
byte 0
 bytes 1,2
 bytes 3 to n
 
0x03
 包長度
 一組header
 
回應(yīng)格式如下:
byte 0
 bytes 1,2
 bytes 3 to n
 
response code
 包長度
 可選header
 
關(guān)于get操作更詳細(xì)的用法將在文件傳輸部分作解釋。
5、 abort操作
abort操作中斷一個多包操作(例如發(fā)送一個大文件)。abort操作可以包含描述中斷原因的description header。
abort操作的格式如下:
byte 0
 bytes 1,2
 bytes 3 to n
 
0xff
 包長度
 可選header
 
abort對應(yīng)的應(yīng)該是一個成功的操作(0xa0),指明這個操作已被接收并且服務(wù)端已經(jīng)重新與客戶端同步。如果返回的另外的值,客戶端應(yīng)該disconnect。
6、 setpath
setpath操作用于切換對方的路徑。通常使用一個name header用于指定對方路徑名稱。如果為空,則返回默認(rèn)目錄,通常為根目錄
setpath操作格式如下:
byte 0
 bytes 1,2
 byte 3
 byte 4
 bytes 5 to n
 
0x85
 包長度
 flags
 constants(常數(shù))
 可選header
 
注:flags可以設(shè)置bit0和bit1。bit0表示退回到上一層目錄;bit1表示如果目錄不存在就創(chuàng)建一個目錄,否則返回一個錯誤。
回應(yīng)格式如下:
byte 0
 bytes 1,2
 bytes 3 to n
 
responsecode
 包長度
 可選response header
 
 
五、實(shí)際例子
 注:數(shù)據(jù)使用serialmonitor獲得。客戶端為pc,服務(wù)端為西門子m55手機(jī)。
1、 connect、disconnect
çconnect request:
 80 00 1a 10 00 40 06 46 00 13 6b 01 cb 31 41 06 [email protected]ë1a.
 11 d4 9a 77 00 50 da 3f 47 1f .ô?w.pú?g.
èconnect response:
 a0 00 1f 10 00 01 da cb 00 00 01 00 4a 00 13 6b .....úë....j..k
 01 cb 31 41 06 11 d4 9a 77 00 50 da 3f 47 1f .ë1a..ô?w.pú?g. 
çdisconnect request:
 81 00 03 ?.. 
èdisconnect response:
 a0 00 03 ..
該實(shí)例首先連接到手機(jī),然后使用disconnect脫離連接。
çconnect request:
80:connect
00 1a:包長度26字節(jié)
10:obex版本1.0
00:總是0
40 06:最大包長度16390字節(jié)。
46:hi,target(目標(biāo))。0x40開頭,表示后面跟2個字節(jié)的長度描述。
00 13:header長度19
6b….:對應(yīng)的target
èconnect response:
a0:ok,success
00 1f:包長度31字節(jié)
10:obex版本1.0
00:總是0
01 da:最大包長度474字節(jié)
cb:connection id=0x100。0xc0開頭,表示后面跟4個字節(jié)的值。
4a 00 13:who header。長度0x13。
6b…:who header值。
2、 put,get,setpath
例一:如何下載手機(jī)/sound目錄里面的21680.mid文件。大小為313字節(jié)。
整個過程分為:
連接æ切換到根目錄æ切換到sound目錄æget(21680.mid)
具體過程:
……(連接部分省略)
ç切換到根目錄,name header(0x01)內(nèi)容為空
85 00 08 02 00 01 00 03 ?....... 
è響應(yīng)
a0 00 03 .. 
ç切換到/sound目錄。name header(0x01)長度0x11。
85 00 16 02 00 01 00 11 00 53 00 6f 00 75 00 6e ?........s.o.u.n
00 64 00 73 00 00 .d.s.. 
è響應(yīng)
a0 00 03 ..
çget請求。name header(0x01)指定文件名
83 00 1a 01 00 17 00 32 00 31 00 36 00 38 00 30 ?......2.1.6.8.0
00 2e 00 6d 00 69 00 64 00 00 ...m.i.d.. 
è回應(yīng)
0x90說明需要繼續(xù)。
0xc3指明文件長度00 00 01 39。
0x48說明是文件的一部分。
90 01 44 c3 00 00 01 39 48 01 3c 4d ….
çget請求。由于服務(wù)端返回0x90,所以繼續(xù)發(fā)送get
83 00 03 ?.. 
è回應(yīng)。成功。服務(wù)端發(fā)送0x49說明是對象最后一部分。
a0 00 06 49 00 03 ..i..
 
例二:說明如何獲取大文件,主要介紹get部分。
取得/pictures/102725.jpg,大小5314字節(jié)。
整個過程分為:
連接æ切換到根目錄æ切換到pictures目錄æget(102725.jpg)æget…. 
çget請求。name header值為102725.jpg
83 00 1c 01 00 19 00 31 00 30 00 32 00 37 00 32 ?......1.0.2.7.2
 00 35 00 2e 00 6a 00 70 00 67 00 00 .5...j.p.g.. 
è返回一個body。客戶端應(yīng)該繼續(xù)發(fā)送get
90 01 d3 c3 00 00 14 c2 48 01 cb ff d8 ff e0 00 ?.óã...âh.ëÿøÿà.
10 4a 46 49 46 00 01 01 01 02 58 02 58 00 00 ff .jfif.....x.x..ÿ
…..
çget請求。
83 00 03 ?..
è返回第二個body。客戶端繼續(xù)發(fā)送get
90 01 d7 48 01 d4 6a 60 99 1c a2 74 4c 92 67 bc ?.×h.ôj`?.¢tl?g¼
a9 aa 84 cd 6b 20 83 83 f4 bb df 8b bc 58 a4 dc ©ª?ík ??ô»ß?¼x¤ü
……
……(省略若干重復(fù)過程)
çget請求。由于服務(wù)端返回0x90,所以繼續(xù)發(fā)送get
83 00 03 ?.. 
è回應(yīng)。成功。服務(wù)端發(fā)送0x49說明是對象最后一部分。
a0 00 06 49 00 03 ..i..
 
例三:發(fā)送文件到/sound/1.mid。大小313字節(jié)
整個過程分為:
連接æ切換到根目錄æ切換到sound目錄æputæ…
具體過程:
……(省略連接切換部分)
çput操作
0x82:put操作,finalbit設(shè)置
0x01:nameheader。文件名1.mid
0xc3:length。文件大小
0x44:日期和時間。這里為2005年2月14日,19:49:38。使用本地時間。
0x49:end-of-body。文件的最后部分。
82 01 65 01 00 0f 00 31 00 2e 00 6d 00 69 00 64 ?.e....1...m.i.d
00 00 c3 00 00 01 39 44 00 12 32 30 30 35 30 32 ..ã...9d..200502
31 34 54 31 39 34 39 33 38 49 01 3c 4d 54 68 64 14t194938i.<mthd
è回應(yīng)
 a0 00 03 .. 
 
例四:發(fā)送文件到/pictures/102725.jpg,大小5314字節(jié)。
過程分為:
連接æ切換到根目錄æ切換到/pictures目錄æputæ…
具體過程:
……(省略連接切換部分)
çput操作
0x02:put操作,fianlbit沒有設(shè)置。說明還有剩余部分需要發(fā)送。
0x01:nameheader。文件名102725.jpg
0xc3:length。文件大小
0x44:日期和時間。這里為2005年2月14日,19:57:52。使用本地時間。
0x48:body。文件的一部分。
02 01 d0 01 00 19 00 31 00 30 00 32 00 37 00 32 ..ð....1.0.2.7.2
00 35 00 2e 00 6a 00 70 00 67 00 00 c3 00 00 14 .5...j.p.g..ã...
c2 44 00 12 32 30 30 35 30 32 31 34 54 31 39 35 âd..20050214t195
37 35 32 48 01 9d ff d8 ff e0 00 10 4a 46 49 46 752h.?ÿøÿà..jfif
……
è回應(yīng)。客戶端繼續(xù)發(fā)送
90 00 03
çput操作
0x02:put操作,fianlbit沒有設(shè)置。說明還有剩余部分需要發(fā)送。
0x48:body。文件的一部分。
注意:不在需要設(shè)置多余的header。
02 01 d4 48 01 d1 f3 c0 f1 2d 5a e9 98 b1 1b 71 ..ôh.ñóàñ-zé?±.q
47 96 5b 45 30 bd 3c 7e 2b d7 ae 82 6b df 2c 42 g?[e0½<~+×®?kß,b
b5 ba 21 d3 6b 16 b5 b8 db 4f d4 23 db 11 c6 4c µº!ók.µ¸ûoô#û.æl
……
……(省略若干重復(fù)過程)
çput操作
0x82:put操作,finalbit設(shè)置。說明這是最后一部分
0x49:end-of-body。文件的最后部分。
82 01 22 49 01 1f f6 75 bf 01 3c 02 49 48 e4 48 ?."i..öu¿.<.ihäh
6f 3e ff 00 2d 51 25 cf 32 d8 39 5f 25 d8 88 44 o>ÿ.-q%ï2ø9_%ø?d
…..
è回應(yīng)。成功
a0 00 03