Gui*_*TeK 5 c# bluetooth bluetooth-lowenergy 32feet windows-10
我最近购买了一块Lilypad Simblee BLE 板,我想以编程方式将其与我的计算机配对(使用C# 中的32feet.NET库)。
我知道StackOverflow 上已经有人询问“如何以编程方式配对蓝牙设备”(例如此处),但是由于某种原因,我所有以编程方式配对设备的尝试都失败了。事实上,我成功地将设备与Windows 10 设置面板中的“管理蓝牙设备”窗口(设置>设备)配对>蓝牙)配对。
首先,我不知道配对方法(传统的还是SSP)。Windows 从未要求我输入 PIN 码或其他信息,所以我猜它是 SSP,但我不确定。
我在 Google 上搜索了如何与 32feet.NET 进行SSP配对请求:我发现这个。
但是,一旦它发现我的设备(设备发现工作正常),配对请求立即失败。
我的代码:
using InTheHand.Net.Bluetooth;
using InTheHand.Net.Sockets;
using System;
using System.Collections.Generic;
namespace HLK_Client
{
class HLKBoard
{
public event HLKBoardEventHandler HLKBoardConnectionComplete;
public delegate void HLKBoardEventHandler(object sender, HLKBoardEventArgs e);
private BluetoothClient _bluetoothClient;
private BluetoothComponent _bluetoothComponent;
private List<BluetoothDeviceInfo> _inRangeBluetoothDevices;
private BluetoothDeviceInfo _hlkBoardDevice;
private EventHandler<BluetoothWin32AuthenticationEventArgs> _bluetoothAuthenticatorHandler;
private BluetoothWin32Authentication _bluetoothAuthenticator;
public HLKBoard()
{
_bluetoothClient = new BluetoothClient();
_bluetoothComponent = new BluetoothComponent(_bluetoothClient);
_inRangeBluetoothDevices = new List<BluetoothDeviceInfo>();
_bluetoothAuthenticatorHandler = new EventHandler<BluetoothWin32AuthenticationEventArgs>(_bluetoothAutenticator_handlePairingRequest);
_bluetoothAuthenticator = new BluetoothWin32Authentication(_bluetoothAuthenticatorHandler);
_bluetoothComponent.DiscoverDevicesProgress += _bluetoothComponent_DiscoverDevicesProgress;
_bluetoothComponent.DiscoverDevicesComplete += _bluetoothComponent_DiscoverDevicesComplete;
}
public void ConnectAsync()
{
_inRangeBluetoothDevices.Clear();
_hlkBoardDevice = null;
_bluetoothComponent.DiscoverDevicesAsync(255, true, true, true, false, null);
}
private void PairWithBoard()
{
Console.WriteLine("Pairing...");
bool pairResult = BluetoothSecurity.PairRequest(_hlkBoardDevice.DeviceAddress, null);
if (pairResult)
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine("Fail"); // Instantly fails
}
}
private void _bluetoothComponent_DiscoverDevicesProgress(object sender, DiscoverDevicesEventArgs e)
{
_inRangeBluetoothDevices.AddRange(e.Devices);
}
private void _bluetoothComponent_DiscoverDevicesComplete(object sender, DiscoverDevicesEventArgs e)
{
for (int i = 0; i < _inRangeBluetoothDevices.Count; ++i)
{
if (_inRangeBluetoothDevices[i].DeviceName == "HLK")
{
_hlkBoardDevice = _inRangeBluetoothDevices[i];
PairWithBoard();
return;
}
}
HLKBoardConnectionComplete(this, new HLKBoardEventArgs(false, "Didn't found any \"HLK\" discoverable device"));
}
private void _bluetoothAutenticator_handlePairingRequest(object sender, BluetoothWin32AuthenticationEventArgs e)
{
e.Confirm = true; // Never reach this line
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么配对请求失败?
您链接的问题的答案有一个看似合理的建议...您读过吗?
你也应该看看这个问题。
32feet 库是围绕传统配对构建的,因此您要么需要知道要连接的设备的引脚,要么为其提供 null 以获取弹出窗口以输入引脚。
它还表示 32feet 使用的 windows 函数在较新版本的 windows 中已被弃用。如果这是真的,那么它立即失败的原因是因为您在配对请求中传递了空引脚,并且要继续进行,窗口需要显示一个不再存在的对话框。
如果您尝试使用引脚“0000”或“1234”连接会发生什么?
我正在查看WindowsBluetoothSecurity.cs32feet.net 中的源代码,我发现如果配对请求失败,它会将错误代码记录到Debug.WriteLine,您是否可以在此处发布该错误代码?
解决此问题的一个好方法可能是BluetoothAuthenticateDeviceEx手动导入并使用它来完成配对请求。如果您不想手动执行此操作,看起来在最新版本的 32feet 源中,实际上有一个利用此方法的 SSP 配对方法,但它不是公开的,也没有在任何地方使用,因此您需要访问通过反射:
typeof(BluetoothSecurity)
.GetMethod("PairRequest", BindingFlags.Static | BindingFlags.NonPublic)
.Invoke(null, new object[] { _hlkBoardDevice.DeviceAddress, BluetoothAuthenticationRequirements.MITMProtectionNotRequired });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21862 次 |
| 最近记录: |