首先使用以下命令启动 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 传输协议(protocol)和 32feet 库)和一点运气。 Linux obexpushd 实现的区别在于它对 OBEX 传输数据包的解释。
我在页面上找到了 OBEX 规范:OBEX specification .
在调试 23 英尺 obex 传输的内部结构后,我发现代码在哪里发送用于将文件发送到接收器的 OBEX PUT 命令。 Obex 规范给出了 PUT 初始化数据包的以下示例:
PUT 命令 |数据包长度 |名称标题 |名称标题的长度 |对象名称 |长度标题 |物体长度 |对象主体 block 头 |主体标题的长度 |正文字节数
32feet 库发送的第一个数据包没有 Body Header,这会导致 obexpushd Linux 命令出错。
不知道是不是32feet库的错误,obexpushd或者OBEX规范不够精确,但是在第一个数据包中添加Body头解决了这个问题。从我的实验中可以看出,至少 objectt 的前 2 个字节必须在第一个数据包中发送。此外,添加 header 不会导致其他任何崩溃,并且 Windows<->Windows 传输仍然运行良好。
关于c# - 无法使用 32feet.Net C# 库通过蓝牙将文件从 Windows 传输到 Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10998320/