首页 > 编程 > C# > 正文

Windows系统中使用C#编写蓝牙通信程序的简单实例

2020-01-24 01:12:28
字体:
来源:转载
供稿:网友

现在很多电脑提供了蓝牙支持,很多笔记本网卡也集成了蓝牙功能,也可以采用USB蓝牙方便的连接手机等蓝牙设备进行通信。
操作蓝牙要使用类库InTheHand.Net.Personal
首先在项目中引用该类库;

static void Main(string[] args) {   BluetoothRadio bluetoothRadio = BluetoothRadio.PrimaryRadio;   if (bluetoothRadio == null)   {   Console.WriteLine("没有找到本机蓝牙设备!");   }   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插入了蓝牙适配器,便会显示蓝牙相关信息:

201648155454003.jpg (544×265)

 然后我们就要利用蓝牙收发文件了:
前提是蓝牙设备(如手机)已经和PC配对了

public partial class Form1 : Form {   BluetoothRadio radio = null;//蓝牙适配器   string sendFileName = null;//发送文件名   BluetoothAddress sendAddress = null;//发送目的地址   ObexListener listener = null;//监听器   string recDir = null;//接受文件存放目录   Thread listenThread, sendThread;//发送/接收线程    public Form1()   {     InitializeComponent();     radio = BluetoothRadio.PrimaryRadio;//获取当前PC的蓝牙适配器     CheckForIllegalCrossThreadCalls = false;//不检查跨线程调用     if (radio == null)//检查该电脑蓝牙是否可用     {       MessageBox.Show("这个电脑蓝牙不可用!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);     }     recDir = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);     labelRecDir.Text = recDir;   }    private void buttonSelectBluetooth_Click(object sender, EventArgs e)//选择远程蓝牙设备   {     SelectBluetoothDeviceDialog dialog = new SelectBluetoothDeviceDialog();     dialog.ShowRemembered = true;//显示已经记住的蓝牙设备     dialog.ShowAuthenticated = true;//显示认证过的蓝牙设备     dialog.ShowUnknown = true;//显示位置蓝牙设备     if (dialog.ShowDialog() == DialogResult.OK)     {       sendAddress = dialog.SelectedDevice.DeviceAddress;//获取选择的远程蓝牙地址       labelAddress.Text = "地址:" + sendAddress.ToString() + "  设备名:" + dialog.SelectedDevice.DeviceName;     }   }    private void buttonSelectFile_Click(object sender, EventArgs e)//选择要发送的本地文件   {     OpenFileDialog dialog = new OpenFileDialog();     if (dialog.ShowDialog() == DialogResult.OK)     {       sendFileName = dialog.FileName;//设置文件名       labelPath.Text = Path.GetFileName(sendFileName);     }   }    private void buttonSend_Click(object sender, EventArgs e)//发送按钮   {     sendThread = new Thread(sendFile);//开启发送文件线程     sendThread.Start();   }    private void sendFile()//发送文件方法   {     ObexWebRequest request = new ObexWebRequest(sendAddress, Path.GetFileName(sendFileName));//创建网络请求     WebResponse response = null;     try     {       buttonSend.Enabled = false;       request.ReadFile(sendFileName);//发送文件       labelInfo.Text = "开始发送!";       response = request.GetResponse();//获取回应       labelInfo.Text = "发送完成!";     }     catch (System.Exception ex)     {       MessageBox.Show("发送失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);       labelInfo.Text = "发送失败!";     }     finally     {       if (response != null)       {         response.Close();         buttonSend.Enabled = true;       }     }   }    private void buttonselectRecDir_Click(object sender, EventArgs e)//选择接受目录   {     FolderBrowserDialog dialog = new FolderBrowserDialog();     dialog.Description = "请选择蓝牙接收文件的存放路径";     if (dialog.ShowDialog() == DialogResult.OK)     {       recDir = dialog.SelectedPath;       labelRecDir.Text = recDir;     }   }    private void buttonListen_Click(object sender, EventArgs e)//开始/停止监听   {     if (listener == null || !listener.IsListening)     {       radio.Mode = RadioMode.Discoverable;//设置本地蓝牙可被检测       listener = new ObexListener(ObexTransport.Bluetooth);//创建监听       listener.Start();       if (listener.IsListening)       {         buttonListen.Text = "停止";         labelRecInfo.Text = "开始监听";         listenThread = new Thread(receiveFile);//开启监听线程         listenThread.Start();       }     }     else     {        listener.Stop();       buttonListen.Text = "监听";       labelRecInfo.Text = "停止监听";     }   }    private void receiveFile()//收文件方法   {     ObexListenerContext context = null;     ObexListenerRequest request = null;     while (listener.IsListening)     {       context = listener.GetContext();//获取监听上下文       if (context == null)       {         break;       }       request = context.Request;//获取请求       string uriString = Uri.UnescapeDataString(request.RawUrl);//将uri转换成字符串       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();     }   } } 

程序界面:

201648155559869.jpg (427×270)

SelectBluetoothDeviceDialog是一个InTheHand.Net.Personal提供的窗体,用于选择蓝牙设备:

201648155651467.jpg (650×495)

从手机往电脑发送文件需要在电脑上开启监听ObexListener,才能收到文件。

201648155708976.jpg (427×270)

核心代码:

BluetoothRadio radio = null;//蓝牙适配器 string sendFileName = null;//发送文件名 BluetoothAddress sendAddress = null;//发送目的地址 ObexListener listener = null;//监听器 string recDir = null;//接受文件存放目录 Thread listenThread, sendThread;//发送/接收线程  radio = BluetoothRadio.PrimaryRadio;//获取当前PC的蓝牙适配器  //关于蓝牙设备选择对话框 SelectBluetoothDeviceDialog dialog = new SelectBluetoothDeviceDialog(); dialog.ShowRemembered = true;//显示已经记住的蓝牙设备 dialog.ShowAuthenticated = true;//显示认证过的蓝牙设备 dialog.ShowUnknown = true;//显示位置蓝牙设备 sendAddress = dialog.SelectedDevice.DeviceAddress;//获取选择的远程蓝牙地址  //发送文件操作 ObexWebRequest request = new ObexWebRequest(sendAddress, Path.GetFileName(sendFileName));//创建网络请求 WebResponse response = null; request.ReadFile(sendFileName);//发送文件 response = request.GetResponse();//获取回应 response.Close();  //接收文件 radio.Mode = RadioMode.Discoverable;//设置本地蓝牙可被检测 listener = new ObexListener(ObexTransport.Bluetooth);//创建监听 listener.Start(); listener.Stop();  ObexListenerContext context = null; ObexListenerRequest request = null; context = listener.GetContext();//获取监听上下文 request = context.Request;//获取请求 string uriString = Uri.UnescapeDataString(request.RawUrl);//将uri转换成字符串 string recFileName = recDir + uriString; request.WriteFile(recFileName);//接收文件 labelRecInfo.Text = "收到文件" + uriString.TrimStart(new char[] { '/' } 

PS:关于InTheHand.Net.Personal
InTheHand.Net.Personal.dll来源于32feet.NET。
32feet.NET是shared-source的项目,支持CF.net 2.0以及桌面版本.NET framework,提供短距离领域(personal area networking technologie)的通信功能,支持bluetooth,Infrared(IrDA)红外等. 想了解更多的信息可以参考其 官方主页,其项目的安装包和源码是放在微软的开源工程网站CodePlex上面的,作为.NET开发人员我们必须要上的网站就是CodePlex~

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表