使用以下命令启动第一个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代码中禁用身份验证,但没有帮助。
有谁知道如何解决这个问题,或者从哪里开始寻找?

最佳答案

好吧,看来没人对这个话题感兴趣。)幸好我自己找到了解决办法。
然而,它涉及到很多分析(包括obex传输协议和32英尺库)和一些运气。
Linux obexpushd实现的区别在于它对OBEX传输包的解释。
我在页面上找到了OBEX规范:OBEX specification
在调试了23英尺obex传输的内部之后,我发现代码将obex PUT命令发送到哪里,该命令用于向接收器发送文件。Obex规范给出了PUT初始化包的以下示例:
PUT命令|数据包长度|名称头长度|名称头长度|对象名称|长度头长度|对象长度|对象正文块头长度|正文头长度|正文字节
32feet库发送第一个没有Body头的包,这会导致obexpushd Linux命令出错。
如果在32英尺库、obexpushd中出错,或者OBEX规范不够精确,舒尔就不会这么做,但在第一个包中添加Body头就解决了这个问题。根据我的实验,在第一个包中必须至少发送objectt的前两个字节。此外,添加头不会使任何其他操作崩溃,而且WindowsWindows transfer仍然工作得很好。

10-07 15:52