Подтвердить что ты не робот

Пара Bluetooth-устройств на компьютер с 32-битной библиотекой .NET Bluetooth

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


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

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

На компьютере запущена пользовательская программа bluetooth на основе 32feet.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 просит меня ввести код сопряжения для устройства. Я прочитал о BluetoothWin32Authentication, чтобы предотвратить этот случай, но я не понимаю.

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

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

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


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

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

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

4b9b3361

Ответ 1

Я понял, как решить свои проблемы, и мои знания о соединениях Bluetooth сейчас немного больше. Если у кого-то есть проблемы с этим, я предоставляю свое решение. Примеры кода представляют реализацию С# контроллера bluetooth с 32-битной библиотекой 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 допустимым адресом BluetoothAddress (например, с помощью BluetoothAddress.Parse();). После подключения устройств они могут обмениваться сообщениями через базовый поток. Если соединение не работает, могут возникнуть проблемы с аутентификацией, поэтому попробуйте установить контакт локального устройства в слушателе (l.SetPin(LOCAL_MAC, MY_PASSWORD);