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/