2015-05-04 2 views
1

Я использую BlueZ C API для программирования моей мыши Bluetooth, чтобы прочитать расстояние. Я установил bluetooth-ключ. На данный момент мне нужно переместить мышь на расстоянии не менее 5-10 футов от ноутбука (Bluetooth-ключ), чтобы получить некоторое чтение RSSI. Ниже этого расстояния я получаю большую часть показаний как 0.BlueZ Bluetooth API и точность калибровки расстояния

Можно ли использовать этот API для получения более точного значения RSSI, чтобы мы могли отслеживать расстояние в этом диапазоне?

int8_t Bluetooth::read_rssi(int to) { 

    int dd = hciSocket; 
    struct hci_conn_info_req *cr; 
    bdaddr_t bdaddr; 
    int8_t rssi; 

    str2ba(bt_addr, &bdaddr); 

    if (dd < 0) { 
      perror("HCI device open failed"); 
      exit(1); 
    } 

    cr = (hci_conn_info_req *)(malloc(sizeof(*cr) + sizeof(struct hci_conn_info))); 
    if (!cr) { 
      perror("Can't allocate memory"); 
      exit(1); 
    } 

    bacpy(&cr->bdaddr, &bdaddr); 
    cr->type = ACL_LINK; 
    if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) < 0) { 
      perror("Get connection info failed"); 
      exit(1); 
    } 

    if (hci_read_rssi(dd, htobs(cr->conn_info->handle), &rssi, 1000) < 0) { 
      perror("Read RSSI failed"); 
      exit(1); 
    } 

    return rssi; 
} 

ответ

1

hci_read_rssi, вероятно, не то, что вы хотите. Это не фактический удаленный RSSI. Из спецификации секции BT, описывающей команду HCI_Read_RSSI:

Параметр RSSI возвращает разность между измеренным Received Strength Индикация сигнала (RSSI) и пределы Golden получающего Диапазон мощности для подключения ручки к другому BR/EDR Контроллер. Любое положительное значение RSSI, возвращаемое контроллером , показывает, сколько дБ RSSI превышает верхний предел, любое отрицательное значение указывает, сколько дБ RSSI ниже нижнего предела. Нулевое значение указывает, что RSSI находится внутри золотой принимающей мощности Диапазон.

Я считаю, что ценность, которую вы хотите, такова, что содержится в запросе/сканировании. Я знаю, как это получить, но не уверен, приемлемо ли это для вас или это лучший способ.

API-интерфейс устройства bluez dbus имеет RSSI как одно из свойств. Api doc можно найти here.

ОБНОВЛЕНИЕ: Я не пробовал это сам, но похоже, что поддержка pybluez запрашивает запрос RSSI. См. this pybluez example.

Вот простой пример для bluez4:

https://bitbucket.org/kaylum/bluez-rssi-example/src

+0

Есть ли у вас какие-либо примеры кода на получение значения RSSI из запроса/сканирования API на основе? Не могли бы вы поделиться более подробной информацией? – AnilJ

+0

Какую версию Bluez вы используете? В настоящее время у меня нет отдельного примера. Но мне не понадобится много времени, чтобы написать основной пример. Я обновляю ответ через день или около того с помощью ссылки на код. Но учтите, что я использую привязку db glib, поэтому вам нужно будет установить эту библиотеку. Если это неприемлемо, дайте мне знать сейчас, поэтому я не трачу время на это. – kaylum

+0

Я использую версию 4.101 Bluez на Ubuntu 14.04. TBH, я совершенно новый, и все, что я понял, это доступные открытые примеры. Прямо сейчас, я написал класс C++ из доступного примера (также опубликованного в исходном сообщении). Поэтому, я считаю, должно быть хорошо иметь привязку glib/dbus, если она позволяет мне обновлять текущий класс C++. Спасибо за помощь. – AnilJ

Смежные вопросы