Сопряжение устройств Bluetooth с компьютером с библиотекой Bluetooth 32feet .NET

Если вы хотите узнать, как использовать библиотеку 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 - но это немного небезопасно ...


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

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

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


person xmashallax    schedule 28.05.2013    source источник
comment
В windows 10 это не работает. ОС предлагает мне нажать на кнопку, чтобы настроить устройство - я никогда не получаю обратный вызов обработчику событий HandleRequests с использованием приведенного выше кода. Есть идеи, как обойти это приглашение?   -  person TheJeff    schedule 29.08.2015
comment
Да, как сказал TheJeff, сопряжение не работает в Windows 10, устройство сопрягается, но оно не отображается на «устройствах воспроизведения», как это исправить?   -  person sebastso    schedule 17.12.2015
comment
В системных требованиях не указана Windows 10, только Windows 8. Возможно, сейчас это невозможно.   -  person xmashallax    schedule 17.12.2015
comment
Я также получаю Tap, чтобы настроить всплывающее уведомление устройства в Windows 8.1. Мне интересно, связано ли это с опцией «Оповещать меня, когда новое устройство Bluetooth хочет подключиться» в настройках Bluetooth.   -  person Aron Curzon    schedule 12.01.2016
comment
удалось ли вам решить эту проблему? Я также получаю тот же TAP для настройки всплывающего уведомления, как только я нажимаю, он правильно сопряжен.   -  person sebastso    schedule 12.02.2016


Ответы (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);

person xmashallax    schedule 30.05.2013
comment
Вам нужен собственный код для запуска на удаленном устройстве? - person Uri Abramson; 25.04.2014
comment
@xmarshallax Socket не подключается с помощью метода BeginConnect. Статус Socket.connected имеет значение false, поэтому метод Getstream () не будет работать для отправки или получения данных. - person Harsh; 24.06.2014
comment
Это вопрос или заявление? Код выше работает для меня - person xmashallax; 13.10.2014
comment
@xmashallax Мне нужна помощь. Я делаю приложение WP8. Мое требование - сканировать устройства (сканеры RFID с модулем bluetooth), подключаться к одному из них, отправлять команды для выполнения конкретной работы и получать ответ! любая помощь ? - person Apoorv; 26.05.2015
comment
Не следует ли регистрировать обработчики событий Progress и Complete до вызова метода DiscoverDevicesAsync? - person Edgar; 27.08.2015
comment
В целом да, но асинхронный метод занимает некоторое время (несколько секунд), поэтому обычно устройство не обнаруживается до регистрации обработчиков. - person xmashallax; 27.08.2015
comment
Для тех, кто ищет, как найти Mac-адрес Mac с Bluetooth: stackoverflow.com/questions/1819971/ - person CodyF; 12.05.2016
comment
Я хочу знать, как отправить данные на конкретное устройство? - person Bhavin Patel; 14.06.2016
comment
Поддерживает ли эта 32-футовая библиотека соединение с устройствами с низким энергопотреблением Bluetooth? Нравится iOS? - person Bit_Pulse; 15.02.2017
comment
Кто-нибудь знает, как подключиться к blutooth-устройству без пина? - person noone392; 16.05.2017
comment
Я почти уверен, что каждое устройство по умолчанию имеет предустановленный пин-код. Проверьте руководство или Интернет, или попробуйте 1234 или 0000. Удачи! - person xmashallax; 17.05.2017
comment
@Harsh Я заменил этот метод BeginConnect на localClient.Connect (device.DeviceAddress, BluetoothService.Handsfree); (Я знал, что на моем устройстве громкая связь) - person StinkyCat; 04.07.2019
comment
Какое значение имеет ПИН-код устройства в соединении? Насколько мне известно, мой смартфон и ноутбук подключаются, потому что я предоставляю авторизацию, если она запрашивается. Это ПИН-код или что-то еще? Я смущен. - person octopusgrabbus; 27.02.2020
comment
@xmashallax: Не пойми меня неправильно, приятель; Я ценю усилия, но в публикации очень плохой английский и отсутствует информация. Вы бросаете код, который должен находиться внутри методов; нет объявления объекта ... Похоже на Magic Code. Люди смотрят на это, веря, что что-то есть; там нет. Мы должны просто угадать? =) В любом случае: пожалуйста, улучшите свою ветку. - person John Connor; 31.03.2021