有啥方法可以从 Windows 10 中的 c# 桌面应用程序使用蓝牙 LE?

Posted

技术标签:

【中文标题】有啥方法可以从 Windows 10 中的 c# 桌面应用程序使用蓝牙 LE?【英文标题】:Is there any way to use Bluetooth LE from a c# desktop app in windows 10?有什么方法可以从 Windows 10 中的 c# 桌面应用程序使用蓝牙 LE? 【发布时间】:2016-09-16 22:07:01 【问题描述】:

我在网上找到的所有关于蓝牙 LE 的东西都需要一个通用的 windows 应用程序,这完全不适合我。

有没有办法在 C# 中使用蓝牙 LE,而不必像在 UWP 上那样编写整个应用程序?

【问题讨论】:

【参考方案1】:

您可以在 C# 桌面应用程序中使用 C# API!我有一个sample here in GitHub。

一般来说,要访问 C# APIS,请向您的项目添加两个引用:

    C:\Program Files (x86)\Windows Kits\10\UnionMetadata\Windows.winmd C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll

请注意,#2 版本取决于您使用的 .NET 版本。

不支持后台任务,但所有其他蓝牙 C# 功能应该在那里。

【讨论】:

我试过了。在 Windows 8 上工作,但无法在 Windows 10 上工作。我不知道我做错了什么。此外,蓝牙 LE api 在 Windows 8 中受到严重限制。因此,虽然我可以针对 Windows 8 并仍然在 Windows 10 中运行,但这对我来说不起作用。我需要使用 Windows 10 的蓝牙 LE api @CedricMamo 自己尝试过这样做 - 现在更新答案! 似乎 #2 可以在我的操作系统上的不同路径下找到 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETCore\v4.5\System.Runtime.WindowsRuntime.dll 从 PowerShell 访问它需要什么? 如果我添加这两个引用,我仍然无法访问Windows.Devices【参考方案2】:

自 XP 时代以来,我一直在使用并围绕 Microsoft 部分蓝牙 API 解决方案工作。我从 BTFramework 中找到了一个我在许多平台和多种语言中广泛使用的库。 BTFramework 的蓝牙经典和低功耗 API 包易于使用、非常可靠,并且它们对我发现的任何缺陷都反应迅速。因此,我们的商业产品从蓝牙端出现的故障为零。 BTFramework 的团队已经着手解决微软对该标准的部分实施。顺便说一下,我们主要用 C# dot NET 编写代码。而且我们在应用程序中使用了很多线程。

【讨论】:

感谢您的参考。有时,解决一个特别棘手的问题的第三方解决方案是明智的答案。我会检查他们...【参考方案3】:
Look at the code below this shows how to scan and connect to a ble device using winform application

using System;
using System.Windows.Forms;
using Windows.Devices.Bluetooth;
using Windows.Devices.Bluetooth.GenericAttributeProfile;
using Windows.Devices.Enumeration;

namespace TestBle

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        

        private async void button1_ClickAsync(object sender, EventArgs e)
        
            string[] requestedProperties =  "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.IsConnected" ;

            DeviceWatcher deviceWatcher =
                        DeviceInformation.CreateWatcher(
                                BluetoothLEDevice.GetDeviceSelectorFromPairingState(false),
                                requestedProperties,
                                DeviceInformationKind.AssociationEndpoint);

            // Register event handlers before starting the watcher.
            // Added, Updated and Removed are required to get all nearby devices
            deviceWatcher.Added += DeviceWatcher_Added;
            deviceWatcher.Updated += DeviceWatcher_Updated;
            deviceWatcher.Removed += DeviceWatcher_Removed;
            deviceWatcher.EnumerationCompleted += DeviceWatcher_EnumerationCompleted;
            deviceWatcher.Stopped += DeviceWatcher_Stopped;

            // Start the watcher.
            deviceWatcher.Start();
        

        private void DeviceWatcher_Stopped(DeviceWatcher sender, object args)
        
            //throw new NotImplementedException();
        

        private void DeviceWatcher_EnumerationCompleted(DeviceWatcher sender, object args)
        
            string a = "";
        

        private void DeviceWatcher_Removed(DeviceWatcher sender, DeviceInformationUpdate args)
        
            string a = "";
        

        private void DeviceWatcher_Updated(DeviceWatcher sender, DeviceInformationUpdate args)
        
            string a = "";
        

        private async void DeviceWatcher_Added(DeviceWatcher sender, DeviceInformation args)
        
            string[] split = args.Id.Split('-');
            if(split[1] == "84:2e:14:aa:65:13")
            
                BluetoothLEDevice bluetoothLeDevice = await BluetoothLEDevice.FromIdAsync(args.Id);
                GattDeviceServicesResult result = await bluetoothLeDevice.GetGattServicesAsync();

                if (result.Status == GattCommunicationStatus.Success)
                
                    var services = result.Services;
                    // ...
                
            `enter code here`

        
    

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于有啥方法可以从 Windows 10 中的 c# 桌面应用程序使用蓝牙 LE?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以使用 C# 获取 Windows Phone 设备的 IMEI 号码

有啥方法可以调试从 C# DllImport 调用的 c++ dll?

C#中的方法与属性-有啥区别[重复]

有啥方法可以为 c# .NET 中的特定数据库表自动生成 BLL 类?

如何使用 C# 从 Windows 10 日历中检索 UWP 中的约会

c#的timer控件计时不够准确,有啥办法可以替代吗,我需要10ms左右的精度,但是timer很不准确