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

yizhihongxing

一、前言

本文将会详细介绍如何使用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日

相关文章

  • C#中实现任意List的全组合算法代码

    以下是详细的攻略步骤: 1. 确定算法 全组合算法可以用以下方式递归实现: 对于List的每个元素,有两种情况:选择与不选择 当选择了一个元素时,接下来需要从剩下的元素中选择 当不选择一个元素时,同样需要从剩下的元素中选择 递归执行以上步骤,直到剩下的元素集合为空,即为一种排列结果 这样,我们可以写出以下的伪代码。 // 全组合算法 public stati…

    C# 2023年6月1日
    00
  • C#单线程和多线程的端口扫描器应用比较详解

    C#单线程和多线程的端口扫描器应用比较详解 一、介绍 本文主要介绍C#单线程和多线程的端口扫描器应用比较,主要包括以下内容: 单线程端口扫描器原理及实现 多线程端口扫描器原理及实现 单线程与多线程端口扫描器的比较分析 二、单线程端口扫描器原理及实现 单线程端口扫描器是指只有一个线程去扫描指定的ip和端口。实现思路如下: 1. 获取目标ip地址和端口范围 2.…

    C# 2023年5月15日
    00
  • .NetCore使用Swagger+API多版本控制的流程分析

    在.NET Core中,我们可以使用Swagger和API多版本控制来管理和文档化Web API。在本攻略中,我们将详细讲解如何使用Swagger和API多版本控制来管理和文档化Web API,并解析可能遇到的问题。 安装Swagger:首先,我们需要安装Swagger。我们可以使用NuGet包管理器来安装Swashbuckle.AspNetCore包。安装…

    C# 2023年5月16日
    00
  • 利用Warensoft Stock Service编写高频交易软件

    利用Warensoft Stock Service编写高频交易软件需要具备一定的编程和交易知识。下面是一些步骤,可以帮助您开始: 1. 注册并开通Warensoft帐户 Warensoft是提供互联网股票交易服务的平台。首先,需要在Warensoft官网上注册一个帐户,并通过实名认证等方式完成开户流程。注册后,可以使用Warensoft Stock Serv…

    C# 2023年6月6日
    00
  • asp.net core 认证和授权实例详解

    ASP.NET Core认证和授权实例详解 ASP.NET Core是一个跨平台的开源Web框架,它提供了一套完整的认证和授权机制,可以帮助我们保护Web应用程序的安全性。下面是ASP.NET Core认证和授权的完整攻略: 认证 1. 添加认证服务 在ASP.NET Core应用程序中启用认证服务,需要在Startup.cs文件中的ConfigureSer…

    C# 2023年5月12日
    00
  • C# lambda表达式原理定义及实例详解

    C# lambda表达式原理定义及实例详解 1. 什么是lambda表达式 Lambda表达式是一种能够把代码作为一个参数传递的匿名函数。它是从LISP借鉴过来的一个概念,相当于是在代码里面定义一个函数,然后直接把这个函数作为一个参数传递给另一个函数,简化了代码的书写。在C#中,Lambda表达式是Func<>或Action<> 或 …

    C# 2023年6月7日
    00
  • c# 闭包的相关知识以及需要注意的地方

    C#中闭包是一种特殊的函数,它捕获了外部函数或方法的变量,并在外部函数或方法被调用或执行完毕后,仍可以访问外部函数或方法中的变量。闭包在某些情况下可以使代码更加简洁、优雅和高效,但也存在一些需要注意的地方。 什么是闭包? 闭包是指一个函数捕获了外部函数或方法中的变量,并将其作为该函数的一部分返回。通常情况下,当一个函数或方法执行完毕后,其中的局部变量就会被销…

    C# 2023年6月7日
    00
  • C#操作注册表的方法

    下面是关于C#操作注册表的方法的完整攻略。 什么是注册表 注册表是Windows操作系统中一个存储配置信息的关键数据结构。在注册表中,包含了大量的系统和软件的配置信息,比如安装路径、环境变量、文件类型、驱动程序等等。Windows系统和软件的运行状态也将会写入注册表。 在C#中,我们可以通过Registry类来访问和操作注册表。 C#操作注册表的方法 读取注…

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