Можете ли вы получить MAC-адрес Bluetooth устройства Bluetooth, если у вас есть его имя?

0

В настоящее время я создаю программу в C++, которая позволяет подключать устройства (в настоящее время только к моему смартфону) к ПК. Я использую функции WinApi, и это работает очень хорошо.

Для работы программы мне в настоящее время необходимо передать MAC-адрес Bluetooth устройства, в частности, функция BluetoothRegisterForAuthenticationEx MSDN нуждается в ее подключении к устройству.

Теперь я действительно не хочу вводить свой MAC-адрес Bluetooth, но было бы неплохо ввести имя устройства (или что-то еще) для того, чтобы соединить устройство.

Я просмотрел функции bluetooth winapi, но ничего не нашел, поэтому мой вопрос для вас,

Могу ли я, программно, получить MAC-адрес Bluetooth определенного устройства, когда у меня есть другая информация (например, имя устройства), не будучи уже сопряженной? И если да, то как?

Теги:
bluetooth
winapi
mac-address

2 ответа

0
Лучший ответ

Я нашел точный метод, который я искал в образцах Windows SDK.

Microsoft SDK\Windows\v7.0\Примеры\netds\winsock\bluetooth

Мехтод называется NameToBthAddr и делает то, что предлагал Эрик Леманисье.

0

Вы можете запустить обнаружение устройства с помощью WSALookupServiceBegin и WSALookupServiceNext, а затем для каждого обнаруженного устройства (каждый WSAQUERYSET) сравнить lpszServiceInstanceName с именем, введенным пользователем. Если он совпадает, тогда у вас есть адрес mac в поле lpcsaBuffer->RemoteAddr.lpSockaddr. Это поле можно передать в PSOCKADDR_BTH, затем вы получите MAC-адрес в PSOCKADDR_BTH->btAddr

WSAQUERYSET querySet;
memset(&querySet, 0, sizeof(querySet));
querySet.dwSize = sizeof(querySet);
querySet.dwNameSpace = NS_BTH;
HANDLE hLookup;
if(0 != WSALookupServiceBegin(&querySet, LUP_CONTAINERS | LUP_FLUSHCACHE, &hLookup))
{
    if(WSAGetLastError() != WSASERVICE_NOT_FOUND)
    {
        // error during WSALookupServiceBegin
    }
    else
    {
        //No BlueTooth device Found
    }
    return res;
}
DWORD deviceLength = 2000;
char buf[deviceLength];
WSAQUERYSET* pDevice = PWSAQUERYSET(buf);
while (0 == WSALookupServiceNext(hLookup, LUP_RETURN_ADDR | LUP_RETURN_NAME, &deviceLength, pDevice))
{
    PSOCKADDR_BTH sa = PSOCKADDR_BTH(pDevice->lpcsaBuffer->RemoteAddr.lpSockaddr);
    if(sa->addressFamily != AF_BTH)
    {
       // Address family is not AF_BTH  for bluetooth device discovered
        continue;
    }
    //the name is available in pDevice->lpszServiceInstanceName
    //the MAC address is available in sa->btAddr
}
WSALookupServiceEnd(hLookup);
  • 0
    Прежде всего, спасибо. Для WSALookupServiceBegin функции WSALookupServiceBegin мне нужен lpServiceClassId , GUID, который идентифицирует службу, которую я ищу. Я заглянул в SvcGuid.h где пример, который я нашел, получил свой GUID, но, похоже, ничего не подходит. Знаете ли вы случайно, что мне нужно использовать, чтобы найти устройства / услуги Bluetooth? Или я ошибся?
  • 0
    Вам не нужен ServiceClassId, если вы выполняете обнаружение устройства, он нужен только тогда, когда вы выполняете обнаружение службы. Я отредактировал свой ответ с помощью псевдокода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню