Сравнение строки, полученной от MQTT/Cloud/Arduino
Я пытаюсь сравнить строку данных, которую я получаю от брокера 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();
}
@Dave, 👍0
Обсуждение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));
}
}
- Использование SD-адаптера 5 В в системе 3,3 В
- Arduino MKR1000 и DHT11 не дают правильного вывода для температуры и влажности
- Датчик температуры MKR1000 и DS18B20
- POST-запрос на Arduino MKR1400 GSM не работает
- Связь между двумя Arduino/MKR1000
- Проблема при отправке числа с плавающей запятой и нескольких чисел с плавающей запятой
- Использование модуля SD-Card в сочетании с MKR GSM 1400.
- Проблема Arduino MKR Zero с новой связью UART
Комментарии не предназначены для расширенного обсуждения; этот разговор был [перенесен на chat](https://chat.stackexchange.com/rooms/128722/discussion-on-question-by-dave-comparison-of-a-string-received-from-mqtt-cloud-a)., @Juraj