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

Android 正在使用hcitool获取蓝牙连接的RSSI,崩溃,android,bluetooth,bluez,Android,Bluetooth,Bluez,我读过很多关于蓝牙连接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 retu

我读过很多关于蓝牙连接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:


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

hcitool源代码是bluez堆栈的一部分。您需要Android NDK根据linux共享库的正确版本编译它。我已经为4.0.4下载了整个android源代码,这是一个巨大的blob,但它工作正常。

hcitool源代码是bluez堆栈的一部分。您需要Android NDK根据linux共享库的正确版本编译它。我已经下载了4.0.4的全部android源代码,这是一个巨大的blob,但它成功了。

欢迎来到俱乐部!我对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);
}
然后编写一个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
…并将其更改为

cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info) + 100);
如果您想估计正确的大小,请随时更正实现


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

欢迎来到俱乐部!我对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);
}
然后编写一个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
…并将其更改为

cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info) + 100);
如果您想估计正确的大小,请随时更正实现


希望这个答案仍然有帮助,或者将来会有帮助

为什么您需要使用hcitool,而不是
蓝牙设备。额外的RSSI机制,如下所述:它不允许您获取连接的RSSI值,它只允许您从扫描中获取处于可发现模式的设备的RSSI。为什么您需要使用hcitool,而不是
BluetoothDevice。这里描述的额外RSSI
机制:这不允许您获取连接的RSSI值,它只允许您从扫描中获取处于可发现模式的设备的RSSI。