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!
答案 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....
}