蓝牙LE信号强度Linux

时间:2014-06-25 19:31:02

标签: linux bluetooth bluetooth-lowenergy bluez rssi

你好有没有什么方法可以通过linux中的bluetooth le设备获得接近的信号强度?或者nodejs,php或mono的任何好的库(我确实知道一些c ++或python,但是我们更愿意放弃它们)如果一个工具不存在但是写起来相当容易

谢谢

7 个答案:

答案 0 :(得分:30)

在Linux上,执行此操作的方法是使用hcitool命令。但是,必须连接才能获取设备的rssi。如果要从命令行实现此目的,请尝试:

#hcitool rssi AA:BB:CC:DD:EE:FF

如果要查看实际的C代码,请查看cmd_rssi函数下的bluez tools/hcitool.c文件。

static void cmd_rssi(int dev_id, int argc, char **argv)
{
    ...
}

对于蓝牙低功耗,我只知道一种方法,即使用#btmon命令。在后台运行btmon,然后扫描蓝牙低功耗设备:

#./btmon &
# hcitool lescan

显示器上显示的结果应与此类似:

> HCI Event: LE Meta Event (0x3e) plen 12                                                                                  
      LE Advertising Report (0x02)
        Num reports: 1
        Event type: Scan response - SCAN_RSP (0x04)
        Address type: Public (0x00)
        Address: AA:BB:CC:DD:EE:FF (<Vendor Name>)
        Data length: 0
        ***RSSI: -34 dBm (0xde)***
AA:BB:CC:DD:EE:FF <Device Name>

请注意,使用btmon时,您无需连接即可获取BLE设备的rssi。

我希望这会有所帮助。

答案 1 :(得分:4)

您可以使用以下组合: sudo hcitool lescan --duplicates&amp; ; sudo hcidump --raw

将为您提供所有蓝牙数据包的原始转储,其中包含您必须感兴趣的所有相关信息,例如:UUID,Major,Minor,RSSI,TxPower。您将不得不运行某种脚本来解析和过滤LE数据包并使其成为可读形式。

使用Bash和S编辑器编写的一个脚本由jjnebaker here提供,并讨论了问题和解决方案here

其他选项是使用示例代码here使用PyBluez 但您可能会发现Switchdoc实验室提供的解决方案也可以根据您的需求使用。 here

答案 2 :(得分:3)

对不起其他答案......

这适用于c语言,但在转换具有de rssi信号信息的字节时出错。 https://github.com/glock45/intel-edison-playground/blob/master/scan.c

这一行121: printf(“%s - RSSI%d \ n”,addr,( char )info-&gt; data [info-&gt; length]);

应该是: printf(“%s - RSSI%d \ n”,addr,( int8_t )info-&gt; data [info-&gt; length]);

我通过查看bluez-version / monitor / * .c找到了这些,其中btmon程序是。你可以看到数据类型和结构,hcidump.c非常有用,而且packet.c和main.c也是如此,但是有很多要了解的hci套接字

答案 3 :(得分:2)

我还找到了一个我能编辑的程序来做我想做的事 我通过我的github帐户了解它 https://github.com/tholum/bluez/blob/master/blue.py

答案 4 :(得分:1)

我找到了几种解决方案,但是大多数解决方案太慢了,以至于无法用作跟踪功能。

查看https://github.com/abandonware/noble,其中包含一些示例。

我的独立扫描仪也基于abandonware的模块,可以在以下位置找到: https://github.com/efeuentertainment/BLE-continuous-RSSI-scan

node index.js BLEMAC

连续列出RSSI,其更新频率约为每秒2,具体取决于BLE设备。

基于bash的快速更新也是:

sudo hcitool lescan --duplicates &

结合以下几行之一: 持续更新

sudo hcidump | grep "E6:4E:57:09:74:E4" -A 4
sudo btmon | grep "E6:4E:57:09:74:E4" -A 7

仅下一个收到的更新

sudo hcidump | grep -m 1 "E6:4E:57:09:74:E4" -A 4 | grep "RSSI"
sudo btmon | grep -m 1 "E6:4E:57:09:74:E4" -A 7 | grep "RSSI"
希望有帮助。这是一个老话题,但是我的搜索引擎还是把我引到了这里。

答案 5 :(得分:0)

尝试:

$ bluez-test-discovery

输出:

[ 18:7A:93:05:E4:B1 ]
    Name = AMIYJ_E4B1
    Paired = 0
    LegacyPairing = 0
    Alias = AMIYJ_E4B1
    Broadcaster = 0
    UUIDs = dbus.Array([dbus.String(u'0000fff0-0000-1000-8000-00805f9b34fb')], signature=dbus.Signature('s'), variant_level=1)
    Address = 18:7A:93:05:E4:B1
    RSSI = -65
    Class = 0x000000

为您提供: RSSI = -65

答案 6 :(得分:0)

无需连接btmgmt

$ sudo btmgmt find

Discovery started
hci0 type 7 discovering on
hci0 dev_found: 50:8C:FD:99:0A:EC type LE Random rssi -80 flags 0x0000 
AD flags 0x06 
eir_len 23
…

相对信号强度指示器 rssi -80,并且此设备和其他设备的列表会持续一段时间。

要监视仅显示具有最强RSSI的唯一MAC地址的蓝牙邻居,请运行以下命令:

$ sudo btmgmt find |grep rssi |sort -n |uniq -w 33

hci0 dev_found: 40:43:42:B3:71:11 type LE Random rssi -53 flags 0x0000 
hci0 dev_found: 44:DA:5F:EA:C6:CF type LE Random rssi -78 flags 0x0000 
hci0 dev_found: 7F:7D:08:6B:E0:37 type LE Random rssi -74 flags 0x0000 
hci0 dev_found: A4:58:0F:21:A1:8C type BR/EDR rssi -79 flags 0x0000