6

有谁知道如何在 C# 中最好地跟踪蓝牙连接的信号强度?

我正在考虑使用 WMI 查询,但无法追踪封装连接的 WMI 类。

这个想法是,当我将手机放在口袋里时,蓝牙信号会减弱,我的机器会锁定,而我不会受到干扰。

4

1 回答 1

5

蓝牙设备中运行的链路管理器协议 (LMP) 负责链路设置和配置。这一切都是由两个设备交换协议数据单元 (PDU) 完成的。RSSI 的硬件和软件功能在 LMP 级别提供,允许您管理 RSSI 数据。它允许您读取 RSSI 级别并控制 TX RF 输出功率(LMP 功率命令)LMP 进行控制并获取状态信息。

因此,在使用 MS 蓝牙堆栈时,您实际要查找的内容在 LMP 中定义。MS Bluetooth Stack HCI 接口已经支持以下功能,即

HCI_READHCIPARAMETERS
HCI_STARTHARDWARE
HCI_STOPHARDWARE
HCI_SETCALLBACK
HCI_OPENCONNECTION
HCI_READPACKET
HCI_WRITEPACKET
HCI_CLOSECONNECTION

我想微软本可以实现一个名为 HCI_Read_RSSI 的函数,但他们没有。

要获取 RSSI 数据,您必须使用 LMP 来获取您需要的信息。

读取 RSSI 数据的示例伪代码

// Read HCI Parameters

#include <windows.h>
#include <windev.h>
#include <bt_buffer.h>
#include <bt_hcip.h>
#include <bt_os.h>
#include <bt_debug.h>
#include <svsutil.hxx>
#include <bt_tdbg.h>

unsigned short hci_subversion, lmp_subversion, manufacturer;
unsigned char hci_version, lmp_version, lmp_features[8];

if (BthReadLocalVersion (&hci_version, &hci_subversion, &lmp_version, &lmp_subversion, &manufacturer, lmp_features) != ERROR_SUCCESS) {
            SetUnloadedState ();
            return 0;
      }
WCHAR szLine[MAX_PATH]
unsigned char *pf = lmp_features;

if ((*pf) & 0x02) {
wsprintf (szLine, L"   RSSI");
}

这仅适用于 Microsoft 蓝牙堆栈。这也是 C++ 代码。我从页面底部的专家交流帖子(我知道)中得到了这个。 http://www.experts-exchange.com/Programming/Wireless_Programming/Bluetooth/Q_21267430.html

没有特定的功能可以为您完成。

还有这个库可以帮助你,我没有完整地查看文档,但我听说过它的好消息。 http://inthehand.com/content/32feet.aspx

祝你好运!

于 2008-09-15T20:53:23.667 回答