#c #c #winapi #bluetooth
#c #c #winapi #bluetooth
Вопрос:
Я играю с Windows API для встроенного программирования Bluetooth.
Я успешно подключаю свой ПК с Windows к своему устройству Android, но когда я изменяю параметр AUTHENTICATION_REQUIREMENTS в функции
BluetoothAuthenticateDeviceEx из AUTHENTICATION_REQUIREMENTS::MITMProtectionRequiredGeneralBonding
Для AUTHENTICATION_REQUIREMENTS::MITMProtectionRequired
мой код «не удается» выполнить сопряжение с моим устройством Android.
Под «сбоем» я подразумеваю, что все API-интерфейсы являются ERROR_SUCCESS
кодом возврата, а в телефоне Android мой ПК с Windows отображается как «сопряженный», но на моем ПК с Windows устройство Android не было добавлено к устройствам Bluetooth. Более того, если я попытаюсь использовать свой телефон Android и подключиться к своему ПК с Windows, процесс сопряжения будет запущен снова (я предполагаю, что это так, поскольку ранее сопряжение не было завершено успешно).
Код Windows выглядит следующим образом:
int Authenticate(BLUETOOTH_DEVICE_INFO device)
{
HBLUETOOTH_AUTHENTICATION_REGISTRATION hAuthentication = nullptr;
DWORD err = BluetoothRegisterForAuthenticationEx(amp;device,
amp;hAuthentication,
amp;::AuthenticationCallbackStatic,
nullptr);
if (ERROR_SUCCESS != err) { return -1; }
// Changing last parameter to MITMProtectionRequired will cause to pairing
// complete unsuccessfully
err = BluetoothAuthenticateDeviceEx(nullptr,
nullptr,
amp;device,
nullptr,
MITMProtectionRequiredGeneralBonding);
if (ERROR_SUCCESS != err) { return -1; }
return 0;
}
Есть идеи, почему этот параметр вызывает сбой сопряжения?
Ответ №1:
Существует разница между «сопряжением» и «Связыванием». Сопряжение — это генерация общего секрета (ключа) между двумя устройствами, который может использоваться во время аутентификации текущего сеанса.
Если ключ сохранен, два устройства связаны.
MITMProtectionRequired в соответствии с MSDN — это «требование MITM для аутентификации», поэтому я понимаю, что это означает просто сопряжение, а не соединение. Вот как вы видите ERROR_SUCCESS, но ключ не сохраняется. Поэтому для последующих подключений требуется сопряжение.