低功耗蓝牙.NET C#?

vyswwuz2  于 2023-03-24  发布在  .NET
关注(0)|答案(1)|浏览(223)

我正在开发一个C#控制台应用程序,它将不得不与多个移动的(iOS和Android)进行通信。我的团队的第一个想法是使用蓝牙,因为Wi-Fi/Internet连接可能并不总是可用的。我使用www.example.com编写代码32Feet.net(https://inthehand.com/components/32feet/)使用了蓝牙经典。然而,在iPhone上将蓝牙经典用于音频设备以外的任何东西似乎都是强烈不鼓励/不可能的。所以,我厌倦了使用32 Feet的蓝牙低功耗框架。我无法弄清楚如何使用它,因为它已经过时了,文档也不强大。然后我切换到BTFramework的演示版本(https://www.btframework.com),它宣传支持蓝牙低功耗,但我无法让它工作。所以我的问题是:

  • 是否还有其他蓝牙低功耗框架,我应该看看?(我希望该框架是跨平台的,但我的目标是Windows 10及更高版本)
  • 我做错什么了吗?
  • 我应该首先使用蓝牙吗?

以下是我的一些BTFramework代码,我密切关注文档:

using wclBluetooth;
using wclCommon;
using System.Text;

public class BluetoothManager
{
    // BTFramework objects
    private readonly wclBluetoothManager _wclBluetoothManager = new wclBluetoothManager();
    private wclBluetoothRadio? _radio;
    private wclGattServer? _gattServer;
    
    private readonly List<wclGattServerClient> _clients = new List<wclGattServerClient>();
    private bool _btReady;

    private byte[]? _recvBuffer;
    private int? _lastClientToWriteId;

    public void Init()
    {
        _wclBluetoothManager.Open();
        _radio = GetRadio();
        if (!_radio.LeSupported)
        {
            Console.WriteLine("This device does not support Bluetooth Low Energy.");

            return;
        }
        
        
        _radio.GetName(out string radioName);
        _radio.SetConnectable(true);
        _radio.SetDiscoverable(true);
        Console.WriteLine($"Bluetooth radio name: {radioName}");

        _gattServer = new wclGattServer();
        // define callbacks
        _gattServer.OnClientConnected += OnClientConnected;
        _gattServer.OnWrite += OnWrite;
        _gattServer.Initialize(_radio);
        if (!_gattServer.Initialized)
        {
            Console.WriteLine("Gatt server was not initialized.");

            return;
        }
        
        _btReady = true;
        Console.WriteLine("Bluetooth Initialization completed.");
    }

    private wclBluetoothRadio GetRadio()
    {
        Int32 res = _wclBluetoothManager.GetLeRadio(out wclBluetoothRadio bluetoothRadio);
        if (res != wclErrors.WCL_E_SUCCESS)
        {
            throw new BluetoothNotAvailableException("Error getting bluetooth radio.");
        }
        return bluetoothRadio;
    }

    private void OnClientConnected(object sender, wclGattServerClient client)
    {
        _clients.Add(client);

        Console.WriteLine($"New client connected.");
    }

    private void OnWrite(object sender, wclGattServerClient client, wclGattLocalCharacteristic characteristic, byte[] data)
    {
        _recvBuffer = data;
        _lastClientToWriteId = _clients.IndexOf(client);
    }

谢谢你的帮忙!

  • 32Feet.Net经典蓝牙:虽然这在用另一台Windows笔记本电脑测试时有效,但iPhone对蓝牙经典的支持非常有限。
  • 32Feet.Net低功耗蓝牙:无法弄清楚如何使用框架
  • BTFramework低功耗蓝牙:无法获得回叫/无法识别新连接的电话。
50pmv0ei

50pmv0ei1#

首先,我想说,我们有很好的和快速的支持,所以你可以随时联系我们,你喜欢:www.btframework.com/contacts.htm我们很乐意帮助您解决此问题。
现在关于你的问题:在Windows平台上,无法检测远程设备何时连接到GATT服务器。Bluetooth Framework在内部模拟此操作,并在客户端订阅、读取或写入特性时调用OnClientConnected事件。
此外,当您在控制台中运行应用程序时,您需要更改默认的内部同步。默认情况下,蓝牙框架使用Windows消息与主/UI线程同步事件。对于基于UI的应用程序,它可以正常工作,但对于控制台或服务,它需要消息处理循环。
幸运的是,蓝牙框架允许更改同步。有两种:APC和线程。APC one使用异步过程调用。线程同步使用单独的线程,所有事件始终在单独的线程中调用。
要更改默认同步,在使用任何蓝牙框架方法之前,代码中的第一个链接必须是:**wclMessageBroadcaster.SetSyncMethod(wclMessageSynchronizationKind.skThread);**这会将默认同步更改为Thread one。将此代码行放在Init()方法的最开始。
控制台GATT服务器的良好起点是物联网演示文件夹中的GattServer演示。即使它被称为物联网,它也可以在桌面操作系统上运行。
请不要犹豫contact us如果你有任何问题。

相关问题