Революция о которой так долго говорили большевики свершилась. Теперь вы можете взять карточку памяти microSD, записать на неё файлы дистрибутива AMS и ваша Arduino превратиться в маленькое (или большое, это как посмотреть) чудо. Вам больше не нужны «костыли» с поддержкой стороннего сервера, Arduino Mega Server стал полностью автономным и вполне «юзабельным» в одиночном режиме работы. И это открывает для всех нас очень интересные перспективы.
Было много разговоров о том, что это невозможно и что ограничения микроконтроллера и сетевой платы не позволят этого сделать, было множество обсуждений и экспериментов, но теперь всё это позади, удалось решить все проблемы и преодолеть все препятствия и всё-таки заставить это работать так, как надо.
В первой статье о Arduino Mega Server я подробно описал проект, рассказал о технологии и обрисовал примерные перспективы развития и применения AMS, в этой статье я расскажу о том, как удалось добиться автономной работы сервера и какие возможности уже открыты перед нами.
Битва за автономку
Автономность работы это принципиальный момент. Если вы «привязаны» к стороннему серверу, то это кардинальным образом ограничивает возможности применения ваших проектов. Сами посудите, чтобы работал маленький контроллер, ему нужна поддержка в виде инсталляции и настройки большого сервера MajorDoMo. Поэтому все силы были брошены на решение этой проблемы, но… не тут то было. На пути вывода AMS в автономное плавание встало множество неожиданных и труднопреодолимых преград.
Первая преграда это низкая скорость чтения файлов с microSD карты. В первой статье я упомянул о том, что бутылочным горлышком в этой системе является скорость работы карты памяти, так вот, это оказалось не совсем так. Проблема не в microSD карте, а в алгоритме работы функции
File.read();
Она осуществляет побайтовое чтение из файла и тем самым очень тормозит весь процесс. Средняя скорость чтения в этом режиме составляет 25 килобайт в секунду. Выходом оказался переход на блочное чтение с размером буфера от 32 до 256 байт. Оптимальным по соотношению ресурсы / производительность был выбран размер 128 байт и это подняло скорость чтения с карты памяти в 10 (!) раз, примерно до 260 килобайт в секунду. И это, как вы сами понимаете, уже совсем другой коленкор. Скорость чтения в 25 килобайт в секунду просто ставила крест на всём проекте потому, что с такой скоростью в принципе невозможно передавать файлы за приемлемое время.
File.read(buff, MAX_BUFFER_SIZE);
Первое препятствие мы благополучно преодолели, но когда я замерил скорость отдачи файлов в сеть, то оказался в глубоком шоке: 4,1 килобайта в секунду. То есть все наши старания по ускорению чтения данных с диска разбивались о стену черепашьей скорости отдачи этих данных в сеть.
client.write(data);
Вы уже, наверное, догадались в чём проблема и как её можно решить. Правильно, заменить побайтовую выдачу в сеть на блочную. Что и было сделано и дало прирост скорости в 14 (!) раз примерно до 57 килобайт в секунду. И вот тут наш сервер стал похож на настоящий, он наконец-то стал работать, а не ползать с черепашьей скоростью. Кстати, версия 0.11 работает на скорости 4,1 килобайта в секунду и спасает её только тандемный режим.
client.write(buff, size);
Это было очень здорово, но, как оказалось, расслабляться нам было ещё рано, настоящие трудности ещё и не начинались. Следующей эпической проблемой стала задержка ответов сервера, которой была посвящена целая статья (не пропустите увлекательное чтение). Вкратце, оказалось, что стандартная библиотека Ethernet, поставляемая со средой разработки Arduino в течение многих лет, содержит генетический дефект, делающий её профнепригодной. Она неправильно работает с запросами и просто «подвешивает» неодиночные запросы. Между делом, была исправлена стандартная библиотека Arduino Ethernet.
Уменьшение задержки ответов сервера, в сочетании с поднятой до нормального уровня скорости чтения файлов с карты памяти и отдачи данных в сеть, сделали Arduino Mega Server «серьёзной» и по-настоящему работоспособной системой.
Железная стена
И тут мы упёрлись в обстоятельства непреодолимой силы под названием чип W5100 (я в курсе про более продвинутые варианты, но это несколько другая история). Его четыре аппаратных сокета ставят очень жёсткие ограничения на сетевое взаимодействие с ним. Нельзя просто так взять и загрузить через него веб-страничку с десятком линков на CSS, JavaScript и HTML файлы. Каждая ссылка порождает новый запрос и новое соединение и… когда их становится больше четырёх, то начинаются проблемы с задержкой ответа. И чтобы всё это заработало, нужно организовать сетевое взаимодействие с учётом этой особенности чипа W5100.
Для решения этой проблемы было введено некое подобие серверного языка программирования (макросы), которое позволяет собирать странички на стороне сервера и, что самое главное, позволяет манипулировать сборкой страниц из скетчей на Arduino и с самих загружаемых страничек. Это даёт полную свободу и вы становитесь подобны магу или волшебнику и можете проделывать с выводимыми страничками всё, что угодно.
Например, на лету менять стиль, дизайн и функциональность выводимых страниц. Это можно представить себе в виде некой трёхмерной матрицы: одна ось — функционал сайта, вторая ось — дизайн (визуальное представление), третья ось — топология сайта. Другими словами, один сайт превращается во множество сайтов, каждый со своим дизайном, своей функциональностью и своей топологией. А работу множества сайтов обеспечивает единое ядро.
И происходит всё это на восьмибитном микроконтроллере Arduino.
Красота
Поскольку мы получили в свои руки столь мощный инструмент, как AMS Matrix Engine, грех было бы им не воспользоваться и в качестве демонстрации были созданы три дополнительных сайта на которые можно переключаться одним кликом прямо на ходу (даже перезагрузку странички AMS заботливо сделает сам). Кстати, можно было сделать не три, а тридцать три сайта или сто тридцать три сайта (визуально — топологически — функционального представления информации) — ваша Arduino с лёгкостью будет их обслуживать (не одновременно, конечно, но это нам и не нужно).
По умолчанию (гик моде, вам понравится)
Домашний (спокойный дизайн и «спокойные» функции)
Модерн («модерновый» дизайн и функциональность по вкусу)
Амперка (брендирование под вашу компанию, Интернет-магазин, школу или лабораторию)
Поясню, потому, что не все могли понять то, что было написано выше. У вас есть мощный микроконтроллер и десятками пинов и обслуживающий больше полусотни датчиков. Среди них есть температурные, токовые, охранные и прочие. Каждая группа датчиков образует логический кластер, например, охрана, климат, здоровье вашего любимого кактуса и т. д. Так вот, под каждый логический кластер AMS Matrix Engine позволяет создать отдельный сайт с отдельным дизайном и функционалом. Пользователю даже в голову не придёт, что всё это богатство работает на «дохлом» и невзрачном микроконтроллере который пылится в углу.
Перспективы использования
Ваши проекты. Берёте контроллер, заливаете на него прошивку с AMS и вставляете microSD карту памяти с файлами из дистрибутива. Это всё. Система запустится и вы можете с ней работать. Если вас не устраивает функциональность, то вы просто изменяете и дописываете всё, что вам нужно.
Продавцы Ардуино-железа. Вместо того, чтобы продавать голое железо, вы можете продавать готовые конфигурации и (коробочные) решения под задачи клиентов. Выгода очевидна — снижается порог вхождения и расширяется рынок. Клиент покупает набор под свою задачу и пользуется им. Для этого ему не нужен ни паяльник, ни знание программирования: он работает с оборудованием, как с обычным сайтом. Конфигурация собирается как из кубиков Лего без паяльника.
Брендирование. Ваша компания, ваш Интернет-магазин, ваш стартап, ваша лаборатория, в случае, если вы работаете с Ардуино-железом, может снабжать свои изделия брендированным вариантом AMS с нужной вам функциональностью.
Создатели обучающих наборов. Из AMS можно сделать превосходный обучающий набор. Сам контроллер будет содержать в себе документацию, скетчи, примеры, готовые опыты и т. д. В сочетании с датчиками, подключаемыми одним кликом (без паяльника) и беспроводными датчиками это будет увлекательный набор, который надолго «дезактивирует» любого ребёнка.
Школы и обучающие центры. На базе AMS можно проводить обучение всему спектру современных технологий: микроконтроллеры, робототехника, Умный Дом, программирование, веб-технологии, сайтостроение, дизайн интерфейсов и т. д. и т. п.
Альтернативы
Я часто слышу, что легче взять «Малинку» с более продвинутыми сетевыми возможностями, но как быть с чисто микроконтроллерными функциями? У Меги 16 аналоговых пинов и 54 цифровых (не считая прочих достоинств). Как я (или вы) подключу к «Малинке» блок контроля напряжения и тока на 14 каналов? И куда мне подключать на «Малинке» десятки датчиков и исполнительных устройств? А здесь мы получаем мощный микроконтроллер и роскошное управление по сети в одном флаконе.
Есть ли недостатки?
Условным недостатком технологии, можно назвать высокий порог вхождения (не для использования, здесь как раз всё в порядке, а для самостоятельного изменения и дополнения). Нужно знать множество современных технологий и быть достаточно квалифицированным пользователем. А так же ранняя стадия самого проекта и отсутствие качественной документации.
Но если вас не пугают подобные трудности, то лучшего тренажёра для освоения всего спектра современных технологий вам не найти.
Последняя актуальная версия
Загрузить последнюю актуальную версию вы можете с официального сайта проекта Arduino Mega Server. А задать возникшие вопросы — на форуме. Для интересующихся: типичное время загрузки странички в одиночном режиме — четыре секунды, иногда чуть меньше, иногда чуть больше, но в среднем около четырёх секунд. В тандемном режиме — примерно в два раза быстрее. Простор для оптимизации огромный, но в целом уже вполне можно пользоваться.
Дополнение. Открыт канал на Youtube и вот промо ролик Arduino Mega Server, который демонстрирует работу с реальной системой.