Хобрук: Ваш путь к мастерству в программировании

Невозможно подключиться к устройству Bluetooth с помощью Bluetooth API Windows на С++

Я создал программу, использующую только Bluetooth API Windows, которая перечисляет устройства Bluetooth в пределах досягаемости, а затем ищет конкретное устройство Bluetooth (модуль Bluetooth HC-05). Если поиск успешен, программа выполняет аутентификацию и устанавливает состояние службы устройства для создания виртуального порта с использованием GUID последовательного порта (1101). Моя цель состоит в том, чтобы программно соединиться и взаимодействовать с устройством BT, не беспокоя пользователя.

Ниже показан сегмент main(), в котором предпринимается попытка аутентификации и создания виртуального порта.

if(desired_device_info.fAuthenticated==FALSE){ //if device is not authenticated then,
BluetoothGetDeviceInfo(m_radio,&desired_device_info); //get updated device information
if(!pairDevice(desired_device_info)){//attempt to pair with the device.
    cout<<"Authentication failed, Try manually"<<endl;
    CloseAllHandle();
    return 0;}
    }

ret=BluetoothSetServiceState(m_radio,&desired_device_info,&serial,BLUETOOTH_SERVICE_ENABLE); 
if(ret !=ERROR_SUCCESS && ret!=E_INVALIDARG){
        if(ret == ERROR_INVALID_PARAMETER)
            cout<< "Invalid Parameter" << endl;
        if(ret == ERROR_SERVICE_DOES_NOT_EXIST)
            cout<< "Service not found" << endl;

            cout<<"Press any key to exit"<<endl;
            CloseAllHandle();
            x=_getch();
            return 0;
                }

BluetoothGetDeviceInfo(m_radio,&desired_device_info); //get updated device infor

BluetoothUpdateDeviceRecord(&desired_device_info);

Функция pairDevice(), используемая в приведенном выше сегменте:

bool pairDevice(BLUETOOTH_DEVICE_INFO device){

    DWORD errorCode;
    bool result=false;
    //wchar_t passKey=L'1234\n';
        PWSTR * passKey = new PWSTR[1];
        passKey[0]=L"1234";// this is the default pass key/pin code for HC-05, can be changed to a custom value.
    errorCode=BluetoothAuthenticateDevice(NULL,m_radio,&device,*passKey,4); //here 4 is the size of device passkey 

    //errorCode=BluetoothRegisterForAuthenticationEx(&device, &hRegHandle, (PFN_AUTHENTICATION_CALLBACK_EX)&bluetoothAuthCallback, NULL);
    //       if(errorCode != ERROR_SUCCESS)
    //           {
    //              fprintf(stderr, "BluetoothRegisterForAuthenticationEx ret %d\n", errorCode);
    //              CloseAllHandle();
    //               _getch();
    //               return false;
    //              //ExitProcess(2);
    //              
    //           }


    //errorCode = BluetoothAuthenticateDeviceEx(NULL,m_radio, &device, NULL, MITMProtectionNotRequired);
    switch(errorCode)
    {case(ERROR_SUCCESS):
        cout<<"Device authenticated successfully"<<endl;
        result=true;
        break;
    case(ERROR_CANCELLED):
            cout<<"Device authenticated failed"<<endl;
            result=false;
        break;
    case(ERROR_INVALID_PARAMETER):
            cout<<"Invalid parameters"<<endl;
            result=false;
        break;
    case(ERROR_NO_MORE_ITEMS):
        cout<<"Device not available"<<endl;
        result=false;
        break;
    }

    if(errorCode != ERROR_SUCCESS)
        cout<<"Failure due to: "<<GetLastError() <<endl;

    return result;
}

void CloseAllHandle(void){

    if(CloseHandle(m_radio) == FALSE){
                        cout<<"CloseHandle() failed with error code "<< GetLastError()<<endl;
                        }
    BluetoothUnregisterAuthentication(hRegHandle);

}

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

Изображение вывода программы

Когда последовательный терминал пытается связаться с созданным выше comport, он возвращает следующую ошибку:

Элемент не найден. (1168)

Я устал использовать метод обратного вызова для аутентификации устройства, но он не работает, возвращая такие ошибки, как:

Устройство не подключено. (1167) Устройство не распознает команду. (22)

Я был бы очень признателен, если бы кто-нибудь мог отладить этот код, поскольку мне не удалось найти ресурсы или учебник по использованию API-интерфейсов Windows Bluetooth.

Вот полный код.

19.06.2016

  • Английский не является моим родным языком, но я старался быть максимально грамматически точным. 19.06.2016

Ответы:


1

Прежде всего, в качестве быстрого (первого) ответа вы не сможете «общаться» (отправлять/считывать данные в/из...) с этим набором API («Bluetooth»): вам нужно использовать 'socket' Bluetooth API, как описано здесь: https://msdn.microsoft.com/en-us/library/aa362928(v=VS.85).aspx (поскольку вы нигде об этом не упомянули, я предположил, что вы его не использовали, верно?) Здесь есть много сообщений об этом, но я могу посоветовать вам также прочитать этот замечательный учебник http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancedotherprotocol4j.html

21.06.2016
  • Я попробовал функцию подключения winsock, и она сработала, теперь проблема в том, что при вызове функции подключения пользователю предлагается выполнить сопряжение с устройством. Как я могу этого избежать? Я пробовал аутентификацию перед функцией подключения и пробовал функцию обратного вызова аутентификации, но обе они не работали. 24.06.2016
  • Для автоматической обработки аутентификации используйте BluetoothWin32Authentication и обрабатывайте его обратный вызов, предоставляя необходимую информацию SSP, т. е. PIN-код для старых устройств. 28.06.2016
  • Новые материалы

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

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...