Пройдет года два, и при упоминании «ещё один умный выключатель» автора забросают яйцами. Но речь пойдёт не об этом, разговор будет об инструменте разработки. Я не первый и не последний, кто решился автоматизировать разработку пользовательских приложений для дистанционной работы с электронными устройствами.
Мне всегда было интересно, какие решения предлагают другие разработчики в этой области. Чаще всего, что попадалось, это были довольно серьёзные инструменты с развесистой документацией. Впрочем, сложно ожидать что-то другое от полноценного рабочего инструмента.
В этом плане, мой сервис стоит в стороне. И хотя он не предоставляет комплексного решения, но для некоторых задач, в силу своей легковесности, мог бы быть вполне пригоден. Простота проектирования визуальных интерфейсов и рабочей программы могла бы ускорить создание прототипов устройств. С помощью редактора мнемосхем, можно довольно быстро разместить элементы управления, а затем скачав рабочую программу, модифицировать её под свои нужды. Наловчившись, всю работу можно проделать буквально за пять минут.
Быстрое создание пользовательских интерфейсов, в наше время, не является исключительной особенностью, скорей это необходимый минимум по современным меркам. Другое дело окружение, то есть насколько весомым будет всё остальное, помимо самих интерфейсов. Типичный пример это SCADA, да здесь графика будет всегда на высоте, но захочет ли разработчик, для того чтобы опробовать свою железку в бою прикручивать её к OPC-серверу? Без заблаговременной заготовки драйвера, разработчик наверняка откажется от применения SCADA.
Где же ещё найти инструмент для создания интерфейсов? Можно встроить в устройство Web сервер, для этого есть много готовых визуальных элементов, бери не хочу. Не хочу? В устройстве нет памяти для размещения HTML страниц? То есть опять напрашивается некий промежуточный сервер (OPC-сервер).
Поэтому появилось новое направление облачных серверов, вы отправляете туда свои данные, а они визуализируют ваши данные посредством HTML страниц. Это направление достаточно свежее, и в то же время эти решения уже находят своих потребителей.
Для серьёзной автоматизации это как правило будет не приемлемо, но в бытовых мелочах, в качестве дешёвых решений, очень даже вполне.
То, что я встречал среди облачных решений, было направленно на хранение пользовательских данных. Это наверное самая актуальная задача, для которой у меня пока нет собственной реализации. Зато, в своём сервисе я неплохо проработал вопрос управления в реальном времени, разработал компактные протоколы для обмена данными, реализовал авторизацию и поточное шифрование. Всё таки управление требует повышенной безопасности, в отличие от мониторинга.
Теперь о самой реализации и некоторой технике, которые я применил при создании сервиса.
Сервис состоит из непосредственно сайта, где пользователь может создать свою учётную запись. Войдя в свой аккаунт, пользователь увидит список собственных панелей управления. Каждая панель управления может управлять одним или несколькими устройствами одновременно.
Также у пользователя есть список панелей, которые ему доверили друзья. И есть третий список панелей, которые выложены в общий доступ для всех. Доверить свою панель другу или разместить её в общий доступ могут все пользователи сервиса.
Для проектирования своих панелей нужно зайти в редактор (для редактора нужен установленный плагин Silverlight).
Уж извините, когда-нибудь в будущем, переведу этот редактор на технологию HTML5 и javascript (в силу javascript я уже поверил и даже успел полюбить).
Перед созданием панели управления для своей железки, нужно создать «Место подключения». Каждое «место подключения» уникально и используется как связующее звено между панелями управления и электронным устройством.
На первый взгляд эта сущность излишняя, ведь достаточно было присвоить каждому параметру глобальный уникальный идентификатор.
Но я поступил иначе, привязка параметров производится по именам, что делает этот процесс более наглядным (имя может состоять из нескольких слов). Естественно, уникальность имён должна соблюдаться в пределах одного «места подключения».
Упомянутые выше параметры это ещё одна сущность, которая имеет название «сигнал» (слово «сигнал» менее перегружено по смыслу). Каждый сигнал имеет свой тип, разрешённые операции и уровень доступа. Уровень доступа используется только в случае, когда панель управления выкладывается в общий доступ, и нужна защита на определённое действие, например чтобы никто кроме хозяина не смог записать определённый параметр.
Одно «место подключения» может связать до 255 сигналов (для одного физического устройства этого количества должно хватить). Для меня было важным, чтобы транспортный протокол был компактным. Например, передача одного 4-х байтового параметра и 8-ми байтовой временной метки, а также его имени упакуется в 8 байт (4 + 8 + name = 8). Такой арифметике GSM модем только спасибо скажет.
Вообще, с этими терминами прям беда, все так и норовят напридумывать сущности без надобности.
- Панель управления — графический интерфейс удалённого взаимодействия с оборудованием;
- Место подключения — логическая единица, связывающая оборудование и панель управления;
- Сигнал — определённый параметр оборудования;
- Редактор — инструмент проектирования мест и панелей (требуется установка плагина Silverlight от Microsoft);
- Симулятор — графический интерфейс имитирующий соответствующее оборудование.
Пожалуй, создание сигналов это самое неприятное место, но не спешите метать камни, в этом есть свой резон. На основании этой информации для разработчика будет автоматически создан исходный код рабочей программы (для платформ Arduino, Windows и FreeBSD). Этот код уже изначально будет работоспособен и его можно загрузить в Arduino. Для разработчика останется только заполнить обработчики сигналов полезным кодом (например включить светодиод или отправить новое состояние кнопки).
Получив готовые исходники и лаконичное API в виде сишных функций, разработчику не нужно разбираться в протоколах обмена. Да и в целом, при таком подходе вероятность ошибок многократно снижается.
Всё, физическое устройство готово и подключено к интернету. Теперь осталось создать панель управления.
Размещаем на панели элементы управления, привязываем их к нужным сигналам.
Теперь выйдем из редактора и во вкладке «Мои панели» откроем созданную панель управления, тут же произойдёт автоматическое подключение к оборудованию.
В качестве демонстрации я выложил в общий доступ свою Arduino, можете поморгать светодиодами и попринимать фотки с двух JPEG камер (покуда домочадцы не смахнули со стола).
Что ещё хотелось бы реализовать:
1) Возможность встраивания пользовательских SVG элементов управления.
2) Механизм перехода с облачного сервиса в автономный режим (когда нет интернета).
3) Регистрация данных (непростая задача).
В любой реализации найдутся свои подводные камни. Был у меня проект, где я разработал распределённую систему на базе CANOpen, так там в каждый исполнительный узел я закладывал отдельную логику отработки аварийных ситуаций. В системе было около двадцати узлов. Вот это была надёжность, 100% отработка всех нештатных ситуаций, при этом реакция всей системы укладывалась в 5мс.
Автор: valeraba