我正在开发一个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低功耗蓝牙:无法获得回叫/无法识别新连接的电话。
1条答案
按热度按时间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如果你有任何问题。