【问题标题】:Bluetooth LE Signal Strength Linux蓝牙 LE 信号强度 Linux
【发布时间】:2014-08-16 12:13:15
【问题描述】:

你好,有什么方法可以在 linux 中获取附近蓝牙设备的信号强度吗?或者 nodejs、php 或 mono 的任何好的库(我确实知道一些 c++ 或 python,但更愿意远离它们),如果工具不存在但相当容易编写。

【问题讨论】:

    标签: linux bluetooth bluetooth-lowenergy bluez rssi


    【解决方案1】:

    在 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。

    【讨论】:

    • hcitool rssi 似乎只适用于普通蓝牙而不是蓝牙文件,我得到“获取连接信息失败:没有这样的文件或目录”当我尝试连接时(对于蓝牙文件你通过 hcitool lecc 连接[MAC] 不是常规的 hcitool cc [MAC],
    • 用 bluetooth-lowenergy 标记了这个问题,因为我错过了 le 部分 :) 你试过 #hcidump 了吗?我读过你可以用它来读取低能耗设备的 rssi 值,但我没有设备可以测试。
    • 编辑了问题以包括蓝牙低功耗部分。我尝试了#hcidump,但它对我不起作用,但#btmon 工作得很好。
    • BLE scan 第一行“plen 12”是什么意思 > HCI Event: LE Meta Event (0x3e) plen 12" ?
    • 如果连接了BLE设备,这种方式是找不到RSSI的。
    【解决方案2】:

    您可以使用以下组合:

    sudo hcitool lescan --duplicates & ;
    sudo hcidump --raw 
    

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

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

    另一个选项是使用 PyBluez 使用示例代码 here 但是您可能会发现 Switchdoc labs 提供的解决方案也根据您的需要很有用。 here

    【讨论】:

      【解决方案3】:

      使用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
      

      【讨论】:

        【解决方案4】:

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

        第 121 行:

        printf("%s - RSSI %d\n", addr, (**char**)info->data[info->length]);
        

        应该是:

        printf("%s - RSSI %d\n", addr, (**int8_t**)info->data[info->length]);
        

        我通过查看bluez-version/monitor/*.c 内部找到了这些,btmon 程序所在的位置。你可以看到数据类型和结构,hcidump.c 非常有用,packets.cmain.c 也有,但是还有很多关于 hci 套接字的知识。

        【讨论】:

        • 我找到的最快的扫描仪。在华硕加密狗(连接到 PC)上使用 gcc 5.5.0 在 Linux Mint 上进行了测试,并且通过强制转换为“(char)”可以正常读取。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          我找到了几种解决方案,但大多数都太慢了,无法满足我用作跟踪功能的需求。

          查看包含一些示例的 https://github.com/abandonware/noble

          我的独立扫描仪也是基于放弃软件的模块,可以在这里找到: https://github.com/efeuentertainment/BLE-continuous-RSSI-scan

          node index.js BLEMAC
          

          以大约每秒 2 次/取决于 BLE 设备的更新频率连续列出 RSSI。

          基于 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"
          

          希望对您有所帮助。这是一个旧线程,但我的搜索引擎还是把我带到了这里。

          【讨论】:

            【解决方案7】:

            试试:

            $ 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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-09
              • 2011-11-29
              • 2014-02-07
              • 1970-01-01
              • 1970-01-01
              • 2014-08-12
              相关资源
              最近更新 更多