c# - 无法使用 32feet.Net C# 库通过蓝牙将文件从 Windows 传输到 Linux

标签 c# windows linux bluetooth

首先使用以下命令启动 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/

相关文章:

c# - 通过 'view' 接口(interface)公开一个对象

c# - C# 中单词的后期绑定(bind)

c# - 一圈还是两圈? (如何阅读 IL)

windows - 在所有图像/文件完成之前页面停止加载

linux - 通过GPIO访问连接FPGA的RTC I2C芯片

linux - 如何将 linux 命令保存在变量中,以便在 shell 脚本的后面部分使用

C程序列出文件

c# - 如何在服务器端获取 window.location.hash?

C# 文本框按键控件帮助

C++ TCP 套接字插件