WinCE5下查询蓝牙服务,每次都出现错误:WSASERVICE_NOT_FOUND

stoutstone   2008-9-19 17:01 楼主
使用WSALookupServiceBegin、WSALookupServiceNext和WSALookupServiceEnd,可以搜索到周围的蓝牙设备,可以正确获取设备名称和地址。
现在想获取设备提供的服务,照搬MSDN中《Querying Service Capability on Remote Bluetooth Devices》这一节的代码:

static int PerformServiceSearch (BT_ADDR *pb)
{
        CoInitializeEx (0, COINIT_MULTITHREADED);
        int iResult = 0;
        BTHNS_RESTRICTIONBLOB RBlob;
        memset (&RBlob, 0, sizeof(RBlob));
        RBlob.type = SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST;
        RBlob.numRange = 1;
        RBlob.pRange[0].minAttribute = SDP_ATTRIB_PROTOCOL_DESCRIPTOR_LIST;
        RBlob.pRange[0].maxAttribute = SDP_ATTRIB_PROTOCOL_DESCRIPTOR_LIST;
        RBlob.uuids[0].uuidType = SDP_ST_UUID16;
        RBlob.uuids[0].u.uuid16 = SerialPortServiceClassID_UUID16;
        BLOB blob;
        blob.cbSize = sizeof(RBlob);
        blob.pBlobData = (BYTE *)&RBlob;
        SOCKADDR_BTH sa;
        memset (&sa, 0, sizeof(sa));
        *(BT_ADDR *)(&sa.btAddr) = *pb;
        sa.addressFamily = AF_BT;
        CSADDR_INFO csai;
        memset (&csai, 0, sizeof(csai));
        csai.RemoteAddr.lpSockaddr = (sockaddr *)&sa;
        csai.RemoteAddr.iSockaddrLength = sizeof(sa);
        WSAQUERYSET wsaq;
        memset (&wsaq, 0, sizeof(wsaq));
        wsaq.dwSize      = sizeof(wsaq);
        wsaq.dwNameSpace = NS_BTH;
        wsaq.lpBlob      = &blob;
        wsaq.lpcsaBuffer = &csai;
        HANDLE hLookup;
        int iRet = WSALookupServiceBegin (&wsaq, 0, &hLookup);
        if (ERROR_SUCCESS == iRet)
        {
                CHAR buf[5000];
                LPWSAQUERYSET pwsaResults = (LPWSAQUERYSET) buf;
                DWORD dwSize  = sizeof(buf);
                memset(pwsaResults,0,sizeof(WSAQUERYSET));
                pwsaResults->dwSize      = sizeof(WSAQUERYSET);
                pwsaResults->dwNameSpace = NS_BTH;
                pwsaResults->lpBlob      = NULL;
                iRet = WSALookupServiceNext (hLookup, 0, &dwSize, pwsaResults);
                if (iRet == ERROR_SUCCESS) // Success - got the stream
                {
                        //Parse the SDP result set by using the FindRFCOMMChannel function.
                        if (ERROR_SUCCESS == FindRFCOMMChannel (pwsaResults->lpBlob->pBlobData, pwsaResults->lpBlob->cbSize, &cChannel))
                                iResult = cChannel;
                }
                WSALookupServiceEnd(hLookup);
        }
        CoUninitialize ();
        return iResult;
}

每次运行到iRet = WSALookupServiceNext (hLookup, 0, &dwSize, pwsaResults)返回-1,调用WSAGetLastError(),返回WSASERVICE_NOT_FOUND。

调试了两天,按照MSDN的说明修改BTHNS_RESTRICTIONBLOB、WSAQUERYSET等结构体,但怎么改都是返回失败……
没理由MSDN提供的代码有问题吧?我的OS是自己定制的,蓝牙部分选上Bluetooth Stack with Universal Loadable Driver,不知是否还要配置其他东西?

回复评论 (10)

其实应该是看你的蓝牙的注册表项有没有,对应的DLL有没加载起来,还有就是深入地调试函数,看在那里执行不成功,不成功是因为什么,这样才好分析。还有就是看看蓝牙的那个构架,看什么服务在什么服务之上,那个是对那个的封装与继承,先得把那些类与数据结构搞的心中有数才好找问题的。
点赞  2008-9-19 18:36
如果对应的驱动没有加载,那还能扫描到周围的设备么?
深入地调试函数?貌似无法深入地进入WSALookupServiceNext函数。。。
蓝牙协议我大概了解了一下,获取设备、服务都是在SDP这一层做的,WinCE提供的API就这三个函数了。。
点赞  2008-9-19 20:34
确定一下你的硬件设备用的是CE/MOBIEL提供的蓝牙协议栈吗?
如果不是的话,这些API就不能work了。目前很多mobile设备上的蓝牙并没有用MS的蓝牙协议栈
点赞  2008-9-22 11:50
呃,我用的是USB Bluetooth Dongle,蓝牙芯片是Broadcom的,不知是否CE5的驱动不支持?
点赞  2008-9-22 23:36
检测一下蓝牙协议栈是否被装载,查询BTH_NAMEDEVENT_STACK_INITED这个事件的状态就可以
点赞  2008-9-23 10:34
引用: 引用 4 楼 xy1001 的回复:
呃,我用的是USB Bluetooth Dongle,蓝牙芯片是Broadcom的,不知是否CE5的驱动不支持?

说错了,应该说驱动是不是用的是蓝牙协议栈,和硬件无关。

不说说到硬件,你的USB 蓝牙芯片是Broadcom的话,可能有问题拉。CE 5自带的USB蓝牙芯片驱动是for CSR的芯片,你可以在CE 下的控制面板里搜索蓝牙设备吗?
点赞  2008-9-23 10:47

8楼 low 

引用: 引用 5 楼 navi_dx 的回复:
检测一下蓝牙协议栈是否被装载,查询BTH_NAMEDEVENT_STACK_INITED这个事件的状态就可以

蓝牙协议栈已经装载。。
点赞  2008-9-23 14:33
引用: 引用 6 楼 songtitan 的回复:
引用 4 楼 xy1001 的回复:
呃,我用的是USB Bluetooth Dongle,蓝牙芯片是Broadcom的,不知是否CE5的驱动不支持?

说错了,应该说驱动是不是用的是蓝牙协议栈,和硬件无关。

不说说到硬件,你的USB 蓝牙芯片是Broadcom的话,可能有问题拉。CE 5自带的USB蓝牙芯片驱动是for CSR的芯片,你可以在CE 下的控制面板里搜索蓝牙设备吗?


嗯,可以搜索到蓝牙设备,但是查询服务的时候,蓝牙设备的连接灯会亮,但最后返回失败。我明天换个CSR的试试~
点赞  2008-9-23 14:35
换CSR的也不行,唉。
点赞  2008-9-24 13:57
关注,我们csr的usb也不工作。
点赞  2009-1-16 19:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复