C++如何在回调arduino之外查询值

问题描述

我希望可以通过 BLE 从手机更改测量间隔和 MQTT 服务器设置。我使用 LightBlue 作为移动应用程序。

这是我的 BLE 代码,适用于我的移动应用程序

#include <BLEDevice.h>
#include <bleutils.h>
#include <BLEServer.h>
#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHaraCTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string value = pCharacteristic->getValue();
      if (value.length() > 0) {
        Serial.println("*********");
        Serial.print("New value: ");
        for (int i = 0; i < value.length(); i++)
          Serial.print(value[i]);

        Serial.println();
        Serial.println("*********");
      }
    }
};

void setup() {
  Serial.begin(115200);

  Serial.println("1- Download and install an BLE scanner app in your phone");
  Serial.println("2- Scan for BLE devices in the app");
  Serial.println("3- Connect to MyESP32");
  Serial.println("4- Go to CUSTOM CHaraCTERISTIC in CUSTOM SERVICE and write something");
  Serial.println("5- See the magic =)");

  BLEDevice::init("MyESP32");
  BLEServer *pServer = BLEDevice::createServer();

  BLEService *pService = pServer->createService(SERVICE_UUID);

  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHaraCTERISTIC_UUID,BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  pCharacteristic->setCallbacks(new MyCallbacks());

  pCharacteristic->setValue("Hello World");
  pService->start();

  BLEAdvertising *pAdvertising = pServer->getAdvertising();
  pAdvertising->start();
}

void loop() {
  // put your main code here,to run repeatedly:
  delay(2000);
}

这是 MQTT 代码

void loop() {
  unsigned long currentMillis = millis();
  // Every X number of seconds (interval = 10 seconds) 
  // it publishes a new MQTT message
  if (currentMillis - prevIoUsMillis >= interval) {
    // Save the last time a new reading was published
    prevIoUsMillis = currentMillis;
    // New DHT sensor readings
    hum = dht.readHumidity();
    // Read temperature as Celsius (the default)
    temp = dht.readTemperature();
    // Read temperature as Fahrenheit (isFahrenheit = true)
    //temp = dht.readTemperature(true);    

    // Check if any reads Failed and exit early (to try again).
    if (isnan(temp) || isnan(hum)) {
      Serial.println(F("Failed to read from DHT sensor!"));
      return;
    }
    
    // Publish an MQTT message on topic esp32/dht/temperature
    uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP,1,true,String(temp).c_str());                            
    Serial.printf("Publishing on topic %s at QoS 1,packetId: %i",MQTT_PUB_TEMP,packetIdPub1);
    Serial.printf("Message: %.2f \n",temp);

    // Publish an MQTT message on topic esp32/dht/humidity
    uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM,String(hum).c_str());                            
    Serial.printf("Publishing on topic %s at QoS 1,packetId %i: ",MQTT_PUB_HUM,packetIdPub2);
    Serial.printf("Message: %.2f \n",hum);
  }
}

请问我如何将间隔设置为 BLE 代码中的任何变量,而不是 10000。

long interval = 10000;

解决方法

您需要将变量 interval 声明为全局变量,以便从文件中的任何位置访问它。全局变量可以在函数之外声明。

您收到的值属于 std::string 类型,并且您希望尽可能长时间地使用它。您可以使用 toInt() 将变量从 String 转换为 Long。

尝试这样的事情:

long interval = 10000; // Set default value

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic) {
      std::string value = pCharacteristic->getValue();
      if (value.length() > 0) {
        Serial.println("*********");
        Serial.print("New value: ");
        for (int i = 0; i < value.length(); i++)
          Serial.print(value[i]);

        Serial.println();
        Serial.println("*********");
        interval = value.toInt(); // <-- Set received value
      }
    }
};