Windows系統(tǒng)中使用C#編寫(xiě)藍(lán)牙通信程序的簡(jiǎn)單實(shí)例
現(xiàn)在很多電腦提供了藍(lán)牙支持,很多筆記本網(wǎng)卡也集成了藍(lán)牙功能,也可以采用USB藍(lán)牙方便的連接手機(jī)等藍(lán)牙設(shè)備進(jìn)行通信。
操作藍(lán)牙要使用類(lèi)庫(kù)InTheHand.Net.Personal
首先在項(xiàng)目中引用該類(lèi)庫(kù);
static void Main(string[] args)
{
BluetoothRadio bluetoothRadio = BluetoothRadio.PrimaryRadio;
if (bluetoothRadio == null)
{
Console.WriteLine("沒(méi)有找到本機(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)牙適配器,便會(huì)顯示藍(lán)牙相關(guān)信息:

然后我們就要利用藍(lán)牙收發(fā)文件了:
前提是藍(lán)牙設(shè)備(如手機(jī))已經(jīng)和PC配對(duì)了
public partial class Form1 : Form
{
BluetoothRadio radio = null;//藍(lán)牙適配器
string sendFileName = null;//發(fā)送文件名
BluetoothAddress sendAddress = null;//發(fā)送目的地址
ObexListener listener = null;//監(jiān)聽(tīng)器
string recDir = null;//接受文件存放目錄
Thread listenThread, sendThread;//發(fā)送/接收線(xiàn)程
public Form1()
{
InitializeComponent();
radio = BluetoothRadio.PrimaryRadio;//獲取當(dāng)前PC的藍(lán)牙適配器
CheckForIllegalCrossThreadCalls = false;//不檢查跨線(xiàn)程調(diào)用
if (radio == null)//檢查該電腦藍(lán)牙是否可用
{
MessageBox.Show("這個(gè)電腦藍(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)證過(guò)的藍(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);//開(kāi)啟發(fā)送文件線(xiàn)程
sendThread.Start();
}
private void sendFile()//發(fā)送文件方法
{
ObexWebRequest request = new ObexWebRequest(sendAddress, Path.GetFileName(sendFileName));//創(chuàng)建網(wǎng)絡(luò)請(qǐng)求
WebResponse response = null;
try
{
buttonSend.Enabled = false;
request.ReadFile(sendFileName);//發(fā)送文件
labelInfo.Text = "開(kāi)始發(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 = "請(qǐng)選擇藍(lán)牙接收文件的存放路徑";
if (dialog.ShowDialog() == DialogResult.OK)
{
recDir = dialog.SelectedPath;
labelRecDir.Text = recDir;
}
}
private void buttonListen_Click(object sender, EventArgs e)//開(kāi)始/停止監(jiān)聽(tīng)
{
if (listener == null || !listener.IsListening)
{
radio.Mode = RadioMode.Discoverable;//設(shè)置本地藍(lán)牙可被檢測(cè)
listener = new ObexListener(ObexTransport.Bluetooth);//創(chuàng)建監(jiān)聽(tīng)
listener.Start();
if (listener.IsListening)
{
buttonListen.Text = "停止";
labelRecInfo.Text = "開(kāi)始監(jiān)聽(tīng)";
listenThread = new Thread(receiveFile);//開(kāi)啟監(jiān)聽(tīng)線(xiàn)程
listenThread.Start();
}
}
else
{
listener.Stop();
buttonListen.Text = "監(jiān)聽(tīng)";
labelRecInfo.Text = "停止監(jiān)聽(tīng)";
}
}
private void receiveFile()//收文件方法
{
ObexListenerContext context = null;
ObexListenerRequest request = null;
while (listener.IsListening)
{
context = listener.GetContext();//獲取監(jiān)聽(tīng)上下文
if (context == null)
{
break;
}
request = context.Request;//獲取請(qǐng)求
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是一個(gè)InTheHand.Net.Personal提供的窗體,用于選擇藍(lán)牙設(shè)備:

從手機(jī)往電腦發(fā)送文件需要在電腦上開(kāi)啟監(jiān)聽(tīng)ObexListener,才能收到文件。

核心代碼:
BluetoothRadio radio = null;//藍(lán)牙適配器
string sendFileName = null;//發(fā)送文件名
BluetoothAddress sendAddress = null;//發(fā)送目的地址
ObexListener listener = null;//監(jiān)聽(tīng)器
string recDir = null;//接受文件存放目錄
Thread listenThread, sendThread;//發(fā)送/接收線(xiàn)程
radio = BluetoothRadio.PrimaryRadio;//獲取當(dāng)前PC的藍(lán)牙適配器
//關(guān)于藍(lán)牙設(shè)備選擇對(duì)話(huà)框
SelectBluetoothDeviceDialog dialog = new SelectBluetoothDeviceDialog();
dialog.ShowRemembered = true;//顯示已經(jīng)記住的藍(lán)牙設(shè)備
dialog.ShowAuthenticated = true;//顯示認(rèn)證過(guò)的藍(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ò)請(qǐng)求
WebResponse response = null;
request.ReadFile(sendFileName);//發(fā)送文件
response = request.GetResponse();//獲取回應(yīng)
response.Close();
//接收文件
radio.Mode = RadioMode.Discoverable;//設(shè)置本地藍(lán)牙可被檢測(cè)
listener = new ObexListener(ObexTransport.Bluetooth);//創(chuàng)建監(jiān)聽(tīng)
listener.Start();
listener.Stop();
ObexListenerContext context = null;
ObexListenerRequest request = null;
context = listener.GetContext();//獲取監(jiān)聽(tīng)上下文
request = context.Request;//獲取請(qǐng)求
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來(lái)源于32feet.NET。
32feet.NET是shared-source的項(xiàng)目,支持CF.net 2.0以及桌面版本.NET framework,提供短距離領(lǐng)域(personal area networking technologie)的通信功能,支持bluetooth,Infrared(IrDA)紅外等. 想了解更多的信息可以參考其 官方主頁(yè),其項(xiàng)目的安裝包和源碼是放在微軟的開(kāi)源工程網(wǎng)站CodePlex上面的,作為.NET開(kāi)發(fā)人員我們必須要上的網(wǎng)站就是CodePlex~
相關(guān)文章
C#創(chuàng)建自定義控件及添加自定義屬性和事件使用實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于C#創(chuàng)建自定義控件及添加自定義屬性和事件使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
C#使用ADO.Net連接數(shù)據(jù)庫(kù)與DbProviderFactory實(shí)現(xiàn)多數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)
這篇文章介紹了C#使用ADO.Net連接數(shù)據(jù)庫(kù)與DbProviderFactory實(shí)現(xiàn)多數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
C#組件系列 你值得擁有的一款Excel處理神器Spire.XLS
又一款Excel處理神器Spire.XLS,這篇文章主要為大家詳細(xì)介紹了第三方組件Spire.XLS,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
探討C#中Dispose方法與Close方法的區(qū)別詳解
本篇文章是對(duì)C#中Dispose方法與Close方法的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Unity ScrollView實(shí)現(xiàn)動(dòng)態(tài)列表生成
這篇文章主要為大家詳細(xì)介紹了Unity ScrollView實(shí)現(xiàn)動(dòng)態(tài)列表生成,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
C# 定時(shí)器定時(shí)更新的簡(jiǎn)單實(shí)例
這篇文章主要介紹了C#中定時(shí)器定時(shí)更新的簡(jiǎn)單實(shí)例。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
C#結(jié)合數(shù)據(jù)庫(kù)的數(shù)據(jù)采集器示例
這篇文章主要介紹了C#結(jié)合數(shù)據(jù)庫(kù)的數(shù)據(jù)采集器,功能比較實(shí)用,需要的朋友可以參考下2014-07-07

