我读过很多stackoverflow的帖子,关于蓝牙连接的rssi的可能性。似乎android并没有通过任何api直接公开这一点,唯一的希望就是直接使用bluezapi。
显然,一旦你与蓝牙设备建立了连接,你就可以使用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。
最佳答案
欢迎来到俱乐部!我对hcitool也有同样的问题。这个问题是一个错误的实现。
为每个命令都分配了一个结构(CR),稍后在ioctl()命令中使用。我查看了内核实现,发现所需的字节数大于提供的字节数。
由于我目前无法修补这个问题,我为自己编写了一个简单的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);
如果您想估计正确的大小,请随时纠正执行。
希望这个答案对将来的人还是有帮助的
关于android - 使用hcitool获取蓝牙连接的RSSI,崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13752264/