我需要获取多个蓝牙信标的距离以进行三角测量,这样我就可以进行室内定位。我试图提供尽可能多的相关细节。这个项目是为 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> 10
Can'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
使用https://stackoverflow.com/questions/22213793/bluetooth-le-on-raspbian,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
我还没有找到适当的解决方案。
我尝试了另一种方式读取 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 上测试
也许这就是您所寻找的。