Сравнение строки, полученной от MQTT/Cloud/Arduino

mkr1000

Я пытаюсь сравнить строку данных, которую я получаю от брокера MQTT. Если я получу ключевое слово быстрее, я хочу напечатать "увеличить скорость двигателя", а когда я получу ключевое слово медленнее или любое другое ключевое слово, я хочу напечатать "уменьшить скорость двигателя". Я не уверен, как сохранить данные, которые я получаю от MqttClient.read (), а затем сохранить их в строке, чтобы затем сравнить Ниже приведен фрагмент кода, в который я его добавил, и в моем случае он, похоже, работает неправильно. не могли бы вы взглянуть на это и сообщить мне, в чем ошибка?

while (mqttClient.available()) {
Serial.print((char)mqttClient.read());
String ipstring= String("(char)mqttClient.read()");
String fast ="faster";
if((char)mqttClient.read()==fast)
{
Serial.println("increase motor speed");}
else
{
Serial.println("decrease motor speed");
}*
}

Я также приложил код для справки. Спасибо!

/*
  Azure IoT Hub NB

  Этот скетч надежно подключается к центру интернета вещей Azure с помощью MQTT через NB IoT/LTE Cat M1.
  Он использует закрытый ключ, хранящийся в ATECC508A, и самозаверяющий открытый
сертификат для аутентификации SSL/TLS.

  Он публикует сообщение каждые 5 секунд в "devices/{deviceId}/messages/events/" topic
  и подписывается на сообщения в разделе "devices/{deviceId}/messages/devicebound/#"

  Схема:
  - Плата MKR NB 1500
  - Антенна
  - SIM-карта с тарифным планом
  - LiPo батарея

  Следующий учебник по Arduino Project Hub можно использовать
для настройки вашей учетной записи Azure и платы MKR:

  https://create.arduino.cc/projecthub/Arduino_Genuino/securely-connecting-an-arduino-nb-1500-to-azure-iot-hub-af6470

  Этот пример кода находится в открытом доступе.
*/

#include <ArduinoBearSSL.h>
#include <ArduinoECCX08.h>
#include <utility/ECCX08SelfSignedCert.h>
#include <ArduinoMqttClient.h>
#include <MKRNB.h>

#include "arduino_secrets.h"
int sensorValue;

/////// Введите свои конфиденциальные данные в arduino_secrets.h
const char pinnumber[]   = SECRET_PINNUMBER;
const char broker[]      = SECRET_BROKER;
String     deviceId      = SECRET_DEVICE_ID;

NB nbAccess;
GPRS gprs;

NBClient      nbClient;            // Используется для подключения TCP-сокета
BearSSLClient sslClient(nbClient); // Используется для подключения SSL/TLS, интегрируется с ECC508
MqttClient    mqttClient(sslClient);

unsigned long lastMillis = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial);

  if (!ECCX08.begin()) {
    Serial.println("No ECCX08 present!");
    while (1);
  }

  // восстановить самоподписанный сертификат
  ECCX08SelfSignedCert.beginReconstruction(0, 8);
  ECCX08SelfSignedCert.setCommonName(ECCX08.serialNumber());
  ECCX08SelfSignedCert.endReconstruction();

  // Установите обратный вызов, чтобы узнать текущее время
  // используется для проверки сертификата сервера
  ArduinoBearSSL.onGetTime(getTime);

  // Установите слот ECCX08 для использования в качестве закрытого ключа
  // и сопутствующий публичный сертификат для него
  sslClient.setEccSlot(0, ECCX08SelfSignedCert.bytes(), ECCX08SelfSignedCert.length());

  // Установите идентификатор клиента, используемый для MQTT, в качестве идентификатора устройства
  mqttClient.setId(deviceId);

  // Установите имя пользователя на "<broker>/<device id>/api-version=2018-06-30" и пустой пароль
  String username;

  username += broker;
  username += "/";
  username += deviceId;
  username += "/api-version=2018-06-30";

  mqttClient.setUsernamePassword(username, "");

  // Установите обратный вызов сообщения, эта функция
  // вызывается, когда MqttClient получает сообщение
  mqttClient.onMessage(onMessageReceived);
}

void loop() {
  if (nbAccess.status() != NB_READY || gprs.status() != GPRS_READY) {
    connectNB();
  }

  if (!mqttClient.connected()) {
    // Клиент MQTT отключен, подключиться
    connectMQTT();
  }

  // опрос для новых сообщений MQTT и отправки сохраняйте жизнь
  mqttClient.poll();

  // публиковать сообщение примерно каждые 5 секунд.
  if (millis() - lastMillis > 5000) {
    lastMillis = millis();

    publishMessage();
  }
}

unsigned long getTime() {
  // получить текущее время из модуля сотовой
  return nbAccess.getTime();
}

void connectNB() {
  Serial.println("Попытка подключения к сотовой сети");

  while ((nbAccess.begin(pinnumber) != NB_READY) ||
         (gprs.attachGPRS() != GPRS_READY)) {
    // не удалось, повторить попытку
    Serial.print(".");
    delay(1000);
  }

  Serial.println("Вы подключены к сотовой сети");
  Serial.println();
}

void connectMQTT() {
  Serial.print("Попытка подключения к брокеру MQTT: ");
  Serial.print(broker);
  Serial.println(" ");

  while (!mqttClient.connect(broker, 8883)) {
    // не удалось, повторить попытку
    Serial.print(".");
    Serial.println(mqttClient.connectError());
    delay(5000);
  }
  Serial.println();

  Serial.println("Вы подключены к брокеру MQTT");
  Serial.println();

  // подписаться на топик
  mqttClient.subscribe("devices/" + deviceId + "/messages/devicebound/#");
}

void publishMessage() {
  Serial.println("Publishing message");

  // отправить сообщение, интерфейс печати можно использовать для настройки содержимого сообщения
  mqttClient.beginMessage("devices/" + deviceId + "/messages/events/");
  mqttClient.print("hello ");
  sensorValue = analogRead(A0);
  mqttClient.println(sensorValue);
  //mqttClient.print(millis());
  
  mqttClient.endMessage();
}

void onMessageReceived(int messageSize) {
  // мы получили сообщение, распечатайть тему и содержание
  Serial.print("Received a message with topic '");
  Serial.print(mqttClient.messageTopic());
  Serial.print("', length ");
  Serial.print(messageSize);
  Serial.println(" bytes:");

  // используйте потоковый интерфейс для печати содержимого
  while (mqttClient.available()) {
    Serial.print((char)mqttClient.read());
    String ipstring= String("(char)mqttClient.read()");
    String fast ="faster";
    if((char)mqttClient.read()==fast)
    {
      Serial.println("увеличить скорость двигателя");}
      else
      {
        Serial.println("уменьшить скорость двигателя");
        }
  }
  Serial.println();

  Serial.println();
}

, 👍0

Обсуждение

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перенесен на chat](https://chat.stackexchange.com/rooms/128722/discussion-on-question-by-dave-comparison-of-a-string-received-from-mqtt-cloud-a)., @Juraj


1 ответ


1

Читая комментарии, я вижу, что требования к проекту меняются. Структура команд 0 = Выкл.сильно ограничит то, что вы можете сделать, но это хорошая отправная точка.

Что касается первого блока кода, начинающегося с while (MqttClient.available ()) {, а затем добавления вашей идеи команд с одной цифрой / символом, у меня есть этот тестовый скетч, который вы можете попробовать.

Вам не нужен объект String для достижения вашей цели. Возможно, вам придется сделать что-то подобное, хотя input = (char)MqttClient.read (), где в тестовом скетче используется этот ввод = Serial.read();.

char input;

void setup(){
  Serial.begin(9600);
}

void loop(){

  if(Serial.available() > 0){

    input = Serial.read();

    if(input == '0'){
      Serial.println("Turn Off");
    }

    else if(input == '1'){
      Serial.println("Turn On");
    }

    else if(input == '2'){
      Serial.println("Decrease Speed");
    }

    else if(input == '3'){
      Serial.println("Increase Speed");
    }
  }
}

Чтобы сделать еще один шаг вперед, предположим, вы хотите отправлять команды, которые начинаются с одной буквы, а затем после буквы остальные цифры или символы имеют определенную цель, если вы этого хотите. Например, допустим, вы отправляете следующую команду d50. d может означать снижение скорости, а 50 может означать 50%, 50 шагов и т.д.

Следующий тестовый скетч иллюстрирует мою точку зрения.

char inputBuffer[64 + 1];

void setup(){
  Serial.begin(9600);
}

void loop(){

  while(Serial.available() > 0){

    Serial.readBytesUntil('\n', inputBuffer, sizeof(inputBuffer));

    if(inputBuffer[0] == 'f'){
      Serial.println("Letter 'f' entered");
    }

    // Letter "r". Everything after the "r" should be digits.
    else if(inputBuffer[0] == 'r'){
      Serial.print("Letter 'r' entered\t");
      // Change the letter "r" to the digit 0 to keep atol() happy.
      inputBuffer[0] = B110000;
      Serial.print("Number entered = ");
      Serial.println(atol(inputBuffer));

      // Your code here that uses the number parsed using atol().

    }

    // Letter "s". Everything after the "s" should have a max
    // length of up to 64 chars long for a 64 + 1 char buffer.
    else if(inputBuffer[0] == 's'){

      // MAX CHARS example with a 64 byte buffer:
      // s123456789a123456789b123456789c123456789d123456789e123456789f + CR + NL
      Serial.print("Letter 's' entered\tText entered = ");

      // Print out the chars in the buffer.
      for(int i = 1; i < strlen(inputBuffer); i++){
        Serial.print(inputBuffer[i]);
      }
      Serial.println();

      // Your code here that uses the char data after the letter "s" is entered.

    }
    memset(inputBuffer, 0, sizeof(inputBuffer));
  }
}

,