我们如何在 Linux 中从蓝牙信标(具体是估计值)获取 RSSI 值?

我们如何在 Linux 中从蓝牙信标(具体是估计值)获取 RSSI 值?

我需要获取多个蓝牙信标的距离以进行三角测量,这样我就可以进行室内定位。我试图提供尽可能多的相关细节。这个项目是为 RPi 设计的,但我目前正试图先通过我的笔记本电脑对其进行测试。我已经尝试了在互联网上能找到的大部分关于此内容的方法:

我能找到的获取 RSSI 值的最佳方法是hcitool rssi <address of beacon>

从这里https://stackoverflow.com/questions/24417017/bluetooth-le-signal-strength-linux

为了测试这一点,我首先尝试在手机上获取它。它显示“ Not Connected”。我认为我需要先连接,所以我尝试了多种方法来连接我的手机:

A)hcittol cc <address of mobile>

b)gatttool -b <address of mobile> -t random --interactive

C)rfcomm connect 0 <address of mobile> 10

在每种情况下,当我在手机上单击配对时,连接就会终止。

然后,我以通常的方式从蓝牙菜单配对我的手机,然后尝试,hcitool rssi <Address of mobile>最后返回一个值-8

现在我已经在手机上使用它了,我现在转向信标。

然后,我尝试对我的信标进行同​​样的操作。这次我必须先获取可用信标的地址,然后使用返回错误的hcitool lescan命令连接到其中一个信标。 因此,接下来,我再次尝试使用其他两种方式进行连接:hcitool lecc <address of beacon>Could not create connection: Connection timed out

rfcomm connect 0 <address of beacon> 10Can't connect RFCOMM socket: Host is down当我确定 hci0 已启动时,它返回了错误。

然后我尝试使用,sudo gatttool -b F1:15:A7:E3:17:63 --interactive之后打开了交互模式,我输入了命令connect。之后出现了不同的错误Attempting to connect to <address of beacon>,主要connect error : Connection timed outError: connect error: Connection refused (111)

然后我读到我需要-t random使用https://stackoverflow.com/questions/22213793/bluetooth-le-on-raspbianhttps://ubuntuforums.org/showthread.php?t=2204808以及另一个我现在找不到的来源。

所以我输入sudo gatttool -b F1:15:A7:E3:17:63 -t random --interactive了命令,结果connect出现了错误Error: connect error: Device or resource busy (16),而且有时Error: connect error: Input/Output Error

然后我读到我可能需要重新启动我的 hci0,hciconfig hci0 down然后hciconfig hci0 up这个办法就奏效了,信标现在已经连接上了。

但是,在显示“GLib-WARNING**:无效的文件描述符”后,它很快就断开了连接。

`我在这里读到https://raspberrypi.stackexchange.com/questions/53982/how-to-fix-gatttools-glib-warning-invalid-file-descriptor这是因为连接不良。我尝试将信标放近一些,但结果还是一样。

因此,我尝试在连接的短暂时间内至少获取一个 rssi 值。但是,即使这样连接,我也出现了hcitool rssi <address of beacon>如下错误:

hcitool rssi F1:15:A7:E3:17:63
Get connection info failed: No such file or directory

我还没有找到适当的解决方案。

我尝试了另一种方式读取 rssi 值,结果如下:

hcidump -R
HCI sniffer - Bluetooth packet analyzer ver 5.37
device: hci0 snap_len: 1500 filter: 0xffffffffffffffff
> 04 0E 04 01 0B 20 00 
> 04 0E 04 01 0C 20 00 
> 04 0E 04 01 0C 20 00 
> 04 0F 04 00 01 0D 20 
> 04 0F 04 00 01 16 20 
> 04 0F 04 00 01 13 20 

这是断线前的情况。我在这里读到https://stackoverflow.com/questions/37073114/obtain-rssi-with-hcidump意思是读取第 14 个字节。由于所有这些似乎都是十六进制数字,这意味着每个数字都是 1 个字节。但这样一来,每行只有 7 个数字,我该如何读取第 14 个字节呢?

远离信标一直困扰着我,并且浪费了我很多时间。请帮我解决这个问题。如果您能帮我找到资源来帮助我做到这一点,我将不胜感激。

答案1

您的信标可能会主动拒绝您的连接以节省电量,但​​只需读取信号强度,您就不需要连接,因为它们无论如何都应该广播该信息。

我无法让 hcidump 提供我正在寻找的信息,因此我使用了 btmon,并成功从我的 BLE 信标中获取了 RSSI:

btmon &
hcitool lescan --duplicates

答案2

我测试sudo btmgmt find并得到了RSSI值。

编辑后的输出:

hci0 dev_found: xx:xx:xx:xx:xx:xx type BR/EDR rssi -86 flags 0x0003
eir_len 5

(xx由我代替)

在 raspi zero w 上测试

也许这就是您所寻找的。

相关内容