Как программно подключить устройство Bluetooth

Недавно я купил плату Lilypad Simblee BLE, и я хотел бы подключить ее программно к моему компьютеру (используя библиотеку 32feet.NET в C#).

Мне известно, что в Stackru уже задавался вопрос " Как запрограммировать сопряжение устройства Bluetooth " ( здесь, например), однако по некоторым причинам все мои попытки сопряжения устройства запрограммированы неудачно. Действительно, я успешно связал устройство с окном " Управление устройствами Bluetooth " на панели настроек Windows 10 (" Настройки" > " Устройства" > " Bluetooth").

Во-первых, я не знаю метод сопряжения (устаревший или SSP) для использования с моим устройством. Windows никогда не спрашивала у меня PIN-код или что-то в этом роде, поэтому я предполагаю, что это SSP, но я не уверен.

Я искал в Google, как сделать запрос сопряжения SSP с 32feet.NET: я нашел это.

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

Мой код:

using InTheHand.Net.Bluetooth;
using InTheHand.Net.Sockets;
using System;
using System.Collections.Generic;

namespace HLK_Client
{
    class HLKBoard
    {
        public event HLKBoardEventHandler HLKBoardConnectionComplete;
        public delegate void HLKBoardEventHandler(object sender, HLKBoardEventArgs e);

        private BluetoothClient _bluetoothClient;
        private BluetoothComponent _bluetoothComponent;
        private List<BluetoothDeviceInfo> _inRangeBluetoothDevices;
        private BluetoothDeviceInfo _hlkBoardDevice;
        private EventHandler<BluetoothWin32AuthenticationEventArgs> _bluetoothAuthenticatorHandler;
        private BluetoothWin32Authentication _bluetoothAuthenticator;


        public HLKBoard()
        {
            _bluetoothClient = new BluetoothClient();
            _bluetoothComponent = new BluetoothComponent(_bluetoothClient);
            _inRangeBluetoothDevices = new List<BluetoothDeviceInfo>();
            _bluetoothAuthenticatorHandler = new EventHandler<BluetoothWin32AuthenticationEventArgs>(_bluetoothAutenticator_handlePairingRequest);
            _bluetoothAuthenticator = new BluetoothWin32Authentication(_bluetoothAuthenticatorHandler);

            _bluetoothComponent.DiscoverDevicesProgress += _bluetoothComponent_DiscoverDevicesProgress;
            _bluetoothComponent.DiscoverDevicesComplete += _bluetoothComponent_DiscoverDevicesComplete;
        }


        public void ConnectAsync()
        {
            _inRangeBluetoothDevices.Clear();
            _hlkBoardDevice = null;
            _bluetoothComponent.DiscoverDevicesAsync(255, true, true, true, false, null);
        }


        private void PairWithBoard()
        {
            Console.WriteLine("Pairing...");

            bool pairResult = BluetoothSecurity.PairRequest(_hlkBoardDevice.DeviceAddress, null);

            if (pairResult)
            {
                Console.WriteLine("Success");
            }

            else
            {
                Console.WriteLine("Fail"); // Instantly fails
            }
        }


        private void _bluetoothComponent_DiscoverDevicesProgress(object sender, DiscoverDevicesEventArgs e)
        {
            _inRangeBluetoothDevices.AddRange(e.Devices);
        }

        private void _bluetoothComponent_DiscoverDevicesComplete(object sender, DiscoverDevicesEventArgs e)
        {
            for (int i = 0; i < _inRangeBluetoothDevices.Count; ++i)
            {
                if (_inRangeBluetoothDevices[i].DeviceName == "HLK")
                {
                    _hlkBoardDevice = _inRangeBluetoothDevices[i];
                    PairWithBoard();

                    return;
                }
            }

            HLKBoardConnectionComplete(this, new HLKBoardEventArgs(false, "Didn't found any \"HLK\" discoverable device"));
        }

        private void _bluetoothAutenticator_handlePairingRequest(object sender, BluetoothWin32AuthenticationEventArgs e)
        {
            e.Confirm = true; // Never reach this line
        }
    }
}

Любая идея, почему запрос на сопряжение не удается?

1 ответ

Решение

Ответ на связанный с вами вопрос имеет правдоподобное предположение... вы читали его?

Также вы должны посмотреть на этот вопрос.

Библиотека 32feet построена на основе унаследованного сопряжения, поэтому вам нужно либо узнать пин-код устройства, к которому вы подключаетесь, либо указать нулевое значение, чтобы во всплывающем окне ввести пин-код.

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

Что произойдет, если вы попытаетесь соединиться с контактом "0000" или "1234"?

Я смотрю на исходный код WindowsBluetoothSecurity.cs в 32feet.net, и я вижу, если запрос на сопряжение не удается, он записывает код ошибки в Debug.WriteLineЕсть ли шанс, что вы могли бы опубликовать этот код ошибки здесь?

Один хороший способ обойти эту проблему - импортировать BluetoothAuthenticateDeviceEx и используйте это вручную, чтобы завершить запрос на сопряжение. Если вы не хотите делать это вручную, похоже, что в последней версии источника 32feet существует метод сопряжения SSP, использующий этот метод, но он не является общедоступным и нигде не используется, поэтому вам потребуется доступ это через отражение:

typeof(BluetoothSecurity)
    .GetMethod("PairRequest", BindingFlags.Static | BindingFlags.NonPublic)
    .Invoke(null, new object[] { _hlkBoardDevice.DeviceAddress, BluetoothAuthenticationRequirements.MITMProtectionNotRequired });
Другие вопросы по тегам