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

现在很多电脑提供了蓝牙支持,很多笔记本网卡也集成了蓝牙功能,也可以采用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插入了蓝牙适配器,便会显示蓝牙相关信息:

然后我们就要利用蓝牙收发文件了:
前提是蓝牙设备(如手机)已经和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();
    }
  }
}

程序界面:

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

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

核心代码:

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~

(0)

相关推荐

  • Android系统中的蓝牙连接程序编写实例教程

    Bluetooth结构 1.JAVA层 frameworks/base/core/java/android/bluetooth/ 包含了bluetooth的JAVA类. 2.JNI层 frameworks/base/core/jni/android_bluetooth_开头的文件 定义了bluez通过JNI到上层的接口. frameworks/base/core/jni/android_server_bluetoothservice.cpp 调用硬件适配层的接口system/bluetooth/

  • 微信小程序--Ble蓝牙

    有一段时间没有.没有写关于小程序的文章了.3月28日,微信的api又一次新的更新.期待已久的蓝牙api更新.就开始撸一番. 源码地址 1.简述 蓝牙适配器接口是基础库版本 1.1.0 开始支持. iOS 微信客户端 6.5.6 版本开始支持,Android 客户端暂不支持 蓝牙总共增加了18个api接口. 2.Api分类 搜索类 连接类 通信类 3.API的具体使用 详细见官网: https://mp.weixin.qq.com/debug/wxadoc/dev/api/bluetooth.ht

  • Android蓝牙开发深入解析

    1. 使用蓝牙的响应权限 复制代码 代码如下: <uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 2. 配置本机蓝牙模块 在这里首先要了解对蓝牙操作一个核心类BluetoothAdapter 复制代码 代码如下: Bluetoot

  • Android Bluetooth蓝牙技术使用流程详解

    在上篇文章给大家介绍了Android Bluetooth蓝牙技术初体验相关内容,感兴趣的朋友可以点击了解详情. 一:蓝牙设备之间的通信主要包括了四个步骤 设置蓝牙设备 寻找局域网内可能或者匹配的设备 连接设备 设备之间的数据传输 二:具体编程实现 1. 启动蓝牙功能 首先通过调用静态方法getDefaultAdapter()获取蓝牙适配器BluetoothAdapter,如果返回为空,则无法继续执行了.例如: BluetoothAdapter mBluetoothAdapter = Blueto

  • 客户端实现蓝牙接收(C#)知识总结

    在实现蓝牙接收时,网上的资料很多,使用起来也很简单,但是我觉得还是有必要把这些知识总结下来.蓝牙开发需要用到一个第三方的库InTheHand.Net.Personal.dll,其中关键的两个类是 BluetoothClient 和 BluetoothListener,首先开启一个子线程来不断的接收数据,使用很简单,直接上代码: 复制代码 代码如下: using InTheHand.Net.Sockets; using System.Threading; public MainWindow() {

  • Android单片机与蓝牙模块通信实例代码

    啦啦毕业了,毕业前要写毕业设计,需要写一个简单的蓝牙APP进行交互,通过参考网上资料,问题顺利搞定,下面小编把具体实现思路分享给大家,供大家参考. 1.Android蓝牙编程 蓝牙3.0及以下版本编程需要使用UUID,UUID是通用唯一识别码(Universally Unique Identifier),这是一个软件构建的标准,也是被开源基金会组织应用在分布式计算环境领域的一部分.在蓝牙3.0及下一版本中,UUID被用于唯一标识一个服务,比如文件传输服务,串口服务.打印机服务等,如下: #蓝牙串

  • Android手机通过蓝牙连接佳博打印机的实例代码

    所使用的打印机为佳博打印机,支持蓝牙.wifi.usb我所使用的是通过蓝牙来连接. 在网上找到一个佳博官方针对安卓开发的App源码,但是各种的跳转,没有看太懂,所以又去问度娘,找到了一个不错的文章 Android对于蓝牙开发从2.0版本的sdk才开始支持,而且模拟器不支持,测试至少需要两部手机,所以制约了很多技术人员的开发. 1. 首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限 // 管理蓝牙设备的权限 <uses-permissionandroid:name="

  • Android编程之蓝牙测试实例

    本文实例讲述了Android编程之蓝牙测试.分享给大家供大家参考.具体分析如下: 一.软件平台: win7 + eclipse + sdk 二.设计思路: 配合倒计时定时器实现蓝牙打开,可见,扫描三个功能 三.源代码: main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/re

  • 分享Android 蓝牙4.0(ble)开发的解决方案

    最近,随着智能穿戴式设备.智能医疗以及智能家居的普及,蓝牙开发在移动开中显得非常的重要.由于公司需要,研究了一下,蓝牙4.0在Android中的应用. 以下是我的一些总结. 1.先介绍一下关于蓝牙4.0中的一些名词吧:    (1).GATT(Gneric Attibute  Profile) 通过ble连接,读写属性类小数据Profile通用的规范.现在所有的ble应用Profile  都是基于GATT (2).ATT(Attribute Protocal) GATT是基于ATT Potoca

  • android实现蓝牙文件发送的实例代码,支持多种机型

    最近项目上需要实现蓝牙传输apk的一个功能,能够搜索周围的蓝牙手机并分享文件.从需求上讲android手机自带的蓝牙传输模块就可以满足需要了,实现也很简单.不过让人头疼的是,虽然说一般的主流机型都配置有蓝牙模块,但是android机型碎片化太严重,不同android版本手机蓝牙功能也不一样.4.0.3以下版本和以上版本使用的蓝牙包是不同的,分别是"com.android.bluetooth"和"com.mediatek.bluetooth".还有一些厂商对蓝牙模块进

随机推荐