2012-12-06 161 views
2

我已閱讀了很多有關獲取藍牙連接的RSSI的可能性的stackoverflow文章。看起來好像Android不會直接通過任何API公開這一點,唯一的希望是直接進入bluez API。使用hcitool獲取藍牙連接的RSSI,崩潰

顯然,一旦你有一個藍牙設備的連接,你可以使用hcitool得到RSSI或者鏈路質量,如:

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

然而,每當我試圖做到這一點使用hcitool,我得到分段錯誤:

130|[email protected]:/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 

即使我嘗試,而不是BluetoothAdapter創建具有hcitool的連接,:

130|[email protected]:/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。

+1

爲什麼你需要使用hcitool,而不是在'BluetoothDevice.EXTRA_RSSI'機制,如下所述:https://groups.google。 COM /論壇/?fromgroups =#!topic/android-developers/8qXyalWHadY – TJD

+1

,它不允許您獲取連接的RSSI值,它只允許您從掃描中獲取可發現設備的RSSI。 – gnychis

回答

1

hcitool源代碼是bluez堆棧的一部分。您需要Android NDK才能針對正確版本的Linux共享庫進行編譯。我已經下載了4.0.4的整個android源代碼,它是一個巨大的blob,但它工作。

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); 

如果你關心估計正確的尺寸,請隨時糾正實施。

希望這個答案還幫助或幫助別人在未來