Кому-нибудь удалось получить значение Bluetooth RSSI на Windows 8?
Я использую WIDCOMM SDK и Visual C ++, чтобы получить значение RSSI, но он всегда возвращает 0. Что я сделал, это следующим образом:
— Сканирование для списка устройств Bluetooth вокруг.
— Для каждого устройства я запускаю StartDiscovery (), чтобы получить список служб на устройстве.
— Затем я открываю канал RFComm для устройства и получаю значение RSSI через функцию GetConnectionStats.
Я установил последнюю версию WIDCOMM SDK и обновление программного обеспечения WIDCOMM. Мой ноутбук работает под управлением Windows 8 64bit и имеет драйвер Bluetooth Broadcom, поэтому он должен использовать стек Bluetooth 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 — это просто структура для хранения информации Bluetooth, такой как адрес и имя.
Можно ли получить значение RSSI на Windows 8? Если да, пожалуйста, скажите мне, что я должен сделать, чтобы получить значение.
Заранее благодарю.
Я провел некоторое исследование и думаю, что невозможно получить значение RSSI для Windows Vista и новее. Я не могу подтвердить это, потому что я не смог найти ни веб-сайт, ни документы, подтверждающие это. Но вот что я нашел:
Основываясь на этом руководстве, только стек Bluetooth WIDCOMM поддерживает получение значения RSSI:
http://controllingtheinter.net/WidcommTutorial.php
Однако, похоже, что Windows Vista и новее используют версии 6.x драйвера WIDCOMM, и эти версии не поддерживают RSSI. В примечании к выпуску WIDCOMM SDK указано, что:
GetConnectionStats (все классы, где присутствуют) не поддерживают поле данных RSSI в версиях 6.x
Это связано с тем, что версия Bluetooth WIDCOMM 6.x работает в стеке Microsoft Bluetooth.
Заметка о выпуске WIDCOMM SDK находится здесь:
http://www.broadcom.com/support/bluetooth/sdk.php