【问题标题】:Get Bluetooth RSSI value on Windows 8 with WIDCOMM SDK使用 WIDCOMM SDK 在 Windows 8 上获取蓝牙 RSSI 值
【发布时间】:2014-07-13 08:49:17
【问题描述】:

有人在 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 值吗?如果是,请告诉我应该怎么做才能获得价值。

先谢谢你了。

【问题讨论】:

    标签: c++ windows-8 bluetooth rssi


    【解决方案1】:

    我做了一些研究,我认为在 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 蓝牙版本在 Microsoft 蓝牙堆栈上运行。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多