Linux EIB Home Server

Документация




Авторы:

Vladimir Vinarski (volodimir@users.sourceforge.net)

Jens Neumann (jneumann@users.sourceforge.net)













  1. Состояние ревизии

    Состояние

    Дата

    Ответственный

    Тема обработки

    0.1

    13.03.02

    V.Vinarskyi

    J. Neumann

    Создание

    0.2

    16.06.03

    J.Neumann

    Документация для SourceForge

    0.3

    01.04.04

    V.Vinarski

    J.Neumann

    Дополнения и корректировки

  2. Открытые пункты

  1. Содержание

  1. Состояние ревизии
  2. Открытые пункты
  3. Содержание
  4. Список иллюстраций
  5. Введение
    1. Архитектура
      1. Интерфейсы к клиентам
      2. Интерфейс homeserver <-> homedriver
    2. Динамическое описание
      1. Интерфейс между Linux EIB Home Server-ом и EIB-бусом
    3. Используемые файлы в модулях homedriver и homeserver
    4. Описание модулей : homedriver
      1. Краткое описание
      2. Klassen und deren Assoziationen
      3. Классы, атрибуты и методы
      4. Функции
    5. Описание модулей: homeserver
      1. Краткое описание
      2. Классы и их ассоциации
      3. Классы, атрибуты и методы
  6. Список литературы


  1. Список иллюстраций

  1. Коллаборационная диаграмма EIB Home Server-а. График показывает информационные потоки между EIB - инсталляцией и возможными приложениями.
  2. Классы homedriver-а и их ассоциации.
  3. Драйвер-классы
  4. Классы соединений
  5. Иерархиянаследованияклассовсостояний.
  6. Сокет-классы.
  7. Иерархия наследования классов сообщений
  8. Exceptions des homedrivers
  9. Классовые диаграммы homeserver.
  10. Класс HomeServer
  11. Класс DatenBank
  12. Класс Driver
  13. Класс DriverMessages
  14. Класс Client
  15. Класс ClientMessages
  16. Класс Interest
  17. Класс PathData
  18. Класс Instruction
  1. Введение

Linux EIB Home Server содержит интерфейсы для управления и слежения за EIB-инсталляцией.

Европейский инсталляционный бус (EIB) служит для автоматического управления функциями для домашнего хозяйства и специальных служб. EIB четко разделяет передачу электрической энергии и информации. Наряду с электросетью соединяются друг с другом всевозможные EIB-сенсоры и акторы, через которые и происходит общий обмен информацией.

Координация функционирования всевозможных элементов EIB-сети программируется и может быть сколь угодно часто изменена. Для эксплуатации нет необходимости в каком либо центральном элементе. Администрирование и сохранение всех данных сети происходит децентрализовано в отдельных EIB- приборах. Однако по необходимости возможен доступ к этим данным в любой точке сети, что дает возможность интегрировать EIB- электроинсталляцию в форме управляющей и контролирующей системы (например, Embassi [1]), не прибегая при этом к дополнительным инсталляционным затратам.


    1. Архитектура

состоит в основном из двух компонентов (см. Рис.1):


Рис. 1: Коллаборационная диаграмма EIB-а. График показывает информационные потоки между EIB- инсталляцией и возможными приложениями.


Потоки сообщений::

EIB- бус -> FT 1.2 интерфейс -> homedriver -> homeserver -> клиенты

Клиент -> homeserver -> homedriver -> -> FT 1.2 интерфейс -> EIB-бус

Для клиентов будем различать нормальные приложения и HTTPклиенты.

Обе компоненты homedriver и homeserver используют различные дополнительные библиотеки:

      1. Интерфейсы к клиентам

        1. EIB-HomeServer <-> TCP/IP-приложение ( Port 8081 )

Клиент это произвольный процесс, который поддерживает tcp/ip- соединения к homeserver-у и посылает к нему команды, описанные далее в этой главе.

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


Пример READ:

Цель: определить значение параметра прибора с групповым адресом 2/0/2.

Формат:

<eib type="read" path="/eib/groups/2/0/2/curvalue"/>

Ответ-а:

<eib state="true" path="database.value/eib/groups/2/0/2/curvalue" data="0"/>

(если значение соответствующего параметра прибора с данным групповым адресом равно нулю)

Ответ в случае ошибки:

<eib state="false" path="database.value/eib/groups/2/0/2" error="$error0007"/>

Ответ на ошибочную команду:

<eib state="false" error="instruction isn't correct"/>


Пример WRITE:

Цель: присвоить значению параметра прибора с групповым адресом 2/0/2 значение 11, и таким образом переключить прибор на соответствующее значение.

Формат:

<eib type="write" path="/eib/groups/2/0/2/curvalue" data="11">

Ответ HomeServer-а:

<eib state="true" path="database.value/eib/groups/2/0/2/curvalue" data="11"/>

Ответ на ошибочную команду: смотри READ.

Пример SUBSCRIBE:

Цель: Клиент желает получать информацию об изменениях значений параметра прибора с групповым адресом 2/1/0.

Формат:

<eib type="subscribe" path="/eib/groups/2/1/0"/>

Ответ Home-Server-а:

<eib state="true" type="subscribe" path="/eib/groups/2/1/0"/>

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

Ответ в случае ошибки: смотри READ.


Эта команда поддерживает применение шаблонов, т.е. с помощью команды:

<eib type="subscribe" path="*"/>

заказываются все сообщения EIB- буса (контролируются все групповые адреса).

Ответ Server-а:

<eib state="true" type="subscribe" path="*"/>

Пример UNSUBSCRIBE:

Цель: отмена SUBSCRIBE-команды.

Формат:

<eib type="unsubscribe" path="/eib/groups/2/1/0"/>

Ответ HomeServer-а:

<eib state="true" type="unsubscribe" path="/eib/groups/2/1/0"/>


Так же и для этой команды применяются шаблоны, т.е. по команде:

<eib type="unsubscribe" path="*"/>

#1079;аказываются все сообщения EIB- буса.

Ответ HomeServer-а:

<eib state="true" type="unsubscribe" path="*"/>

Замечания:

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

Read-команда действует одновременно и как SUBSCRIBE-команда !!!

        1. EIB-Home-Server <-> HTTP-приложение (Port 8080)

Формат команды (если Home-Server запущен на компьютере с IP- адресом 192.168.169.33):

http://192.168.169.33:8080/eibhomeserver?instruction=<eib type="read" path="/eib/groups/2/0/2/curvalue"/>

После instruction= должны следовать в полном объеме описанные выше READ- или WRITE--команды (смотри предыдущую главу). HTTP--клиент не может использовать SUBSCRIBE- или UNSUBSCRIBE--команды!

Ответ HomeServer-а:

HTTP/1.0 200 OK
Server: Loewe HomeServer 1.0
MIME-version: 1.0
Content-type: text/html

<html><script>var answer='<eib state="true" path="database.value/eib/groups/2/0/2/curvalue" data="11"/>’;</script></html>

Пример Write-команды:

http://192.168.169.33:8080/eibhomeserver?instruction=<eib type="write" path="/eib/groups/2/0/2/curvalue" data="11"/>

Ответ HomeServer-а:

HTTP/1.0 200 OK
Server: Loewe HomeServer 1.0
MIME-version: 1.0
Content-type: text/html

<html><script>var answer='<eib state="true" path="database.value/eib/groups/2/0/2/curvalue" data="11"/>';</script></html>

Ответ при ошибке:

HTTP/1.0 200 OK
Server: Loewe HomeServer 1.0
MIME-version: 1.0
Content-type: text/html

<html><script>var answer='<eib state="false" error="instruction isn't correct"/>';</script></html>


Замечания:

Соединение с HTTP- приложением прерывается после ответа от HomeServer-а.

      1. Интерфейс „homeserver <-> homedriver“

Между homedriver-ом и homeserver-ом передаются датаграммы в следующем формате (см. также EIBA инструкцию [3]):

Датаграмма состоит из 12-ти или более байтов:

Байт 0(type): определяет тип датаграммы

0: EIB--сообщение

1: Внутреннее сообщение между homedriver-ом и homeserver-ом.

Байт 1 (total length): общая длина сообщения от 2-го байта до Checksum-Byte включительно.

Байт 2 (control field): по умолчанию 0x9c.

Байты 3, 4 (source address): определяет адрес источника датаграммы.

Байты 5, 6 (group address): определяет адрес получателя датаграммы.

Байт 7 (routing counter / length): Этот байт является комбинированным полем, состоящим из частей routing counter и data length . По умолчанию routing counter = [110] и определяет биты с номерами 6,5 и 4. Бит 7 определяет групповую или физическую адресацию. (1 означает групповую адресацию). Биты 3, 2, 1 и 0 являются битами длины и определяют общее число байтов для передаваемого значения параметра. При length = 1 передаются так называемые short user data.

Байт 8 (transport control field / APCI ): по умолчанию равно 0, причем биты 7, 6, 5, 4, 3, 2 принадлежат к , а биты 1 и 0 определяют начало APCI.

Байт 9 (APCI / short user data ): 2 бита (номер 7 и 6) определяют оставшуюся часть APCI, а 6 битов (номера 5, 4, 3, 2, 1, 0) определяют поле short user data. Поле short user data применяется в случае, если передаваемый параметр может быть представлен шестью битами, в противном случае используется user data байт (или байты), который имеет номер 10 (номера 10, 11).

Байт 10 (Bytes 10, 11, ... – user data): Определяет передаваемые данные, в случае если они не могут быть представлены шестью битами.

Заключительный байт (checksum): Специальная контрольная сумма байтов начиная от второго и до Checksum--байта. Применяется бит-функция (not (b0 b1 b2 ... bn) ), где „“ бит-операция xor.


homedriver перенаправляет сообщения от homeserver-ак EIB--бусу, при этом дополнительный Header датаграммы добавляется к другому OSI-Layer-у (см. EIBA--инструкцию [3]).

    1. Динамическое описание

      1. Интерфейс между Linux EIB Home Server-ом и EIB-бусом

homedriver коммуницирует с EIB-бусом через FT1.2 совместимый интерфейс.FT1.2 протокол основан на международных стандартах IEC 870-5-1 и 870-5-2 (DIN 19244) (см. EIBA инструкцию [3]). Подключение интерфейса к компьютеру осуществляется через серийный порт, подключение к EIB-бусу осуществляется через так называемый Bus-Access-Unit(BAU) тип 2 (см. EIBA инструкцию, глава 9/4/2, [3]).

homedriverустанавливает интерфейс в так называемый Busmonitor-режим. В этом режиме все сообщения с EIB-буса перенаправляются к homedriver-у. Посредством этого Linux EIB Home Server регистрирует каждое изменение, происходящее на подключённой EIB-инсталяции.

Каждое сообщение с бусмонитора перенаправляется с homedriver-а к homeserver-у. Другие сообщения обрабатываются самим homedriver-ом.

    1. Используемые файлы в модулях homedriver и homeserver

      Modul / Include-File / Source-File

      Описание

      homeserver/include/client.h

      homeserver/src/client.cpp

      Коммуникация с разнымиклиентами Клиентами являются программы, которые управляют EIB-бусом или же запрашивают информацию с EIB-инсталяции.

      Ожидание новых клиентов.

      homeserver/include/homeserver.h

      homeserver/src /datenbank.cpp

      Коммуникация homeserver-а с встроенной базой данных.

      homeserver/include/homeserver.h

      homeserver/src/driver.cpp

      Коммуникация с homedriver-ом. homedriver предоставляет homeserver-у соединение с EIB-бусом.

      homeserver/include/homeserver.h

      homeserver/src/homeserver.cpp

      Центральныйкласс homeserver-а. Управляет всеми процессами homeserver-а.

      homedriver/main/eibmain.cpp

      Main-программа homedriver-а. Может быть использована для старта homedriver-а. homedriver может быть также запущен из другой программы как Thread.

      homedriver/include/eibdriver.h

      homedriver/src/eibdriver.cpp

      Центральный класс homedriver-а. Стартует все Thread-ы и управляет как соединением с homeserve-ом так и с EIB-бусом.

      homedriver/include/eibsocket.h

      homedriver/src/eibsocket.cpp

      Соединение сhomeserver-ом через сокет.

      homedriver/include/ eibconnection .h

      homedriver/src/eibconnection.cpp

      RS232-соединение с EIB-бусом.

      homedriver/include/ eibstate .h

      homedriver/src/eibstate.cpp

      Статус FT1.2-соединения с EIB-бусом.

      homedriver/include/ eibmessage .h homedriver/src/eibmessage.cpp

      -датаграмм-формат.

      homedriver/include/eibexception .h

      homedriver/src/eibexception.cpp

      Описывает ошибочные и исключительные состояния.

      homedriver/include/ eibstd.h

      Разные определения сообщений об ошибках, форматов сообщений или стандартных интерфейсов и портов.

    2. Описание модулей: homedriver

      1. Краткое описание

homedriver имеет два задания:

  1. Он получает Write- и Read-запросы, а также Response-сообщения от homeserver-а и перенаправляет их к EIB-бусу

    1. Write: Необходимо изменить значение параметра группового адреса соответствующего прибора.

    2. Read: Необходимо прочитать значение параметра группового адреса соответствующего прибора.

    3. Response: Ответ на Read-команду от EIB-буса. Эта команда в настоящее время не поддерживается homeserver-ом.

  2. homedriver перенаправляет полученные бусмонитор-сообщения к homeserver-у.

homedriver может быть запущен как самостоятельная программа или же может быть вызвана из другой программы:

  1. Самостоятельная программа: Для этого необходимо откомпилировать файл eibmain.cpp и в результате получить исполняемую программу. При старте можно задавать различные параметры.
    Синтаксис:
    homedriver [–d device] [–p portnumber] [–f inputfile outputfile]
    device: задает серийны й интерфейс к EIB-бусу, например, /dev/ttyS4
    portnumber: Задает порт для сокет-соединения к homeserver-у.
    inputfile, outputfile: Для симуляции данные обмена с EIB-бусом могут быть прочитаны (записаны) из файла (в файл). Этот режим имеет смысл, если нет физического соединения к EIB. Названые файлы должны существовать.
    Опции f и d нельзя задавать совместно.

    Все параметры являются опциональными.

    Без задания параметров принимаются следующие значения по умолчанию:
    device: /dev/ttyS0
    portnumber: 8083

  2. Вызов из другой программы: Для этого необходимо инстанциировать объект класса homedriver посредством вызова статического метода:
    EibDriver::createInstance( int portNumber, char* inputDevice, char* outputDevice, bool simulation)
    portnumber: Задаёт порт для сокет-соединения с homeserver -ом.
    inputDevice: Задаёт серийный интерфейс к EIB-бусу, например /dev/ttyS1, , или файл ввода.
    outputDevice: Задаёт серийный интерфейс к EIB-бусу, например /dev/ttyS1, , или файл ввода.
    simulation: True для симуляции, т.е. input/outputDevice являются файлами. для реального режима, т.е. inputdevice и ouputdevice задают одинаковые серийные интерфейсы.

      1. Klassen und deren Assoziationen

Диаграмма классов на Рис. 2 #1087;оказывает классы модуля homedriver uи также отношения между классами. Кроме классов EibReceiveMessage и EibSendMessage, которые отвечают за посылку и получение EIB-сообщений, все остальные классы реализованы как Singleton. По этой причине диаграмма классов является собственно говоря диаграммой объектов.

homedriver коммуницирует с homeserver -ом посредствам сокета. Стандартным значением порта является 8083. Сокет реализован в классе EibDriverSocket , в котором инстанциируется соответствующий обьект.

Один из Thread-ов записывает сообщения в сокет, а другой Thread читает сообщения из сокета. Все сообщения депонируются в двух очередях сообщений, которые реализуются посредством класса lfcdllist из LFC. Сообщения, посылаемые на EIB-бус, реализованы посредством класса EibSendMessage, а принимаемые сообщения -соответственно посредством класса EibReceiveMessage.

homedriver коммуницирует с EIB-бусом через серийный интерфейс. Во время инициализации системы интерфейс FT1.2 переключается в бусмонитор-режим путем посылки соответствующего сообщения. После этого homedriver получает абсолютно все сообщения, которые курсируют по EIB-бусу. Он (homedriver) подтверждает любое сообщение при помощи Acknowledge. Соединение с EIB-бусом представлено классом EibConnection. Состояние соединения описывается классом, производным от абстрактного базисного класса EibState.


Рис. 2: Классы homedriver-а и их ассоциации.

В данный момент моделируются следующие состояния:

  1. EibStateReady: Сообщения могут быть получены и посланы.

  2. EibStateSent: Это состояние Write- или Response-команда посланная на BAU. В этом состоянии невозможно послать какие-либо другие сообщения. homedriver ждет подтверждения (Acknowledge) с BAU. Если будет получено подтверждение (Acknowledge), homedriver возвращается назад в состояние EibStateReady. Если в течение 200 миллисекунд не будет получено подтверждение (Acknowledge), то отправление сообщения повторяется до трех раз. После четырех неудачных попыток вновь инсталлируется полное соединение.

  3. EibStateRequest: Это - Read-команда посланная на BAU. В этом состоянии невозможно послать какие-либо другие сообщения. homedriver ждет подтверждения (Acknowledge) с BAU. Если в течение определенного времени не будет получено подтверждение (Acknowledge), то отправление сообщения повторяется до трех раз. После четырех неудачных попыток вновь инсталлируется полное соединение.

  4. EibStateWait: Получено подтверждение (Acknowledge) на Read-команду. homedriver ждет ответ (Response) от прибора. В этом состоянии невозможно послать какие-либо другие сообщения. Если получен ответ (Response) или по истечению определенного времени (TimeOut) (см. EIBA инструкцию [3]),) homedriver возвращается назад в состояние EibStateReady.

Из всех бусмонитор-сообщений извлекается FT1.2-протокол-фрейм, -байт и TimeStamp и соответствующие сообщения направляются к homeserver-у До этого все повторения рассортировываются.

      1. Классы, атрибуты и методы

        1. EibDriver

Методы класса EibDriver представлены на Рис. 3.


Рис. 3: Драйвер-классы

        1. EibConnection

Методы класса EibConnection представлены на Рис. 4.

Рис. 4: Классы соединений

        1. EibState

Методы класса EibState и порожденные от него классы представлены на Рис. 5.


Рис. 5: Иерархия наследованияклассовсостояний.

        1. EibSocket

Методы класса EibSocket представлены на Рис. 6.


Рис. 6: Сокет-классы.

        1. EibMessage

Методы класса EibMessage и порожденные от него классы представлены Рис. 7.


Рис. 7: Иерархия наследования классов сообщений.

        1. EibException

Методы класса EibException и порожденные от него классы представлены на этом рисунке ( Рис. 8):

Рис. 8: Exceptions.


      1. Функции

В модуле homedriver кроме main() нет никаких других функций, не являющихся методами класса. Описание методов класса можно найти в соответствующих главах.

homedriver можно стартовать

Документацию к классам и методам можно найти в исходных текстах.

    1. Описание модулей: homeserver

      1. Краткое описание

homeserver имеет три задания:

  1. Он коммуницирует по протоколу TCP/IP или HTTP с приложением

  2. Он коммуницирует с homedriver-ом (см. предыдущий раздел 5.4)

  3. Он управляет базой данных групповых адресов и текущие параметров приборов.


homeserver сохраняет текущие значения параметров групповых адресов в XML-базе данных. База данных расположена в файле с названием по умолчанию:eibdb.xml. В этом файле необходимо сохранить все данные при EIB-инсталяции сервера. В течении эксплуатации значения параметров конфигурированных групповых адресов постоянно обновляются и файл eibdb.xml время от времени синхронизируется.

Интервалы синхронизации задаются при старте программы параметром:

-s <Количество в секундах>
( по умолчанию -s 300, т.е. синхронизация каждые 5 минут, в случае если имеются какие-либо изменения. Отказ от синхронизации при помощи -s 0).


Синтаксис:

homeserver -dr driver-host -db database -dp driver-port -ap applications-port -wp http-port -s synctimeout

Описание параметров:

значения по умолчанию:

driverhost: localhost

driver-port: 8083

database: eibdb.xml

applications-port: 8081

http-port: 8080

synctimeout: 300 (в секундах)


      1. Классы и их ассоциации

Классовая диаграмма на Рис. 9 показывает классы модуля homeserver и их взаимные отношения.


Рис. 9: Классовые диаграммы homeserver.


      1. Классы, атрибуты

        1. HomeServer

Методы класса HomeServer показаны на Рис. 10.


Рис. 10: Класс HomeServer


        1. DatenBank

Методы класса DatenBank показаны на Рис. 11.


Рис. 11: Класс DatenBank.

        1. Driver

Методы класса Driver представлены на Рис. 12.

Рис. 12: Класс Driver.

        1. DriverMessages

Методы класса DriverMessages представлены на Рис. 13.

Рис. 13: Класс DriverMessages.

        1. Client

Методы класса Client представлены на Рис. 14.

Рис. 14: Класс Client.

        1. ClientMessages

Методы класса ClientMessages представлены на Рис. 15.


Рис. 15: Класс ClientMessages

        1. Interest

Методы класса Interest представлены на Рис. 16.

Рис. 16: Класс Interest.

        1. PathData

Методы класса PathData представлены на Рис. 17 dargestellt.

Рис. 17: Класс PathData.

        1. Instruction

Методы класса Instruction представлены на Рис. 18.

Рис. 18 Класс Instruction.

  1. Список литературы

  1. BMBF-Исследовательский проект (Embassi) www.embassi.de

  2. Intel: The Universal Plug and Play (UPnP) SDK for Linux, http://sourceforge.net/projects/upnp/

  3. EIB Association: www.eiba.org