如何用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日

相关文章

  • .NET 个人博客系统

    前言 之前通过github学习了一个.net core的博客项目,最近也是完成了博客的备案,完善了一下。该项目是传统的MVC项目,可以进行主题的切换,采用Bootstrap进行前台页面的展示,有配套的后台管理系统,可以解析Markdown文件。 参观地址 ZY知识库可以将个人的意见评论到该文章,我可以采纳采纳。 采用技术 后端:.NET Core ORM:E…

    C# 2023年4月17日
    00
  • C# BackgroundWorker用法详解

    我们来详细讲解一下C#中的BackgroundWorker用法。 一、BackgroundWorker 是什么? 在C#中,BackgroundWorker是一个多线程组件,用于在后台执行一个操作并在主界面上更新相应的进度。它避免了在主线程中直接执行操作而引起的冻结UI界面的问题。 二、BackgroundWorker 的声明 我们使用 Background…

    C# 2023年5月15日
    00
  • C# 使用动态库DllImport(“kernel32”)读写ini文件的步骤

    C# 中使用动态库 DllImport 功能可以调用 Win32 API 库中的函数。其中,kernel32.dll 是 Windows 系统默认提供的 DLL 动态链接库,包含一些系统 API 函数。INI 文件是一种文本格式的配置文件,在 Windows 系统中使用广泛。 以下是 C# 使用动态库 DllImport 调用 kernel32.dll 中提…

    C# 2023年6月1日
    00
  • C# Datatable的几种用法小结

    C# Datatable的几种用法小结 什么是C# Datatable? C# Datatable是一个用于在内存中存储数据的表结构对象。它可以用于存储和操作数据源中的多行数据,并且能够提供强大的筛选、排序、分组等功能。C# Datatable是ADO.NET中的一部分,可以用于在Windows Forms、WPF应用程序及Web应用程序中显示和操作数据。 …

    C# 2023年5月15日
    00
  • user32.dll 函数说明小结

    下面是“user32.dll 函数说明小结”的完整攻略。 什么是 user32.dll? user32.dll 是 Windows 操作系统的一个动态链接库文件,其中包含了很多与用户界面有关的函数。它是操作系统和应用程序之间的桥梁,使应用程序能够与用户交互并将用户输入和操作反馈到屏幕上。 如何使用 user32.dll 函数? 在使用 user32.dll …

    C# 2023年6月7日
    00
  • c++用指针交换数组的实例讲解

    下面我将为您详细讲解“c++用指针交换数组的实例讲解”的完整攻略。 1. 什么是指针? 指针是C/C++的重要概念,它是一个存储内存地址的变量。通过指针,我们可以访问和修改内存中的数据,包括整数、浮点数、数组、结构体等。 2. 如何定义指针? 在C/C++中,我们可以使用 * 运算符来定义指针。下面是一个示例: int *p; // 定义一个指向整数的指针 …

    C# 2023年6月8日
    00
  • C# 基础编程题集锦

    简单字符串加密 编写一个应用程序用来输入的字符串进行加密,对于字母字符串加密规则如下:’a→d’ ‘b’→’e’ ‘w’→z’ …… x’→’a’ ‘y’→b’ ‘z→c’ ‘A’→’D’ ‘B’→’E’ ‘W’→’Z’ ‘X’→’A’ ‘Y’→’B’ ‘Z’→’C’ ?对于其他字符,不进行加密。 static void Main(string[] …

    C# 2023年5月1日
    00
  • asp.net core3.1 引用的元包dll版本兼容性问题解决方案

    asp.net core3.1 引用的元包dll版本兼容性问题解决方案 在使用ASP.NET Core 3.1开发应用程序时,可能会遇到引用的元包DLL版本不兼容的问题。这通常是由于不同的元包使用了不同的依赖项版本所致。在本攻略中,我们将详细讲解如何解决ASP.NET Core 3.1引用的元包DLL版本兼容性问题,并提供两个示例说明。 步骤一:使用NuGe…

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