【发布时间】: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