如何使用esp_bt_gap_read_rssi_delta函数从ESP32获取蓝牙经典RSSI?

时间:2018-09-29 21:28:44

标签: c bluetooth rssi esp32

ESP-IDF框架中的经典蓝牙GAP API具有以下功能:

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

具有以下说明:

此函数被调用以在连接后按地址读取RSSI增量。ESP_BT_GAP_READ_RSSI_DELTA_EVT返回的RSSI值。

返回: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,成功),但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?

注意:蓝牙是经典的,而不是BLE!

2 个答案:

答案 0 :(得分:1)

经过几次尝试,我使esp_bt_gap_read_rssi_delta()工作。

首先要了解的(如果您还没有的话)是回调/事件。回调函数是代码中的函数,当发生特殊情况(事件)时,ESP-IDF将调用该函数。初始化蓝牙堆栈后,可以通过调用esp_bt_gap_register_callback()来注册回调函数。

当您调用esp_bt_gap_read_rssi_delta()(连接到设备后)时,它会立即以OK或错误状态返回。实际的RSSI读数将稍后由调用您的回调函数的框架返回。

回调函数有两个参数。第一个标识发生的事件,第二个标识与该事件关联的数据。第二个参数是指向esp_bt_gap_cb_param_t联合中定义的结构之一的指针。

以下是使用BluetoothSerial进行连接的Arduino IDE的一些框架代码(不测试返回代码等):

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

答案 1 :(得分:0)

所以我的问题的最终解决方案(感谢@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....
}