查找蓝牙设备的服务 uuid
Find service`s uuid of a bluetooth device
我正在尝试获取有关蓝牙设备提供的服务的信息。使用 WSALookupServiceNext
我可以获得所有服务的列表。但是,无论我尝试发现什么蓝牙设备,生成的 WSAQUERYSET 结构 (pqs
) 永远不会包含 lpServiceClassId
字段(而 lpszServiceInstanceName
始终存在)。我想知道服务的 UUID 以确定它属于 Table 2: Service Class Profile Identifiers 中的哪个 class。
#include<winsock2.h>
int main()
{
WSADATA data;
WSAStartup(MAKEWORD(2, 2), &data);
WSAQUERYSET qs{};
qs.dwSize = sizeof(WSAQUERYSET);
qs.dwNameSpace = NS_BTH;
qs.dwNumberOfCsAddrs = 0;
qs.lpszContext = (LPWSTR)L"12:34:56:78:99:11";
qs.lpServiceClassId = const_cast<LPGUID>(&PublicBrowseGroupServiceClass_UUID);
const DWORD flags = LUP_FLUSHCACHE | LUP_RETURN_ALL;
HANDLE hlookup = nullptr;
WSALookupServiceBegin(&qs, flags, &hlookup);
while (true) {
char buff[4096];
WSAQUERYSET* pqs = (WSAQUERYSET*)buff;
DWORD size = sizeof(buff);
memset(buff, 0, size);
const INT res = WSALookupServiceNext(hlookup, flags, &size, pqs);
if (res != 0 && GetLastError() == WSA_E_NO_MORE) {
break;
}
// it prints "service name=Advanced Audio, service uuid=0x0"
wprintf(L"service name=%s, service uuid=0x%X\n", pqs->lpszServiceInstanceName, pqs->lpServiceClassId->Data1);
}
}
回答我自己的问题:
为了获得服务 ID,我们必须解析从 WSALookupServiceNext
函数调用返回并可通过 WSAQUERYSET.lpBlob
成员访问的 SPD 结构。
有关详细信息,请参阅 。
此外,还有一个很好的示例如何从 Qt framework source code.
实现它
至于我自己,我决定不走这条路,因为我的目标是编写一个用于配对蓝牙设备的控制台实用程序。我发现使用我正在使用的 Windows.Devices.Enumeration API. Finally, using this API, I managed to create the BluetoothDevicePairing 实用程序有更好的方法。
我正在尝试获取有关蓝牙设备提供的服务的信息。使用 WSALookupServiceNext
我可以获得所有服务的列表。但是,无论我尝试发现什么蓝牙设备,生成的 WSAQUERYSET 结构 (pqs
) 永远不会包含 lpServiceClassId
字段(而 lpszServiceInstanceName
始终存在)。我想知道服务的 UUID 以确定它属于 Table 2: Service Class Profile Identifiers 中的哪个 class。
#include<winsock2.h>
int main()
{
WSADATA data;
WSAStartup(MAKEWORD(2, 2), &data);
WSAQUERYSET qs{};
qs.dwSize = sizeof(WSAQUERYSET);
qs.dwNameSpace = NS_BTH;
qs.dwNumberOfCsAddrs = 0;
qs.lpszContext = (LPWSTR)L"12:34:56:78:99:11";
qs.lpServiceClassId = const_cast<LPGUID>(&PublicBrowseGroupServiceClass_UUID);
const DWORD flags = LUP_FLUSHCACHE | LUP_RETURN_ALL;
HANDLE hlookup = nullptr;
WSALookupServiceBegin(&qs, flags, &hlookup);
while (true) {
char buff[4096];
WSAQUERYSET* pqs = (WSAQUERYSET*)buff;
DWORD size = sizeof(buff);
memset(buff, 0, size);
const INT res = WSALookupServiceNext(hlookup, flags, &size, pqs);
if (res != 0 && GetLastError() == WSA_E_NO_MORE) {
break;
}
// it prints "service name=Advanced Audio, service uuid=0x0"
wprintf(L"service name=%s, service uuid=0x%X\n", pqs->lpszServiceInstanceName, pqs->lpServiceClassId->Data1);
}
}
回答我自己的问题:
为了获得服务 ID,我们必须解析从 WSALookupServiceNext
函数调用返回并可通过 WSAQUERYSET.lpBlob
成员访问的 SPD 结构。
有关详细信息,请参阅
至于我自己,我决定不走这条路,因为我的目标是编写一个用于配对蓝牙设备的控制台实用程序。我发现使用我正在使用的 Windows.Devices.Enumeration API. Finally, using this API, I managed to create the BluetoothDevicePairing 实用程序有更好的方法。