查找蓝牙设备的服务 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 实用程序有更好的方法。