C# 通过蓝牙读取原始数据

C# 通过蓝牙读取原始数据,c#,.net,bluetooth,32feet,C#,.net,Bluetooth,32feet,我有一个数字人机界面设备,我正试图使用32feet.net连接它,这样我就可以从中读取输入数据,并在我的应用程序中处理输出。我以前从未使用蓝牙编程,现在正在学习 我可以使用microsoft/broadcom堆栈将我的设备连接到Windows 7没有问题。我还可以使用32feet.net发现设备,但当我尝试连接它时,会出现错误。我确保使用BluetoothRadio.IsSupported支持我的堆栈。以下是一段代码片段: var client = new BluetoothClient();

我有一个数字人机界面设备,我正试图使用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设置为空,因为这是我使用DeviceInfo.ClassOfDevice.Service时显示的内容。我已经能够使用DeviceInfo.SetServiceState(BluetoothService.HumanInterfaceDevice,true)将设备连接到windows,但无法从中获取流

即使在Windows中连接设备后,我可以从该设备获取数据流,也没关系。我的目标很简单,可以像按按钮一样从设备中读取输入。

试试以下方法:

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);
我无论如何都不是专家,但对我来说:

  • 如果蓝牙设备中没有显示设备,我需要将设备配对。您只需对使用蓝牙收音机发现的每个新设备执行一次,或者如果您卸载它,我每次都执行一次,以防选择新设备
  • 启动服务,一旦启动,设备将在设备属性的“服务”下显示串行端口(在您的情况下为HID)
  • 连接
  • 在每个阶段都需要发生一些事情:

  • 确保设备出现在“控制面板”的“蓝牙设备”中
  • 在设备“属性”中的“服务”选项卡下,应该显示“人机界面”或其他内容
  • 那个服务应该打勾


  • 另一方面,你得到的异常是非常神秘的,但它只是让我想,如果设备还没有连接到某个东西。如果您选中“device.Connected”,则必须返回false,否则您将永远无法连接。

    Arturo的答案是正确的。使用SetServiceState(或者BluetoothSecurity.PairRequest将自动执行)让蓝牙堆栈处理低级HID通信,并通过Windows的HID API公开HID事件。然后您的代码可以使用该API

    详情如下:

    a) 蓝牙上的HID不使用RFCOMM,这正是BluetoothClient所使用的。有关每个配置文件/服务使用的协议的更多信息,请参阅。没有简单的L2CAP API可用于Microsoft堆栈,因此那里不支持L2CapClient

    b) 如果可以使用L2CapClient,则需要读取和写入原始HID数据,并解码和解析HID帧。相反,您应该让蓝牙堆栈连接到设备,并使用Windows HID API查看按钮按下情况。在我的32英尺.NET文档中,这是第3点


    c) 显然是PS3蓝牙控制器中的某些故障,这意味着Windows HID服务无法使用它。在这种情况下,用户必须直接连接到设备显然…

    感谢您的帮助,但例外情况仍然存在。不需要配对代码,我试过不使用该行、使用该行以及使用空字符串作为pin的行。SetServiceState函数将它连接到windows堆栈,这应该发生吗?我真的不知道“将它连接到windows堆栈”是什么意思。查看我答案中的更新,它们可能会有所帮助