J2ME蓝牙OBEX如何实现ACTION(移动/重命名,设置权限)操作?

Posted

技术标签:

【中文标题】J2ME蓝牙OBEX如何实现ACTION(移动/重命名,设置权限)操作?【英文标题】:How to implement ACTION (move/rename, set permissions) operation in J2ME Bluetooth OBEX? 【发布时间】:2012-05-10 11:11:17 【问题描述】:

蓝牙 FTP 规范说我需要使用 ACTION 操作,这是一个页面

但ClentSession 仅提供 GET 和 PUT 操作,javadocs 中没有提及。

创建文件操作如下所示,非常简单

    public void create() throws IOException 
        HeaderSet hs = cs.createHeaderSet();
        hs.setHeader(HeaderSet.NAME, file);
        op = cs.put(hs);
        OutputStream os = op.openOutputStream();
        os.close();
        op.close();
    

问题 1:如何使用自定义标头实现 ACTION 操作以执行移动/重命名和设置权限?没有 JSR82 OBEX API 应该是可能的。请帮我做这件事。

问题 2: 我了解如何设置权限吗? 根据 OBEX_Errata Compiled For 1.3.pdf(感谢 alanjmcf!)

因此,要设置为只读,我应该执行以下操作:

    int a = 0;

    //byte 0 //zero
    //byte 1 //user
    //byte 2 //group
    //byte 3 //other

    //set read for user
    a |= (1 << 7); //8th bit - byte 1, bit 0 -> set to 1
    // a = 10000000

    //for group
    a |= (1 << 15); //16th bit - byte 2, bit 0 -> set to 1
    // a = 1000000010000000

    //for other
    a |= (1 << 23); //24th bit - byte 3, bit 0 -> set to 1
    // a = 100000001000000010000000

    //or simply
    private static final int READ = 8421504 //1000,0000,1000,0000,1000,0000
    int value = 0 | READ;

    //========== calculate write constant =========
    a = 0;
    a |= (1 << 8); //write user
    a |= (1 << 16); //write group
    a |= (1 << 24); //write other
    // a = 1000000010000000100000000
    private static final int WRITE = 16843008 // 1,0000,0001,0000,0001,0000,0000

    //========= calculate delete constant ==========
    a = 0;
    a |= (1 << 9); //delete user
    a |= (1 << 17); //delete group
    a |= (1 << 25); //delete other
    //a = 10000000100000001000000000
    private static final DELETE = 33686016; //10,0000,0010,0000,0010,0000,0000

    //========= calculate modify constant ==========
    a = 0;
    a |= (1 << (7 + 7)); //modify user
    a |= (1 << (15 + 7)); //modify group
    a |= (1 << (23 + 7)); //modify other
    //a = 1000000010000000100000000000000
    private static final MODIFY = 1077952512; // 100,0000,0100,0000,0100,0000,0000,0000


    // now, if i want to set read-write-delete-modify, I will do the following:
    int rwdm = 0 | READ | WRITE | DELETE | MODIFY;
    // and put the value to the header... am I right?

如果正确,唯一的问题仍然是问题1:我如何进行ACTION操作以及如何设置标题。

【问题讨论】:

code.google.com/p/blueframe/source/checkout - 里面可能有什么 @AmigableClarkKant 设备交换自己格式的数据。它不能帮助我创建目标设备将识别为 OBEX 的标头。 【参考方案1】:

请注意,您从蓝牙 FTP 规范中引用的文本提到了三个标头:ActionId、Name、DestName。因此,您需要添加一个 NAME 标头和一个 DestName 标头。 Jsr-82 显然没有为该(新)标头定义 const,因此引用了 OBEX 规范:

修改 2.1 OBEX 标头

HI identifier | Header name | Description  
0x94            Action Id     Specifies the action to be performed (used in ACTION operation)  
0x15            DestName      The destination object name (used in certain ACTION operations)  
0xD6            Permissions   4 byte bit mask for setting permissions  
0x17 to 0x2F    Reserved for future use.  This range includes all combinations of the upper 2 bits

所以创建以下等。(我的 Java 有点生疏)

static final int DEST_NAME = 0x15;

并在您的代码中使用它。

[ADD] 所有作为动作的操作(动作)都使用ACTION操作! :-,) 即使用 OBEX 操作码 ACTION 而不是 PUT 或 GET 等。操作码 ACTION 的值为 0x86

我正在从“OBEX_Errata Compiled For 1.3.pdf”中阅读此内容。 IrDA 确实对规格收费,但现在似乎根据要求提供(http://www.irda.org)。索取最新的 OBEX 规范 (1.5 IIRC) 的副本。我自己也这样做了,但还没有得到回应。或者您可以尝试在谷歌上搜索“移动/重命名对象操作”以获取“1.3 Errata”PDF。

无论如何,如果 Java 阻止您使用新的操作码(仅允许 GET 和 PUT)并且还阻止您使用新的 HeaderId 值,那么您无论如何都无法继续。 :-( *(他们没有理由这样做,因为 HeaderId 对它包含的数据类型进行编码)。

在再次查看 Java API 之后,我看不到任何通过 ClientSession 发送任意命令的方式。您必须手动构建数据包,连接到 OBEX 服务,然后通过该连接发送和接收数据包。构建数据包并不是困难...

【讨论】:

但我仍然不知道该怎么做。 虽然这个答案被授予了,我的问题仍然没有答案。

以上是关于J2ME蓝牙OBEX如何实现ACTION(移动/重命名,设置权限)操作?的主要内容,如果未能解决你的问题,请参考以下文章

Android 蓝牙使用 OBEX 发送私有/内部文件

手机作为蓝牙耳机

将图像从服务器发送到客户端

蓝牙的OBEX协议

如何在不配对的情况下在远程设备中安装 J2ME .jar 文件?

蓝牙OBEX剖析-- 流程解析