Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #1 : 06-02-2006 21:19 » |
|
Могу описать архитектуру реальной системы для проведения техосмотра автомобиля: несколько машин (компьютеров), на каждую машину (хост) через плату расширения до 8 COM-портов с приборами, на каждом порту может висеть несколько приборов.
Перво-наперво был создан протокол, по которому приборы обмениваются информацией с хостом. Каждый прибор имел уникальный идентификатор, имеющий часть "тип прибора", и часть "номер прибора" - по аналогии с MAC-адресами сетевых карт, только вместо вендора тип. Хост тоже имел уникальный идентификатор. Обмен данным осуществлялся в виде передачи пакетов данных, описанных в протоколе. Каждый пакет имел адрес получателя. Далее было соглашение, что прибор лишь откликается на запрос хоста, но сам "голос не подаёт" - некоторая аналогия с сетями с передачей маркера. Хост периодически рассылал пакеты прибора, а каждый прибор по адресу определял "свой" пакет и откликался на него. Пакеты помимо адреса содержали команды и данные для работы с приборами, причём для каждого типа прибора был свой набор команд и свой формат данных.
В приборах были соответствующие прошивки контроллеров, на хосте система из COM-объектов, которая всем делом управляла.
Теперь про хост.
На конце каждого канала со стороны хоста висел один объект, который можно назвать диспетчером канала. Задача у него была маленькая: открывать и закрывать каналы, настраивать их, буферизировать и передавать данные, контролировать связь (повторно передавать пакеты в случае ошибок чётности и т.п.). Это канальный уровень.
Над диспетчером канала висел объект, управляющий протоколом: он знал так сказать "ядро" протокола - имел средства преобразования запросов в пакеты (последовательности байтов) и, наоборот, средства преобразования пакетов в ответы - осуществлял сериализацию. Запросы и ответы являлись структурами данных, содержащими адреса приборов и данные - пока ещё последовательности байтов.
Над управляющим протоколом объектом висел диспетчер устройств. Диспетчер конфигурировался на хосте - т.е. ему сообщалось, какие приборы подключены к каналу. PnP не было. Задачами диспетчера устройств являлось: а) периодический опрос устройств - поддержание связи с устройствами (согласно протоколу), б) сортировка принимаемых ответов по устройствам. По адресу ответа определялось устройство, и данные пакета передавались на более высокий уровень (см. ниже).
На более высоком уровне для каждого прибора находился объект, управляющий протоколом этого прибора. Объект умел преобразовывать команды и данные форматов конкретного прибора из структур в последовательности байтов, и обратно - сериализация.
Ну и наверху находился объект - контроллер прибора, который обеспечивал API конкретного прибора. К контроллеру (находящемуся на логическом уровне) подключались объекты, создающие всякие настроечные диалоги и окошки мониторинга работы (уровень представления) и объекты, обеспечивающие протоколирование работы в БД (уровень данных), а также прочие объекты логического уровня, инициирующие сеансы работы с устройствами и обрабатывающие полученные результаты.
В общем, вдохновение для этой архитектуры черпалось в 7-иуровневой OSI модели организации сетей, и ничего принципиального нового не изобреталось. Да и какой смысл изобретать велосипед?
Ключ успешной работы приборов через разделяемый канал - разработка соответствующего протокола, который разрешает все возможные проблемы. Остальное тривиально.
Если на канальном уровне использются Ethernet-фреймы, соответственно, у всех узлов сети есть MAC-адреса. Если прибор должны слушать много потребителей (хостов), тогда прибор будет слать бродкаст-фрейм. В остальных случаях указывается конкретный MAC адресата (хоста или прибора). Вместо посылки бродкаста можно завести некий служебный хост, который будет копировать пакет от прибора каждому заинтересованному потребителю, но тогда будет теряться MAC-адрес прибора.
|