Применение 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 парсер на наши данные:

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

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

 

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