Программно подключить устройство Bluetooth как аудиоустройство - PullRequest
0 голосов
/ 07 февраля 2019

Я разрабатываю бизнес-приложение с windows 10, которое должно автоматически подключаться к данному Bluetooth-динамику / гарнитуре (Jabra FREEWAY v5.7.0).Используя BluetoothAPIs.h, пока это работает хорошо.Проблема в том, что он не отображается как аудиоустройство под Windows.Я не могу воспроизвести тестовый звук (или любой другой) на нем.Как связать устройство в качестве аудиоустройства?или есть ли какие-либо последующие шаги, чтобы установить устройство как аудио?

У нас есть аналогичный код, работающий для мобильного принтера, кажется, нет необходимости делать дополнительные шаги там.При подключении устройства (Jabra) с указанными возможностями Windows правильно отображается как аудиоустройство.

BOOL CALLBACK BTHeadsetAuthCallbackEx(__in_opt LPVOID /*pvParam*/, __in PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS pAuthCallbackParams)
{
  BLUETOOTH_AUTHENTICATE_RESPONSE resp;
  resp.bthAddressRemote = pAuthCallbackParams->deviceInfo.Address;
  resp.authMethod = pAuthCallbackParams->authenticationMethod;
  resp.negativeResponse = FALSE;
  resp.passkeyInfo.passkey = pAuthCallbackParams->Passkey;
  DWORD ret = BluetoothSendAuthenticationResponseEx( NULL, &resp );
  if( ret != ERROR_SUCCESS )
  {
    logError( "BluetoothSendAuthenticationResponseEx failed with %u", ret );
    return FALSE;
  }

  return TRUE;
}


BLUETOOTH_DEVICE_INFO deviceInfo = { sizeof(BLUETOOTH_DEVICE_INFO) };
deviceInfo.Address.ullLong = device->getAddress();

HBLUETOOTH_AUTHENTICATION_REGISTRATION regHandle;
DWORD err = BluetoothRegisterForAuthenticationEx( &deviceInfo, &regHandle, (PFN_AUTHENTICATION_CALLBACK_EX)&BTHeadsetAuthCallbackEx, NULL );
if( err != ERROR_SUCCESS )
{
  logError( "BluetoothRegisterForAuthenticationEx failed with %u", err );
  return false;
}

err = BluetoothAuthenticateDevice( NULL, NULL, &deviceInfo, L"0000", 4 );
if( err != ERROR_SUCCESS  )
{
  BluetoothUnregisterAuthentication( regHandle );
  logError( "BluetoothAuthenticateDevice failed with %u", err );
  return false;
}

BluetoothUnregisterAuthentication( regHandle );

1 Ответ

0 голосов
/ 08 февраля 2019

Как указал Майк Петриченко, мне нужно было вызвать BluetoothSetServiceState () с правильным GUID службы (устройства громкой связи в моем случае), который я нашел здесь: https://docs.microsoft.com/en-us/windows/client-management/mdm/policy-csp-bluetooth

Полный код:

BOOL CALLBACK BTHeadsetAuthCallbackEx(__in_opt LPVOID /*pvParam*/, __in PBLUETOOTH_AUTHENTICATION_CALLBACK_PARAMS pAuthCallbackParams)
{
  BLUETOOTH_AUTHENTICATE_RESPONSE resp;
  resp.bthAddressRemote = pAuthCallbackParams->deviceInfo.Address;
  resp.authMethod = pAuthCallbackParams->authenticationMethod;
  resp.negativeResponse = FALSE;
  resp.passkeyInfo.passkey = pAuthCallbackParams->Passkey;
  DWORD ret = BluetoothSendAuthenticationResponseEx( NULL, &resp );
  if( ret != ERROR_SUCCESS )
  {
    logError( "BluetoothSendAuthenticationResponseEx failed with %u", ret );
    return FALSE;
  }

  return TRUE;
}

BLUETOOTH_DEVICE_INFO deviceInfo = { sizeof(BLUETOOTH_DEVICE_INFO) };
deviceInfo.Address.ullLong = device->getAddress();

HBLUETOOTH_AUTHENTICATION_REGISTRATION regHandle;
DWORD err = BluetoothRegisterForAuthenticationEx( &deviceInfo, &regHandle, (PFN_AUTHENTICATION_CALLBACK_EX)&BTHeadsetAuthCallbackEx, NULL );
if( err != ERROR_SUCCESS )
{
  logError( "BluetoothRegisterForAuthenticationEx failed with %u", err );
  return false;
}

err = BluetoothAuthenticateDevice( NULL, NULL, &deviceInfo, L"0000", 4 );
if( err != ERROR_SUCCESS  )
{
  BluetoothUnregisterAuthentication( regHandle );
  logError( "BluetoothAuthenticateDevice failed with %u", err );
  return false;
}

BluetoothUnregisterAuthentication( regHandle );

HANDLE btHeadset;
BLUETOOTH_FIND_RADIO_PARAMS rfind = { sizeof( rfind ) };
BluetoothFindFirstRadio( &rfind, &btHeadset );
GUID id = { 0x0000111e, 0x0000, 0x1000, { 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb} }; 
err = BluetoothSetServiceState( &btHeadset, &deviceInfo, &id, BLUETOOTH_SERVICE_ENABLE );
if( err != ERROR_SUCCESS  )
{
  logError( "BluetoothSetServiceState failed with %u", err );
}

logNorm( "BluetoothSetServiceState successfull" );

примечание: это не полная защита от дурака.Я использую первое найденное устройство с пустыми параметрами поиска.Некоторая очистка будет осуществляться там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...