4

32feet.net を使用して接続しようとしているデジタル ヒューマン インターフェイス デバイスがあるので、そこから入力データを読み取り、アプリケーションで出力を処理できます。これまで Bluetooth でプログラミングしたことがなく、学習しながら学んでいます。

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 配列を取得し、その配列からデバイスを手動で選択して接続しようとしました。DeviceInfo.ClassOfDevice.Service を使用するとそれが表示されるため、serviceClass を Empty に設定してみました。DeviceInfo.SetServiceState(BluetoothService.HumanInterfaceDevice, true) を使用してデバイスを Windows に接続できましたが、そこからストリームを取得できませんでした。

Windows で接続した後にデバイスからデータ ストリームを取得できたとしても、それで問題ありません。ここでの私の目標は、ボタンを押すようにデバイスからの入力を読み取ることができるようにすることです。

4

2 に答える 2

1

アルトゥーロの答えは正しいです。SetServiceState (またはBluetoothSecurity.PairRequestが自動的に実行します)を使用して、Bluetoothスタックに低レベルのHID通信を処理させ、WindowsのHIDAPIを介してHIDイベントを公開します。次に、コードでそのAPIを使用できます。

詳細:

a)BluetoothのHIDはRFCOMMを使用せず、それがBluetoothClientが使用するものです。各プロファイル/サービスが使用するプロトコルの詳細については、Bluetoothプロファイルと32feet.NETを参照してください。Microsoftスタックで使用する単純なL2CAPAPIがないため、L2CapClientのサポートは(まだ?)ありません。

b)L2CapClientを使用できる場合は、生のHIDデータを読み書きし、HIDフレームをデコードして解析する必要があります。代わりに、Bluetoothスタックを取得してデバイスに接続し、WindowsHIDAPIを使用してボタンが押されたことを確認する必要があります。私の32feet.NETドキュメントでは、http://32feet.codeplex.com/documentationのポイント3です

c) PS3 Bluetoothコントローラーなどに何らかの障害があるようです。これは、 WindowsHIDサービスがそれを使用できないことを意味します。その場合、人々はデバイスに直接接続する必要があります。 どうやら...

于 2012-12-02T21:08:50.433 に答える
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. デバイスが Bluetooth デバイスに表示されない場合は、デバイスをペアリングする必要があります。Bluetooth 無線で新しいデバイスを検出するたびに、これを 1 回実行するだけで済みます。または、アンインストールする場合は、新しいデバイスが選択された場合に備えて、毎回実行します。
  2. サービスを開始します。これを行うと、デバイスのプロパティの「サービス」でシリアルポート (この場合は HID) が利用可能であることがデバイスに表示されます。
  3. 接続

すべての段階で何かが起こる必要があります:

  1. [コントロール パネル] の [Bluetooth デバイス] にデバイスが表示されていることを確認します。
  2. デバイスの「プロパティ」内の「サービス」タブの下に、「ヒューマン インターフェイス」などと表示されているはずです。
  3. そのサービスにチェックを入れる必要があります。

別の注意として、あなたが得る例外は本当に不可解ですが、デバイスがまだ何かに接続されていないかどうかを考えさせられました. 「device.Connected」をチェックすると、false を返す必要があります。そうしないと、接続できなくなります。

于 2012-11-29T23:21:55.263 に答える