Windows Mobile 与 PC之间的通过蓝牙(Bluetooth) 传输文件的开发

简介:

背景

之前也写过一些Windows Mobile和Wince下Bluetooth开发的文章如下。

.NET Compact Framework下的Bluetooth开发 之 Windows Embedded Source Tools for Bluetooth

.NET Compact Framework下的Bluetooth开发 之 32feet.NET

.NET Compact Framework下的Bluetooth开发 之 Bluetooth Virtual Serial Port (可以用于把Bluetooth的GPS receiver变成串口)

.NET Compact Framework下的Bluetooth设备的配对

30 Days of .NET [Windows Mobile Applications] - Day 02: Bluetooth Manager(蓝牙管理器) (简单的Bluetooth应用)

.NET Compact Framework下的Bluetooth广播程序的开发

期间有两个同学问我如何实现蓝牙的文件传输,今天整理出蓝牙文件传输的代码实现,并把他记录下来。

简介

本文讲述Windows Mobile和PC之间蓝牙文件传输的实现。通过使用32feet.net库对Obex的封装实现了Push文件的程序。Obex Push 的PC程序可以给所有支持Obex的设备传输文件,包括非Windows Mobile的设备。

OBEX

蓝牙文件传输可以借助OBEX实现。OBEX(The Object Exchange Protocol,对象交换协议)被广泛用于个人无线网络中设备的文件传输,基本上所有的移动设备都支持该协议。实现了OBEX,不仅仅可以实现Window Mobile和PC的文件传输,可以实现所有支持OBEX协议的设备的文件传输。关于OBEX可以参考 Object Exchange Protocol.

 

Windows Mobile 推文件到PC

本节讲述Windows Mobile推文件到PC的实现,其实PC推文件到Windows Mobile的实现差异性不大。

Windows Mobile客户端的实现

见源代码ObexPushDevice项目。

private void menuItem1_Click(object sender, EventArgs e)
{
// use the new select bluetooth device dialog
SelectBluetoothDeviceDialog sbdd = new SelectBluetoothDeviceDialog();
sbdd.ShowAuthenticated = true;
sbdd.ShowRemembered = true;
sbdd.ShowUnknown = true;
if (sbdd.ShowDialog() == DialogResult.OK)
{
OpenFileDialog ofdFileToBeam = new OpenFileDialog();
if (ofdFileToBeam.ShowDialog() == DialogResult.OK)
{

Cursor.Current = Cursors.WaitCursor;
System.Uri uri = new Uri("obex://" + sbdd.SelectedDevice.DeviceAddress.ToString() + "/" + System.IO.Path.GetFileName(ofdFileToBeam.FileName));
ObexWebResponse response = null;
try
{
ObexWebRequest request = new ObexWebRequest(uri);
request.ReadFile(ofdFileToBeam.FileName);

response = request.GetResponse() as ObexWebResponse;
MessageBox.Show(response.StatusCode.ToString());
}
catch
{
MessageBox.Show("Fail to beam the file " + uri);
}
finally
{
if (response != null)
{
response.Close();
}
}
Cursor.Current = Cursors.Default;
}
}
}

SelectBluetoothDeviceDialog 是 32feet.net里面的一个蓝牙发现类,自动发现周边的蓝牙设备,然后通过对话框的形式呈现。如下图:

bt_beam

选择要推文件的目标PC后,通过OpenFileDialog 类选择要推动文件,如下图:

 bt_beam2

通过ObexWebRequest 来推文件到目标机器。ObexWebRequest 的实现模式和HttpWebRequest类似,都是发送请求,等等回应,回应封装在ObexWebResponse 类里面。如果目标机器的Obex服务没有打开,会发生下面的错误。关于HttpWebRequest的文件可以参考 .NET Compact Framework下HttpWebRequest开发

 bt_beam3

PC服务端的实现

见源代码ObexListenerPC项目。

初始化

InTheHand.Net.Bluetooth.BluetoothRadio.PrimaryRadio.Mode = InTheHand.Net.Bluetooth.RadioMode.Discoverable;
listener = new ObexListener(ObexTransport.Bluetooth);

由于蓝牙通信支持一个设备的通信,所以找出主要(Primary)设备,把他绑定到ObexListener里。

启动服务

listener.Start();
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(DealWithRequest));
t.Start();

启动线程来处理请求。

处理请求

public void DealWithRequest()
{
while (listener.IsListening)
{
try
{
ObexListenerContext olc = listener.GetContext();
ObexListenerRequest olr = olc.Request;
string filename = Uri.UnescapeDataString(olr.RawUrl.TrimStart(new char[] { '/' }));
olr.WriteFile(Environment.SpecialFolder.MyDocuments + DateTime.Now.ToString("yyMMddHHmmss") + " " + filename);
BeginInvoke(new MethodInvoker(delegate()
{
this.listBoxDetail.Items.Add("Received " + filename);
}));
}
catch(Exception e)
{
BeginInvoke(new MethodInvoker(delegate()
{
this.listBoxDetail.Items.Add(e.Message);
}));
continue;
}
}
}

DealWithRequest()函数处理来自客户端的ObexListenerRequest 请求。把接收的文件存放到Environment.SpecialFolder.MyDocuments文件夹里面。如下图收到"abc shops.bmp”文件。

 bt_beam4

停止服务

listener.Stop();

程序关闭时需要停止服务。

 

PC 推文件到Windows Mobile

其实PC推文件到Windows Mobile和Windows Mobile推文件到PC的实现是一样的,使用32feet.net可以在不同Winodws Mobile之间,或者不同PC之间互相推文件,根据需求不同,可以利用源码中的不同项目。

PC客户端的实现

见源代码ObexPushPC项目。

private void buttonBeam_Click(object sender, EventArgs e)
{
// use the new select bluetooth device dialog
SelectBluetoothDeviceDialog sbdd = new SelectBluetoothDeviceDialog();
sbdd.ShowAuthenticated = true;
sbdd.ShowRemembered = true;
sbdd.ShowUnknown = true;
if (sbdd.ShowDialog() == DialogResult.OK)
{
OpenFileDialog ofdFileToBeam = new OpenFileDialog();
if (ofdFileToBeam.ShowDialog() == DialogResult.OK)
{

Cursor.Current = Cursors.WaitCursor;
System.Uri uri = new Uri("obex://" + sbdd.SelectedDevice.DeviceAddress.ToString() + "/" + System.IO.Path.GetFileName(ofdFileToBeam.FileName));
ObexWebResponse response = null;
try
{
ObexWebRequest request = new ObexWebRequest(uri);
request.ReadFile(ofdFileToBeam.FileName);

response = request.GetResponse() as ObexWebResponse;
MessageBox.Show(response.StatusCode.ToString());
}
catch
{
MessageBox.Show("Fail to beam the file " + uri);
}
finally
{
if (response != null)
{
response.Close();
}
}
Cursor.Current = Cursors.Default;
}
}
}

可以说和上面实现的“Windows Mobile客户端的实现”没有区别, 32feet.net屏蔽的差异性。

bt_beam5

选择目标设备。

bt_beam6

选择传输文件。

 bt_beam7

Windows Mobile默认是打开了Obex的服务,所以,在Windows Mobile可以不用部署任何程序就可以接收文件了。非常方便,如果某些设备不支持Obex的服务,需要部署程序,可以使用源代码中的ObexListenerDevice项目。

我同时使用这个Obex Push程序给非Windows Mobile系统成功发送文件。这是一个通用的Obex文件传输程序。

环境: VS 2008 + XP + Windows Mobile 6.5 + 32feet.net

源代码:http://files.cnblogs.com/procoder/BluetoothObex.rar




    本文转自Jake Lin博客园博客,原文链接:http://www.cnblogs.com/procoder/archive/2009/09/22/Windows_Mobile_Bluetooth_Transfer_File.html,如需转载请自行联系原作者


相关文章
|
2月前
|
存储 开发框架 .NET
Windows IIS中asp的global.asa全局配置文件使用说明
Windows IIS中asp的global.asa全局配置文件使用说明
40 1
|
2月前
|
Java Windows
如何在windows上运行jar包/JAR文件 如何在cmd上运行 jar包 保姆级教程 超详细
本文提供了一个详细的教程,解释了如何在Windows操作系统的命令提示符(cmd)中运行JAR文件。
1050 1
|
2月前
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
62 0
|
2月前
|
Ubuntu Linux Python
如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发
如何在WSL(Windows Subsystem for Linux)的Ubuntu环境中使用conda虚拟环境来为Windows上的PyCharm开发设置Python解释器。
140 0
|
2月前
|
程序员 Windows
程序员必备文件搜索工具 Everything 带安装包!!! 比windows自带的文件搜索快几百倍!!! 超级好用的文件搜索工具,仅几兆,不占内存,打开即用
文章推荐了程序员必备的文件搜索工具Everything,并提供了安装包下载链接,强调其比Windows自带搜索快且占用内存少。
49 0
|
3月前
|
存储 安全 程序员
Windows任务管理器开发原理与实现
Windows任务管理器开发原理与实现
|
3月前
|
Windows
7-3|windows删除目录下的所有文件的命令
7-3|windows删除目录下的所有文件的命令
|
20天前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
|
24天前
|
监控 安全 网络安全
使用EventLog Analyzer日志分析工具监测 Windows Server 安全威胁
Windows服务器面临多重威胁,包括勒索软件、DoS攻击、内部威胁、恶意软件感染、网络钓鱼、暴力破解、漏洞利用、Web应用攻击及配置错误等。这些威胁严重威胁服务器安全与业务连续性。EventLog Analyzer通过日志管理和威胁分析,有效检测并应对上述威胁,提升服务器安全性,确保服务稳定运行。
|
25天前
|
监控 安全 网络安全
Windows Server管理:配置与管理技巧
Windows Server管理:配置与管理技巧
66 3