Windows系統(tǒng)中使用C#編寫藍(lán)牙通信程序的簡單實(shí)例
現(xiàn)在很多電腦提供了藍(lán)牙支持,很多筆記本網(wǎng)卡也集成了藍(lán)牙功能,也可以采用USB藍(lán)牙方便的連接手機(jī)等藍(lán)牙設(shè)備進(jìn)行通信。
操作藍(lán)牙要使用類庫InTheHand.Net.Personal
首先在項(xiàng)目中引用該類庫;
static void Main(string[] args) { BluetoothRadio bluetoothRadio = BluetoothRadio.PrimaryRadio; if (bluetoothRadio == null) { Console.WriteLine("沒有找到本機(jī)藍(lán)牙設(shè)備!"); } else { Console.WriteLine("ClassOfDevice: " + bluetoothRadio.ClassOfDevice); Console.WriteLine("HardwareStatus: " + bluetoothRadio.HardwareStatus); Console.WriteLine("HciRevision: " + bluetoothRadio.HciRevision); Console.WriteLine("HciVersion: " + bluetoothRadio.HciVersion); Console.WriteLine("LmpSubversion: " + bluetoothRadio.LmpSubversion); Console.WriteLine("LmpVersion: " + bluetoothRadio.LmpVersion); Console.WriteLine("LocalAddress: " + bluetoothRadio.LocalAddress); Console.WriteLine("Manufacturer: " + bluetoothRadio.Manufacturer); Console.WriteLine("Mode: " + bluetoothRadio.Mode); Console.WriteLine("Name: " + bluetoothRadio.Name); Console.WriteLine("Remote:" + bluetoothRadio.Remote); Console.WriteLine("SoftwareManufacturer: " + bluetoothRadio.SoftwareManufacturer); Console.WriteLine("StackFactory: " + bluetoothRadio.StackFactory); } Console.ReadKey(); }
如果PC插入了藍(lán)牙適配器,便會顯示藍(lán)牙相關(guān)信息:
然后我們就要利用藍(lán)牙收發(fā)文件了:
前提是藍(lán)牙設(shè)備(如手機(jī))已經(jīng)和PC配對了
public partial class Form1 : Form { BluetoothRadio radio = null;//藍(lán)牙適配器 string sendFileName = null;//發(fā)送文件名 BluetoothAddress sendAddress = null;//發(fā)送目的地址 ObexListener listener = null;//監(jiān)聽器 string recDir = null;//接受文件存放目錄 Thread listenThread, sendThread;//發(fā)送/接收線程 public Form1() { InitializeComponent(); radio = BluetoothRadio.PrimaryRadio;//獲取當(dāng)前PC的藍(lán)牙適配器 CheckForIllegalCrossThreadCalls = false;//不檢查跨線程調(diào)用 if (radio == null)//檢查該電腦藍(lán)牙是否可用 { MessageBox.Show("這個電腦藍(lán)牙不可用!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } recDir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); labelRecDir.Text = recDir; } private void buttonSelectBluetooth_Click(object sender, EventArgs e)//選擇遠(yuǎn)程藍(lán)牙設(shè)備 { SelectBluetoothDeviceDialog dialog = new SelectBluetoothDeviceDialog(); dialog.ShowRemembered = true;//顯示已經(jīng)記住的藍(lán)牙設(shè)備 dialog.ShowAuthenticated = true;//顯示認(rèn)證過的藍(lán)牙設(shè)備 dialog.ShowUnknown = true;//顯示位置藍(lán)牙設(shè)備 if (dialog.ShowDialog() == DialogResult.OK) { sendAddress = dialog.SelectedDevice.DeviceAddress;//獲取選擇的遠(yuǎn)程藍(lán)牙地址 labelAddress.Text = "地址:" + sendAddress.ToString() + " 設(shè)備名:" + dialog.SelectedDevice.DeviceName; } } private void buttonSelectFile_Click(object sender, EventArgs e)//選擇要發(fā)送的本地文件 { OpenFileDialog dialog = new OpenFileDialog(); if (dialog.ShowDialog() == DialogResult.OK) { sendFileName = dialog.FileName;//設(shè)置文件名 labelPath.Text = Path.GetFileName(sendFileName); } } private void buttonSend_Click(object sender, EventArgs e)//發(fā)送按鈕 { sendThread = new Thread(sendFile);//開啟發(fā)送文件線程 sendThread.Start(); } private void sendFile()//發(fā)送文件方法 { ObexWebRequest request = new ObexWebRequest(sendAddress, Path.GetFileName(sendFileName));//創(chuàng)建網(wǎng)絡(luò)請求 WebResponse response = null; try { buttonSend.Enabled = false; request.ReadFile(sendFileName);//發(fā)送文件 labelInfo.Text = "開始發(fā)送!"; response = request.GetResponse();//獲取回應(yīng) labelInfo.Text = "發(fā)送完成!"; } catch (System.Exception ex) { MessageBox.Show("發(fā)送失??!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); labelInfo.Text = "發(fā)送失敗!"; } finally { if (response != null) { response.Close(); buttonSend.Enabled = true; } } } private void buttonselectRecDir_Click(object sender, EventArgs e)//選擇接受目錄 { FolderBrowserDialog dialog = new FolderBrowserDialog(); dialog.Description = "請選擇藍(lán)牙接收文件的存放路徑"; if (dialog.ShowDialog() == DialogResult.OK) { recDir = dialog.SelectedPath; labelRecDir.Text = recDir; } } private void buttonListen_Click(object sender, EventArgs e)//開始/停止監(jiān)聽 { if (listener == null || !listener.IsListening) { radio.Mode = RadioMode.Discoverable;//設(shè)置本地藍(lán)牙可被檢測 listener = new ObexListener(ObexTransport.Bluetooth);//創(chuàng)建監(jiān)聽 listener.Start(); if (listener.IsListening) { buttonListen.Text = "停止"; labelRecInfo.Text = "開始監(jiān)聽"; listenThread = new Thread(receiveFile);//開啟監(jiān)聽線程 listenThread.Start(); } } else { listener.Stop(); buttonListen.Text = "監(jiān)聽"; labelRecInfo.Text = "停止監(jiān)聽"; } } private void receiveFile()//收文件方法 { ObexListenerContext context = null; ObexListenerRequest request = null; while (listener.IsListening) { context = listener.GetContext();//獲取監(jiān)聽上下文 if (context == null) { break; } request = context.Request;//獲取請求 string uriString = Uri.UnescapeDataString(request.RawUrl);//將uri轉(zhuǎn)換成字符串 string recFileName = recDir + uriString; request.WriteFile(recFileName);//接收文件 labelRecInfo.Text = "收到文件" + uriString.TrimStart(new char[] { '/' }); } } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { if (sendThread != null) { sendThread.Abort(); } if (listenThread != null) { listenThread.Abort(); } if (listener != null && listener.IsListening) { listener.Stop(); } } }
程序界面:
SelectBluetoothDeviceDialog是一個InTheHand.Net.Personal提供的窗體,用于選擇藍(lán)牙設(shè)備:
從手機(jī)往電腦發(fā)送文件需要在電腦上開啟監(jiān)聽ObexListener,才能收到文件。
核心代碼:
BluetoothRadio radio = null;//藍(lán)牙適配器 string sendFileName = null;//發(fā)送文件名 BluetoothAddress sendAddress = null;//發(fā)送目的地址 ObexListener listener = null;//監(jiān)聽器 string recDir = null;//接受文件存放目錄 Thread listenThread, sendThread;//發(fā)送/接收線程 radio = BluetoothRadio.PrimaryRadio;//獲取當(dāng)前PC的藍(lán)牙適配器 //關(guān)于藍(lán)牙設(shè)備選擇對話框 SelectBluetoothDeviceDialog dialog = new SelectBluetoothDeviceDialog(); dialog.ShowRemembered = true;//顯示已經(jīng)記住的藍(lán)牙設(shè)備 dialog.ShowAuthenticated = true;//顯示認(rèn)證過的藍(lán)牙設(shè)備 dialog.ShowUnknown = true;//顯示位置藍(lán)牙設(shè)備 sendAddress = dialog.SelectedDevice.DeviceAddress;//獲取選擇的遠(yuǎn)程藍(lán)牙地址 //發(fā)送文件操作 ObexWebRequest request = new ObexWebRequest(sendAddress, Path.GetFileName(sendFileName));//創(chuàng)建網(wǎng)絡(luò)請求 WebResponse response = null; request.ReadFile(sendFileName);//發(fā)送文件 response = request.GetResponse();//獲取回應(yīng) response.Close(); //接收文件 radio.Mode = RadioMode.Discoverable;//設(shè)置本地藍(lán)牙可被檢測 listener = new ObexListener(ObexTransport.Bluetooth);//創(chuàng)建監(jiān)聽 listener.Start(); listener.Stop(); ObexListenerContext context = null; ObexListenerRequest request = null; context = listener.GetContext();//獲取監(jiān)聽上下文 request = context.Request;//獲取請求 string uriString = Uri.UnescapeDataString(request.RawUrl);//將uri轉(zhuǎn)換成字符串 string recFileName = recDir + uriString; request.WriteFile(recFileName);//接收文件 labelRecInfo.Text = "收到文件" + uriString.TrimStart(new char[] { '/' }
PS:關(guān)于InTheHand.Net.Personal
InTheHand.Net.Personal.dll來源于32feet.NET。
32feet.NET是shared-source的項(xiàng)目,支持CF.net 2.0以及桌面版本.NET framework,提供短距離領(lǐng)域(personal area networking technologie)的通信功能,支持bluetooth,Infrared(IrDA)紅外等. 想了解更多的信息可以參考其 官方主頁,其項(xiàng)目的安裝包和源碼是放在微軟的開源工程網(wǎng)站CodePlex上面的,作為.NET開發(fā)人員我們必須要上的網(wǎng)站就是CodePlex~
相關(guān)文章
Winform控件優(yōu)化Paint事件實(shí)現(xiàn)圓角組件及提取繪制圓角的方法
這篇文章主要介紹了Winform控件優(yōu)化Paint事件實(shí)現(xiàn)圓角組件及提取繪制圓角的方法,Windows?11下所有控件已經(jīng)默認(rèn)采用圓角,其效果更好、相對有著更好的優(yōu)化,只是這是默認(rèn)的行為,無法進(jìn)一步自定義,更多詳情需要的小伙伴可以參考下面文章內(nèi)容2022-08-08C#使用NPOI實(shí)現(xiàn)Excel和DataTable的互轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了C#使用NPOI實(shí)現(xiàn)Excel和DataTable的互轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02c# 重載WndProc,實(shí)現(xiàn)重寫“最小化”的實(shí)現(xiàn)方法
在做“亦歌桌面版”的時候,發(fā)現(xiàn)當(dāng)打開歌詞狀態(tài)下,用最小化隱藏窗體到托盤的話(如下code #1),在調(diào)出發(fā)現(xiàn)歌詞縮小了(雖然顯現(xiàn)的窗體大小跟剛才一樣),從這點(diǎn)看調(diào)用該方法其實(shí)窗體大小是改變了的(這個過程只是不可視而已)。2009-02-02C#結(jié)合JavaScript實(shí)現(xiàn)上傳視頻到騰訊云點(diǎn)播平臺的操作方法
這篇文章主要介紹了C#結(jié)合JavaScript實(shí)現(xiàn)上傳視頻到騰訊云點(diǎn)播平臺,上傳視頻功能,主要要解決兩個問題,一是在服務(wù)端通過C#生成簽名和SDKID,二是在客戶端通過JavaScript上傳視頻到騰訊云點(diǎn)播服務(wù)器,感興趣的朋友跟隨小編一起看看吧2023-11-11C#讀取xml節(jié)點(diǎn)數(shù)據(jù)方法小結(jié)
這篇文章主要介紹了C#讀取xml節(jié)點(diǎn)數(shù)據(jù)的方法,實(shí)例總結(jié)了C#針對XML文件節(jié)點(diǎn)操作的相關(guān)技巧,需要的朋友可以參考下2015-06-06C#中的modbus Tcp協(xié)議的數(shù)據(jù)抓取和使用解析
這篇文章主要介紹了C#中的modbus Tcp協(xié)議的數(shù)據(jù)抓取和使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07