0

使用以下命令启动第一个 linux 服务侦听过程:

obexpushd –B[00:15:83:3D:0A:57]:9 –d –o /home/myfolder

在 Windows 上,以下代码用于执行 obex 传输:

InTheHand.Net.BluetoothAddress address = peerDevice.DeviceAddress;
   System.Uri uri = new Uri("obex://" + address.ToString() + "/" + srcfile.Name);
   request = new ObexWebRequest(uri);
   startcopy = DateTime.Now;

   request.ReadFile(file); // this performs the file read from the hard drive

   try
   {
       response = (ObexWebResponse)request.GetResponse(); // here file should be pushed to the listening service
   }
   catch (System.InvalidOperationException ex)
   {
       if (response != null) {
                            response.Close();
       }
       return;
   }

设备可以互相看到,并且它们的 obex 服务也是可见的。传输似乎成功,但实际上没有传输任何数据。该代码可以在 windows 和 windows 之间正常工作。

Obexpushd 进程输出显示:

obexpushd 0.10.2 Copyright (C) 2006-2010 Hendrik Sattler
This software comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions.
Listening on bluetooth/[00:15:83:3D:0A:57]:9
OBEX_EV_ACCEPTHINT, OBEX_CMD_CONNECT
0: Connection from "bluetooth/[00:09:DD:50:94:0B]:9"
0: OBEX_EV_REQHINT, OBEX_CMD_CONNECT
0: OBEX_EV_REQ, OBEX_CMD_CONNECT
0: Sending response code 0
0: OBEX_EV_REQDONE, OBEX_CMD_CONNECT
0: OBEX_EV_REQHINT, OBEX_CMD_PUT
0.1: OBEX_EV_REQCHECK, OBEX_CMD_PUT
0.1: OBEX_EV_REQDONE, OBEX_CMD_PUT
0.1: OBEX_EV_REQHINT, OBEX_CMD_DISCONNECT
0.1: Sending response code 100
0.1: OBEX_EV_REQ, OBEX_CMD_DISCONNECT
0.1: OBEX_EV_REQDONE, OBEX_CMD_DISCONNECT

我也尝试在 C# 代码中禁用身份验证,但这没有帮助。

有谁知道如何解决这个问题或者从哪里开始寻找?

4

1 回答 1

1

好吧,似乎没有人对这个话题很感兴趣。:) 幸运的是我自己找到了解决方案。

但是,它涉及大量分析(obex 传输协议和 32feet 库)和一点运气。Linux obexpushd实现的区别在于它对 OBEX 传输数据包的解释。

我在页面上找到了 OBEX 规范:OBEX 规范

在调试了 23feet obex 传输的内部后,我发现代码将用于向接收器发送文件的 OBEX PUT 命令发送到何处。Obex 规范给出了 PUT 初始化数据包的以下示例:

放置命令 | 数据包长度 | 名称标题 | 名称标题的长度 | 对象名称 | 长度标题 | 物体长度 | 对象体块头 | 正文标题的长度 | 正文字节

32feet 库发送的第一个数据包没有Body Header,这会导致obexpushd Linux 命令出错。

如果是 32feet 库中的错误、obexpushd 或 OBEX 规范不够精确,则不确定,但是在第一个数据包中添加 Body 标头解决了问题。从我的实验结果表明,必须在第一个数据包中发送对象的至少 2 个第一个字节。此外,添加标头不会导致其他任何崩溃,Windows<->Windows 传输仍然可以很好地工作。

于 2012-07-25T12:14:07.890 回答