国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.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

    &ccedil;connect request:

    80 00 1a 10 00 40 06 46 00 13 6b 01 cb 31 41 06 [email protected]&euml;1a.

    11 d4 9a 77 00 50 da 3f 47 1f .&ocirc;?w.p&uacute;?g.

    &egrave;connect response:

    a0 00 1f 10 00 01 da cb 00 00 01 00 4a 00 13 6b .....&uacute;&euml;....j..k

    01 cb 31 41 06 11 d4 9a 77 00 50 da 3f 47 1f .&euml;1a..&ocirc;?w.p&uacute;?g.

    &ccedil;disconnect request:

    81 00 03 ?..

    &egrave;disconnect response:

    a0 00 03 ..

    該實(shí)例首先連接到手機(jī),然后使用disconnect脫離連接。

    &ccedil;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

    &egrave;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é)。

    整個過程分為:

    連接&aelig;切換到根目錄&aelig;切換到sound目錄&aelig;get(21680.mid)

    具體過程:

    ……(連接部分省略)

    &ccedil;切換到根目錄,name header(0x01)內(nèi)容為空

    85 00 08 02 00 01 00 03 ?.......

    &egrave;響應(yīng)

    a0 00 03 ..

    &ccedil;切換到/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..

    &egrave;響應(yīng)

    a0 00 03 ..

    &ccedil;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..

    &egrave;回應(yīng)
    0x90說明需要繼續(xù)。
    0xc3指明文件長度00 00 01 39。
    0x48說明是文件的一部分。

    90 01 44 c3 00 00 01 39 48 01 3c 4d ….

    &ccedil;get請求。由于服務(wù)端返回0x90,所以繼續(xù)發(fā)送get

    83 00 03 ?..

    &egrave;回應(yīng)。成功。服務(wù)端發(fā)送0x49說明是對象最后一部分。

    a0 00 06 49 00 03 ..i..



    例二:說明如何獲取大文件,主要介紹get部分。

    取得/pictures/102725.jpg,大小5314字節(jié)。

    整個過程分為:

    連接&aelig;切換到根目錄&aelig;切換到pictures目錄&aelig;get(102725.jpg)&aelig;get….

    &ccedil;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..

    &egrave;返回一個body。客戶端應(yīng)該繼續(xù)發(fā)送get

    90 01 d3 c3 00 00 14 c2 48 01 cb ff d8 ff e0 00 ?.&oacute;&atilde;...&acirc;h.&euml;&yuml;&oslash;&yuml;à.

    10 4a 46 49 46 00 01 01 01 02 58 02 58 00 00 ff .jfif.....x.x..&yuml;

    …..

    &ccedil;get請求。

    83 00 03 ?..

    &egrave;返回第二個body。客戶端繼續(xù)發(fā)送get

    90 01 d7 48 01 d4 6a 60 99 1c a2 74 4c 92 67 bc ?.×h.&ocirc;j`?.&cent;tl?g&frac14;

    a9 aa 84 cd 6b 20 83 83 f4 bb df 8b bc 58 a4 dc &copy;&ordf;?&iacute;k ??&ocirc;&raquo;&szlig;?&frac14;x¤&uuml;

    ……
    ……(省略若干重復(fù)過程)

    &ccedil;get請求。由于服務(wù)端返回0x90,所以繼續(xù)發(fā)送get

    83 00 03 ?..

    &egrave;回應(yīng)。成功。服務(wù)端發(fā)送0x49說明是對象最后一部分。

    a0 00 06 49 00 03 ..i..



    例三:發(fā)送文件到/sound/1.mid。大小313字節(jié)

    整個過程分為:

    連接&aelig;切換到根目錄&aelig;切換到sound目錄&aelig;put&aelig;…

    具體過程:

    ……(省略連接切換部分)

    &ccedil;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 ..&atilde;...9d..200502

    31 34 54 31 39 34 39 33 38 49 01 3c 4d 54 68 64 14t194938i.<mthd

    &egrave;回應(yīng)

    a0 00 03 ..



    例四:發(fā)送文件到/pictures/102725.jpg,大小5314字節(jié)。

    過程分為:

    連接&aelig;切換到根目錄&aelig;切換到/pictures目錄&aelig;put&aelig;…

    具體過程:

    ……(省略連接切換部分)

    &ccedil;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 ..&eth;....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..&atilde;...

    c2 44 00 12 32 30 30 35 30 32 31 34 54 31 39 35 &acirc;d..20050214t195

    37 35 32 48 01 9d ff d8 ff e0 00 10 4a 46 49 46 752h.?&yuml;&oslash;&yuml;à..jfif

    ……

    &egrave;回應(yīng)。客戶端繼續(xù)發(fā)送

    90 00 03

    &ccedil;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 ..&ocirc;h.&ntilde;ó&agrave;&ntilde;-zé?±.q

    47 96 5b 45 30 bd 3c 7e 2b d7 ae 82 6b df 2c 42 g?[e0&frac12;<~+×&reg;?k&szlig;,b

    b5 ba 21 d3 6b 16 b5 b8 db 4f d4 23 db 11 c6 4c &micro;&ordm;!&oacute;k.&micro;&cedil;&ucirc;o&ocirc;#&ucirc;.&aelig;l

    ……

    ……(省略若干重復(fù)過程)

    &ccedil;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..&ouml;u&iquest;.<.ih&auml;h

    6f 3e ff 00 2d 51 25 cf 32 d8 39 5f 25 d8 88 44 o>&yuml;.-q%&iuml;2&oslash;9_%&oslash;?d

    …..

    &egrave;回應(yīng)。成功

    a0 00 03


    發(fā)表評論 共有條評論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    主站蜘蛛池模板: 婺源县| 滕州市| 淮南市| 天柱县| 太康县| 句容市| 济南市| 盐源县| 乐业县| 五莲县| 婺源县| 贺兰县| 三门县| 太保市| 麦盖提县| 泽普县| 涿州市| 梅河口市| 辰溪县| 磴口县| 南康市| 郑州市| 宜兴市| 广平县| 芮城县| 定西市| 广宁县| 巢湖市| 洞头县| 新竹县| 雷波县| 玛纳斯县| 靖宇县| 共和县| 集安市| 韩城市| 海安县| 阿坝县| 太康县| 乡宁县| 芦山县|