首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何枚举所有蓝牙服务?

如何枚举所有蓝牙服务?
EN

Stack Overflow用户
提问于 2022-10-28 10:30:06
回答 1查看 54关注 0票数 -1

我想得到任何蓝牙设备可用蓝牙服务的列表。

我从Windows中找到了BluetoothEnumerateInstalledServices,但它只枚举已安装的服务。这样我就可以得到一个3项服务的列表,而不是4项服务。

如何获得蓝牙设备上所有服务的列表?

EN

回答 1

Stack Overflow用户

发布于 2022-11-06 13:42:18

我找到了一个办法,但它没有提供全部必要的信息:

代码语言:javascript
运行
复制
    #pragma comment(lib, "ws2_32.lib")
    #include <winsock2.h>
    #include <Ws2bth.h>
    #pragma comment(lib, "Bthprops.lib")
    #include <BluetoothAPIs.h>
    #include <stdio.h>
    #include <iostream>

    int main(int argc, char** argv)
    {
        WSADATA data;
        if (WSAStartup(0x0202, &data) != 0)
        {
            // Выход по ошибке
            printf("WSACleanup() failed with error code %ld\n", WSAGetLastError());
            return 1;
        }
        #define BUF_SIZE 10240    
        WSAQUERYSET* pQuerySet = (WSAQUERYSET*) new BYTE[BUF_SIZE];
        ZeroMemory(pQuerySet, BUF_SIZE);
        pQuerySet->dwSize = sizeof(WSAQUERYSET);
        pQuerySet->dwNameSpace = NS_BTH;

        // Запускаем поиск устройств
        HANDLE lookupHandle = 0;
        int    lookupResult = WSALookupServiceBegin(pQuerySet,
            LUP_RETURN_NAME | LUP_CONTAINERS | LUP_RETURN_ADDR | LUP_FLUSHCACHE |
            LUP_RETURN_TYPE | LUP_RETURN_BLOB | LUP_RES_SERVICE,
            &lookupHandle);
        if (lookupResult != 0)
        {
            // Ошибка при инициализации поиска
            printf("WSALookupServiceBegin() failed with error code %ld\n", WSAGetLastError());
        }
        else
        {
            printf("WSALookupServiceBegin() is OK\n");       
        }

        while (lookupResult == 0)
        {
            DWORD  bufferLen = BUF_SIZE;

            lookupResult = WSALookupServiceNext(lookupHandle,
                LUP_RETURN_NAME | LUP_RETURN_ADDR,
                &bufferLen,
                pQuerySet);
            if (lookupResult != 0)
                break;
    
            DWORD addressLength = 128;
            char* addressString = new char[addressLength];

            int result = WSAAddressToString(pQuerySet->lpcsaBuffer->RemoteAddr.lpSockaddr,
                pQuerySet->lpcsaBuffer->RemoteAddr.iSockaddrLength,
                NULL,
                (LPWSTR)addressString,
                &addressLength);

            if (result != 0)
            {
                printf("\n          WSAAddressToString() for remote address failed with error code %ld\n", WSAGetLastError());
            }
            else {
                printf("MAC: ");
                printf("%S ", addressString);
                printf("Name: ");
                wprintf(pQuerySet->lpszServiceInstanceName);
                printf("\n");        

                WSAQUERYSET* pQuerySetServices = (WSAQUERYSET*) new BYTE[BUF_SIZE];
                ZeroMemory(pQuerySetServices, BUF_SIZE);
                pQuerySetServices->dwSize = sizeof(WSAQUERYSET);
                pQuerySetServices->dwNameSpace = NS_BTH;
                pQuerySetServices->dwNumberOfCsAddrs = 0;
                pQuerySetServices->lpszContext = (LPWSTR)addressString;
                pQuerySetServices->lpServiceClassId = (GUID*)&L2CAP_PROTOCOL_UUID;

                HANDLE lookupServicesHandle = 0;
                int lookupServicesResult = WSALookupServiceBegin(pQuerySetServices, LUP_RETURN_NAME | LUP_RETURN_TYPE | LUP_RES_SERVICE | LUP_RETURN_ADDR | LUP_RETURN_BLOB | LUP_RETURN_COMMENT, &lookupServicesHandle);
                if (lookupServicesResult != 0)
                {
                    printf("WSALookupServiceBegin() failed with error code %ld\n", WSAGetLastError());
                }
                else
                {
                    while (lookupServicesResult == 0)
                    {
                        DWORD  bufferLen = BUF_SIZE;

                        lookupServicesResult = WSALookupServiceNext(lookupServicesHandle,
                            LUP_RETURN_ALL,
                            &bufferLen,
                            pQuerySetServices);
                        if (lookupServicesResult != 0)
                            break;

                        GUID guid = *pQuerySetServices->lpServiceClassId;
                        OLECHAR* guidString;
                        StringFromCLSID(guid, &guidString);

                        printf("    ");
                        wprintf(guidString);
                        printf(" ");
                        wprintf(pQuerySetServices->lpszServiceInstanceName);
                        printf("\n");
                    }
                    WSALookupServiceEnd(lookupServicesHandle);
                }
            }
        }

        WSALookupServiceEnd(lookupHandle);
        WSACleanup();
    }

输出:

代码语言:javascript
运行
复制
    MAC: (00:1E:B5:8C:64:49) Name: Moga Pro HID
        {00000000-0000-0000-0000-000000000000}
        {00000000-0000-0000-0000-000000000000} Android Controller Gen-2(ACC)
    MAC: (30:39:26:FE:C8:62) Name: SBH20
        {00000000-0000-0000-0000-000000000000} Hands-Free unit
        {00000000-0000-0000-0000-000000000000} Headset
        {00000000-0000-0000-0000-000000000000}
        {00000000-0000-0000-0000-000000000000}
        {00000000-0000-0000-0000-000000000000}

这个方法可以得到正确的服务计数,但是GUID总是空的,有些服务没有可读的名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74234066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档