我正在尝试获取有关蓝牙设备提供的服务的信息。使用WSALookupServiceNext
,我可以获得所有服务的列表。但是,无论我尝试发现哪种蓝牙设备,生成的WSAQUERYSET结构(pqs
)都不会包含lpServiceClassId
字段(而lpszServiceInstanceName
始终存在)。我想知道服务的UUID,以确定它属于Table 2: Service Class Profile Identifiers的哪个类。
#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结构。有关更多详细信息,请参见Mike Petrichenko's comment。另外,还有一个很好的示例,如何从Qt framework source code实现它。
至于我,我决定不遵循这条路,因为我的目标是编写一个用于配对蓝牙设备的控制台实用程序。我发现使用Windows.Devices.Enumeration API有更好的方法。最后,使用此API,我设法创建了正在使用的BluetoothDevicePairing实用程序。