我有一个数字人机接口设备,我正在尝试使用32feet.net连接,因此我可以从中读取输入数据并在我的应用程序中处理输出。我以前从未编程过蓝牙,而且我正在学习。
我可以使用microsoft / broadcom堆栈将我的设备连接到Windows 7没问题。我也可以使用32feet.net发现设备,但是当我尝试连接它时,我收到一个错误。我确保使用BluetoothRadio支持我的堆栈.IsSupported这是一段代码片段:
var client = new BluetoothClient();
var dlg = new SelectBluetoothDeviceDialog();
DialogResult result = dlg.ShowDialog(this);
if (result != DialogResult.OK)
{
return;
}
BluetoothDeviceInfo device = dlg.SelectedDevice;
BluetoothAddress addr = device.DeviceAddress;
Console.WriteLine(device.DeviceName);
Guid serviceClass = BluetoothService.HumanInterfaceDevice;
client.Connect(new BluetoothEndPoint(addr, serviceClass));
最后一行导致以下错误: System.dll
中发生了'System.Net.Sockets.SocketException'类型的第一次机会异常我已经尝试了一些其他方法与client.Connect。我已经尝试使用DiscoverDevices来获取DeviceInfo数组并手动从该阵列中选择设备并连接到它。我已经尝试将serviceClass设置为Empty,因为当我使用DeviceInfo.ClassOfDevice.Service时会出现这种情况。我已经能够使用DeviceInfo.SetServiceState(BluetoothService.HumanInterfaceDevice,true)将设备连接到Windows,但无法从中获取流。
即使我在Windows中连接后可以从设备获取数据流,也没关系。我的目标很简单,就是能够像按下按钮一样从设备读取输入。
答案 0 :(得分:1)
试试这个:
var client = new BluetoothClient();
var dlg = new SelectBluetoothDeviceDialog();
DialogResult result = dlg.ShowDialog(this);
if (result != DialogResult.OK)
{
return;
}
BluetoothDeviceInfo device = dlg.SelectedDevice;
BluetoothAddress addr = device.DeviceAddress;
Console.WriteLine(device.DeviceName);
BluetoothSecurity.PairRequest(addr, "Whatever pin");
device.SetServiceState(BluetoothService.HumanInterfaceDevice, true);
Thread.Sleep(100); // Just in case
if (device.InstalledServices.Length == 0)
{
// I wouldn't know why it doesn't install the service
}
client.Connect(addr, BluetoothService.HumanInterfaceDevice);
我无论如何都不是专家,但对我而言:
在每个阶段都需要发生一些事情:
另一方面,你得到的例外情况真的很神秘,但它只是让我想到设备是否还没有连接到什么东西。如果您选中“device.Connected”,它必须返回false,否则您将无法连接。
答案 1 :(得分:1)
Arturo的回答是正确的。使用 SetServiceState (或者 BluetoothSecurity.PairRequest 会自动执行此操作)让蓝牙堆栈处理低级别HID通信,并通过Windows的HID API公开HID事件。然后您的代码可以使用该API。
更多细节:
a)蓝牙上的HID不使用RFCOMM,而这正是BluetoothClient使用的。有关每个配置文件/服务使用的协议的详细信息,请参阅Bluetooth Profiles and 32feet.NET。没有简单的L2CAP API可以与Microsoft堆栈一起使用,因此对于那里的L2CapClient没有支持(但是?)。
b)如果一个人(可以)使用L2CapClient,则需要读取和写入原始HID数据并解码和解析HID帧。相反,您应该让蓝牙堆栈连接到设备并使用Windows HID API查看按钮按下。在我的32feet.NET文档中,http://32feet.codeplex.com/documentation
指向第3点c)显然是 PS3蓝牙控制器,这意味着Windows HID服务无法使用它。在这种情况下,人们必须直接连接到设备。的显然... 强>