首页 > 解决方案 > Windows 10 上的 BLE 服务器

问题描述

大家好,我正在尝试使用 Microsoft 的示例代码和在本网站 ( https://www.jenx.si/2019/08/09/bluetooth-gatt-server/ ) 中找到的教程在 Windows 10 上创建 BLE 服务器。问题是我可以使用桌面应用程序使服务器正常,但是当我尝试使用控制台示例代码时,我得到:

System.InvalidOperationException HResult=0x80131509 当任一应用程序没有控制台或控制台输入已被重定向时,无法读取密钥。试试 Console.Read。

错误。当我尝试继续按钮时,它会给我“找不到ExceptionDispatchInfo.cs”错误。任何人都可以帮助我解决这些错误。或者任何人都可以向我展示另一个示例,说明如何使用 C# 在控制台中的 Windows 10 上制作 BLE 服务器?

using Jenx.Bluetooth.GattServer.Common;
using System.Threading.Tasks;

namespace Jenx.Bluetooth.GattServer.Console
{
internal class Program
{
    static private ILogger _logger;
    static private IGattServer _gattServer;

    private static async Task Main(string[] args)
    {
        InitializeLogger();
        InitializeGattServer();
        await StartGattServer();
        await StartLooping();
    }
    
    #region Private
    
    private static void InitializeLogger()
    {
        _logger = new ConsoleLogger();
    }

    private static void InitializeGattServer()
    {
        _gattServer = new Common.GattServer(GattCharacteristicIdentifiers.ServiceId, _logger);
        _gattServer.OnChararteristicWrite += GattServerOnChararteristicWrite;
    }

    private static async Task StartGattServer()
    {
        try
        {
            await _logger.LogMessageAsync("Starting Initializong Jenx.si Bluetooth Gatt service.");
            await _gattServer.Initialize();
            await _logger.LogMessageAsync("Jenx.si Bluetooth Gatt service initialized.");
        }
        catch
        {
            await _logger.LogMessageAsync("Error starting Jenx.si Bluetooth Gatt service.");
            throw;
        }

        await _gattServer.AddReadWriteCharacteristicAsync(GattCharacteristicIdentifiers.DataExchange, "Data exchange");
        await _gattServer.AddReadCharacteristicAsync(GattCharacteristicIdentifiers.FirmwareVersion, "1.0.0.1", "Firmware Version");
        await _gattServer.AddWriteCharacteristicAsync(GattCharacteristicIdentifiers.InitData, "Init info");
        await _gattServer.AddReadCharacteristicAsync(GattCharacteristicIdentifiers.ManufacturerName, "Jenx.si", "Manufacturer");

        _gattServer.Start();
        await _logger.LogMessageAsync("Jenx.si Bluetooth Gatt service started.");
    }

    private static async Task StartLooping()
    {
        System.ConsoleKeyInfo cki;
        System.Console.CancelKeyPress += new System.ConsoleCancelEventHandler(KeyPressHandler);

        while (true)
        {
            await _logger.LogMessageAsync("Press any key, or 'X' to quit, or ");
            await _logger.LogMessageAsync("CTRL+C to interrupt the read operation:");
            cki = System.Console.ReadKey(true);
            await _logger.LogMessageAsync($"  Key pressed: {cki.Key}\n");

            // Exit if the user pressed the 'X' key.
            if (cki.Key == System.ConsoleKey.X) break;
        }
    }

    private static async void KeyPressHandler(object sender, System.ConsoleCancelEventArgs args)
    {
        await _logger.LogMessageAsync("\nThe read operation has been interrupted.");
        await _logger.LogMessageAsync($"  Key pressed: {args.SpecialKey}");
        await _logger.LogMessageAsync($"  Cancel property: {args.Cancel}");
        await _logger.LogMessageAsync("Setting the Cancel property to true...");
        args.Cancel = true;

        await _logger.LogMessageAsync($"  Cancel property: {args.Cancel}");
        await _logger.LogMessageAsync("The read operation will resume...\n");
    }

    private static async void GattServerOnChararteristicWrite(object myObject, CharacteristicEventArgs myArgs)
    {
        await _logger.LogMessageAsync($"Characteristic with Guid: {myArgs.Characteristic.ToString()} changed: {myArgs.Value.ToString()}");
    }

    private static void StopGattServer()
    {
        _gattServer.Stop();
    }

    #endregion Private
}

}

标签: c#windowsserverbluetooth-lowenergygatt

解决方案


推荐阅读