#c #json
#c #json
Вопрос:
Я новичок в MQTT и хочу отправить сообщение с помощью клиентской библиотеки paho c, я могу отправить сообщение в виде символа *, но мне нужно преобразовать его в формат JSON.
Я нашел Янссон из json.org чтобы создать объект JSON для отправки в виде сообщения MQTT.
вот что я пробовал:
#include <stdio.h>
#include <jansson.h>
int main(int argc, char* argv[])
{
// ..... creating client ....
//creating JSON
long int timestamp = 1609446771;
float temperature = 30.14;
float D850 = 102.48;
float D280 = 4845.84;
json_t *obj = json_pack("{s:s,s:s,s:s,s:s}",
"timestamp", timestamp,
"temperature", temperature,
"D850", D850,
"D280", D280);
// .... publishing message ....
}
Я скомпилировал код с:
gcc -L/home/MYUSER/MQTT/paho.mqtt.c/build/output pahocclient.c -lpaho-mqtt3c -ljansson -lm -o publish_c.out
код компилируется без ошибок, но когда я запускаю его, я получаю ошибку ошибки сегментации:
Ошибка сегментации (сброс ядра)
что я делаю не так?
Комментарии:
1. Попробуйте добавить
NULL
последний аргументjson_pack
и скомпилировать как ваш код на C, так и библиотеку JANSSON с помощьюgcc -Wall -Wextra -g
2. вы имеете в виду
json_t *obj = json_pack("{s:s,s:s,s:s,s:s}", "timestamp", timestamp, "temperature", temperature, "D850", D850, "D280", D280, NULL);
и компилируете с помощью:gcc -L/home/shahriar/MQTT/paho.mqtt.c/build/output pahocclient.c -lpaho-mqtt3c -ljansson -lm -Wall -Wextra -g -o publish_c.out
?? Я все еще получаюSegmentation fault (core dumped)
ошибку3. Я в основном имею в виду, что вам следует уделять больше времени чтению документации библиотек, которые вы используете
Ответ №1:
Сначала вам нужно потратить больше времени на ознакомление с форматом JSON.
Затем ваш
json_t *obj = json_pack("{s:s,s:s,s:s,s:s}",
"timestamp", timestamp,
"temperature", temperature,
"D850", D850,
"D280", D280);
плохо типизирован. Поскольку вы используете s
everywhere в первом аргументе, вы должны передавать строки C везде.
Например:
long int timestamp = 1609446771;
char timestampbuf [64];
memset(timestampbuf, 0, sizeof(timestampbuf));
snprintf (timestampbuf, sizeof(timestampbuf), "%ld", timestamp);
затем перейдите "timestamp", timestampbuf,
к json_pack
.
В качестве альтернативы, потратьте больше времени на чтение документации libjansson. Может быть, вам следует изменить "{s:s,s:s,s:s,s:s}"
строку и изменить спецификацию данных JSON?
Вы могли бы даже подумать о написании своего плагина GCC, чтобы проверять во время компиляции ввод большинства json_pack
вызовов. См. Статический анализатор bismon.
Если вы компилируете с помощью GCC, обязательно ознакомьтесь с его документацией и запустите ее со всеми предупреждениями и отладочной информацией: gcc -Wall -Wextra -g
. Затем используйте отладчик GDB.
Вы также можете скомпилировать jansson из его исходного кода с аналогичными параметрами компиляции (или gcc -Wall -Wextra -g -O2
)
Перед написанием кода задокументируйте на письменном английском языке (или на обычном человеческом языке), с обозначением EBNF, JSON, который вы хотите отправить, и отправьте этот документ (возможно, по электронной почте) лицу, пишущему на принимающей стороне.