Arduino GET запрос разбора больших данных - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь проанализировать шестнадцатеричные значения, которые я получаю от веб-сервера после преобразования изображения в 1-битное изображение BMP и преобразования этого изображения BMP в шестнадцатеричные значения. Эти данные поступают в Arduino nano IoT 33 через HTTP-запрос GET. Эти данные в основном используются для обновления дисплея eInk, который прикреплен к Arduino. Цель состоит в том, чтобы обновить дисплей по беспроводной связи с любым изображением, которое я хочу. Я успешно могу отправить данные на мой Arduino, однако, из-за размера полученных данных, для анализа этих данных требуется много времени. Длина содержимого полученных данных в среднем составляет 80540.

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

https://forum.arduino.cc/index.php?topic=49357.0

https://forum.arduino.cc/index.php?topic=281897.0

Я приложил скриншот ниже, который показывает некоторые части данных, которые я Получать.

Есть ли какой-либо способ или библиотека, которую я могу использовать для анализа этих больших данных и сохранения их в массиве, который затем можно использовать для обновления отображения eInk? Мы будем благодарны за ответ.

enter image description here

Ответы [ 2 ]

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

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

Возможно, вам придется реализовать более одного из них, чтобы обойти ограничения вашего board.

Разделить ответ по клиентскому запросу

Клиент Arduino может запросить фрагмент данных и обработать этот фрагмент перед запросом следующего фрагмента. Это может быть либо с помощью «постраничного» запроса, либо с использованием заголовка Transfer-Encoding: chunked.

Использование более эффективного кодирования в ответе сервера

Пример ответа кодирует один октет в виде шести символов (например, 0xff,).

Переход к двоичному ответу уменьшит пример 80 КБ примерно до 14 КБ. Простой двоичный дамп может быть возвращен. например, ответ HTTP (с заголовком Content-Type: application/octet-stream) может иметь чисто двоичную полезную нагрузку.

Если вам нужно, чтобы ответ оставался в виде текста, то даже кодировка base 64 будет более эффективной с точки зрения памяти, чем текущая шестнадцатеричная кодировка.

Использовать сжатую кодировку в ответе сервера (например, RLE)

Это не сжимает полезную нагрузку ответа (через HTTP-сжатие), поскольку Arduino, вероятно, не будет иметь памяти или ЦП для обработки этого.

Вместо этого кодирование длины выполнения может сжимать полезную нагрузку в объеме, достаточном для заполнения области памяти. Эффективный декодер RLE должен работать с небольшим объемом ОЗУ / ЦП.

RLE часто очень подходит для сжатия 1-битных изображений.

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

Как уже отмечалось в комментариях, 32 КБ ОЗУ недостаточно для хранения среднего набора в 80 КБ. Помимо выбора другого микроконтроллера, вы можете попытаться разделить ваше изображение на куски (может быть, 8 Кбайт), передать каждый чанк в своем собственном GET-запросе и нарисовать каждый из них на своем дисплее перед запросом следующего чанка.

...