【问题标题】:getting RSSI of Bluetooth connection with hcitool, crashing使用 hcitool 获取蓝牙连接的 RSSI,崩溃
【发布时间】:2012-11-24 23:49:14
【问题描述】:

我已经阅读了许多关于获取蓝牙连接 RSSI 的可能性的 stackoverflow 帖子。似乎 Android 没有通过任何 API 直接公开这一点,唯一的希望就是直接使用 bluez API。

显然,一旦您与蓝牙设备建立连接,您就可以使用 hcitool 来获取 RSSI 或链接质量,例如:

hcitool rssi E8:06:88:2F:D1:4E

但是,每当我尝试使用 hcitool 执行此操作时,都会遇到分段错误:

130|shell@android:/system/bin # hcitool rssi E8:06:88:2F:D1:4E
RSSI return value: 0
[1] + Stopped (signal)     hcitool rssi E8:06:88:2F:D1:4E 

即使我尝试使用 hcitool 创建连接,而不是蓝牙适配器:

130|shell@android:/system/bin # hcitool cc E8:06:88:2F:D1:4E
Can't create connection: I/O error

我正在使用这个版本的 hcitool:http://code.google.com/p/androidobex/downloads/detail?name=hcitool

但是,它说它是“Android 开发手机版本”,我显然使用的是比 G1 更新的东西。但是,我找不到任何其他版本的 hcitool。

【问题讨论】:

标签: android bluetooth bluez


【解决方案1】:

hcitool 源代码是 bluez 堆栈的一部分。您需要 Android NDK 来针对正确版本的 linux 共享库编译它。我已经下载了 4.0.4 的整个 android 源代码,它是一个巨大的 blob,但它确实有效。

【讨论】:

    【解决方案2】:

    欢迎来到俱乐部!我对 hcitool 有同样的问题。问题是一个错误的实现。

    为每个命令分配一个结构 (cr),稍后在 ioctl() cmd 中使用。我查看了内核实现,发现所需的字节数比提供的要大。

    由于我目前无法修补此问题,我为自己编写了一个简单的 so lib,它修改了每个 malloc() 调用以分配额外的 100 个字节作为安全边际。然后不会发生崩溃:

    #define _GNU_SOURCE
    
    #include <stdio.h>
    #include <dlfcn.h>
    
    static void* (*real_malloc)(size_t)=NULL;
    
    
    void *malloc(size_t size) {
        if (!real_malloc) {
            real_malloc = dlsym(RTLD_NEXT, "malloc");
        }
    
        return real_malloc(size + 100);
    }
    

    使用以下行编译(或在必要时插入您的交叉编译器):

    gcc memsafe.c --shared -fPIC -O2 -ldl -o libmemsafe.so
    

    然后给自己写一个bash脚本来获取各种值:

    #!/bin/bash
    
    if [ ! -z "$1" ]; then
        export LD_PRELOAD="libmemsafe.so"
        hcitool cc $1
        hcitool rssi $1
        hcitool lq $1
        hcitool tpl $1 0
        hcitool tpl $1 1
    else
        echo "Usage: $0 <btAddr>"
    fi
    

    如果您可以自己编译 hcitool,请查找所有这样的行:

    cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info));
    

    ...并将它们更改为...

    cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info) + 100);
    

    如果您想估计正确的大小,请随时更正实施。

    希望这个答案仍然可以帮助或将来会帮助某人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多