通过蓝牙读取原始数据

时间:2012-11-29 20:22:53

标签: c# .net bluetooth 32feet

我有一个数字人机接口设备,我正在尝试使用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中连接后可以从设备获取数据流,也没关系。我的目标很简单,就是能够像按下按钮一样从设备读取输入。

2 个答案:

答案 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);

我无论如何都不是专家,但对我而言:

  1. 如果设备未在蓝牙设备中显示,我需要配对设备。您只需要使用蓝牙无线电发现的每个新设备执行此操作一次,或者如果您将其卸载,我每次都会这样做以防万一选择新设备。
  2. 启动服务,一旦我这样做,设备将显示设备属性中“服务”下的串口(在您的情况下为HID)。
  3. 连接
  4. 在每个阶段都需要发生一些事情:

    1. 确保设备出现在“控制面板”中的“蓝牙设备”中。
    2. 在设备的“属性”中的“服务”标签下,它应该显示“人机界面”或其他内容。
    3. 应该勾选该服务。

    4. 另一方面,你得到的例外情况真的很神秘,但它只是让我想到设备是否还没有连接到什么东西。如果您选中“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服务无法使用它。在这种情况下,人们必须直接连接到设备。的显然...