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

标签 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, 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?

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

最佳答案

经过几次尝试,我让 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 union 中定义的结构之一的指针。

这里是 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);
  }
}

关于c - 如何使用 esp_bt_gap_read_rssi_delta 函数从 ESP32 获取蓝牙经典 RSSI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52572703/

相关文章:

c - 如何使用procfs将内核数据发送到用户空间?

c++ - 初始化结构,使用数组

Android BluetoothSocket.isConnected 总是返回 false

java - 无法从 BLE nordic thingy :52 检索 RSSI 值

c - 将字符串连接到数组时内存泄漏

将 * 指针转换为 *** 指针

android - 蓝牙错误没有广告设备

java - Android 通过蓝牙连接到 Arduino。应用程序不会发送字符串

android - 如何获取我正在为 RSSI 读取的 BLE 设备的地址?

c# - Microsoft 蓝牙堆栈 RSSI 解决方法