web-dev-qa-db-ja.com

32feet.NETを搭載したWindows 10でのBluetoothペアリング(SSP)

Windows 10タブレットを別のBluetoothデバイスとペアリングする必要があるプロジェクトを開始しました。

プロセスに慣れるために、シンプルなWindowsフォームアプリから始めることにしました。私は32feet.NET NuGetパッケージをソリューションに追加しましたが、デバイスの検索とリストボックスの作成にすぐに成功しました。

client = new BluetoothClient();
devices = client.DiscoverDevices();
if (devices.Length > 0)
{
    foreach (var device in devices)
    {
        lstBTDevices.Items.Add(device.DeviceName);
    }
}
else
{
    MessageBox.Show("Unable to detect any bluetooth devices");
}

次に、イベントハンドラーを追加して、検出されたデバイスを選択し、それとのペアリングを試行できるようにしました。

    private void LstBTDevices_SelectedIndexChanged(object sender, EventArgs e)
    {
        BluetoothDeviceInfo selectedDevice = devices[lstBTDevices.SelectedIndex];
        if (MessageBox.Show(String.Format("Would you like to attempt to pair with {0}?", selectedDevice.DeviceName), "Pair Device", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            if (BluetoothSecurity.PairRequest(selectedDevice.DeviceAddress, "123456"))
            {
                MessageBox.Show("We paired!");
            }
            else
            {
                MessageBox.Show("Failed to pair!");
            }
        }
    }

安価なBluetooth 2.0アダプタを搭載したWindows7デスクトップPCでは、これにより、携帯電話にポップアップが表示され、ピンコードの入力を要求します。 「123456」と入力すると、ペアリングが成功します。

ただし、ここから問題が始まります。次に、アプリケーションを取得してWindows10タブレットで実行します。電話を選択すると、ランダムな6桁のピンコードを含むポップアップが電話に表示され、タブレット画面に表示されているものと一致するというメッセージが表示されます。 、オプションとしてペア/キャンセルボタン。いずれかのボタンを押すと、失敗します。

これは私が間違っていることですか? 32feet.NETでサポートされていないドライバー?

何かアドバイスをいただければ幸いです。

更新:bare_metalからのコメントは、私がさらに理解するのに役立ちました

BluetoothWin32Authenticationイベントハンドラーを追加し、SSPペアリングを開始するためのボタンを追加しました。

EventHandler<BluetoothWin32AuthenticationEventArgs> authHandler = new EventHandler<BluetoothWin32AuthenticationEventArgs>(handleAuthRequests);
BluetoothWin32Authentication authenticator = new BluetoothWin32Authentication(authHandler);

    private void btnPairSSP_Click(object sender, EventArgs e)
    {
        BluetoothDeviceInfo selectedDevice = devices[lstBTDevices.SelectedIndex];
        if (MessageBox.Show(String.Format("Would you like to attempt to pair with {0}?", selectedDevice.DeviceName), "Pair Device", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            Task t = new Task(PairBluetoothTask);
            t.Start();
        }
    }

    private void PairBluetoothTask()
    {
        BluetoothDeviceInfo selectedDevice = devices[lstBTDevices.SelectedIndex];
        if (BluetoothSecurity.PairRequest(selectedDevice.DeviceAddress, null))
        {
            MessageBox.Show("We paired!");
        }
        else
        {
            MessageBox.Show("Failed to pair!");
        }

    }

    private void handleAuthRequests(object sender, BluetoothWin32AuthenticationEventArgs e)
    {
        switch (e.AuthenticationMethod)
        {
            case BluetoothAuthenticationMethod.Legacy:
                MessageBox.Show("Legacy Authentication");
                break;

            case BluetoothAuthenticationMethod.OutOfBand:
                MessageBox.Show("Out of Band Authentication");
                break;

            case BluetoothAuthenticationMethod.NumericComparison:
                if(e.JustWorksNumericComparison == true)
                {
                    MessageBox.Show("Just Works Numeric Comparison");
                }
                else
                {
                    MessageBox.Show("Show User Numeric Comparison");
                    if (MessageBox.Show(e.NumberOrPasskeyAsString, "Pair Device", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        e.Confirm = true;
                    }
                    else
                    {
                        e.Confirm = false;
                    }                        
                }
                break;

            case BluetoothAuthenticationMethod.PasskeyNotification:
                MessageBox.Show("Passkey Notification");
                break;

            case BluetoothAuthenticationMethod.Passkey:
                MessageBox.Show("Passkey");
                break;

            default:
                MessageBox.Show("Event handled in some unknown way");
                break;

        }
    }

スマートフォンからペアリングを開始すると、これは正常に機能し、イベントがトリガーされ、メッセージボックスが表示され、ペアリングが成功します。

ただし、タブレットからペアリングを開始すると、イベントハンドラーがトリガーされないため、ペアリングが失敗します。

27
Andy P

ここでの問題は、32フィートライブラリがレガシーペアリングに基づいて構築されているため、接続しているデバイスのピンを知っている必要があるか、またはピンを入力するポップアップウィンドウを取得するためにnullを提供する必要があることです。そのダイアログは新しいバージョンのウィンドウに到達しなかった可能性があります-これについては不明ですが、32feetライブラリがラップするネイティブ関数のドキュメントでは、Vistaよりも新しいものを開発する場合は別のメソッドを呼び出すように言われています.

https://msdn.Microsoft.com/en-us/library/windows/desktop/aa362770(v = vs.85).aspx

32feetの逆コンパイルされたソースを閲覧した私の研究から、32feetがSSPをサポートしていないように見えるかもしれませんが、それは他の人だけです-しかし、それは、提供されたBluetoothスタック実装が更新を必要とするか、または独自のものを作成する必要があることだけです-もう一度私はわからない。

このサードパーティではなく、.NET用のMicrosoft提供のライブラリを調べたい場合があります。Githubのサンプルを使用して、すべてのデバイスと正常に接続してペアリングできました。

https://msdn.Microsoft.com/en-us/library/windows/apps/mt168401.aspx

https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/DeviceEnumerationAndPairing/cs

4
Espen