Преобразование JSON в строку для MQTT
Я пытаюсь опубликовать объект json в строку со следующим фрагментом
JSONVar data;
data["chipid"] = chipId;
data["co2_equivalent"] = co2_equivalent.c_str();
data["tvoc"] = tvoc.c_str();
data["h2_signal"] = h2_signal;
data["ethanol_signal"] = ethanol_signal;
data["humidity"] = humidity;
data["temperature"] = temperature;
data["absolute_hum"] = v.absolute_hum;
data["co2_equivalent_baseline"] = co2_equivalent_baseline;
data["tvoc_baseline"] = tvoc_baseline;
String data_json = JSON.stringify(data);
Serial.print(data_json);
Serial.println();
client.publish("/devices/data", data_json);
Это дает мне следующую ошибку во время компиляции.
/Users/ubuntu/Desktop/Arduino/data_collection/esp32-svm30-mqtt.ino/esp32-svm30-mqtt.ino.ino: In function 'void loop()':
esp32-svm30-mqtt.ino:271:46: error: no matching function for call to 'PubSubClient::publish(const char [14], String&)'
client.publish("/devices/data", data_json);
^
In file included from /Users/ubuntu/Desktop/Arduino/data_collection/esp32-svm30-mqtt.ino/esp32-svm30-mqtt.ino.ino:2:0:
/Users/ubuntu/Documents/Arduino/libraries/PubSubClient/src/PubSubClient.h:141:12: note: candidate: boolean PubSubClient::publish(const char*, const char*)
boolean publish(const char* topic, const char* payload);
^
/Users/ubuntu/Documents/Arduino/libraries/PubSubClient/src/PubSubClient.h:141:12: note: no known conversion for argument 2 from 'String' to 'const char*'
/Users/ubuntu/Documents/Arduino/libraries/PubSubClient/src/PubSubClient.h:142:12: note: candidate: boolean PubSubClient::publish(const char*, const char*, boolean)
boolean publish(const char* topic, const char* payload, boolean retained);
^
/Users/ubuntu/Documents/Arduino/libraries/PubSubClient/src/PubSubClient.h:142:12: note: candidate expects 3 arguments, 2 provided
/Users/ubuntu/Documents/Arduino/libraries/PubSubClient/src/PubSubClient.h:143:12: note: candidate: boolean PubSubClient::publish(const char*, const uint8_t*, unsigned int)
boolean publish(const char* topic, const uint8_t * payload, unsigned int plength);
^
/Users/ubuntu/Documents/Arduino/libraries/PubSubClient/src/PubSubClient.h:143:12: note: candidate expects 3 arguments, 2 provided
/Users/ubuntu/Documents/Arduino/libraries/PubSubClient/src/PubSubClient.h:144:12: note: candidate: boolean PubSubClient::publish(const char*, const uint8_t*, unsigned int, boolean)
boolean publish(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained);
^
/Users/ubuntu/Documents/Arduino/libraries/PubSubClient/src/PubSubClient.h:144:12: note: candidate expects 4 arguments, 2 provided
Multiple libraries were found for "PubSubClient.h"
Used: /Users/ubuntu/Documents/Arduino/libraries/PubSubClient
Multiple libraries were found for "Arduino_JSON.h"
Used: /Users/ubuntu/Documents/Arduino/libraries/Arduino_JSON
Multiple libraries were found for "svm30.h"
Used: /Users/ubuntu/Documents/Arduino/libraries/svm30
Multiple libraries were found for "Wire.h"
Used: /Users/ubuntu/Library/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/Wire
Multiple libraries were found for "WiFi.h"
Used: /Users/ubuntu/Library/Arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/WiFi
Not used: /Applications/Arduino.app/Contents/Java/libraries/WiFi
exit status 1
no matching function for call to 'PubSubClient::publish(const char [14], String&)'
Строка Serial.print(data_json)
печатает его в последовательном мониторе.
Обновление :
Если я делаюclient.publish("/devices/data", data_json.c_str());
, он компилируется, но данные не появляются в mqtt.
Serial.print(data_json.длина());
отпечатки 236
Правильно ли мое преобразование json в строку ?
@roy, 👍0
1 ответ
Пожалуйста, обратите внимание: в вопросе изначально не упоминалось о попытке использовать
c_str()
- так что я не дебил
Пункт 1 JSON на самом деле является строкой
Пункт 2 ваша переменная
data_json представляет собой строку
Клиент точки 3.Публикация
не работает, в качестве аргумента полезной нагрузки берется строка, она принимает либо
const char*
, либо const uint8_t *
Таким образом, вы можете просто использовать метод String s
c_str, чтобы вставить символ const *
в качестве полезной нагрузки
т. е.
client.publish("/devices/data", data_json.c_str());
Пункт 4. если вы прочтете документацию pubsubclient, вы увидите, что
Максимальный размер сообщения, включая заголовок, по умолчанию составляет 128 байт. Это настраивается с помощью MQTT_MAX_PACKET_SIZE в PubSubClient.h. Более длинные сообщения также можно отправлять с помощью метода publish_P ().
итак, сейчас вы можете столкнуться с размером сообщения, слишком большим для обработки pubsubclient - установите больший размер пакета, прежде чем включать PubSubClientHeader.h
#define MQTT_MAX_PACKET_SIZE 1024
#include <pubsubclient.h>
Если это тоже не сработает, попробуйте
client.publish_P("/devices/data", data_json.c_str());
- Mqtt не подписывается на тему, преобразованную из массива String в массив символов.
- форматирование строк в Arduino для вывода
- Проблемы с преобразованием byte[] в String
- Чтение строки, разделенной запятыми
- Использование строки вместо строки C, еще одна попытка затронуть загруженную проблему
- Разделение Serial.readString на массив строк
- strcmp, похоже, не работает
- Как заменить объекты String массивами символов, продолжая использовать строковые методы
Я попробовал " data_json.c_str ()", но все равно данные не отображаются в mqtt., @roy
@roy - но сейчас он компилируется?, @Jaromanda X
Да, он компилируется, но данные не попадают в mqtt., @roy
@roy - обновил ответ с другой возможной проблемой, которую вы подтвердили своим последним обновлением, что длина полезной нагрузки превышает 128 ... это означает, что все сообщение значительно превышает 128, @Jaromanda X
Я попытался добавить "#define MQTT_MAX_PACKET_SIZE 1024", но в mqtt по-прежнему нет данных., @roy
@roy - что, если вы установите фиксированную полезную нагрузку? Я не могу вспомнить, пробовали ли вы это, так как вы продолжаете редактировать вопрос - вы добавили это определение ДО того, как включили файл заголовка?, @Jaromanda X
Если я просто опубликую фиксированные данные, это будет выглядеть так:
client.publish("/устройства/данные", "1234567890");
, @royи теперь, когда вы увеличили размер пакета, он все еще не работает? это странно, потому что, если
Serial.print(data_json);
печатает строку, и строка намного меньше 1024, это должно было сработать - можете ли выSerial.print(MQTT_MAX_PACKET_SIZE);
просто чтобы быть уверенным, @Jaromanda Xпопробуйте использовать
client.publish_P("/устройства/данные", data_json.c_str());
, @Jaromanda XВы почти все перепробовали, и @Jaromanda дал ответ, который, возможно, должен сработать. Не могли бы вы, пожалуйста, попробовать следующие действия
const char *buffer = NULL; //объявление const char * buffer = strdup(data_json.c_str()); //дублирование строки client.publish("/устройства/данные", буфер); //опубликовать его MQTT
, @Maaz Sk