Поделиться в Facebook Поделиться ВКонтакте Поделиться в LinkedIn Опубликовать в Twitter

Устойчивая служба публикации/подписки QNX (Persistent Publish/Subscribe – PPS)

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

Jaron Lanier, цитата из статьи Jack Ganssle

«Решения для проведения сети, как правило, разрабатываются и осуществляются на основе первоначальных требований соединения и, поэтому, сети очень уязвимы при вводе новых требований. Как правило, соединение прокладывается по прямой, от точки к точке, между взаимодействующими приложениями/компонентами...»

Jerry Krasner, из статьи на Embedded.com

Уязвимость. Лишь немногие люди связывают это слово с программным обеспечением. Но для реализации связей между программными компонентами разработчикам С и С++ часто приходится задавать точное, и поэтому уязвимое, описание внешней функции. В результате – изменение одного компонента может потребовать внесения изменений и в другие компоненты. Например, если разработчику необходимо изменить статусную информацию, полученную от драйвера устройства, необходимо также произвести соответствующие изменения в интерфейсе «человек-машина» (HMI).

Эта тесная взаимосвязь усложняет многое для встраиваемых решений, особенно для тех, которые сочетают низкоуровневое управление с высоким уровнем пользовательских приложений. Возьмем, например, систему реального времени для управления двигателем, использующую HMI на основе Adobe Flash. Разработчики Flash, возможно, мало что понимают в проектировании систем реального времени или вообще ничего об этом не знают, не говоря уже об установлении связи с такими системами. А разработчики систем реального времени могут иметь нулевой опыт работы с Flash. Две команды разработчиков живут в разных мирах – как преодолеть разрыв?

Для решения этих задач, QNX Software Systems выпустила для встраиваемых систем устойчивую службу публикации/подписки (Persistent Publish/Subscribe — PPS). Небольшая и расширяемая служба PPS позволяет разработчикам создавать не жестко соединенные системы, основанные на асинхронных публикациях и уведомлениях. Также PPS обеспечивает сохранение данных после перезагрузки.

Создание раздельных проектов

PPS предоставляет объектно-ориентированную систему, состоящую из издателей и подписчиков: издатели изменяют свойства данных объектов; и подписчики этих объектов получают обновления при изменении данных объектов.

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

На самом деле, издатель и подписчик не должны «знать» друг друга; они оба устанавливают связь только с объектом, который имеет смысл и значение для них обоих.

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

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

Масштабируемая, устойчивая, независящая от языка

PPS предлагает много преимуществ, включающих:

Слабое связывание масштабируемых проектов – используя PPS вы можете просто подключать (или отключать) различных издателей или потребителей исходных данных, без необходимости создания точно настроенного и высокосинхронизированного API (программного интерфейса) между компонентами.

Большая гибкость по сравнению с обычными IPC – PPS выходит за пределы обычной взаимосвязи «один-к-одному» между программными компонентами. Также поддерживается взаимосвязь «один-ко-многим» (один издатель, несколько подписчиков) и «многие-к-одному» (много издателей, один подписчик).

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

Независимость от языка – т. к. PPS использует сервисы файловой системы стандарта POSIX, он может работать с любым языком программирования или окружением приложения, включая С, С++, Java, Adobe Flash, ksh и др. Компоненты, написанные на совершенно разных языках могут взаимодействовать друг с другом без необходимости каких-либо специальных знаний друг о друге.

Пример: интеллектуальная энергетическая панель

Чтобы оценить преимущества, предоставляемые PPS в QNX, рассмотрим интеллектуальную энергетическую панель, которая позволяет домовладельцам контролировать и управлять системами отопления, кондиционирования, охранной сигнализации и другими подсистемами. Такая система включает в себя температурные датчики, двухпозиционное реле и HMI (человеко-машинный интерфейс, ЧМИ), отображающее состояние различных подсистем.

В обычных системах датчики и HMI тесно взаимосвязаны. HMI обычно точно знает с каким оборудование оно общается, из-за чего производить изменения или подключение новых устройств становится очень сложно. С PPS датчики и другие устройства не подключены к HMI напрямую; скорее они становятся издателями данных объектов. В результате, упрощается замена используемого оборудования, или добавление новых температурных меток, или новых методов контроля. Что не менее важно, несколько панелей по всему дому могут подключаться к таким же объектам, без необходимости беспокойства о последствиях множественных вызовов для низкоуровневых датчиков API.

Интеллектуальная панель использующая PPS

Интеллектуальная панель использующая PPS

Для получения технической документации по использованию PPS в интеллектуальных энергетических системах управления зданием необходимо пройти по ссылке (требуется регистрация).

Пример: приборная панель в автомобиле

В качестве другого примера рассмотрим приборную панель в автомобиле, содержащую спидометр, тахометр, датчики температуры и другие приборы. Стек CAN получает данные от спидометра и количество оборотов (в минуту) по шине CAN и, после получения новых данных, формируется обратная связь с HMI прибора. При обычной реализации, любые изменения в используемом стеке или протоколе напрямую отображаются в API, принудительно изменяя HMI.

В модели PPS стек CAN «публикует» два источника данных – RPM (количество оборотов) и скорость. После этого, HMI «подписывается» на эти исходные данные. Такой подход со слабыми связями позволяет разработчикам перемещать или изменять базовый стек или протокол, без необходимости внесения изменений в HMI. Также упрощается разработка прототипа и параллельная разработка, так как разработчики могут легко смоделировать данные RPM или скорости, если оборудование все еще разрабатывается.

Постоянное хранение
PPS гарантирует ключевую функцию для систем, работающих в тяжелых, непредсказуемых условиях – постоянное хранение данных. Например, в интеллектуальной энергетической системе, пользователь запросил определенный диапазон температуры, если такие данные были реализованы, как опубликованные данные объекта, то они будут сохранятся после перезагрузки системы или отключения питания. В этом случае, система резервного копирования данных сохранит те значения температуры, которые были до перезагрузки или выключения. При включении, PPS восстанавливает данные объекта либо сразу, либо при первом же обращении – разработчик может выбрать любой вариант.

Разработано для людей
При проектировании сервиса PPS необходимо решить на раннем этапе будут ли использоваться бинарные или удобочитаемые для человека объекты. Бинарный вариант реализован в виде мелких объектов. Удобочитаемый человеком вариант упрощает разработку и отладку. QNX пошёл вторым путём.

Удобочитаемые для человека объекты позволяют разработчикам производить отладку из командной строки, используя простые утилиты файловой системы, такие как cat для подписчика и echo для издателя. Кроме того, они позволяют создать простую программу, которая подписывается на объект и выводит отладочную информацию, включая объекты и атрибуты PPS.

Например, для отображения всех объектов PPS в системе, вы можете просто набрать:

 ls -lR /fs/pps/

Для создания, запроса или изменения объектов PPS, разработчики могут использовать API-вызовы стандарта POSIX: open(), read(), write() и т. д. Например, при публикации объекта PPS, издатель просто вызывает функцию open() для файла объекта. После этого издатель может вызвать функцию write() для изменения любых атрибутов объекта PPS. Точно так же, для подписки на объект, клиент может просто вызвать функцию open(). Запросить объект для чтения можно функцией read(). В ответ PPS возвращает имя объекта, а затем его текущие атрибуты.

Например, мультимедийная система автомобиля публикует метаданные текущей проигрываемой композиции в объекте “PlayCurrent”, подписчик, запрашивающий PlayCurrent с помощью функции read(), может увидеть что-то примерно такое:

@PlayCurrent
author::Beatles
album::Abbey Road
title::Come Together
duration::3.45
time::1.24

Предостережение: в этом разделе приведены общие сведения. Для получения полной информации необходимо ознакомиться с документацией на PPS.

Различные варианты разработки
PPS позволяет не торопиться с выбором. Например:

Несколько издателей одного объекта – несколько издателей могут опубликовать один и тот же объект PPS, и каждый издатель может «присвоить» различные атрибуты объекта. В мультимедийных системах, например, один компонент может быть исходником атрибута “time::value”, в то время как HMI может быть исходником атрибута “duration::value”.

Несколько подписчиков – клиенты PPS могут подписаться на несколько объектов, и объекты PPS могут иметь несколько подписчиков. Когда издатель вносит изменения в объект, все подписанные на него клиенты информируются об изменениях.

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

Двухтактная система – по умолчанию, QNX PPS выполняет функцию «выталкивания» системы издателей. Но также она позволяет подписчикам «вытягивать» данные от издателей, таким образом, публикация происходит по запросу.

Надежное хранение
Постоянное сохранение данных требует надежную файловую систему. Поэтому, в дополнение к PPS, QNX Software Systems предоставляет на выбор несколько файловых систем высокой надежности, включая дисковую файловую систему Power-Safe, встроенную файловую систему транзакций для NAND-флеш и отказоустойчивую файловую систему для NOR-флеш. Также PPS может работать с файловыми системами, созданными пользователями.

Таким образом вы имеете: намного менее уязвимый способ совместного подключения программных компонентов.

Ссылки:

Persistent Publish/Subscribe for Embedded Industrial Applications

QNX Persistent Publish/Subscribe. Developer’s Guide

Файловые системы

Технология PPS

Метки: QNX6 | Статья

Задать вопрос on-line Обсудить на форуме Написать электронное письмо