精华内容
下载资源
问答
  • obex-源码

    2021-03-22 04:08:09
    obex
  • 介绍下OBEX协议的特点及应用,从对象模型和会话协议两个方面详细分析OBEX协议,然后针对OBEX在蓝牙开发中的典型应用,介绍下其在OPP和PBAP上的适配和绑定。
  • Obexpushd 可用于通过蓝牙、IrDA(红外线)或网络连接使用 OBEX 协议接收文件。 该程序应该适用于许多移动设备,如 PDA 和移动电话。
  • 蓝牙OBEX协议在移动传输中的应用研究及实现,刘景松,,随着蓝牙技术的日趋成熟,蓝牙的使用越来越广泛,配备了蓝牙的手机也越来越多,OBEX作为蓝牙协议栈中面向应用的会话层协议,提供��
  • 【摘要】:OBEX作为一种基础协议,以对象模型封装信息数据,以会话协议规范传输应用,在以信息传输为底层实现的各项应用中得到了广泛的应用。在蓝牙技术的开发应用中,OBEX是很多应用剖面的底层协议,在其基础上封装实现...
  • OBEX(二)

    2021-09-29 14:34:42
    三、Session Protocol ...但是当启动OBEX Single Response Mode (SRM)时执行Put或者Get操作的时候也有例外的情况,在这种情况下,为了提高OBEX的吞吐量会忽略标准的request-response序列。 1、Req...

    三、Session Protocol

        OBEX操作由request-response对组成。Request由client发出的,response由server发出的。Client发送一个request后,需要在收到来自server的response之后才能发送新的request。但是当启动OBEX Single Response Mode (SRM)时执行Put或者Get操作的时候也有例外的情况,在这种情况下,为了提高OBEX的吞吐量会忽略标准的request-response序列。

    1、Request和Response的格式

    (1)Request的格式:

    Requests由一个或者多个packet组成,每个packet由1 byte的opcode、2 byte的packet length及其他数据组成(根据操作确定)组成

        Opcode的最高位是Final位,当Final设置为1时表示这是request的最后一个包,例如:一个Put 操作发送一个很大的object时,需要发送多个Put包才能完成,但是只有最后一个Put包的Put opcode的Final设置为1

        在server收到一个Final设置为1的request后,回复操作需要使用多个response包才能完成(例如:一个Get操作返回的object太大,一个response包无法容纳时),这时server将使用“Continue”response code告诉client继续发送request,client将使用同样的opcode发送request,但是opcode的Final bit需要设置为1且没有任何header。如果client不想继续操作,可以发送ABORT包

        Packet length和header length一样,都是大端序,Packet length表示整个包的长度(包括opcode和packet length的3个byte)。最大值是64K-1。

        Request code:

    (2)Response的格式: 

     

    Response由一个或者多个packet组成,每个packet由1 byte的opcode、2 byte的packet length及其他数据组成(根据操作确定)组成。

        Opcode的最高位也是Final位,在0BEX 1.0中,总是设置为1。含义与request的Final稍有不同,这里的Final bit用来告诉对方(client)轮到client发送packet了。如果response packet的response code是success或者failure,则client可以开始一个新的操作。如果response code是“Continue”,则client接下来将发出Get request的延续

        Packet length和header length一样,都是大端序,Packet length表示整个包的长度(包括opcode和packet length的3个byte)。最大值是64K-1。实际的最大值需要根据OBEX CONNECT操作的协商确定

        Response code定义如下:

     

     

    2、Connect操作

        Connect request和Connect response只能是一个单一的OBEX packet

    Connect request(Client发送)格式如下:

    Connect response(Server发送)格式如下:

     

    (1)OBEX version number

    高4 bit是主版本号,低4 bit是次版本号。当前版本号都是1.0,即0x10

    (2)Flags,含义如下:

    Connect request中flag是0x00,Connect response中bit 0表示server是否支持多个IrLMP连接导同一个LSAP-SEL。

    (3)Maximum OBEX Packet Length

        2 byte的无符号整型,用来表示设备可以接收的最大OBEX packet size。最大不能超过64K-1 byte,client和server可能有不同的值。OBEX packet size默认值是255 byte,在CONNECT packet中可以增大。注意:Maximum OBEX Packet Length>=255

    (4)Response code

        0xa0表示success,其他值表示failure,失败时可能有一个Description header用来描述失败原因。

    举例:

        Connect request:

     

        (1)Opcode:0x80,connect request只有一个packet,所以设置final bit=1

            (2)connect packet length:0x001A,即长度是26

            (3)OBEX version number:0x10,即1.0

            (4)flags:0x00,request的flags必须设置为0x00

            (5)Maximum OBEX Packet Length:0x0430,即1072

            (6)header:target header(0x46),这是PBAP的header:

     

    Connect response: 

    (1)Opcode:0xA0,表示success

        (2)connect response packet length:0x001F,即长度是31

        (3)OBEX version number:0x10,即1.0

        (4)flags:0x00,response的flags的bit 1位不支持Multiple IrLMP connections

        (5)Maximum OBEX Packet Length:0x0430,即1072

        (6)haeder:

            Connection id(0xcb):0x00000001

    Who header(0x4a):跟connect request中的Target header一样。

    3、Disconnect操作

        Disconnect request和Disconnect response只能是一个单一的OBEX packet

    Disconnect request(Client发送)格式如下:

    Disconnect response(Server发送)格式如下:

     

    注意:client发送Disconnect request,server不能拒绝,必须回复Disconnect response

    举例:

        Disconnect request:

    Disconnect response:

     

    4、Put操作

        OBEX连接建立后,client可以使用Put操作将object推送到server。Put request由一个或者多个packet组成(取决于传输的object的大小和OBEX packet的大小),如果没有设置OBEX Single Response Mode (SRM)为enabled,则server没收到一个Put request packet会回复一个response;如果设置SRM为enabled,则整个Put操作只需要一个response packet(即收到最后一个Put request packet后发出),除非server选择拒绝Put操作。

        Put request(Client发送)格式如下:

    Put response(Server发送)格式如下: 

    举例: 

    Put response: 

    5、Get操作

    OBEX连接建立后,client可以使用Get操作从server获取object。如果设置OBEX Single Response Mode (SRM)是disable,则client每发送一个Get request packet会收到一个Get response packet;如果SRM是enable,则第一次发送Get request(可能包含多个Get request packet,但只有一个request packet的Final bit设置为1)即可。

    Get request(Client发送)格式如下:

    注意:如果server知道要传递什么,则Name header可以省略

        Get response(Server发送)格式如下:

    一个成功且一个response packet可以存放object的response code为0xa0(Success),如果回复的object太大需要多次Get request,则只有最后一个response的response code为0xa0即可,其他的response的response code为0x90(Continue),除了0xa0和0x90,其他的response code都表示failure。

        Get request:

    Get response(Continue):

     

    Get response(Success):

     

    6、Abort操作

        当Client在muti-packet操作(例如PUT)正常结束前决定终止操作时,可以发送ABORT request。ABORT request和ABORT response都应该在一个OBEX packet里面其final bit设置为1。注意:client发送ABORT request后,如果没有收到ABORT response,则应该断开连接。

    ABORT request(Client发送)格式如下:

    ABORT response(Server发送)格式如下: 

    举例:

        ABORT request

    上面的图中解析有问题。可以看到request的opocde为0xff,packet length为0x08,header是Connection Id header=0xcb 0x00 0x00 0x00 0x01

        ABORT response

    7、SetPath操作

        SETPATH操作用于在接收端设置“当前文件夹”,以便启用需要附加路径信息的数据传输。例如,当在两个设备之间发送一组嵌套的文件夹时,SETPATH用于在接收端创建文件夹结构。Path名称包含在name header中。每个SETPATH request和SETPATH response都应该在一个OBEX packet里面且Final bit设置为1。

    SETPATH request(Client发送)格式如下:

    SETPATH response(Server发送)格式如下: 

    注意:

    如果server不支持SETPATH,应该回复C0(Bad Request)或C3 (Forbidden)。

    当建立一个新的OBEX或TinyTP连接时,OBEX server的当前文件夹应该是根文件夹

    (1)flags,定义如下图所示

    (2)constants:设置为0x0

    注意:

    (1)使用Name header时,可以设置为:

            <name>:表示从当前目录下进入名字为name的文件夹

    <empty>:回到默认文件夹

        (2)当使用flags或者constants指示路径时(例如设置flags的bit 1为1时,表示当前目录回退一个目录,即../),name header可以忽略。

    举例:

        SETPATH request

    SETPATH response

     

    四、OBEX在L2CAP上如何使用

    1、蓝牙设备可以作为OBEX client或者server,也可以同时作为OBEX client和server,需要满足以下要求:

    (1)在同一个蓝牙设备上的所有OBEX client和server需要有单独的L2CAP channel。因此在OBEX上的多路复用是不支持的。

    (2)使用OBEX的应用协议需要在SDP database内注册service record,不同的应用协议的service record在各自协议中指定。

    2、在接受OBEX client的connection request之前,OBEX server应该满足以下条件:

    (1)OBEX server应该跟一个L2CAP PSM绑定,可以是固定的PSM,也可以是动态PSM

    (2)使用OBEX server的应用协议应该将OBEX server的能力和相关的L2CAP PSM注册到SDP database内

    (3)然后,OBEX server监听L2CAP连接及来自client的OBEX request

    3、在L2CAP上接收OBEX packet

        一个object可以通过一个或者多个OBEX Put request或者OBEX Get response进行交互。OBEX从L2CAP上接收packet,每个L2CAP SDU内包含一个OBEX packet。所有不能识别的packet或者无效长度的packet应该丢弃,如果SDU无效则可能需要断开L2CAP通道

    4、client建立OBEX connection需要执行以下步骤:

    (1)client使用SDP检索与OBEX server相关的信息(例如:L2CAP PSM)

    (2)client使用L2CAP PSM建立和server之间的L2CAP channel

    (3)client在L2CAP channel上向server发送OBEX Connect request

    (4)如果client接收到来自server的connect response且结果是“Success”,则OBEX连接建立,否则OBEX连接建立失败。

    5、断开OBEX连接

        Client发送OBEX Disconnect request给server请求断开连接,收到response后,client应该关闭相关的L2CAP channel

    五、OBEX v2.0以前的协议

    1、架构图

    OBEX是运行在RFCOMM上的。

    2、OBEX在RFCOMM上怎么使用

    (一)蓝牙设备可以作为OBEX client或者server,也可以同时作为OBEX client和server,需要满足以下要求:

    (1)在同一个蓝牙设备上的所有OBEX server需要有单独的RFCOMM server channel。

    (2)使用OBEX的应用协议需要在SDP database内注册service record,不同的应用协议的service record在各自协议中指定。

    (二)在接受OBEX client的connection request之前,OBEX server应该满足以下条件:

    (1)OBEX server应该打开一个RFCOMM server channel

    (2)使用OBEX server的应用协议应该将OBEX server的能力注册到SDP database内

    (3)然后,client搜索需要的server,server应该监听来自client的request

    (三)client建立OBEX connection需要执行以下步骤:

    (1)client使用SDP检索与OBEX server相关的信息

    (2)client使用discovered RFCOMM channel建立RFCOMM连接

    (3)client向server发送OBEX Connect request

    (4)如果client接收到来自server的connect response且结果是“Success”,则OBEX连接建立,否则OBEX连接建立失败。

    (四)断开OBEX连接

        Client发送OBEX Disconnect request给server请求断开连接,收到response后,client应该关闭相关的RFCOMM channel

     

     

     

     

     

     

     

     

     

     

    展开全文
  • OBEX_bluetooth

    2019-10-17 23:38:43
    btsock_interface_t* btif_sock_get_interface (void) { static btsock_interface_t interface = {sizeof(interface), btsock_listen, ...以下obex opp的传输数据域,对应的rfcomm数据是UIH

    btsock_interface_t* btif_sock_get_interface(void) {
    static btsock_interface_t interface = {sizeof(interface), btsock_listen,
    btsock_connect};

    return &interface;
    }

    com_android_bluetooth_btservice_adapter_service.cpp
    initNative
    sBluetoothSocketInterface =
    (btsock_interface_t*)sBluetoothInterface->get_profile_interface(
    BT_PROFILE_SOCKETS_ID);

    AdapterService.java->com_android_bluetooth_btservice_adapter_service.cpp

    setSocketOpt->setSocketOptNative->
    getSocketOpt->getSocketOptNative->
    以上两种接口好像在mtk平台中找不到了

    connectSocket->connectSocketNative->sBluetoothSocketInterface->connect

    createSocketChannel->createSocketChannelNative->sBluetoothSocketInterface->listen

    上面的接口在BluetoothSocket.java中使用
    connect接口
    在这里插入图片描述bindListen
    在这里插入图片描述

    电话本使用
    BluetoothPbapClient client = new BluetoothPbapClient(device, yourHandler);
    client.connect(); client.pullPhoneBook(BluetoothPbapClient.PB_PATH);
    client.disconnect();

    device为被获取电话本的设备的mac地址

        public BluetoothPbapClient(BluetoothDevice device, Handler handler) {
            if (device == null) {
                throw new NullPointerException("BluetothDevice is null");
            }
    
            mClientHandler = handler;
    
            mSessionHandler = new SessionHandler(this);
    
            mSession = new BluetoothPbapSession(device, mSessionHandler);
        }
    
    

    BluetoothPbapClient.connect();->BluetoothPbapObexSession.start->startRfcomm->RfcommConnectThread->

    private class RfcommConnectThread extends Thread {
            private static final String TAG = "RfcommConnectThread";
    
            private BluetoothSocket mSocket;
    
            public RfcommConnectThread() {
                super("RfcommConnectThread");
            }
    
            @Override
            public void run() {
                if (mAdapter.isDiscovering()) {
                    mAdapter.cancelDiscovery();
                }
    
                try {
                    mSocket = mDevice.createRfcommSocketToServiceRecord(UUID.fromString(PBAP_UUID));创建rfcomm连接
                    mSocket.connect();
    
                    BluetoothPbapObexTransport transport;
                    transport = new BluetoothPbapObexTransport(mSocket);
    
                    mSessionHandler.obtainMessage(RFCOMM_CONNECTED, transport).sendToTarget();
                } catch (IOException e) {
                    closeSocket();
                    mSessionHandler.obtainMessage(RFCOMM_FAILED).sendToTarget();
                }
    
            }
    
    

    opp传输
    btsnoop_mi6-get-hci.log
    btsnoop_hci_mi6_push-opp.log
    当小米6传文件给其他手机时,获取到目标手机返回的同意后(小米发connect,等目标手机确意接收文件后返回respond code:success时),开始传送数据,
    在这里插入图片描述
    小米6传输完文件后,主动断开连接:日志分析发现,不管是谁传给谁,谁发送连接,谁断开
    在这里插入图片描述
    以下obex opp的传输数据域,对应的rfcomm数据是UIH

    在这里插入图片描述

    展开全文
  • (一) OBEX介绍

    千次阅读 2020-08-12 22:01:48
    (一) OBEX介绍 一、什么是OBEX,它有什么用途? OBEX全称为Object Exchange,中文对象交换,所以称之为对象交换协议。它在此软件当中有着核心地位,文件传输和IrMC同步都会使用到它。 OBEX协议构建在IrDA架构的...

    (一)  OBEX介绍

    一、什么是OBEX,它有什么用途?

    OBEX全称为Object Exchange,中文对象交换,所以称之为对象交换协议。它在此软件当中有着核心地位,文件传输和IrMC同步都会使用到它。

    OBEX协议构建在IrDA架构的上层.

    OBEX协议通过简单的使用“PUT”和“GET”命令实现在不同的设备、不同的平台之间方便、高效的交换信息。支持的设备广泛,例如PC,PDA,电话,摄像头,自动答录机,计算器,数据采集器,手表等等。

    OBEX协议定义了一种柔性的概念——objects。也即是对象。这些对象可以包括文件,诊断信息,电子商务卡片,银行的存款等等。Objects在这里没有高级的技术含义,而是视你的应用而定。

    OBEX协议小到可作“命令和控制”功能,例如对电视机,录像机等的操作。大道可以做很复杂的操作,例如数据库的事务处理和同步。

    OBEX能够具有以下几个特点:

    1、  友好的应用——可实现快速开发。

    2、  紧缩——可用在资源有限的小型设备上。

    3、  跨平台

    4、  柔性的数据支持。

    5、  方便的作为其他Internet传输协议的上层协议。

    6、  可扩展性——提供了对未来需求的扩充支持而不影响以存在的实现。例如可扩展安全,数据压缩等。

    7、  可测试可调试。

    更为具体的关于OBEX的介绍请查阅IrOBEX协议。

    二、OBEX对象模型

    关于Headers

    对象模型回答了对象是如何在OBEX协议描述的。这个模型必须包括被传输的对象和对对象的描述。为了做到这点,OBEX定义了Headers的概念。

    一个Header反映了对象的一个方面,例如名字、长度、描述文字或者对象本身。例如,一个文件对象demo.txt会包含它的名字,一个类型标示为“text”,长度和文件本身。

    Headers的构成

    Headers简单的由<Header ID><Header Value>组成,简称为<HI><HV>

    HI由一个字节组成,指出了Header包含的内容以及它的格式。HV包含了一个或者多个字节,其结构由HI所决定。

    所有的Header都是可选的,取决于设备的类型和事务的种类。你可以使用所有的Header,或者一些,或者没有。ID可以使Header可解析以及与传输顺序无关,也可以使不支持的Header被忽略掉。

    HI又可以分为两部分,高2位和低6位。2位确定了HI的编码方式(见表二),6位确定了HI的意义(见表三)。两个表都是我从IrOBEX中的表摘抄并部分翻译过来的。

    表二

    HI的第8和第7

    意义

    00(0x00)

    以Null(0x00)结尾的的Unicode文字。2个字节的无符号整数长度前缀。

    01(0x40)

    Byte块,2个字节的无符号整数前缀。

    10(0x80)

    1Byte容量。

    11(0xC0)

    4Byte容量,以高位先传输为原则。

    表三

    HI

    Header名称

    描述

    0xC0

    Count

    连接中用于指名对象的数量。

    0x01

    Name

    对象的名字。一般为文件名。

    0x42

    Type

    对象的类型。例如text,html,binary,manufacture specific

    0x44

    0xC4

    Time

    时间戳。ISO 8601版本
    时间戳。4Byte版本(用于兼容)

    0x05

    Description

    对对象的文本描述

    0x46

    Target

    操作的目的服务名

    0x47

    HTTP

    一个HTTP1.x头

    0x48

    Body

    对象的一部分

    0x49

    End of body

    对象的最后一部分

    0x4A

    Who

    OBEX Application标识,用于表明是否是同一个应用。

    0xCB

    Connection ID

    用于OBEX多路连接的标识

    0x4C

    App.Parameters

    扩展的应用层请求和回复信息

    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

    用户自定义的。

     

    关于常用Header的更详尽的解释,更详尽信息请参考IrOBEX

    1、Name
                     Name是一个用来描述对象名称的Header,由以Null(0x00)结尾的Unicode字符串组成。例如:DEMO.TXT

    2、Length
                     Length
    描述了对象的大小,由4个字节组成如果Length事先知道,这个Header应该被用到。这样可以让接受者迅速的知道需要分配多少空间,可使处理更为迅速。但这也不是必须的,有些情况下长度无法确认,但设备可以通过End-Body Header知道什么时候结束。

    3、Time

    Time描述了对象的最后修改的时间。使用ISO8601格式。

    本地时间格式:YYYYMMDDTHHMMSS

    UTC时间格式:YYYYMMDDTHHMMSSZ

    格式中的T可以方便的区分日期和时间。UTC时间使用Z作为标记。建议使用UTC时间。
    4、Body、End-of-Body

            Body HeaderHI、一个2Byte长度的描述和整个的对象本身End-of-Body组成和Body组成一样,但标识了这是对象的最后一部分。如果对象本来就很小,就直接使用End-of-Body。

     

    三、请求(Request)和回应(Response

    OBEX使用Request和Response作为最基本的操作。请求的每个Request必然有一个Response,否则可认为Request失败。

    Request由一个或多个的Packet(包)组成,每个包的结构如下表

    Request数据包结构

    Byte 0

    Byte 1,2

    Byte 3 to n

    操作码(opcode)

    Packet Length(包长度)

    Headers或请求信息

     

    由于每个Request可能有多个Packetopcode的最高位称为Final bit。如果被设置为1,那么说明这是Request的最后一个Packet。例如:当用PUT操作发送一个大文件时,会有几个Packet作为一个Request。那么只有最后一个Packet的FinalBit设置为1。

     

    Response也由一个或多个Packet组成,每个包的结构如下表

    Response数据包结构

    Byte 0

    Byte 1,2

    Byte 3 to n

    Response Code(返回值)

    Response Length(回应长度)

    ResponseData回应的数据

     

    同样的ResponseCode的最高位也叫做FinalBitResponseData可能包含对象和Header或者其它信息。

    下表列出了了常见的opcode和responseCode,更详尽的请参考IrOBEX 1.2文档。

    opcode

    Opcode(w/high bit set)

    定义

    意义

    0x80 *

    Connect

    连接

    0x81 *

    Disconnect

    断开连接

    0x02(0x82)

    Put

    发送一个对象

    0x03(0x83)

    Get

    取得一个对象

    0x04(0x84)

    Reserved

    保留的

    0x85 *

    SetPath

    设置路径

    0xFF *

    Abort

    取消当前的操作

    0x06到0x0F

    Reserved

    作为扩展保留

    0x10到0x1F

    User definable

    用户自定义的

    *总是设置FinalBit

     

    ResponseCode

    ResponseCode

    定义

    0x10(0x90)

    Continue(继续)

      0x20(0xA0)

    OK,Success

    0x40(0xC0)

    Bad Request(服务端不明白Request)

    0x41(0xC1)

    Unauthorized(未授权的)

    0x43(0xC3)

    Fobidden(禁止——服务器明白Request,但拒绝)

    0x44(0xC4)

    Not Found(未找到)

     

    四、说明。

    1、 Connect(连接)

    此操作初始化会话然后设置参数。其Request格式为

    Byte 0

    Byte 1,2

    Byte 3

    Byte 4

    Byte 5,6

    Byte 7 to n

    0x80

    包长度

    OBEX版本

    标志

    最大OBEX包长度

    可选Header

    注:OBEX版本现在为1.0。

    Response格式为:

    Byte 0

    Byte 1,2

    Byte 3

    Byte 4

    Byte 5,6

    Byte 7 to n

    ResponseCode

    包长度

    OBEX版本

    标志

    最大OBEX包长度

    可选Header

    对于更多关于Connect的说明请参考IrOBEX

    2、 Disconnect(断开当前会话)

    此操作断开OBEX会话。例如断开当前FolderListing Service,然后使用Connect连接到IrMC Sync Service实现同步通讯薄等功能。

    Disconnect格式为:

    Byte 0

    Bytes 1,2

    Bytes 3 to n

    0x81

    包长度

    可选Header

    成功的断开会返回0Xa0,拒绝会返回0xD3

    3、 Put操作

     

    Put操作从客户端发送一个对象到服务端。一般至少含有NameLength两个Header对于文件而言有可能还有Date/Time Header

    Put操作的格式如下:

    Byte 0

    Bytes 1,2

    Bytes 3 to n

    0x02(当FinalBit设置时为0x82)

    PacketLength包长度

    一组Header

    回应格式如下:

    Byte 0

    Bytes 1,2

    Bytes 3 to n

    ResponseCode(要求继续为0x90;成功为0xA0)

    包长度

    可选Header

    关于Put操作的更详细的用法将在文件传输部分作解释。

    4、 Get操作

    Get操作从服务端返回一个对象。

    Get操作的格式如下:

    Byte 0

    Bytes 1,2

    Bytes 3 to n

    0x03

    包长度

    一组Header

    回应格式如下:

    Byte 0

    Bytes 1,2

    Bytes 3 to n

    Response Code

    包长度

    可选Header

    关于Get操作更详细的用法将在文件传输部分作解释。

    5、 Abort操作

    Abort操作中断一个多包操作(例如发送一个大文件)。Abort操作可以包含描述中断原因的Description Header。

    Abort操作的格式如下:

    Byte 0

    Bytes 1,2

    Bytes 3 to n

    0xFF

    包长度

    可选Header

    Abort对应的应该是一个成功的操作(0xA0),指明这个操作已被接收并且服务端已经重新与客户端同步。如果返回的另外的值,客户端应该Disconnect。

    6、 SetPath

    SetPath操作用于切换对方的路径。通常使用一个Name Header用于指定对方路径名称。如果为空,则返回默认目录,通常为根目录

    SetPath操作格式如下:

    Byte 0

    Bytes 1,2

    Byte 3

    Byte 4

    Bytes 5 to n

    0x85

    包长度

    Flags

    Constants(常数)

    可选Header

    注:Flags可以设置Bit0Bit1Bit0表示退回到上一层目录;Bit1表示如果目录不存在就创建一个目录,否则返回一个错误

    回应格式如下:

    Byte 0

    Bytes 1,2

    Bytes 3 to n

    ResponseCode

    包长度

    可选Response Header

     

    五、实际例子
                    
    注:数据使用SerialMonitor获得。客户端为PC,服务端为西门子M55手机。

    1、 Connect、Disconnect

    ÇConnect Request

     80 00 1A 10 00 40 06 46 00 13 6B 01 CB 31 41 06   ?....@.F..k.Ë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                                           ..

    该实例首先连接到手机,然后使用Disconnect脱离连接。

    ÇConnect Request

    80:Connect

    00 1A:包长度26字节

    10:OBEX版本1.0

    00:总是0

    40 06:最大包长度16390字节。

    46:HI,Target(目标)。0x40开头,表示后面跟2个字节的长度描述。

    00 13:Header长度19

    6B….:对应的Target

    ÈConnect Response

    A0:OK,Success

    00 1F:包长度31字节

    10:OBEX版本1.0

    00:总是0

    01 DA:最大包长度474字节

    CB:Connection ID=0x100。0xC0开头,表示后面跟4个字节的值。

    4A 00 13:Who Header。长度0x13。

    6B…:Who Header值。

    2、 Put,Get,SetPath

    例一:如何下载手机\Sound目录里面的21680.mid文件。大小为313字节。

    整个过程分为:

    连接Æ切换到根目录Æ切换到Sound目录ÆGet(21680.mid)

    具体过程:

    ……(连接部分省略)

    Ç切换到根目录,Name Header(0x01)内容为空

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

    È响应

    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..         

    È响应

    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..     

    È回应
    0x90说明需要继续。
    0xC3指明文件长度00 00 01 39
    0x48说明是文件的一部分。

    90 01 44 C3 00 00 01 39 48 01 3C 4D ….

    ÇGet请求。由于服务端返回0x90,所以继续发送Get

    83 00 03                                          ?..            

    È回应。成功。服务端发送0x49说明是对象最后一部分。

    A0 00 06 49 00 03                                  ..I..

     

    例二:说明如何获取大文件,主要介绍Get部分。

    取得\Pictures\102725.jpg,大小5314字节。

    整个过程分为:

    连接Æ切换到根目录Æ切换到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。客户端应该继续发送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。客户端继续发送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¤Ü

    ……
    ……(省略若干重复过程)

    ÇGet请求。由于服务端返回0x90,所以继续发送Get

    83 00 03                                          ?..            

    È回应。成功。服务端发送0x49说明是对象最后一部分。

    A0 00 06 49 00 03                                  ..I..

     

    例三:发送文件到\Sound\1.mid。大小313字节

    整个过程分为:

    连接Æ切换到根目录Æ切换到Sound目录ÆPutÆ…

    具体过程:

    ……(省略连接切换部分)

    ÇPut操作

    0x82Put操作,FinalBit设置

    0x01NameHeader。文件名1.mid

    0xC3Length。文件大小

    0x44:日期和时间。这里为2005214日,194938。使用本地时间。

    0x49End-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

    È回应

     A0 00 03                                           ..            

     

    例四:发送文件到\Pictures\102725.jpg,大小5314字节。

    过程分为:

    连接Æ切换到根目录Æ切换到\Pictures目录ÆPutÆ…

    具体过程:

    ……(省略连接切换部分)

    ÇPut操作

    0x02Put操作,FianlBit没有设置。说明还有剩余部分需要发送

    0x01NameHeader。文件名102725.jpg

    0xC3Length。文件大小

    0x44:日期和时间。这里为2005214日,195752。使用本地时间。

    0x48Body。文件的一部分。

    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

    ……

    È回应。客户端继续发送

    90 00 03

    ÇPut操作

    0x02Put操作,FianlBit没有设置。说明还有剩余部分需要发送。

    0x48Body。文件的一部分。

    注意:不在需要设置多余的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

    ……

    ……(省略若干重复过程)

    ÇPut操作

    0x82Put操作,FinalBit设置。说明这是最后一部分

    0x49End-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

    …..

    È回应。成功

    A0 00 03

     

      OBEX应用——文件传输部分

    在手机数据传输方面基本OBEX应用分为

    l         文件传输

    l         IrMC同步

    文件传输又可以细分为以下基本操作

    l         初始化连接

    l         断开连接

    l         设置路径

    l         取得目录信息

    l         创建目录

    l         上传下载文件

    l         删除文件或空目录

    在笔者的软件当中设计了OBEX这个类,里面包含了以上所有的基本操作。另外针对M55的服务端的特殊性又设计了更名、取得磁盘空间信息、移动、拷贝文件的功能。具体请参考源代码。

    下面具体讲述各个操作的细节。

    l         初始化连接

    初始化连接包括了使手机进入OBEX状态再到发送Connect指令的一系列过程。具体流程参考下图。

    ATÆAT^SQWE=0ÆAT^SQWE=3ÆConnectÆ连接到Folder-Listing Service

    其中AT^SQWE=0和AT^SQWE=3是西门子特有的隐藏的AT指令,甚至在官方的AT指令集里面都没有提到。其作用是初始化手机到OBEX模式。

    发送Connect指令收到手机回复以后确定Max Packet Length等参数。最后连接到Folder-Listing Service进行文件操作。如果需要IrMC同步的话,在Connect后直接连接到IrMC Sync Service即可,手机立刻进入同步模式,所有的应用程序退出。

    在笔者的程序中当中首先使用AT指令确定手机当前的工作,如果超时,尝试发送+++并等待1秒钟以便手机从不正常的OBEX状态中退出。然后在此发送AT,成功后即进行文件操作,否则引发一个错误。

    l         断开连接

    这里的断开连接是指从OBEX模式退出到AT状态中。在AT指令中,连续发送三个0x2B然后等待一秒钟以上即可退出数据模式进入常规AT模式。

    l         设置路径

    程序中使用SetPath操作设置路径。需要注意的是,可以设计两种风格的过程:一种使用绝对路径,另一种使用相对路径。

    对于手机而言,经笔者实践证明,使用绝对路径要比使用相对路径方便,而且更准确,但效率上稍逊,特别是在多层目录的情况下。由于手机没有能够返回当前路径的方法,所以相对路径总难以控制,只有通过程序控制,极容易出现错误。所以建议使用绝对路径

    如果使用绝对路径,那么路径名将呈现\path1\path2这种形式。首先回到根目录,然后一级一级的到达目的。在笔者的OBEX类当中,可以看到BacktoRoot这个过程。其作用就是把当前程序路径切换到根目录以免引起混乱。

    l         取得目录信息

    取得一个目录的文件信息可以用发送Get指令。该Get指令需要一个TypeHeader,其值为x-obex/folder-listing

    随后服务端会返回一个xml文件,包含了整个目录的信息。例如子目录名、文件名、大小、最后修改时间。再通过xml解析后就会得到目录信息。

    l         创建目录

    SetPathFlagsBit1设为1并且无法找到目录时,服务端会创建这个目录并进入。

    请注意,再次使用SetPath并将FlagsBit0设为1返回上层目录,否则容易引起混乱

    l         上传下载文件

    使用Put和Get命令可以实现上传和下载文件。注意所有的文件操作都在SetPath所指定的目录下进行

    使用Put命令实现上传时,至少需要提供NameHeaderBodyHeader一般还要提供LengthHeaderDateTimeHeader大文件传输需要正确处理BodyHeader,不能超出了服务端最大所能接收的Packet的大小,否则会出现错误。

    需要注意的是如果当前文件存在,那么Put命令不会覆盖已有的文件而是追加,导致错误。传输文件之前需要首先删除同名文件。

    使用Get命令实现下载时,只需要提供NameHeader即可。具体例子参考上一节。

    l         删除文件或空目录

    使用Put命令,其NameHeader指定为文件名或目录名并将BodyHeader设置为空即可。

    非空目录无法删除,会返回错误。

    展开全文
  • OBEX(一)

    2021-09-29 14:26:23
    1、OBEX v2.0(v2.0版本开始OBEX直接在L2CAP上传输,v2.0版本以前OBEX在RFCOMM上传输) 2、OBEX即Object Exchange Protocol,对象交换协议 3、OBEX协议是典型的client/server request-response模型 4、OBEX v2.0...

    一、概述

    1、OBEX v2.0(v2.0版本开始OBEX直接在L2CAP上传输,v2.0版本以前OBEX在RFCOMM上传输)

    2、OBEX即Object Exchange Protocol,对象交换协议

    3、OBEX协议是典型的client/server request-response模型

    4、OBEX v2.0蓝牙协议层次结构图:

    5、OBEX可以用来传输vCard(电话本),vCalendar(电子日历),vMessage(短信和email)和vNotes(电子笔记)。

    二、OBEX Object

        OBEX Object模型描述的是如何表示OBEX Object,OBEX协议可以使用Put-和Get-operations传输Object。一个object可以通过一个或者多个Put-requests、 Get-responses进行交互。Object是由headers组成的,header由header ID和header value组成。通过Header ID可以确定header的格式及包含哪些信息,header value由一个或者多个字节组成,其格式和含义由header ID决定。目前定义的header有:

    Count、Name、Type、Length、Time、Description、Target、HTTP、Body、End of Body、Who、Connection ID、Application Parameters、Authenticate Challenge、Authenticate Response、Creator ID、WAN UUID、Object Class、User-Defined、Session Parameters、Session Sequence Number、Action Identifier、DestName、Permissions、Single Response Mode、Single Response Mode Parameters

    1、header的格式

    (1)Header的一般格式如下:

    HI(header ID)

    HV(header value)

    1 byte

    >=1 byte

        HI:决定HV的格式及含义

        HV:存放具体的header数据

    (2)HI分析

        HI的低6位表示header的含义,HI的高两位表示header的编码

    HI的高两位

    解释

    00(0x00)

    以两个null0x00)字节结尾的Unicode text,有一个2 bytelength前缀,每个Unicode编码是16bitlength是整个header的长度

    01(0x40)

    字节序列,有一个2bytelength前缀,length是整个header的长度

    10(0x80)

    1 byte

    11(0xC0)

    4 byte,大端序发送

    举例:

    HI高两位是00:

        一个name Header,包含Unicode字符串outbox,数据为:

    0x01 0x00 0x11 0x00 0x6f 0x00 0x75 0x00 0x74 0x00 0x62 00 0x6f 0x00 0x78 0x00 0x00

    红色是HI,蓝色是length,黄色是Unicode字符串,绿色是null字节结束符

    HI高两位是01:

        一个application parameter header,包含字节序列,数据为:

        0x4c 0x00 0x06 0x14 0x01 0x01

        红色是HI,蓝色是length,紫色是parameter

     

    HI高两位是10:(没找到)

    HI高两位是11:

        一个connection id header,包含4 byte,数据如下

        0xcb 0x00 0x00 0x00 0x01

        红色是HI,黑色是connection id

       

     2、header的类别

    3、header的描述

    Header

    描述

    Count

    4 byte的无符号整型,用来表示object的数量

    Name

    以2个null字符为结尾的Unicode text字符串,用来描述object的名字

    Type

    一个字节序列,以一个null字符结尾的ASCII text,用来描述object的类型。例如:text, binary或者vCard。如果没有指令Type,那么默认类型是binary

    Length

    4 byte的无符号整型,用来表示object的长度,以byte为单位,如果一个单一的object的长度超过4G-1个字节,则不能使用Length header,而应该使用HTTP content-length header(ASCII编码的十进制数,可以表示无限大),不使用Length header时,可以根据End-of-Body header确定object的结尾。

    Time

    一个字节序列,使用ASCII编码的字符串,本地时间用YYYYMMDDTHHMMSS表示,UTC用YYYYMMDDTHHMMSSZ,T是日期和时间的分隔符,Z表示时区,尽量使用UTC时间

    Description

    以2个null字符为结尾的Unicode text字符串,用来提供额外的object描述或者操作

    Target

    一个字节序列,用来表示操作目标。Target header最常用的用法是:在OBEX CONNECT packet中使用,对OBEX server发起直接连接。当建立直接连接时,Target header通常和Who header及Connection Id headers一块使用。

    注意:1、当使用Target header时,Target header必须是第一个header;2、在一个request中同时发送Connection Id和Target header是非法的,但是可以在response中同时使用

    HTTP

    一个字节序列,包含一个HTTP 1.x header

    Body和End-of-Body

    一个object的body(包含发送的内容)可以使用一个或者多个Body header进行发送(即分块发送)。一个Body header由HI、2 byte的length字段及(整个或者部分)object的内容组成。End-of-Body header用来表示最后一个object body的分块。某些情况下,object body的结尾是无法预期的,所以使用一个length=0的End-of-Body header是合法的。End-of-Body header表示一个object的结束,所以必须在object的最后

    Who

    一个字节序列,有2byte的length前缀,使用Who header,方便双方互相识别对方,Who header通常在OBEX CONNECT response packet中使用,用了表示哪个service(用UUID表示)接受了连接。Who header的value和CONNECT command的Target header的value是相同的。

    Connection Id

    一个4 byte的值,用来告诉request的接收端这个request属于哪个OBEX连接,当在request中Connection Id header时,这个header必须是第一个;

    如果希望通过同一个TinyTP连接提供对多个OBEX services的并发访问,则使用connection Id来区分多个client。当通过默认OBEX server访问多个services时,server可以通过OBEX CONNECT packet中的Target header分配Connection Id,并在OBEX CONNECT response packet中返回给client。Connection Id必须是唯一的,一旦OBEX连接建立,后续所有的client request必须包含Connection Id;只需要在request的第一个packet中包含connection id就可以,所以一次只能处理一个request

    在一个OBEX CONNECT中包含Connection Id是没有意义的,需要禁止这种情况,同样在requset中同时使用Target header和Connection Id header是非法的。

    Application Request-Response Parameters

    一个字节序列,Application Parameters header是OBEX上层协议在request和response packet中用来发送额外信息的。

    使用Tag-Length-Value方式来支持request/response中的各种类型和级别,一个Application Parameters header可能包含一个或者多个Tag-Length-Value结构体,如下图所示

    Tag和Length都是1个byte

    Authenticate Challenge

    一个字节序列,Authenticate Challenge header是client和server向对方发起身份验证用的。一个Authenticate Challenge header可能包含一个或者多个Tag-Length-Value结构体,如下图所示:

     Tag和Length都是1个byte

    Authenticate Response

    一个字节序列,client和server使用这个header回复authentication

    Request,Authenticate Response header可能包含一个或者多个Tag-Length-Value结构体:

     Tag和Length都是1个byte

    Creator ID

    一个4 byte的无符号整型,用来表示object的创建者

    WAN UUID

    一个字节序列(0x40,OBEX协议中描述是0x20,不知道是不是我理解有问题),WAN UUID header是一个16 byte的UUID,唯一标识一个网络client(OBEX Server),用于无状态网络(在这个网络上client和server的角色与OBEX client和server的角色相反,例如WAP)上的OBEX,在这种环境下,网络的client(移动设备)也是OBEX server。因为网络server一次只能识别client的一个request/response对,所以WAN UUID用于提供状态,网络server在OBEX Connect request packet中提供UUID给OBEX server,然后OBEX server在之后的所有response中都会发送这个WAN UUID header。

     

    Object Class

    一个字节序列,Object Class header用于引用object类和属性。在最低层次,除了命令空间是OBEX而不是MIME外,它和OBEX type header起到的作用是类似的。对于子对象级的访问,可以足够详细地表示object内容的特定字段或子集。Object Class header中使用的值的作用域仅限于定义它们的应用程序或服务,但是class类的共享的。

    Session-Parameters

    一个字节序列,Session-Parameters header对于CREATESESSION、CLOSESESSION、SUSPENDSESSION、RESUMESESSION和SETTIMEOUT这些command以及这些command对应的response是必须的。这个header包含一组参数,如果使用这个header,那么在command及其response中需要是第一个header,另外对于SESSION command,Session-Parameters header中的Session Opcode必须是第一个tag-length-value结构体,这个header的结构如下:

    如下图所示

     Tag和Length都是1个byte

    Session-Sequence-Number

    一个1 byte的值,包含一个当前序列号,范围0-255,当计数到255时,序列号将循环重新回到0,尽管OBEX是一个command/response协议,同一时间只能存在一个未响应的request,但是使用这个header增加了另一层验证方法,如果序列号无效,则应该终止这个session。

    当一个serssion刚被创建时,Session-Sequence-Number包含的值应该设置为0。在session建立后,client发送的第一个command将包含这个header并且值为0,server对这个command的response中的这个header的值应该是1

    User Defined Headers

    这个header给应用开发提供了灵活性,可以观察header的最高两位来指定编码,以便应用能够跳过无法识别的header。如果没有严格的应用匹配,这个header很难被正确解释,所以在使用这个header时要特别注意,建立连接时能用Who header来标识出严格的匹配

    4、header举例

    (1)Count:无

    (2)Name(0x01):数据如下:

        01 00 21 00 74 00 65 00 6c 00 65 00 63 00 6f 00 6d 00 2f 00 70 00 62 00 2e 00 76 00 63 00 66 00 00

        Type header的HI是00,即以2个null字符为结尾的Unicode text字符串,有2个byte的length前缀,即0x00 0x21,即后面跟30 byte的数据。如下图所示:Unicode text字符串一个字符是16byte,所以(telecom/pb.vcf是28byte,加2个null字符,即30byte)

    (3)Type(0x42):数据如下:

        42 00 12 78 2d 62 74 2f 70 68 6f 6e 65 62 6f 6f 6b 00

        Type header的HI是01,即字节序列,有2个byte的length前缀,即0x00 0x12,后面跟15byte的数据。如下图所示一共是15byte(x-bt/phonebook加一个null字符)的数据

    (4)Length:无

    (5)Time:无

    (6)Description:无

    (7)Target(0x46):数据如下:

    46 00 13 79 61 35 f0 f0 c5 11 d8 09 66 08 00 20 0c 9a 66

        Target header的HI是01,即字节序列,有2个byte的length前缀,即0x00 0x13,说明这个header总长度是19byte,length和header占用3个byte,所以剩下的数据是16byte。这个16 byte数据就是PBAP里面定义的

    (8)HTTP:无

    (9)Body(0x48):数据如下

     

    Body的HI是01,即字节序列,有2个byte的length前缀,即0x04 0x28,所以后面跟着0x0425 byte的数据,如下图所示(Body里面包含的就是PBAP数据): 

    (10)End-of-Body(0x49):数据如下:

        49 00 03

        End-of-Body的HI是01,即字节序列,有2个byte的length前缀,即0x00 0x03,所以后面跟着0byte的数据

    (11)Who(0x4a):数据如下:

        4a 00 13 79 61 35 f0 f0 c5 11 d8 09 66 08 00 20 0c 9a 66

    Who header的HI是01,即字节序列,有2个byte的length前缀,即0x00 0x13, Who header通常在OBEX CONNECT response packet中使用,用了表示哪个service(用UUID表示)接受了连接。Who header的value和CONNECT command的Target header的value是相同的。

    可以看到后面根据16 byte数据跟上面Target的数据是一样的。

    (12)Connection Id(0xcb):数据如下

    cb 00 00 00 01

    Connection Id的HI是11,所以是一个4 byte的值

    (13)Application Request-Response Parameters(0x4c):数据如下:

    4c 00 18 07 01 00 06 08 00 00 00 00 00 00 00 85 04 02 00 00 05 02 00 00

    Application Request-Response Parameters的HI是01,即字节序列,有2个byte的length前缀,即0x00 0x18,即后面跟着21 byte的数据。后面的数据格式是Tag-Length-value结构体,分别是:

    Tag=0x07,Length=0x01,Value=0x00

    Tag=0x06,Length=0x08,value=0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x85

    Tag=0x04,Length=0x02,Value=0x00 0x00

    Tag=0x05,Length=0x02,Value=0x00 0x00

    (14)Authenticate Challenge:无

    (15)Authenticate Response:无

    (16)Creator ID:无

    (17)WAN UUID:无

    (18)Object Class:无

    (19)Session-Parameters:无

    (20)Session-Sequence-Number:无

    (21)User Defined Headers:无 

    展开全文
  • 微软的OBEX协议文档

    2013-06-03 23:12:41
    在研究蓝牙OBEX协议,比如使用PBAP,OPP,等协议时需要参考的OBEX协议文档,微软的OBEX协议,原先是用于红外传输的,所以叫IRDA,不过蓝牙直接沿用它了。另有一份OBEX协议标准,请在另一个链接下载
  • 蓝牙学习笔记之OBEX_PBAP协议(九)

    千次阅读 2019-02-19 19:52:41
    OBEX_PBAP协议概览 OBEX协议简介 Obex对象模型(Object Model) Obex标题(Headers) 标题描述(Header descriptions) Obex会话协议(Session Protocol) 请求格式 回复格式 PBAP协议简介 Pbap对象和格式 对象...
  • OBEX浅析

    千次阅读 2014-08-12 20:52:01
    (一) OBEX介绍 一、什么是OBEX,它有什么用途? OBEX全称为Object Exchange,中文对象交换,所以称之为对象交换协议。它在此软件当中有着核心地位,文件传输和IrMC同步都会使用到它。 OBEX协议构建在IrDA...
  • javax.obex.jar

    2013-09-20 23:25:24
    javax.obex.jar 2011-05-07版
  • 如果基于蓝牙socket,通过文件流的形式传输,要做到比较可靠,其实就相当于你要实现OBEX协议(对象交换)的具体内容,复杂度和工作量还是不小的。 请注意,普通手机端,由于可以用户操作,依据通用API直接调用...
  • OBEX OBEX是一个去中心化交易所( DEX ),人们可以通过订单簿系统将其ERC20代币交易为ETH,以及将ETH转换为ERC20代币。 特征 该存储库包含两个合同。 OBEX 订单簿。 使用OBEX,您可以将ETH或ERC20令牌交换为ERC...
  • Cable OBEX-开源

    2021-05-01 03:36:14
    这是通过慢速串行电缆进行的通信协议OBEX的小型实现。 它的主要用途是与手机通讯,更具体地说是与SonyEricsson品牌的手机通讯。
  • 简单j2me蓝牙OBEX传文件代码 http://blog.csdn.net/xiaoxiao108/archive/2011/03/10/6237233.aspx 最近想写一手机程序实现以下功能,在蓝牙的有效距离内,如果有其他手机的蓝牙设置为可见状态,自己的手机自动向其他...
  • 当每个OBEX使用bluez接收文件时,请禁用支持的MIME类型的过滤器。 SailfishOS和MeeGo使用bluez , obexd和RPM obexd-contentfilter-helper 。 该软件包提供单个文件obexd-contentfilter-helperapp ,该文件通常安装...
  • OBEX

    2012-08-07 16:13:53
    OBEX全称为Object Exchange,中文对象交换,所以称之为对象交换协议。它在此软件当中有着核心地位,文件传输和IrMC同步都会使用到它。OBEX协议构建在IrDA架构的上层。  一、什么是OBEX,它有什么用途? ...
  • obex_recv_file.zip

    2019-11-12 13:49:08
    linux源码实现蓝牙文件接收,下载了obex的源码,看网上的资料都是拷贝的相当无语,最后自己费劲心思才搞出来的,希望可以帮助到有需要的你。
  • OBEX通信协议简析

    2009-12-28 00:12:28
    OBEX协议是一个简洁、灵活的通信协议,被广泛用于智能设备间的通信,它包括对象模型和会话协议两部分。对象模型采用一系列的对象头(Header)来描述对象各方面的信息,而对象本身也作为特殊的对象头来处理。会话协议...
  • obex蓝牙源代码

    2011-09-22 13:49:37
    obex bluetooth.这是一个用obex bluetooth写的基于windows mobile的软件
  • 蓝牙的OBEX协议

    千次阅读 2017-03-02 10:47:15
    1.概述  OBEX为Object Exchange,用于在蓝牙设备间传数据对象,来源于红外定义的协议,后被蓝牙采用...OBEX在蓝牙协议层中的位置如下图(在之前的OBEX版本中,OBEX是通过RFCOMM挂在L2CAP上的): 2
  • 基于OBEX的蓝牙文件传输程序. 编译环境:VC
  • (六) OBEX应用——文件传输部分 在手机数据传输方面基本OBEX应用分为 l 文件传输 l IrMC同步 文件传输又可以细分为以下基本操作 l 初始化连接 l 断开连接 l 设置路径 l 取得目录信息 l 创建目录 l...
  • 24 Message Access Profile (MAP) 25 OBject EXchange (OBEX) 26 Object Push Profile (OPP) 27 Personal Area Networking Profile (PAN) 28 Phone Book Access Profile (PBAP, PBA) 29 Proximity Profile (PXP) 30 ...
  • (五) OBEX介绍 一、什么是OBEX,它有什么用途? OBEX全称为Object Exchange,中文对象交换,所以称之为对象交换协议。它在此软件当中有着核心地位,文件传输和IrMC同步都会使用到它。 OBEX协议构建在IrDA架构的...
  • OBEX介绍

    千次阅读 2012-02-06 14:11:40
    (一) OBEX介绍 一、什么是OBEX,它有什么用途? OBEX全称为Object Exchange,中文对象交换,所以称之为对象交换协议。它在此软件当中有着核心地位,文件传输和IrMC同步都会使用到它。 OBEX协议构建在IrDA架构的上层...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,945
精华内容 1,178
关键字:

obex