我已经阅读了许多有关获得蓝牙连接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。
答案 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,但它确实有效。