Linux EIB Home Server
Документация
Авторы:
Vladimir Vinarski (volodimir@users.sourceforge.net)
Jens Neumann (jneumann@users.sourceforge.net)
Состояние |
Дата |
Ответственный |
Тема обработки |
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 |
Дополнения и корректировки |
Примеры приложений
Поддержка всех EIB-типов данных
UPnP-поддержка
...
Linux EIB Home Server содержит интерфейсы для управления и слежения за EIB-инсталляцией.
Европейский инсталляционный бус (EIB) служит для автоматического управления функциями для домашнего хозяйства и специальных служб. EIB четко разделяет передачу электрической энергии и информации. Наряду с электросетью соединяются друг с другом всевозможные EIB-сенсоры и акторы, через которые и происходит общий обмен информацией.
Координация функционирования всевозможных элементов EIB-сети программируется и может быть сколь угодно часто изменена. Для эксплуатации нет необходимости в каком либо центральном элементе. Администрирование и сохранение всех данных сети происходит децентрализовано в отдельных EIB- приборах. Однако по необходимости возможен доступ к этим данным в любой точке сети, что дает возможность интегрировать EIB- электроинсталляцию в форме управляющей и контролирующей системы (например, Embassi [1]), не прибегая при этом к дополнительным инсталляционным затратам.
состоит в основном из двух компонентов (см. Рис.1):
homedriver: Управление EIB-бусом и коммуникационным интерфейсом между Home-Server и EIB--бусом, т.е. приборами.
homeserver: Коммуникационный интерфейс между приложениями, которые в последующем будем называть клиентами, и homedriver-ом. Число приложений неограниченно.
|
Потоки сообщений::
EIB- бус -> FT 1.2 интерфейс -> homedriver -> homeserver -> клиенты
Клиент -> homeserver -> homedriver -> -> FT 1.2 интерфейс -> EIB-бус
Для клиентов будем различать нормальные приложения и HTTPклиенты.
Обе компоненты homedriver и homeserver используют различные дополнительные библиотеки:
lfc: Библиотека классов (Strings, HashMaps, Queues, Vectoren, ...) которая используется homedriver-ом.
vector: Библиотека классов (String, Vector, Array, ...) которая используется homeserver- ом.
ixml: XML-DOM анализатор (Intel [2])
Клиент это произвольный процесс, который поддерживает tcp/ip- соединения к homeserver-у и посылает к нему команды, описанные далее в этой главе.
Существуют следующие команды:
„read“ - для опроса состояний EIB- приборов в данный момент (на базе EIB- групповых адресов).
„write“- для установки состояний EIB- приборов (на базе EIB- групповых адресов).
„subscribe“ заказ передачи информации о состоянии EIB- приборов (на базе EIB- групповых адресов).
„unsubscribe“ отмена заказа о передаче информации о состоянии EIB- приборов (на базе EIB- групповых адресов), что бы прервать постоянные сообщения от Home-Server-а.
Пример 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-команда !!!
Формат команды (если 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-а.
Между 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]).
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-ом.
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 |
Разные определения сообщений об ошибках, форматов сообщений или стандартных интерфейсов и портов. |
homedriver имеет два задания:
Он получает Write- и Read-запросы, а также Response-сообщения от homeserver-а и перенаправляет их к EIB-бусу
Write: Необходимо изменить значение параметра группового адреса соответствующего прибора.
Read: Необходимо прочитать значение параметра группового адреса соответствующего прибора.
Response:
Ответ
на Read-команду
от EIB-буса.
Эта команда в
настоящее
время не поддерживается homeserver-ом.
homedriver перенаправляет полученные бусмонитор-сообщения к homeserver-у.
homedriver может быть запущен как самостоятельная программа или же может быть вызвана из другой программы:
Самостоятельная
программа:
Для этого необходимо
откомпилировать
файл 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
Вызов из
другой
программы:
Для этого
необходимо
инстанциировать
объект
класса
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 задают
одинаковые
серийные
интерфейсы.
Диаграмма классов на Рис. 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-а и их ассоциации.
В данный момент моделируются следующие состояния:
EibStateReady: Сообщения могут быть получены и посланы.
EibStateSent: Это состояние Write- или Response-команда посланная на BAU. В этом состоянии невозможно послать какие-либо другие сообщения. homedriver ждет подтверждения (Acknowledge) с BAU. Если будет получено подтверждение (Acknowledge), homedriver возвращается назад в состояние EibStateReady. Если в течение 200 миллисекунд не будет получено подтверждение (Acknowledge), то отправление сообщения повторяется до трех раз. После четырех неудачных попыток вновь инсталлируется полное соединение.
EibStateRequest: Это - Read-команда посланная на BAU. В этом состоянии невозможно послать какие-либо другие сообщения. homedriver ждет подтверждения (Acknowledge) с BAU. Если в течение определенного времени не будет получено подтверждение (Acknowledge), то отправление сообщения повторяется до трех раз. После четырех неудачных попыток вновь инсталлируется полное соединение.
EibStateWait: Получено подтверждение (Acknowledge) на Read-команду. homedriver ждет ответ (Response) от прибора. В этом состоянии невозможно послать какие-либо другие сообщения. Если получен ответ (Response) или по истечению определенного времени (TimeOut) (см. EIBA инструкцию [3]),) homedriver возвращается назад в состояние EibStateReady.
Из всех бусмонитор-сообщений извлекается FT1.2-протокол-фрейм, -байт и TimeStamp и соответствующие сообщения направляются к homeserver-у До этого все повторения рассортировываются.
Методы класса EibDriver представлены на Рис. 3.
Рис. 3: Драйвер-классы
Методы класса EibConnection представлены на Рис. 4.
Рис. 4: Классы соединений
Методы класса EibState и порожденные от него классы представлены на Рис. 5.
Рис. 5: Иерархия наследованияклассовсостояний.
Методы класса EibSocket представлены на Рис. 6.
Рис. 6: Сокет-классы.
Методы класса EibMessage и порожденные от него классы представлены Рис. 7.
Рис. 7: Иерархия наследования классов сообщений.
Методы класса EibException и порожденные от него классы представлены на этом рисунке ( Рис. 8):
Рис. 8: Exceptions.
В модуле homedriver кроме main() нет никаких других функций, не являющихся методами класса. Описание методов класса можно найти в соответствующих главах.
homedriver можно стартовать
при помощи метода run() класса EibDriver
или при помощи Main-функции в файле eibmain.cpp
Документацию к классам и методам можно найти в исходных текстах.
homeserver имеет три задания:
Он коммуницирует по протоколу TCP/IP или HTTP с приложением
Он коммуницирует с homedriver-ом (см. предыдущий раздел 5.4)
Он управляет базой данных групповых адресов и текущие параметров приборов.
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: IP-адрес или имя компьютера, на котором запущен homedriver (homedriver и homeserver #1084;огут быть запущены на разных компьютерах.)
driver-port: IP-порт homedriver-а.
database: имя файла базы данных
applications-port: порт для TCP/IP-приложений
http-port:порт для HTTPприложений
synctimeout: интервал синхронизации базы данных (см. выше)
значения по умолчанию:
driverhost: localhost
driver-port: 8083
database: eibdb.xml
applications-port: 8081
http-port: 8080
synctimeout: 300 (в секундах)
Классовая диаграмма на Рис. 9 показывает классы модуля homeserver и их взаимные отношения.
Методы класса HomeServer показаны на Рис. 10.
Методы класса DatenBank показаны на Рис. 11.
Рис. 11: Класс DatenBank.
Методы класса Driver представлены на Рис. 12.
Рис. 12: Класс Driver.
Методы класса DriverMessages представлены на Рис. 13.
Рис. 13: Класс DriverMessages.
Методы класса Client представлены на Рис. 14.
Рис. 14: Класс Client.
Методы класса ClientMessages представлены на Рис. 15.
Рис. 15: Класс ClientMessages
Методы класса Interest представлены на Рис. 16.
Рис. 16: Класс Interest.
Методы класса PathData представлены на Рис. 17 dargestellt.
Рис. 17: Класс PathData.
Методы класса Instruction представлены на Рис. 18.
Рис. 18 Класс Instruction.
BMBF-Исследовательский проект (Embassi) www.embassi.de
Intel: The Universal Plug and Play (UPnP) SDK for Linux, http://sourceforge.net/projects/upnp/
EIB Association: www.eiba.org