JSON формат в Arduino - PullRequest
       38

JSON формат в Arduino

0 голосов
/ 17 апреля 2020

У меня есть код, который отлично работает, если я ввожу значения напрямую, но моя текущая система такова, что значения должны будут измениться. см. код ниже.

char http_cmd[] =  "POST /tracker/ HTTP/1.1\r\nContent-Type: application/json\r\nContent-Length: 38\r\nHost: haul1.herokuapp.com\r\n\r\n{ \"trackerId\": \"2222\",\"height\": \"42\" }";

// this works fine

но я хочу ввести значения в виде переменных, поэтому я сделал что-то вроде этого

String tracker = "2222";
String height = "42";
char http_cmd[] =  "POST /tracker/ HTTP/1.1\r\nContent-Type: application/json\r\nContent-Length: 38\r\nHost: haul1.herokuapp.com\r\n\r\n{ \"trackerId\": \""+tracker+"\",\"height\": \""+height+"\" }"; 

это сообщение об ошибке, которое я получаю

exit status 1
initializer fails to determine size of 'http_cmd'

Спасибо за попытку. Что мне действительно нужно, так это приемлемый синтаксис типа содержимого Json, мне также нужно знать, как получить точный размер "http_cmd"

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

На самом деле в вашем коде есть две ошибки. Вы видите ошибку, потому что вы создаете массив char без указания длины. Другая ошибка состоит в том, что конкатенация строк с + является частью библиотеки Arduino String, она не является частью c ++ и, следовательно, не является допустимым оператором для типа данных char.

Есть два способа сделать это: 1) использовать оператор конкатенации строк + из библиотеки String (все, что вам нужно, это изменить код с char http_cmd[] на String http_cmd); 2) используя массив символов. Но обычно считается более безопасным использовать массив символов, чем библиотеку String. Вы можете использовать sprintf() для создания массива строк, это работает для всех типов данных, за исключением плавающей запятой в Arduino.

Для простоты расчета длины полезной нагрузки json и для удобочитаемости, лучше разбить команду на несколько строк. Кстати, я предположил, что tracker и height действительно int, которые могут быть закодированы в JSON напрямую.

int tracker = 2222;
int height = 42;

// create json payload
char json[30];
sprintf(json, "{\"trackerId\":%d,\"height\":%d}", tracker, height);

char http_post_request[] = "POST /tracker/ HTTP/1.1\r\n";
char http_content_type[] = "Content-Type: application/json\r\n";

// calculate payload length
char http_content_length[20];
sprintf(http_content_length, "Content-Length:%lu\r\n", strlen(json));
char http_host[] = "Host: haul1.herokuapp.com\r\n\r\n";
0 голосов
/ 17 апреля 2020

На данном этапе это будет считаться объединением строк. Оператор + вернет тип String, а не char[]. Вы пытались сначала создать строку в отдельной переменной и вызвать для нее .c_str()?

Из того, что я вижу, сам синтаксис json выглядит хорошо, если вы пропустите все компоненты http, добавленные перед ним.

...