2012-11-29 162 views
4

原始数据我有我试图连接到使用32feet.net这样我就可以从中读取输入数据和处理我的应用程序的输出数字人机接口设备。我以前从来没有用蓝牙编程,而且我正在学习。读通过蓝牙

我能使用Microsoft /博通堆栈没有问题我的设备连接到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.Net.Sockets.SocketException”发生在System.dll中

我已经尝试了一些其他方法,以及与client.Connect。我试过使用DiscoverDevices来获取DeviceInfo数组,并手动从该数组中选择设备并连接到它。我已经尝试将serviceClass设置为Empty,因为这是使用DeviceInfo.ClassOfDevice.Service时显示的内容。我已经能够使用DeviceInfo.SetServiceState(BluetoothService.HumanInterfaceDevice,true)将设备连接到窗口,但无法从中获取流。

即使我可以从它被连接在Windows后设备的数据流,这将是罚款。我的目标很简单,就是能够像按下按钮一样从设备读取输入。

回答

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. 连接

在每个阶段有什么需要发生:

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

在另一方面,不同的是,你得到的是真正的神秘,但它只是让我觉得如果设备尚未连接到一些东西。如果您选中“device.Connected”,它必须返回false,否则您将无法连接。

+0

感谢您的帮助,但仍然发生异常。配对代码是不需要的,我已经尝试了它,没有线,线和线与空字符串作为引脚。 SetServiceState函数将它连接到Windows堆栈,是否应该发生? – SoloDeveloper

+0

我真的不知道“连接到Windows堆栈”是什么意思。看看我的答案中的更新,他们可能会有所帮助 –

1

阿图罗的答案是正确的。使用SetServiceState(或可能BluetoothSecurity。PairRequest将自动执行此操作)让蓝牙堆栈处理低级别HID通信并通过Windows的HID API公开HID事件。然后你的代码可以使用该API。

在更多的细节:

一)蓝牙HID不使用RFCOMM,这就是BluetoothClient使用。有关每个配置文件/服务使用的协议的详细信息,请参阅Bluetooth Profiles and 32feet.NET。没有简单的L2CAP API与Microsoft堆栈一起使用,因此在那里不支持L2CapClient(还?)。 b)如果其中一个(可能)使用L2CapClient,那么需要读取和写入原始HID数据并解码和解析HID帧。相反,您应该将蓝牙堆栈连接到设备,并使用Windows HID API来查看按钮按下。在我的文档32feet.NET这点在3 http://32feet.codeplex.com/documentation

三)是显然一些故障例如PS3蓝牙控制器,这意味着Windows HID服务无法使用它。在这种情况下,人们必须直接连接到设备。 显然...