使用WIDCOMM SDK在Windows 8上获取蓝牙RSSI值

时间:2014-07-13 08:49:18

标签: c++ windows-8 bluetooth rssi

有人在Windows 8上成功获得蓝牙rssi值吗?

我使用WIDCOMM SDK和visual c ++来获取rssi值,但它总是返回0.我所做的如下: - 扫描周围的蓝牙设备列表。 - 对于每个设备,我运行StartDiscovery()以获取设备上的服务列表。 - 然后我打开一个RFComm通道到设备并通过GetConnectionStats函数获得RSSI值。

我已安装最新的WIDCOMM SDK和WIDCOMM软件更新。我的笔记本电脑运行的是Windows 8 64bit,并且有Broadcom蓝牙驱动程序,所以它应该使用WIDCOMM蓝牙堆栈。

这是我正在使用的代码:

    void BtScanner::OnDiscoveryComplete (UINT16 nRecs, long lResultCode) {
        CSdpDiscoveryRec sdpRecs[16];
        CBdInfo curDev = mDevList[0];

        ReadDiscoveryRecords(curDev.mBdAddr, 16, sdpRecs, NULL);

        for(int i = 0; i < nRecs; ++i) {
            GUID guid = sdpRecs[i].m_service_guid;

            UINT8 channel;
            if(sdpRecs[i].FindRFCommScn(&channel)) {
                CString tmp;
                tmp.Format(_T("RFCOMM Channel: %d \n"), channel);
                TRACE(tmp);

                if (channel == 1) {
                    CRfCommIf myRF;
                    if (!myRF.AssignScnValue(&guid, channel)) { 
                        TRACE("Failed To Set ScnValue"); 
                        return;
                    }

                    UINT8 sec_level = BTM_SEC_NONE;//BTM_SEC_NONE;
                    if (!myRF.SetSecurityLevel((char *)sdpRecs[i].m_service_name, sec_level, false)) { 
                        WBtRc err = GetExtendedError(); 
                        TRACE("Failed To Set Security Level\r\n"); 
                        return;
                    }

                    CRfCommPort ComPort;
                    CRfCommPort::PORT_RETURN_CODE openRes = ComPort.OpenClient(myRF.GetScn(), curDev.mBdAddr);
                    if (openRes != CRfCommPort::PORT_RETURN_CODE::SUCCESS) { 
                        tmp.Format(_T("Failed To Connect RFCOMM: %d\n"), openRes);
                        TRACE(tmp); 
                        return; 
                    }

                    tBT_CONN_STATS stats;
                    while (true) {
                        ComPort.GetConnectionStats(&stats);
                        CString tmp;
                        tmp.Format(_T("RSSI: %d \n"), stats.Rssi);  
                        TRACE(tmp);

                        BD_ADDR tmpBda;
                        bool connected = ComPort.IsConnected(&tmpBda);
                        tmp.Format(_T("Is connected: %d \n"), connected);
                        TRACE(tmp);

                        this_thread::sleep_for(chrono::milliseconds(1000));
                    }
                }
            }
         }
    }

我根据从设备收到的内容更改了频道,但结果相同。我的CBdInfo类只是一个存储蓝牙信息的结构,例如地址和名称。

这可以在Windows 8上获得RSSI值吗?如果是,请告诉我应该怎样做才能获得价值。

先谢谢你。

1 个答案:

答案 0 :(得分:0)

我做了一些研究,我认为在Windows Vista及更新版本上获取RSSI值是不可能的。我无法确认,因为我无法找到任何网站或文件。但这是我发现的:

根据本教程,只有WIDCOMM蓝牙堆栈支持获取RSSI值: http://controllingtheinter.net/WidcommTutorial.php

然而,似乎windows vista和更新版本使用6.x版本的WIDCOMM驱动程序,这些版本并不支持RSSI。 WIDCOMM SDK发行说明中指出:

  

GetConnectionStats(所有存在的类)不支持6.x版本中的RSSI数据字段

这是因为6.x WIDCOMM蓝牙版本在微软蓝牙堆栈上运行。

可以在此处找到WIDCOMM SDK发行说明: http://www.broadcom.com/support/bluetooth/sdk.php