В настоящее время я создаю программу в C++, которая позволяет подключать устройства (в настоящее время только к моему смартфону) к ПК. Я использую функции WinApi, и это работает очень хорошо.
Для работы программы мне в настоящее время необходимо передать MAC-адрес Bluetooth устройства, в частности, функция BluetoothRegisterForAuthenticationEx MSDN нуждается в ее подключении к устройству.
Теперь я действительно не хочу вводить свой MAC-адрес Bluetooth, но было бы неплохо ввести имя устройства (или что-то еще) для того, чтобы соединить устройство.
Я просмотрел функции bluetooth winapi, но ничего не нашел, поэтому мой вопрос для вас,
Могу ли я, программно, получить MAC-адрес Bluetooth определенного устройства, когда у меня есть другая информация (например, имя устройства), не будучи уже сопряженной? И если да, то как?
Я нашел точный метод, который я искал в образцах Windows SDK.
Microsoft SDK\Windows\v7.0\Примеры\netds\winsock\bluetooth
Мехтод называется NameToBthAddr
и делает то, что предлагал Эрик Леманисье.
Вы можете запустить обнаружение устройства с помощью 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);
WSALookupServiceBegin
функцииWSALookupServiceBegin
мне нуженlpServiceClassId
, GUID, который идентифицирует службу, которую я ищу. Я заглянул вSvcGuid.h
где пример, который я нашел, получил свой GUID, но, похоже, ничего не подходит. Знаете ли вы случайно, что мне нужно использовать, чтобы найти устройства / услуги Bluetooth? Или я ошибся?