使用hcitool获取蓝牙连接的RSSI,崩溃

时间:2012-12-06 20:48:03

标签: android bluetooth bluez

我已经阅读了许多有关获得蓝牙连接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而不是BluetoothAdapter创建连接:

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。

2 个答案:

答案 0 :(得分:3)

欢迎来到俱乐部!我和hcitool有同样的问题。问题是执行错误。

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

由于我目前无法对此进行修补,因此我自己写了一个简单的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);

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

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

答案 1 :(得分:1)

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