Windows Mobile下通過藍芽(Bluetooth)發送大檔案的實現

來源:互聯網
上載者:User
背景

在前一篇文章 Windows Mobile 與 PC之間的Bluetooth 檔案傳輸 講述了如何使用Obex開發Bluetooth檔案傳輸的應用。其中BenBen789同學指出不能傳輸大檔案,因此需要實現大檔案的傳輸。

 簡介

本文講述在Windows Mobile下通過藍芽發送大檔案的實現。

 實現

這個發送大檔案的實現是Brecham.Obex的例子程式,基於Brecham.Obex庫來開發的,Brecham.Obex是基於32feet.net的基礎上實現的,可以參考Brecham.Obex。這個庫可以免費使用,但是需要註明依賴。另一方面我沒有找到這個庫的原始碼。

 

發送程式的主視窗。

 

使用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);
}//if

把選擇的檔案賦值給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) != typeOfEx
&& 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);
//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()通過線程傳送檔案。

發送完畢,10M的檔案花了3分45秒。我試過30M的檔案也成功,但是檔案不知道放哪裡了。我對傳送檔案的設計是這樣認為的,我不提倡用藍芽發送很大的檔案,如果需要藍芽發送很大很大的檔案,那樣需要考慮設計方案是否合理,為什麼用藍芽發送那麼大的檔案,真正的需求是什麼,可替換方案是什麼。如果確實有使用藍芽發送大檔案的需要,可以使用Brecham.Obex來實現。

 

接收檔案的裝置,這個裝置不需要安裝任何程式,一般的Windows Mobile都有Obex的Service在運行。

 

檔案儲存後放到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.rar

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.