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

相关文章

  • C#内存管理CLR深入讲解(下篇)

    C#内存管理CLR深入讲解(下篇)攻略 什么是CLR CLR(Common Language Runtime)是Microsoft .NET Framework的基础组件之一,负责管理运行在.NET Framework下的所有程序的执行,GC等。它是一个托管式执行环境,意味着它能够管理程序的内存分配和释放,使开发人员可以专注于业务逻辑的编写,而不需考虑内存管…

    C# 2023年5月31日
    00
  • Visual Studio Connected Services 生成http api 调用代码

    生成的代码将和接口对应的参数、返回值一一对应,本文底层使用的工具为NSwag.exe,其他可替代的方案还有AutoSet.exe。本文中生成的代码将在编译过程中自动编译,类似grpc生成代码的模式,如果使用AutoSet则需要手动引入代码。另外也可以使用NSwag对应的vs插件(https://marketplace.visualstudio.com/ite…

    C# 2023年5月11日
    00
  • ASP.NET2.0中用Gridview控件操作数据的代码

    要在ASP.NET2.0中使用GridView控件操作数据,需要遵循以下步骤: 1.在页面中引入GridView控件 使用以下代码在页面中引入GridView控件: <asp:GridView ID="GridView1" runat="server"></asp:GridView> 2.在代码…

    C# 2023年5月31日
    00
  • 磊科智能路由N1——PC端具体配置教程

    磊科智能路由N1是一款基于OpenWrt系统的智能路由器,它可以通过PC端进行配置。在本文中,我们将提供一份详细的配置教程,以帮助您快速了解如何配置磊科智能路由N1。 步骤一:连接路由器 首先,我们需要将磊科智能路由N1连接到电脑上。您可以使用网线或者Wi-Fi连接路由器。如果您使用的是网线连接,请将网线插入路由器的LAN口和电脑的网卡上。如果您使用的是Wi…

    C# 2023年5月17日
    00
  • asp.net 验证码的简单制作(vb.net+C#)

    一、 关于验证码验证码是因为防止机器恶意注册而被广泛应用的技术。下面是使用ASP.NET在VB.NET和C#中实现的样例代码。 二、步骤 添加ASP.NET Web页面 首先,添加一个新的ASP.NET页面,指定网址,如“~/CheckCode.aspx” ,最好确保您设置为不得缓存页面。这个页面将会生成验证码的图片并直接输出。 创建验证码 使用Bitmap…

    C# 2023年5月31日
    00
  • Asp.NetCore3.1开源项目升级为.Net6.0的方法实现

    升级Asp.NetCore3.1开源项目为.Net6.0的方法实现 在本攻略中,我们将详细讲解如何将Asp.NetCore3.1开源项目升级为.Net6.0,并提供两个示例说明。 升级.Net SDK:首先,我们需要升级.Net SDK版本。我们可以在项目文件(.csproj)中修改TargetFramework属性为net6.0,并在全局.json文件中指…

    C# 2023年5月16日
    00
  • 使用C#调用系统API实现内存注入的代码

    使用C#调用系统API实现内存注入需要遵循以下步骤: 获取目标进程ID 使用系统API函数Process.GetProcessesByName(string processName)可以获取指定名称进程的所有进程实例,然后通过进程实例的Id属性获取目标进程ID。 Process[] processes = Process.GetProcessesByName…

    C# 2023年5月31日
    00
  • C# AsReadOnly():返回只读集合的包装器

    C#中的AsReadOnly()方法用于将可写的集合转换为只读的集合。当你想要确保集合的内容不会被修改时,这个方法非常有用。 方法签名: public static ReadOnlyCollection<T> AsReadOnly<T> (this IList<T> list); 上述方法接受一个 IList<T&g…

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