Interplay Medium (часть II). Микро-сервер AXOD (aka Digital Axon)

в 2:15, , рубрики: diy или сделай сам, internet of things, interplay medium, linux, Lua, open source, дизайн интерфейсов, метки: , , , ,

Это продолжение серии публикация о проекте Interplay Mеdium (первая статья здесь). В этой статье я расскажу о том, как устроено «сердце» Interplay Meduim кластера — микро-сервер AXOD.

Пара слов касательно этимологии: в wiki и на сайте проекта кое-где все еще фигурирует старое название — AXON. Так я и планировал назвать микро-сервер сперва. Однако позднее, размышляя над графическим решением интерфейса, я пришел к идее о четырех базовых фигурах, которые, кроме всего прочего, просились расположиться именно так, чтобы образовать собою название (с буквой N я, после некоторых сомнений, тогда решил примириться). С одной стороны название — суть, отсыл к Маклюэну (и ранее к Хайдеггеру) с их интерпретациями роли технологий и языка (см ссылку в предыдущей статье). С другой — референция к античным представлениям о базовых элементах. Кроме этого, в процессе этимологического исследования я натолкнулся на древнеегипетские источники, содержащие интерпретации фигур, как нельзя кстати рифмующиеся с задуманным мною разделением на «органы чувств». Таким образом, получившееся воплощение, как это порой случается, оказалось сильнее изначальной интенции. В итоге, буква N приобрела новое для нее амплуа и стала буквой D, как намек на электронно-цифровую сущность все затеи :)

Архитектура микро-сервера AXOD

Архитектура микро-сервера AXOD

AXOD представляет из себя набор кастомизированных скриптов, предназначенных для контроля логики периферийных устройств (отдельных объектов или являющихся морфологической частью общего с микро-сервером объекта), именуемых «Дендриты» (Dendrites) + модульный веб интерфейс. В качестве препроцессора используется язык LUA. О последнем стоит сказать пару слов отдельно. LUA был изначально придуман, как интерпретируемый язык для описания логики в компьютерных играх, однако последнее время завоевал популярность у разработчиков встраиваемых систем, как удобное, нетребовательное к ресурсам и весьма проворное решение. В частности популярный дистрибутив для рутеоров OpenWRT вот уже несколько лет использует LUA в качестве HTTP препроцессора. Это, в свою очередь, также стало аргументом в пользу такого выбора.

Как я уже ранее написал, AXOD имеет два набора интерфейсов. Один, именуемый «Дендриты» — для периферийных устройств (т.е. по сути — это физические интерфейсы. За работой дендритов следят скрипты, являющийся частью синаптических модулей). Другой набор — это интерфейсы направленные во вне — «Синапсы». Т.е. пользовательские графические интерфейсы и API для соседних AXOD-ов (или любых внешних элементов кластера).

Директории, структура и обязательные компоненты

Каждый Синапс (или синаптический модуль) расположен в своей собственной директории

{axod micro-server home directory}/synapses/{synaptic group}/{name of synapse}

и содержит следующие обязательные компоненты

  • synapse.lua — собственный микро-движок,
  • synapse.js — необходимые для работы web интерфейса (если таковой предполагается) java script-ы,
  • synapse.css — описание стилей для тех же целей,
  • stdout — в этот файл следует сохранять все ошибки, которые вы хотели бы показать пользователю (туда же стоит перенаправить stdout ваших системных вызовов). Файл читается JS обработчиком основного движка, который, в свою очередь, показывает ошибку ползьователю (в приложенном ниже видео показана демонстрация ошибки при потере дендрита)
  • bottominterface.tmpl — темплейт нижней части интерфейса. Это то, что появления внизу, левее всплывающего меню (см иллюстрацю)
  • maininterface.tmpl — темплейт основного интерфейса

Важное замечание: поскольку микро-сервер предназначен для работы на слабых устройствах, все, что связано с парсингом и какой бы то ни было ресурсоемкой обработкой сведено к минимуму. Поэтому, в случае любых изменений (к примеру, при переключении состояния кнопок) два последних файла (bottominterface.tmpl и maininterface.tmpl) должны генерироваться непосредственно синаптическим скриптом. Основной движок «подхватывает» эти файлы при формировании HTTP ответа клиенту.

Interplay Medium (часть II). Микро сервер AXOD (aka Digital Axon)
так выглядит «основная страничка» предлагаемого по-умолчанию интерфейса микро-сервера AXOD

Interplay Medium (часть II). Микро сервер AXOD (aka Digital Axon)
это интерфейс синаптического модуля сделанного для управления игрой Тетрис :)

Interplay Medium (часть II). Микро сервер AXOD (aka Digital Axon)
а это в разы более сложный интерфейс «музыкального плейера» (показано, как осуществляется выбор внутри одной синаптической группы с помощью нижнего меню)

Как работает AXOD микро-сервер

1. Структура синаптических модулей имеет древовидную форму. Каждый синапс содержит собственный микро-движок (/synapse.lua) — это сердце синаптического модуля. Формально основной (корневой) модуль является таким же синаптическим модулем, что и все остальные. Поэтому устроен он по сходному принципу и имеет те же описанные выше компоненты со сходной файловой структурой относительно собственного микро-движка synapse.lua.

Открытый пользователем синапс сперва подгружает темплейт интерфейса (synapse.tmpl), который в свою очередь использует свой CSS (расположенный в директории css/) и запускает пользовательский JS (js/). CSS и JS основного синаптического модуля, расположенного в корне микро-сервера имеют стандартные общие для всех синаптических модулей стили и скрипты.

2. Отличие корневого синапса от всех вложенных — отсутствие нижнего интерфейса и соседних синапсов. Однако, если морфология вашего приложения подразумевает такое решение — вы можете легко дополнить «главную страницу» необходимым модулем по-аналогии.

Нажатие на один из символов на первой странице откроет интерфейс принадлежащий выбранной вами синаптической групе (/synapses/{synaptic group} subdirectory). По умолчанию открывается первый по списку синапс (согласно тому, что первым возвращает команда ls (/synapse.lua строка 26), вы можете задать собственные условия))

3. Как я уже написал выше, каждый синапс содержит собственные .tmpl файлы (верхний и нижний) и сходную файловую структуру. Микро-движок формирует пользовательский XML простым включением этих фалов. Поскольку интерфейс многопользовательский, микро-движок должен формировать новый .tmpl каждый раз, когда происходят какие-либо изменения.

4. Каждый синапс имеет четыре обязательных опции

  • startsynapse — для старта синапса (его можно запускать сразу при открытии интерфейса или при принудительном старте. при этом запускаются требующийся для работы синапса демоны и совершаются все необходимые системные действия)
  • stopsynapse — для прекращения работы синапса (должен «убивать» все запущенные ранее «свои» демоны)
  • maininterface — используется для генерации собственного maininterface.tmpl
  • bottominterface — используется для генерации собственного bottominterface.tmpl

Внимание! вы можете запускать /synapse.lua в командной строке (с соответствующими опциями) и таким образом отлаживать ваш микро-движок непосредственно в терминале. Поскольку существует известное затруднение с обработкой ошибок при формировании XML c использованием LUA, «консольное» решение чрезвычайно удобно для отладки синаптического модуля.

Кроме этого, ваш синаптический модуль может иметь любые другие опции, какие требует морфология вашего проекта.

5. Когда вы активируете какую-либо функцию вашего пользовательского интерфейса (или внешний объект или приложение выполняет HTTP запрос), synapse.lua выполняется с соответствующими параметрами.

6. Пользовательское управление может быть осуществлено как посредством AJAX запросов, так и прямым вызовом соответствующим образом сформированных ссылок, содержащих необходимые параметры (настоящей версии поддерживается пока только метод GET).

7. Кроме этого, JavaScript запущенный на стороне клиента периодически опрашивает микро-сервер на предмет изменений интерфейса. Если таковые произошли, то меняет соответствующие элементы. Пользователь может использовать синаптический интерфейс даже в том случае, если его браузер не поддерживает JS, однако, в этом случае, он не сможет видеть «отклик» или изменения сделанные другими пользователями.

8. Все интерфейсы должны работать без использования JavaScript, чтобы сохранить максимальную универсальность. Это часть Кодекса проекта Interplay Medium, принципов которого я собираюсь придерживаться в дальнейшем.

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

Демонстрация работы первого прототипа системы.

Благодарность

В настоящей версии использован фреймворк написанный Ником Гэмоном (Nick Gammon) для реализации HTTP препроцессинга на языке LUA, за что ему отдельное спасибо :)

Ссылки

Автор: aureliano_b

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js