Подключите устройства Bluetooth к компьютеру с помощью библиотеки.feet .NET Bluetooth

Если вы хотите узнать, как использовать библиотеку 32feet.NET для связи с устройствами Bluetooth, прочтите решение


В настоящее время я пытаюсь установить связь между компьютером и прототипом.NET Gadgeteer через Bluetooth.

Прототип Gadgeteer состоит из материнской платы, блока питания и модуля Bluetooth. Модуль находится в режиме обнаружения.

На компьютере запущена специальная Bluetooth-программа на основе 32 футов.NET Bluetooth. Программа обнаруживает все Bluetooth-устройства в радиусе действия и пытается выполнить сопряжение с ними. Однако на данный момент это не выполняется автоматически, мне нужно ввести код сопряжения для устройства.

Как выполнить сопряжение устройств без ввода кода сопряжения?

Устройства найдены, проблема в сопряжении. Я много экспериментировал, но не нашел решения...

foreach (BluetoothDeviceInfo device in this.deviceList)
{
    try
    {
        //BluetoothClient client = new BluetoothClient(this.CreateNewEndpoint(localAddress));
        //BluetoothEndPoint ep = this.CreateNewEndpoint(device.DeviceAddress);

        EventHandler<BluetoothWin32AuthenticationEventArgs> handler = new EventHandler<BluetoothWin32AuthenticationEventArgs>(HandleRequests);
        BluetoothWin32Authentication auth = new BluetoothWin32Authentication(handler);

        BluetoothSecurity.PairRequest(device.DeviceAddress, null);
    }
}

Этот блок кода инициирует соединение, и оно работает, но Windows просит меня ввести код подключения для устройства. Я прочитал об аутентификации BluetoothWin32, чтобы предотвратить этот случай, но я не понял его правильно.

private void HandleRequests(object that, BluetoothWin32AuthenticationEventArgs e)
{
    e.Confirm = true;
}

Это код обработчика события ( http://32feet.codeplex.com/wikipage?title=BluetoothWin32Authentication)

Если вы просто хотите разрешить сопряжение, когда подключаются устройства SSP, тогда обработки обратного вызова и установки e.Confirm=True будет достаточно, но это немного небезопасно...


Я запутался -.- Цель состоит в том, чтобы приложение и модуль гаджета могли отправлять данные в обоих направлениях без какого-либо вмешательства пользователя.

Правда ли, что я не могу автоматически подключать устройства без участия пользователя?

Правда ли, что если два устройства уже были соединены, они могут обмениваться данными без взаимодействия с пользователем?

1 ответ

Решение

Я понял, как решить свои проблемы, и мои знания о Bluetooth-соединениях теперь немного больше. Если у кого-то есть проблемы с этим, я предоставлю свое решение. Примеры кода представляют реализацию C# контроллера Bluetooth с библиотекой 32feet Bluetooth.

сканирование

Это означает, что устройства в радиусе действия обнаружены. Мой код:

// mac is mac address of local bluetooth device
BluetoothEndPoint localEndpoint = new BluetoothEndPoint(mac, BluetoothService.SerialPort);
// client is used to manage connections
BluetoothClient localClient = new BluetoothClient(localEndpoint);
// component is used to manage device discovery
BluetoothComponent localComponent = new BluetoothComponent(localClient);
// async methods, can be done synchronously too
localComponent.DiscoverDevicesAsync(255, true, true, true, true, null);
localComponent.DiscoverDevicesProgress += new EventHandler<DiscoverDevicesEventArgs>(component_DiscoverDevicesProgress);
localComponent.DiscoverDevicesComplete += new EventHandler<DiscoverDevicesEventArgs>(component_DiscoverDevicesComplete);

private void component_DiscoverDevicesProgress(object sender, DiscoverDevicesEventArgs e)
{
    // log and save all found devices
    for (int i = 0; i < e.Devices.Length; i++)
    {           
        if (e.Devices[i].Remembered)
        {
            Print(e.Devices[i].DeviceName + " (" + e.Devices[i].DeviceAddress + "): Device is known");
        }
        else
        {
            Print(e.Devices[i].DeviceName + " (" + e.Devices[i].DeviceAddress + "): Device is unknown");
        }
        this.deviceList.Add(e.Devices[i]);         
    }
}

private void component_DiscoverDevicesComplete(object sender, DiscoverDevicesEventArgs e)
{
    // log some stuff
}

спаривание

Это означает, что устройства связаны с локальным устройством Bluetooth. Это нужно сделать один раз, введя код с обеих сторон. Это можно сделать с помощью кода, чтобы пользователь даже не заметил, что устройство было добавлено. Мой код для этой цели:

// get a list of all paired devices
BluetoothDeviceInfo[] paired = localClient.DiscoverDevices(255, false, true, false, false);
// check every discovered device if it is already paired 
foreach (BluetoothDeviceInfo device in this.deviceList)
{
    bool isPaired = false;
    for (int i = 0; i < paired.Length; i++)
    {
        if (device.Equals(paired[i]))
        {
            isPaired = true;
            break;
        }
    }

    // if the device is not paired, pair it!
    if (!isPaired)
    {
        // replace DEVICE_PIN here, synchronous method, but fast
        isPaired = BluetoothSecurity.PairRequest(device.DeviceAddress, DEVICE_PIN);
        if (isPaired)
        {
            // now it is paired
        }
        else
        {
            // pairing failed
        }
    }
}

соединительный

Это означает установление соединения и обмен данными. Опять код:

// check if device is paired
if (device.Authenticated)
{
    // set pin of device to connect with
    localClient.SetPin(DEVICE_PIN);
    // async connection method
    localClient.BeginConnect(device.DeviceAddress, BluetoothService.SerialPort, new AsyncCallback(Connect), device);
}

// callback
private void Connect(IAsyncResult result)
{
    if (result.IsCompleted)
    {
        // client is connected now :)
    }
}

Если вы сохраняете порядок сканирования, сопряжения, подключения, все должно работать нормально. Для отправки или получения данных используйте GetStream() метод BluetoothClient, Он обеспечивает сетевой поток, которым можно манипулировать.

Получение соединения

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

BluetoothListener l = new BluetoothListener(LOCAL_MAC, BluetoothService.SerialPort);
l.Start(10);
l.BeginAcceptBluetoothClient(new AsyncCallback(AcceptConnection), l);

void AcceptConnection(IAsyncResult result){
    if (result.IsCompleted){
        BluetoothClient remoteDevice = ((BluetoothListener)result.AsyncState).EndAcceptBluetoothClient(result);    
    }    
}

замещать LOCAL_MAC с действительным адресом Bluetooth (например, с помощью BluetoothAddress.Parse();). После подключения устройств они могут обмениваться сообщениями через основной поток. Если соединение не работает, могут быть проблемы с аутентификацией, поэтому попробуйте установить контакт локального устройства в приемнике (l.SetPin(LOCAL_MAC, MY_PASSWORD);

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