Публиковать данные json в mqtt

Я пытаюсь опубликовать данные JSON в mqtt со следующим фрагментом кода

#include <Arduino_JSON.h>
JSONVar data;
data["temperature"] = temperature;
data["humidity"] = humidity;
data["pressure"] = pressure;
data["chipId"] = chipId;

String jsonString = JSON.stringify(data);
client.publish("esp32/data", jsonString);

Но возникает следующая ошибка

/home/ubuntu/Arduino/libraries/PubSubClient/src/PubSubClient.h:144:12: note:   candidate expects 4 arguments, 2 provided
Multiple libraries were found for "PubSubClient.h"
 Used: /home/ubuntu/Arduino/libraries/PubSubClient
Multiple libraries were found for "Wire.h"
 Used: /home/ubuntu/.arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/Wire
Multiple libraries were found for "Adafruit_BME280.h"
 Used: /home/ubuntu/Arduino/libraries/Adafruit_BME280_Library
Multiple libraries were found for "Adafruit_Sensor.h"
 Used: /home/ubuntu/Arduino/libraries/Adafruit_Unified_Sensor
Multiple libraries were found for "SPI.h"
 Used: /home/ubuntu/.arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/SPI
Multiple libraries were found for "Arduino_JSON.h"
 Used: /home/ubuntu/Arduino/libraries/Arduino_JSON
Multiple libraries were found for "WiFi.h"
 Used: /home/ubuntu/.arduino15/packages/esp32/hardware/esp32/1.0.4/libraries/WiFi
 Not used: /opt/arduino-1.8.10/libraries/WiFi
exit status 1
no matching function for call to 'PubSubClient::publish(const char [11], String&)'

Что здесь не так?

, 👍1


1 ответ


Лучший ответ:

3

Какое ваше последнее сообщение об ошибке?

no matching function for call to 'PubSubClient::publish(const char [11], String&)'

Прочитайте документацию по методу publish() в PubSubClient. :

не публиковать (тема, полезная нагрузка)

Публикует строковое сообщение в указанной теме.

Параметры

topic — тема для публикации (const char[])

payload — сообщение для публикации (const char[])

Посмотрите на используемые вами параметры. Вы передаете String как полезную нагрузку. publish() ожидает, что payload будет char[] (фактически то же самое, что и char*) - строка языка C. Это ошибка, которую вы видите.

Читать документацию для String . Как получить char* из String? Метод c_str().

Вам нужно изменить

client.publish("esp32/data", jsonString);

в

client.publish("esp32/data", jsonString.c_str());

Что касается других ваших предупреждений, похоже, что ваши библиотеки Arduino находятся в беспорядке с несколькими установленными конфликтующими библиотеками; если вы хотите избавиться от предупреждений, очистите свои библиотеки.

,

можно ли преобразовать json в char*?, @roy

@roy - я дал вам шаги для этого в ответе. Если вы хотите сделать это более непосредственно, вы используете библиотеку Arduino_JSON. Объявление метода stringily() находится по адресу https://github.com/arduino-libraries/Arduino_JSON/blob/master/src/JSON.h, и оно показывает только String в качестве возврата, поэтому вы не можете сделайте это более непосредственно, используя эту библиотеку., @romkey

Arduino_JSON имеет эту ссылку https://github.com/arduino-libraries/Arduino_JSON, здесь не так много информации. Большинство примеров основаны на ArduinoJSON., @roy

Мой комментарий ответил на ваш вопрос - возможно, я редактировал его, когда вы отвечали. Вы можете найти ответ в объявлении stringify() в json.h, @romkey