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

Cos*_*pal 4 bluetooth bluez

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

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

从这里/sf/ask/1709191221/

为了测试这一点,我尝试先在我的手机上安装它。这显示了 ” 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 out 是和Error: connect error: Connection refused (111)

然后我读到我需要使用-t random/sf/ask/1554965541/ 、https://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
Run Code Online (Sandbox Code Playgroud)

对此我还没有找到合适的解决方案。

我尝试了另一种读取 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 
Run Code Online (Sandbox Code Playgroud)

这是断线之前的情况。我在这里读到/sf/ask/2595118011/说要读取第 14 个字节。由于所有这些似乎都是十六进制数字,这意味着每个数字都是 1 个字节。但是这样,我每行只有7个数字,如何读取第14个字节?

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

Ada*_*dam 5

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

我无法让 hcidump 为我提供所需的信息,因此我使用 btmon 并成功从我的 BLE 信标获取 RSSI:

btmon &
hcitool lescan --duplicates
Run Code Online (Sandbox Code Playgroud)