WindowsMobile下通过蓝牙(Bluetooth)发送大文件的实现

 时间:2012-05-11 02:03:02 贡献者:JCQT

导读:Windows Mobile 下通过蓝牙 下通过蓝牙(Bluetooth)发送大文件的实现 发送大文件的实现背景在前一篇文章 Windows Mobile 与 PC 之间的 Bluetooth 文件传输 讲述了如何使用 Obex 开发 Bluetooth 文件传输的应

windowsmobile系统简介.ppt
windowsmobile系统简介.ppt

Windows Mobile 下通过蓝牙 下通过蓝牙(Bluetooth)发送大文件的实现 发送大文件的实现背景在前一篇文章 Windows Mobile 与 PC 之间的 Bluetooth 文件传输 讲述了如何使用 Obex 开发 Bluetooth 文件传输的应用。

其中 BenBen789 同学指出不能传输大文件,因此需要实现大文件的传输。

简介本文讲述在 Windows Mobile 下通过蓝牙发送大文件的实现。

实现这个发送大文件的实现是 Brecham.Obex 的例子程序,基于 Brecham.Obex 库来开发的, Brecham.Obex 是基于 32feet.net 的基础上实现的,可以参考 Brecham.Obex。

这个库可以免费使用, 但是需要注明依赖。

另一方面我没有找到这个库的源代码。

发送程序的主窗口。

tbw 淘宝网 http://tbw.hj99.org taob www.tbwtbwtaob.com 美丽俏佳人 bb 霜 www.qbi.cc 羽西 bb 霜 www.qhi.cc pba 柔肤全效 bb 霜 http://qzq.cc bb 霜是什么 www.tid.cc bb.yeahhandbag.com bb.zhenzhushop.com bb.duleina.com temp.5dpet.com temp.kxcfw.com temp.tntwl.com ccs.tntwl.com tbw.vps22.com tbw.haoxigou.com taob.yeahhandbag.com taob.kaoruan.com taob.yipinfenxiang.com

使用 System.Windows.Forms.OpenFileDialog 弹出选择需要发送文件的窗口。

DialogResult result = openFileDialog1.ShowDialog(); if (result == DialogResult.OK) { State state = new State();//-----------------------------------------------------// Get the file //-----------------------------------------------------String putName; // = "dummy.txt"; try { state.m_fileStream = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read); }catch(IOException ioex){ MessageBox.Show("Failed to open the file: " + ioex.ToString()); return; } state.m_progressStream = new ReadProgressStream(state.m_fileStream);state.m_progressStream.SetTotalReadLength(state.m_fileStream.Length); putName = Path.GetFileName(openFileDialog1.FileName); }//iftbw 淘宝网 http://tbw.hj99.org taob www.tbwtbwtaob.com 美丽俏佳人 bb 霜 www.qbi.cc 羽西 bb 霜 www.qhi.cc pba 柔肤全效 bb 霜 http://qzq.cc bb 霜是什么 www.tid.cc bb.yeahhandbag.com bb.zhenzhushop.com bb.duleina.com temp.5dpet.com temp.kxcfw.com temp.tntwl.com ccs.tntwl.com tbw.vps22.com tbw.haoxigou.com taob.yeahhandbag.com taob.kaoruan.com taob.yipinfenxiang.com

把选择的文件赋值给 ReadProgressStream,这样就可以实现传输进度条功能了。

但是在现实使用中, 这个功能还是不 work。

如果选择了发送文件, 弹出设备搜索窗口, 对接收设备进行选择。

设备选择和链接对话框其实在 32feet.net 里面实现的。

//-----------------------------------------------------// Get the peer //-----------------------------------------------------ProtocolFamily pf = this.protocolComboBox1.SelectedProtocol; state.m_conn = new Brecham.Obex.Net.GuiObexSessionConnection(pf, false, this.labelStatus); // Set our receive size and restrict our send size state.m_conn.ObexBufferSize = 2028; state.m_conn.MaxSendSize = 2048; try { if (!state.m_conn.Connect()) { //user cancelled the connect return; } } catch (Exception ex) { Type typeOfEx = ex.GetType(); if (typeof(ObexResponseException) != typeOfEx && typeof(System.Net.ProtocolViolationException) != typeOfExtbw 淘宝网 http://tbw.hj99.org taob www.tbwtbwtaob.com 美丽俏佳人 bb 霜 www.qbi.cc 羽西 bb 霜 www.qhi.cc pba 柔肤全效 bb 霜 http://qzq.cc bb 霜是什么 www.tid.cc bb.yeahhandbag.com bb.zhenzhushop.com bb.duleina.com temp.5dpet.com temp.kxcfw.com temp.tntwl.com ccs.tntwl.com tbw.vps22.com tbw.haoxigou.com taob.yeahhandbag.com taob.kaoruan.com taob.yipinfenxiang.com

&& typeof(System.IO.IOException) != typeOfEx && typeof(System.Net.Sockets.SocketException) != typeOfEx) { // Not one of the expected exception types, rethrow! throw; } String descr = ex.Message + "\r\n" + ex.GetType().ToString(); this.labelStatus.Text = "Connect failed: " + descr; MessageBox.Show(descr, "Connect failed"); return; }选择设备后,开始发送过程了。

Stream peerStream = state.m_conn.PeerStream;//-----------------------------------------------------// Send //-----------------------------------------------------try { ObexClientSession sess = state.m_conn.ObexClientSession; // this.labelStatus.Text = "Sending..."; this.progressBar1.Visible = true; StartProgressBarUpdater(state);tbw 淘宝网 http://tbw.hj99.org taob www.tbwtbwtaob.com 美丽俏佳人 bb 霜 www.qbi.cc 羽西 bb 霜 www.qhi.cc pba 柔肤全效 bb 霜 http://qzq.cc bb 霜是什么 www.tid.cc bb.yeahhandbag.com bb.zhenzhushop.com bb.duleina.com temp.5dpet.com temp.kxcfw.com temp.tntwl.com ccs.tntwl.com tbw.vps22.com tbw.haoxigou.com taob.yeahhandbag.com taob.kaoruan.com taob.yipinfenxiang.com

//sess.PutFrom(state.m_progressStream, putName, null, state.m_fileStream.Length); state.m_putCaller = new PutFromNtiCaller(sess.PutFrom); AsyncCallback cb = new AsyncCallback(PutCompleted); state.SetStartTime(); IAsyncResult ar = state.m_putCaller.BeginInvoke( state.m_progressStream, putName, null, state.m_fileStream.Length, cb, state);// Enable the Cancel button m_cancelled = false; buttonCancel.Enabled = true; buttonCancel.Tag = sess; // Give the button access to the session. } catch { // All OBEX errors occur on the delegate.BeginInvoke's thread, and // thus are seen on calling EndInvoke in the PutCompleted method. // // Just ensure the streams are closed etc, and rethrow. state.Dispose(); throw; }通过 ObexClientSession 保存发送到会话,用于取消发送。

PutFromNtiCaller 的 BeginInvoke()通过 线程发送文件。

tbw 淘宝网 http://tbw.hj99.org taob www.tbwtbwtaob.com 美丽俏佳人 bb 霜 www.qbi.cc 羽西 bb 霜 www.qhi.cc pba 柔肤全效 bb 霜 http://qzq.cc bb 霜是什么 www.tid.cc bb.yeahhandbag.com bb.zhenzhushop.com bb.duleina.com temp.5dpet.com temp.kxcfw.com temp.tntwl.com ccs.tntwl.com tbw.vps22.com tbw.haoxigou.com taob.yeahhandbag.com taob.kaoruan.com taob.yipinfenxiang.com

发送完毕,10M 的文件花了 3 分 45 秒。

我试过 30M 的文件也成功,但是文件不知道放哪里了。

我对发 送文件的设计是这样认为的,我不提倡用蓝牙发送很大的文件,如果需要蓝牙发送很大很大的文件,那样 需要考虑设计方案是否合理,为什么用蓝牙发送那么大的文件,真正的需求是什么,可替换方案是什么。

如果确实有使用蓝牙发送大文件的需要,可以使用 Brecham.Obex 来实现。

接收文件的设备,这个设备不需要安装任何程序,一般的 Windows Mobile 都有 Obex 的 Service 在运 行。

tbw 淘宝网 http://tbw.hj99.org taob www.tbwtbwtaob.com 美丽俏佳人 bb 霜 www.qbi.cc 羽西 bb 霜 www.qhi.cc pba 柔肤全效 bb 霜 http://qzq.cc bb 霜是什么 www.tid.cc bb.yeahhandbag.com bb.zhenzhushop.com bb.duleina.com temp.5dpet.com temp.kxcfw.com temp.tntwl.com ccs.tntwl.com tbw.vps22.com tbw.haoxigou.com taob.yeahhandbag.com taob.kaoruan.com taob.yipinfenxiang.com

文件保存后放到 My Documents 里面了。

其他相关文章可以参考我以前写的关于 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 之间的 Bluetooth 文件传输环境: VS 2008 + XP + Windows Mobile 6.5 + Brecham.Obex + 32feet.net 源代码:http://files.cnblogs.com/procoder/PutGuiCs.rartbw 淘宝网 http://tbw.hj99.org taob www.tbwtbwtaob.com 美丽俏佳人 bb 霜 www.qbi.cc 羽西 bb 霜 www.qhi.cc pba 柔肤全效 bb 霜 http://qzq.cc bb 霜是什么 www.tid.cc bb.yeahhandbag.com bb.zhenzhushop.com bb.duleina.com temp.5dpet.com temp.kxcfw.com temp.tntwl.com ccs.tntwl.com tbw.vps22.com tbw.haoxigou.com taob.yeahhandbag.com taob.kaoruan.com taob.yipinfenxiang.com

 
 

微信关注公众号,送福利!