Применение JSON парсера JSMN в микроконтроллерах

В рамках «Интернета вещей» нам приходится находить способы наладить взаимодействие между «взрослыми» серверами, служащих для накопления и обработки больших массивов информации и микроконтроллерной «мелочью», эту самую информацию собирающей. Одним из вопросов, возникающих при проектировании IoT-систем, является передача данных (например, первоначальных настроек) от сервера к контроллеру.

Метод передачи данных, разумеется, может разниться в зависимости от решаемой задачи. При больших объемах информации, возможно, будет предпочтительнее использовать какой-то бинарный протокол, возможно, даже с сжатием информации. В случае же, если объем передаваемой информации относительно небольшой, можно передавать данные в формате JSON. В плюсы такому методу можно записать как удобство интерпретации передаваемой информации «на глаз», так как это практически просто удобочитаемый текстовый поток, так и простоту обработки при помощи готовых библиотек.


Не знаю зачем, но у формата JSON есть собственное лого

Давайте реализуем прием информации в формате JSON устройством на базе STM32 (конкретно, на STM32L051). Для меньшего расхода ресурсов микроконтроллера будем использовать JSON парсер JSMN. Конечно, STM32 потянет и куда более тяжелый софт, но, учитывая то, что JSON парсинг, как правило, отнюдь не основная задача микроконтроллера, не будем отъедать ресурсов более необходимого и используем наиболее легковесное решение.

Парсер JSMN несколько непривычен тем, что превращает обрабатываемую JSON строку не в набор готовых пар ключ-значение, а в набор ссылок — номеров символов в общей строке, откуда можно взять как наименование ключа, так и его значение.

Давайте попробуем считать с сервера JSON строку, обработать ее JSON парсером JSMN и, используя полученные данные, сформировать «нормальные» пары ключ-значение.

Для примера обрабатывать будем вот такую JSON строку, которая нужна была мне в одном из проектов: {«server»:»167.xxx.xxx.xxx», «path»:»/api/», «startTime»:»09:00″, «port»:9090,»stopTime»:»21:00″, «activeDuration»:200, «detectTime»:15000, «detectDistance»:50, «connectInterval»:3600000, «wifiNetwork»:»FIRST_INIT», «wifiPassword»:»123456789″, «result»:»ok»}.

Итак, скачиваем и подключаем к своему проекту собственно парсер JSMN. Проблем быть не должно, так как весь парсер умещается всего в двух файлах, jsmn.c и jsmn.h, все остальное — документация, примеры использования и тесты.

Создаем структуру, в которую в конце концов попадут все декодированные данные:

Подготавливаем переменные для парсера:

Вопрос получения данных с сервера мы здесь опустим, этому посвящена отдельная статья, скажу только, что вся полученная от Wi-Fi модуля строка осядет в переменной под названием ESP_Answer.

Для начала очистим начало строки от служебной информации, оставив только JSON данные, удалив всю информацию от начала до первого вхождения символа ‘{‘.

Натравливаем JSON парсер на наши данные:

И наконец, раскладываем полученные данные «по полочкам»:

В результате всех этих программных манипуляций в отладчике вы должны увидеть примерно следующую картину:

 

Закладка Постоянная ссылка.

4 комментария: Применение JSON парсера JSMN в микроконтроллерах

  1. Vise пишет:

    Да не за что. Вот на это:
    uint8_t ESP_Answer[MAXANSWERLENGTH];
    char *bracket = strchr(ESP_Answer, ‘{‘);
    memset(bracket + 1, 0, sizeof(ESP_Answer) — (bracket — ESP_Answer));
    Ругается так: error: invalid operands to binary — (have ‘char *’ and ‘uint8_t * {aka unsigned char *}’)
    Ну GCC во всяком случае. По большому счету тут из длины ESP_Answer вычитается разница между двумя адресами в памяти. Что вообще говоря несколько странно. И еще бы обратный пример, как формировать JSON.

Добавить комментарий

  • Несколько случайная, но довольно любопытная информация:

    Все мы знаем о сланцевой нефти, которая хотя и составляет достаточно незначительный процент в общем объеме добычи, но все же открывает новые возможности по работе с сырьем, использование которого раньше было нерентабельным и оказывает существенное давление на мировые цены на нефть, что даже привело к рождению термина «Сланцевая революция». Интересно, что еще в 1982 году в СССР, в окрестностях села Мордовская Кармалка был создан научно-промышленный полигон, на котором проводился эксперимент по добыче нефти из низкозалегающих твердых битумных пород. Пробурив несколько скважин, экспериментаторы через одну из них поджигали подземные пласты, а через остальные пытались выкачивать разогретый нефтепродукт.