Как использовать функцию esp_bt_gap_read_rssi_delta для получения BluetoothI классического RSSI от ESP32? - PullRequest
0 голосов
/ 30 сентября 2018

Классический API Bluetooth GAP в ESP-IDF Framework имеет функцию:

#include "esp_gap_bt_api.h"
esp_err_t esp_bt_gap_read_rssi_delta(esp_bd_addr_t remote_addr)

со следующим описанием:

" Эта функция вызывается для чтения дельты RSSI по адресупосле подключения. Значение RSSI, возвращаемое ESP_BT_GAP_READ_RSSI_DELTA_EVT.

Возврат: ESP_OK: Успешный; ESP_FAIL: другие

Параметры: remote_addr: - удаленное устройствоадрес, соответствующий определенному дескриптору соединения."

Хорошо, что я делаю (после подключения к устройству BT): определите структуру, которая, я думаю, будет содержать нужный мне результат:

struct read_rssi_delta_param
{
  esp_bd_addr_t bda; /*remote bluetooth device address*/
  esp_bt_status_t stat; /*read rssi status */
  int8_t rssi_delta; /*rssi delta value in range -128 ~127*/
} read_rssi_delta; /*read rssi parameter struct */

и вызов функции:

esp_err_t err_code = esp_bt_gap_read_rssi_delta((uint8_t*)esp_bt_dev_get_address());

возвращает err_code = ESP_OK (0, success), но структура read_rssi_delta содержит только все нули.

Я чувствую, что ясделать что-то не так, потому что должна быть задействована еще одна вещь: это ESP_BT_GAP_READ_RSSI_DELTA_EVT (см. описание выше).Это определено в перечислении:

enum esp_bt_gap_cb_event_t //BT GAP callback events.
..... skip some
ESP_BT_GAP_READ_RSSI_DELTA_EVT //read rssi event
..... etc.

В некоторых источниках это называется «событие», в других - «функция обратного вызова», но ничего о том, как его использовать!

Итак, вопрос: как собрать все это вместе, чтобы получить RSSI с устройства?

Примечание: Bluetooth - это классика, а не BLE!

Ответы [ 2 ]

0 голосов
/ 19 апреля 2019

Итак, окончательное решение моего вопроса (спасибо @dquadros):

//ESP32, Classic Bluetooth, SPP
#include "BluetoothSerial.h"
#include "esp_gap_bt_api.h"
#include <esp_spp_api.h>

BluetoothSerial SerialBT;
byte rssi; //RSSI
byte addr[6] = {0,0,0,0,0,0}; //to keep MAC address of the remote device

//RSSI callback function
void gap_callback (esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *param)
{
  if (event == ESP_BT_GAP_READ_RSSI_DELTA_EVT) rssi = param->read_rssi_delta.rssi_delta;
}

//SPP service callback function (to get remote MAC address)
void spp_callback (esp_spp_cb_event_t event, esp_spp_cb_param_t *param)
{
  if (event == ESP_SPP_SRV_OPEN_EVT) memcpy(addr, param->srv_open.rem_bda, 6);
}

void setup()
{
  Serial.begin(9600);
  SerialBT.begin("ESP32");
  //register RSSI callback function:
  esp_bt_gap_register_callback (gap_callback);
  //register SPP service callback to get remote address:
  SerialBT.register_callback(spp_callback);
}

void loop()
{
  //when we need RSSI call this:
  esp_bt_gap_read_rssi_delta (addr); //now variable rssi contains RSSI level
  byte b = rssi; //etc....
}
0 голосов
/ 10 апреля 2019

После нескольких попыток я заставил esp_bt_gap_read_rssi_delta () работать.

Первое, что нужно понять (если вы этого еще не получили), это функция обратного вызова / события.Функция обратного вызова - это функция в вашем коде, которая будет вызываться ESP-IDF, когда происходит что-то особенное (событие).Вы регистрируете свою функцию обратного вызова, вызывая esp_bt_gap_register_callback () после инициализации стека bluetooth.

Когда вы вызываете esp_bt_gap_read_rssi_delta () (после подключения к устройству), он сразу возвращается со статусом Ok или ошибкой.Фактическое чтение RSSI будет позже возвращено платформой, вызывающей вашу функцию обратного вызова.

Функция обратного вызова имеет два параметра.Первая идентифицирует событие, которое произошло, вторая - данные, связанные с событием.Этот второй параметр является указателем на одну из структур, определенных в объединении esp_bt_gap_cb_param_t.

Ниже приведен скелетный код (не проверяющий коды возврата и т. Д.) Для IDE Arduino, использующий для соединения BluetoothSerial:

#include "esp_gap_bt_api.h"
#include "BluetoothSerial.h"

BluetoothSerial SerialBT;
byte addr[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

void setup() {
  Serial.begin (115200);
  SerialBT.begin();
  esp_bt_gap_register_callback (gap_callback);
}

void loop() {
  delay(100);
  if (SerialBT.hasClient()) {
    esp_bt_gap_read_rssi_delta (addr);
    delay (10000);    
  }
}

void gap_callback (esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *param) {
  if (event == ESP_BT_GAP_READ_RSSI_DELTA_EVT) {
    Serial.println (param->read_rssi_delta.rssi_delta);
  }
}
...