Всем привет! Праздничная атмосфера уже стучится в экраны мониторов и прилетает спамом на ваши электронные адреса. Вот и мы решили выполнить своё обещание и вывести в свет наш стек.


Перейдем к главному: что же мы такого сделали. Сразу оговоримся: сравнивать стек MOAR и IPv6 мы не будем, поскольку говорить сейчас об IPv6 — это почти то же самое, что говорить о подростковом сексе: все о нём говорят, мало кто о нём хоть что-то знает и лишь единицы его действительно пробовали.

Пара слов о нашей тестовой ноде


Нодой мы будем называть одно устройство с одним экземпляром стека. Нода создавалась для тестирования работы стека в привязке к внешним датчикам.

Нам нужно было максимально транспортабельное решение, и изначально всё было уложено в простую картонную коробку. Но её надолго не хватило, а постоянно раскрывать коробку для получения информации нам надоедало, а с учетом того, что все элементы крепились на проводах, сложность использования в какой то момент пересилила лень, и было предложено сделать корпус. Доступ к 3D-принтеру быстро поставил точку в вопросе как его изготовить. Тестовое устройство получилось достаточно удачным и проделало путь с нами из Калининграда в Хельсинки и обратно почтой России.

Примеры


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

Разобравшись с периферийными вопросами, перейдём к рассмотрению структуры стека

Логическая структура MOAR стека содержит несколько уровней:

Интерфейсный уровень — обеспечивает прямое соединение с ближайшими нодами по некоторому физическому или логическому каналу. Интерфейсных уровней может быть несколько, по одному на каждый физический или логический интерфейс обмена данными. Уровень либо работает с драйвером интерфейса, либо сам выполняет его роль.

Канальный уровень — выбирает наиболее подходящий способ связи (интерфейс) с каждой из ближайших нод и выполняет сопутствующие задачи.

Уровень маршрутизации (“роутинга”) — предоставляет алгоритмы для поиска наиболее оптимальных маршрутов передачи данных.

Уровень представления — обеспечивает криптографию и разбиение данных, а также обратные преобразования.

Сервисный уровень — предоставляет API для использования MOAR стека из других приложений.

На данный момент каждый уровень исполняется в отдельном потоке основного процесса, но в целях безопасности возможно разделение уровней в зависимости от привилегий, необходимых для их работы.

Что ж, перейдем к описанию процесса установки и настройки. Для начала скачаем репозиторий, сделать это можно по ссылке, либо, используя git, перейти в нужную папку и выполнить команду:

git clone https://git@github.com:moarstack/moarstack.git 

Большая часть директорий в репозитории MOAR стек имеют специальное назначение:

./ — файлы представленные в корневой директории (такие как CMakeLists.txt) предназначены для сборки всего проекта и всех других проектов во внутренних директориях (иногда размещенных в одной поддиректории, как это сделано для уровней).
layers/ — директории с заголовками (*.h) и исходниками (*.c) для каждого уровня, включая общие файлы с исходными кодами и заголовочные файлы для всех уровней. Также в эту директорию можно добавлять и другие уровни для компиляции вместе со стеком
interface/, channel/, routing/, presentation/, service/ — каталоги с файлами с исходными кодами и заголовочными файлами, имеющими отношение только к конкретному уровню.
shared/ — файлы с определениями, общими для всех уровней.
libmoar/ — файлы с исходными кодами и заголовочные файлы, которые могут быть использованы в других проектах для связи с MOAR стек и использования его для передачи данных. Таким образом, эти файлы реализуют функционал API для MOAR стек
moard/ — файлы с исходными кодами и заголовочные файлы, объединяющие все уровни в linux-демона
tools/ — файлы с исходными кодами и заголовочные файлы дополнительных служебных программ, использующих MOAR стек, или обеспечивающих работу MOAR стека. Так например, служебная программа moсkit представляет из себя виртуальную среду передачи данных, позволяющая отлаживать работу нескольких экземпляров стека с учётом затухания радиосигнала в среде (в простейшем виде).

Со структурой папок более-менее понятно, давайте приступим к компиляции и сборке проекта:

Перейдем в корневую папку:

сd moarstack_linux

и последовательно выполняем следующие команды:

cmake .
make

После удачной сборки в корне должны появятся директории config, lib и bin. В текущей реализации установка в систему не предусмотрена, тем не менее, moard может быть запущен как демон, и, конечно же, вы можете использовать screen или LSB скрипты для автозапуска.

Рассмотрим конфигурационные файлы:

По пути config/moarstack/ размещается основной файл конфигурации moar.conf

moardSettings.LogPath = /var/log/moard.log — расположение лог-файла
moardSettings.LayersEnabledDir = layers_enabled — директория относительно moar.conf где расположена конфигурация остальных уровней
nodeaddress.address = 0123456789abcdef — адрес ноды в hex, 8 байт (должны быть разными у нод, в текущей реализации стека статическая адресация. В сильном упрощении этот адрес можно представить как аналог IP адреса в TCP/IP стеке)
ifaceSocket.FileName = /tmp/moarIfaceChannel.sock — сокет для взаимодействия интерфейсных уровней с канальным уровнем
serviceSocket.FileName = /tmp/moarServiceApi.sock — сокет для взаимодействия сервисного уровня с приложениями, через него работает API

Теперь рассмотрим конфиги уровней, кстати они лежат по адресу:

config/<moardSettings.LayersEnabledDir>/*.conf — конфиги уровней

общие поля для файлов конфигурации уровней:

libraryLocation.FileName = — имя файла скомпилированной динамической библиотеки. Может быть как относительный или полный путь, так и только имя файла. В последнем случае поиск библиотеки в файловой системе возложен на ld.so.
При сборке и отладке стека в Clion, следует обратить внимание на расположение скомпилированных файлов, в зависимости от версии IDE оно может различаться, возможно в настройках цели сборки надо будет задать переменную окружения LD_LIBRARY_PATH c соответствующими путями

Наконец-то мы подошли к первому запуску стека. Аргументов для запуска moard пока немного (как раз по этой причине пустует --help xD):
--help -h — в будущем тут будет страница с описанием аргументов
--config=<filename.conf> -c <file.conf> — имя файла конфигурации, помимо очевидного, позволяет запускать несколько копий стека с разными параметрами

Последовательность запуска MOAR стека:

0. Читаем аргументы moard, если по пути в -c отсутствует файл выпадаем с ошибкой.
1. Если аргумент -c не использован, ищем файл конфигурации по умолчанию в ../config/moarstack/moar.conf (если не находим, выпадаем с ошибкой)
2. Если файл конфигурации найден, грузим его, идем в <moardSettings.LayersEnabledDir>/ и читаем там все имеющиеся там *.conf файлы.
3. Загружаем модули по указанным в *.conf путям.
4. Если уже был загружена библиотека с уровнем данного типа, то последующие попытки загрузить уровень того-же типа игнорируются. (За исключением интерфейсных)
5. Все! Можно взаимодействовать с API стека через сокет указанный в serviceSocket.FileName

Почему вы выбрали Linux и почему не включили в релиз стек для MCU?


Стек MOAR — программное решение, которое может быть установлено на любое устройство под управлением Linux. Мы не ограничиваем пользователей стека MOAR лишь нашим вариантом решения и хотим, чтобы вы относились к нему как к инструменту для собственных проектов, а не как к платформе с жёстко заданной архитектурой. Публикация технической документации — только первый шаг. Да простят нас поклонники Arduino, но мы считаем, что делать свои решения без ограничений на существующие комплекты для разработки интересней и не на много сложнее. И если кто-то решит попробовать собрать очередную метеостанцию с помощью паяльника и стека MOAR, то мы будем только рады.

С open source публикацией версии стека для MCU ситуация сложнее. К сожалению, мы живем в мире, где за еду нужно платить, а нам самим порой хочется кушать. Стек под MCU имеет более специализированную структуру и предназначение, не полностью совместимые с open source идеями, поэтому именно решения для MCU мы предполагаем делать коммерческими. В итоге, опубликованный в open source код будет отставать от коммерческих версий примерно на год.

Обратная связь.


С сегодняшнего дня стек MOAR некоторое время будет находиться в стадии alpha, и мы не рекомендуем использовать его в рабочих проектах во избежание проблем с их работоспособностью. Тем, кто решит попробовать наш стек, мы предлагаем воспользоваться репозиториями с исходными кодами и документацией. Там же можно найти рекомендации по его использованию. Мы сочли создание отдельного сайта или форума нецелесообразным в настоящий момент: доступных каналов связи будет достаточно для оперативного внесения правок и сбора обратной связи.

За сим позвольте откланяться: мы поздравляем Вас с Новым Годом и со своей стороны обещаем радовать Вас новыми релизами в следующем году.
Поделиться с друзьями
-->

Комментарии (10)


  1. Dynamika
    24.12.2016 09:13
    +2

    Я не так много понял из вашей статьи — возможно для таких как я было бы не плохо нарисовать картинки для более точного понимания, к примеру как на ruhighload.com И статья сталабы более информативнее.


    1. Apuzakov
      24.12.2016 14:09
      -1

      Это статья продолжение. Мы разрабатываем стек протоколов для IoT сетей, о том что нас к этому побудило можно узнать перейдя по ссылке в начале статьи. В данной статье описано решение для linux, компиляция, настройка и запуск сервиса.


  1. den1s1
    25.12.2016 00:01

    А что является физическим транспортом для текущей версии? Ethernet или wi-fi? Или я могу радиочип прикрутить к малине? К сожалению ни из этой ни из прошлой статей так этого и не понял.


    1. den1s1
      25.12.2016 00:07

      Виноват, если в прошлой статье сходить по ссылке из последнего спойлера, ответ на мой вопрос становится понятен. Видимо, это Lora


      1. Apuzakov
        25.12.2016 01:40

        Есть альфа-версия мок-интерфейса, она уже выложена в репозиторий вместе со стеком. Работает через виртуальную среду передачи данных, MockIT, которая также присутствует в репозитории. Версия интерфейсного уровня для Lora дописывается и скоро будет добавлена в репозиторий. После этого запланировано добавление поддержки WiFi и BLE.


        1. den1s1
          25.12.2016 12:32

          Теперь снова ничего не понимаю. Что за виртуальна среда такая? Внутри малины чтоли?
          Вот если я соберу 2 ноты на RPi по вашей инструкции, я их связать смогу между собой, используя текущий релиз стека? Если смогу, то по какой физике?


          1. Apuzakov
            25.12.2016 13:14

            MockIT создан для целей отладки и демонстрации, поэтому его возможности ограничены обеспечением передачи данных между экземплярами стека на одной машине (детали Вы можете узнать из файла tools/mockit/readme.md). Поэтому в настоящий момент связать между собой две ноды на основе решений в репозитории невозможно. Однако, как было сказано, скоро в репозиторий будет добавлен интерфейсный уровень для работы через LoRa, и с этого момента связь двух нод станет возможна без необходимости дописывать что-то своё.


  1. neoxack
    25.12.2016 01:40

    Описание протокола где-нибудь можно найти? Или только исходники изучать?


    1. Apuzakov
      25.12.2016 02:09

      Если Вас интересует API стека MOAR, то лучше всего обратить внимание на файл moarApi.h (libmoar/inc/moarApi.h), в котором дано описание функций API на английском языке. Для обращения к ним в своём проекте следует использовать в нём этот заголовочный файл и подключить динамическую библиотеку libmoar.so, которая будет находиться в директории lib после сборки проекта.
      Русскоязычная описание API появится в ближайшее время.


  1. gxcreator
    26.12.2016 02:53
    +6

    говорить сейчас об IPv6 — это почти то же самое, что говорить о подростковом сексе: все о нём говорят, мало кто о нём хоть что-то знает и лишь единицы его действительно пробовали.

    То ли дело MOAR!