Bluetooth-соединение (SSP) в Windows 10 с 32feet.NET

Я только начал проект, который потребует от меня сопряжения планшета Windows 10 с другим устройством Bluetooth.

Я решил начать с простого приложения Windows Forms, чтобы ознакомиться с процессом. Я добавил пакет 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!");
            }
        }
    }

На моем настольном ПК с Windows7 с дешевым адаптером Bluetooth 2.0 на моем телефоне появляется всплывающее окно с просьбой ввести пин-код. Когда я ввожу "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;

        }
    }

Когда я запускаю сопряжение со своего телефона, это работает нормально, событие срабатывает, появляется окно сообщения и сопряжение успешно.

Однако, когда я инициирую сопряжение с планшета, обработчик событий никогда не запускается, поэтому сопряжение не выполняется.

1 ответ

Я полагаю, что проблема здесь в том, что библиотека 32feet построена на унаследованном сопряжении, поэтому вам нужно либо узнать пин-код устройства, к которому вы подключаетесь, либо предоставить ему нулевое значение, чтобы получить всплывающее окно для ввода пин-кода. Это диалоговое окно, возможно, не дошло до новой версии Windows - Не уверен в этом, но в документации по нативной функции, которую оборачивает библиотека 32feet, говорится, что нужно вызывать другой метод, если разрабатывается для более новой, чем Vista.

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

Из моего исследования просмотра декомпилированных источников 32 футов, может показаться, что 32 фута не поддерживают SSP, только другие - но это может быть только из-за того, что поставляемые реализации стека bluetooth нуждаются в обновлении - или вам нужно создать свои собственные - снова я Точно сказать не могу.

Возможно, вы захотите взглянуть на поставляемые Microsoft библиотеки для.NET вместо этой третьей стороны, я смог использовать их пример из Github для успешного подключения и сопряжения со всеми моими устройствами.

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

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

Другие вопросы по тегам