如何用C#在PC上查找连接蓝牙设备并实现数据传输

一、前言

本文将会详细介绍如何使用C#语言在PC上实现蓝牙设备的搜索与数据传输。在使用之前我们需要先安装对应的.net Framework和Win32 API支持库文件。

二、搜索蓝牙设备
1. 使用WMI查找
我们可以使用WMI对象获取当前计算机中的所有蓝牙设备并进行遍历。搜索蓝牙设备可以通过以下代码实现:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PnPEntity where DeviceID like '%_VID_%%%' or DeviceID like '%_vid_%%%'");
foreach (ManagementObject device in searcher.Get())
{
    String HardwareID = (string[])device["HardwareID"] ?? new string[0];
    if (HardwareID.Length < 1)
        continue;

    if (HardwareID[0].ToLower().Contains("vid_0489")) //根据蓝牙设备的厂家VID判断是否为蓝牙设备
    {
        String id = (string)device["PNPDeviceID"];
    }
}
  1. 使用API查找
    除了WMI,我们还可以通过Win32 API函数来进行查找蓝牙设备。其中主要的API有BluetoothFindFirstRadio和BluetoothFindNextRadio函数。搜索蓝牙设备可以通过以下代码实现:
public static Guid BLUETOOTH_DEVICE_GUID = new Guid("00001101-0000-1000-8000-00805F9B34FB");
public static Guid BLUETOOTH_SERVICE_BROWSE_GUID = new Guid("{00000000-0000-0000-0000-000000000000}");

[DllImport("BluetoothAPIs.dll", SetLastError = true)]
public static extern IntPtr BluetoothFindFirstRadio(ref BLUETOOTH_FIND_RADIO_PARAMS pbtfrp, ref IntPtr phRadio);

[DllImport("BluetoothAPIs.dll", SetLastError = true)]
public static extern bool BluetoothFindNextRadio(IntPtr hFind, ref IntPtr phRadio);

[DllImport("BluetoothAPIs.dll", SetLastError = true)]
public static extern bool BluetoothFindDeviceClose(IntPtr hFind);

[DllImport("BluetoothAPIs.dll", SetLastError = true)]
public static extern IntPtr BluetoothFindFirstDevice(ref BLUETOOTH_DEVICE_SEARCH_PARAMS pbtsp, ref BLUETOOTH_DEVICE_INFO pbtdi);

[DllImport("BluetoothAPIs.dll", SetLastError = true)]
public static extern bool BluetoothFindNextDevice(IntPtr hFind, ref BLUETOOTH_DEVICE_INFO pbtdi);

[DllImport("BluetoothAPIs.dll", SetLastError = true)]
public static extern bool BluetoothSetServiceState(IntPtr hRadio, ref BLUETOOTH_DEVICE_INFO pbtdi, ref Guid pGuidService, uint dwServiceFlags);

public static void SearchBluetoothDevices()
{
    BLUETOOTH_FIND_DEVICE_SEARCH_PARAMS searchParams = new BLUETOOTH_FIND_DEVICE_SEARCH_PARAMS();
    searchParams.fReturnAuthenticated = true;
    searchParams.fReturnRemembered = true;
    searchParams.fReturnUnknown = true;
    searchParams.fReturnConnected = true;
    searchParams.fIssueInquiry = true;
    searchParams.cTimeoutMultiplier = 4;
    searchParams.hRadio = IntPtr.Zero;

    BLUETOOTH_DEVICE_INFO deviceInfo = new BLUETOOTH_DEVICE_INFO();
    deviceInfo.dwSize = Marshal.SizeOf(deviceInfo);

    IntPtr hFind = BluetoothFindFirstDevice(ref searchParams, ref deviceInfo);

    while (hFind.ToInt64() != -1)
    {
        Debug.WriteLine(deviceInfo.szName);

        BluetoothFindNextDevice(hFind, ref deviceInfo);
    }
    BluetoothFindDeviceClose(hFind.ToInt64());
}

三、实现数据传输
当我们找到了需要连接的蓝牙设备之后,接下来便是实现数据的传输。蓝牙数据传输的方式一般有两种,采用RFCOMM协议或采用SPP协议。这里我们以RFCOMM协议为例,提供以下两个示例代码。

  1. 基本数据传输
    在RFCOMM协议下,我们需要使用BluetoothSerialPort类来进行数据的发送和接收。这里提供一个基本的代码示例。
using System.IO.Ports;
using Windows.Devices.Bluetooth.Rfcomm;
using Windows.Devices.Enumeration;

//...

//创建蓝牙socket并连接蓝牙设备
private async Task<bool> ConnectAsync(string deviceId, Guid serviceUuid)
{
    var startupTask = StartupTask.GetAsync("MyStartupTaskId");

    RfcommDeviceService rfcommService;
    try
    {
        //建立设备
        DeviceInformation allPairedDevices =
            await DeviceInformation.CreateFromIdAsync(deviceId);

        rfcommService =
            await RfcommDeviceService.FromIdAsync(allPairedDevices.Id);

        if (rfcommService == null)
        {
            Debug.WriteLine("此设备无法进行无线通讯。");
            return false;
        }

        //创建蓝牙socket并连接蓝牙设备
        socket = new StreamSocket();
        await socket.ConnectAsync(
            rfcommService.ConnectionHostName,
            rfcommService.ConnectionServiceName,
            SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication);

        DataReader reader = new DataReader(socket.InputStream);
        DataWriter writer = new DataWriter(socket.OutputStream);

        while (true)
        {
            //发送数据
            writer.WriteBytes(new byte[] { 0x30, 0x31, 0x32, 0x33, 0x34 });
            await writer.StoreAsync();

            //读取响应数据
            await reader.LoadAsync(1024);
            byte[] responseBytes = new byte[reader.UnconsumedBufferLength];
            reader.ReadBytes(responseBytes);
            Debug.WriteLine($"响应:{Encoding.UTF8.GetString(responseBytes)}");

            await Task.Delay(1000);
        }
    }
    catch (Exception e)
    {
        Debug.WriteLine($"发生异常:{e.Message}");
        return false;
    }
}

  1. 创建虚拟串口
    我们可以使用第三方类库“32feet.NET”来创建虚拟串口。首先我们需要通过该类库创建一个蓝牙客户端,通过客户端的Stream属性进行数据的读写操作。代码示例如下:
string selectDeviceName = "<Your Device Name>";
string serviceString = BluetoothService.SerialPort.ToString();
BluetoothAddress selectDeviceAddress = BluetoothAddress.None;
BluetoothClient bluetoothClient = new BluetoothClient();
BluetoothDeviceInfo selectDevice = null;
Stream btStream = null;

//查找并连接蓝牙设备
BluetoothDeviceInfo[] devices = bluetoothClient.DiscoverDevices();
foreach (BluetoothDeviceInfo device in devices)
{
    if (device.DeviceName.Equals(selectDeviceName))
    {
        selectDevice = device;
        break;
    }
}
if (selectDevice == null)
{
    //未找到目标蓝牙
}
else
{
    //创建RFCOMM蓝牙服务
    BluetoothClient bc = new BluetoothClient();
    bc.Connect(selectDevice.DeviceAddress, new Guid("{00001101-0000-1000-8000-00805F9B34FB}"));

    //打开串口
    btStream = bc.GetStream();
    if (btStream == null)
    {
        //无法打开串口
    }

    //开始读取数据
    bool startExecuted = false;
    byte[] buffer = new byte[4096];
    while (true)
    {
        if (btStream != null && btStream.CanRead)
        {
            int bytesRead = btStream.Read(buffer,0,buffer.Length);

            //...
        }

        Thread.Sleep(100)
    }
}

以上就是使用C#语言在PC上实现蓝牙设备的搜索与数据传输的详细攻略。本文提供了两种蓝牙设备的搜索方式和两种RFCOMM协议下的数据传输方式。我们可以根据实际的需求进行选择和优化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何用C#在PC上查找连接蓝牙设备并实现数据传输 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • 使用Supervisor守护ASP.NET Core应用程序进程

    使用Supervisor守护ASP.NET Core应用程序进程 Supervisor是一个进程控制系统,可以帮助您管理和监控应用程序进程。在本攻略中,我们将讨论如何使用Supervisor守护ASP.NET Core应用程序进程,并提供两个示例说明。 步骤一:安装Supervisor 在将ASP.NET Core应用程序进程守护到Supervisor之前,…

    C# 2023年5月17日
    00
  • Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现

    Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现 AspNetCoreRateLimit是一个基于ASP.NET Core的限流控制库,可以帮助我们在ASP.NET Core应用程序中实现限流控制。在本攻略中,我们将介绍如何使用AspNetCoreRateLimit来实现限流控制,并提供两个示例说明。 准备工作 在使用Asp…

    C# 2023年5月16日
    00
  • C++/JAVA/C#子类调用父类函数情况总结

    标题:C++/Java/C#子类调用父类函数情况总结 在OOP(面向对象编程)中,子类可以通过继承父类的方法和属性来实现代码的重用性。但有时子类需要调用到父类中的函数,这时就需要使用到父类函数的调用技巧。本篇文章将总结C++/Java/C#子类如何调用父类函数。 C++中子类调用父类函数 在C++中,子类可通过类名::函数名来调用父类中的函数。其中,类名是父…

    C# 2023年6月8日
    00
  • UG怎么建模儿童玩具篮? UG玩具篮模型的制作方法

    下面是关于UG怎么建模儿童玩具篮的完整攻略。 1. 准备 首先,需要明确制作模型的目的和需求,准备所需的草图、图片或模型参考。同时,需要确保自己已经掌握了UG软件的基本操作知识,熟悉主界面布局以及各项功能的使用方法。 2. 步骤 2.1 加载草图 打开草图,选择File -> Open命令将草图导入到模型中,同时将草图调整到合适的位置。点击Sketch…

    C# 2023年6月6日
    00
  • C#执行外部命令的方法

    执行外部命令是C#语言中常用的一种操作,可以通过Process类实现。下面是关于C#执行外部命令的完整攻略。 1. 创建Process对象 Process是C#语言中提供的一个用于执行外部程序的类。创建一个Process对象需要先引用System.Diagnostics命名空间,然后使用Process类的构造函数创建对象。 using System.Diag…

    C# 2023年6月3日
    00
  • C#中ZipHelper 压缩和解压帮助类

    下面我将为您详细讲解“C#中ZipHelper压缩和解压帮助类”的完整攻略。 1. 概述 ZipHelper是一个C#开发的压缩和解压缩帮助类,使用简单方便,目前已经被广泛应用。下面介绍ZipHelper的基本使用方法及示例。 2. 安装 要使用ZipHelper,需要下载NuGet包“ICSharpCode.SharpZipLib”。可以通过NuGet P…

    C# 2023年5月15日
    00
  • asp.net(C#)实现功能强大的时间日期处理类完整实例

    asp.net(C#)实现功能强大的时间日期处理类完整实例 引言 在程序开发过程中,日期和时间处理是非常常见且重要的操作,然而C#在对时间日期的处理上提供了很多内置的功能和类,但是并不一定适合所有的场景。因此,本文介绍如何实现功能强大的时间日期处理类,让我们的开发变得更加高效。 步骤 创建一个新的C#类,在类中定义所需要的方法和变量。 “`csharp p…

    C# 2023年6月1日
    00
  • C#实现为类和函数代码自动添加版权注释信息的方法

    为了实现C#代码自动添加版权注释信息,我们可以采用Visual Studio提供的模板和插件等多种方式。具体可参考以下步骤: 方法一:Visual Studio自带的模板 在Visual Studio中打开C#项目; 在“解决方案资源管理器”窗口中展开“Properties”文件夹并双击“AssemblyInfo.cs”文件; 在文件中找到注释部分“// 版…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部