1
0
Pārlūkot izejas kodu

Фофонов А. Разработка архитектуры и программного обеспечения системы контроля доступа

ypv 2 gadi atpakaļ
vecāks
revīzija
1025fdbdda

+ 6 - 0
ТЗИ/Лекции/ПМ3.2/README.md

@@ -51,6 +51,12 @@
 П2.2.1 Рассмотрение принципов устройства, работы и применения аппаратных средств аутентификации пользователя  
 П2.2.2 Рассмотрение принципов устройства, работы и применения средств контроля доступа
 
+#### Литература
+
+[Фофонов А. Разработка архитектуры и программного обеспечения системы контроля доступа. Томск.: ТГУ, 2003.- 56 с. Дипломная работа](diplom (1)_СКУД.pdf)
+
+
+
 
 ### Тема 2.3. Система телевизионного наблюдения
 2.3.100 Аналоговые и цифровые системы видеонаблюдения. 

+ 1976 - 0
ТЗИ/Лекции/ПМ3.2/diplom (1)_СКУД.pdf

@@ -0,0 +1,1976 @@
+             Министерство образования Российской Федерации
+            ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
+
+                              Факультет информатики
+                  Кафедра теоретических основ информатики
+
+УДК 681.03
+
+                       ДОПУСТИТЬ К ЗАЩИТЕ В ГАК
+                       Зав. кафедрой, доцент, д.т.н.
+                       _________________Ю.Л. Костюк
+                       «___»____________2003 г.
+
+                  Фофонов Алексей Владиславович
+
+РАЗРАБОТКА АРХИТЕКТУРЫ И ПРОГРАММНОГО
+ОБЕСПЕЧЕНИЯ СИСТЕМЫ КОНТРОЛЯ ДОСТУПА
+
+                            Дипломная работа
+
+Научный руководитель,
+
+заведующий 15 отделом  ____________________ А. Я. Клименко
+
+НИИАЭМ, д.т.н.
+
+Исполнитель,           ____________________ А.В. Фофонов
+студент гр.1481
+
+Электронная версия дипломной работы помещена
+В электронную библиотеку. Файл
+Администратор
+
+                       Томск - 2003
+                                             Реферат
+
+Дипломная работа 57 с., 21 рис., 14 источников, 3 прил.
+СИСТЕМЫ КОНТРОЛЯ И УПРАВЛЕНИЯ ДОСТУПОМ, КАРТОЧКИ-
+ИДЕНТИФИКАТОРЫ, БИОМЕТРИЧЕСКАЯ ИДЕНТИФИКАЦИЯ, КЛАССИФИКАЦИЯ
+СИСТЕМ КОНТРОЛЯ И УПРАВЛЕНИЯ ДОСТУПОМ
+(1) Объект исследования – системы контроля и управления доступом.
+(2) Цель работы – разработать эффективную архитектуру системы контроля и управления
+
+    доступом.
+(3) Метод исследования – экспериментальный (на ЭВМ).
+(4) Результат – разработана общая архитектура системы контроля и управления доступом,
+
+    реализованы и испробованы все основные архитектурные механизмы.
+
+                                                          2
+                                          Содержание
+
+Введение......................................................................................................................................... 6
+1. Исследование предметной области .....................................................................................8
+
+   1.1. Состав СКУД .................................................................................................................8
+   1.2. Способы идентификации..............................................................................................9
+   1.3. Принципы работы систем контроля доступа ...........................................................11
+   1.4. Классификация СКУД ................................................................................................12
+   1.5. Системы контроля доступа в автоматизации маркетинга.......................................13
+   1.6. Особенности систем контроля доступа, как систем реального времени...............15
+2. Моделирование СКУД........................................................................................................17
+   2.1. Подходы и инструментарий .......................................................................................17
+   2.2. Структура СКУД. ........................................................................................................18
+   2.3. Описание предметной области ..................................................................................19
+3. Архитектурные механизмы................................................................................................22
+   3.1. Организация взаимодействия объектов ....................................................................22
+   3.2. Сохранение объектов ..................................................................................................27
+   3.3. Параметризованное создание объектов ....................................................................31
+   3.4. Работа с файлами.........................................................................................................32
+   3.5. Взаимодействие приложений....................................................................................34
+4. Архитектура приложения-сервера СКУД.........................................................................37
+   4.1. Пакет «Система связи сервера» .................................................................................38
+   4.2. Структурные объекты .................................................................................................39
+   4.3. Объекты-данные..........................................................................................................40
+   4.4. Исполнительная подсистема ......................................................................................41
+   4.5. Сохранение объектов ..................................................................................................43
+5. Архитектура приложения-клиента СКУД ........................................................................45
+   5.1. Система связи приложения-клиента .........................................................................46
+   5.2. Пакеты «Клиент» и «Диалоговые классы»...............................................................46
+6. Принципы взаимодействия клиента и сервера.................................................................48
+   6.1. Установление связи.....................................................................................................48
+   6.2. Выполнение запроса ...................................................................................................48
+   6.3. Подписка приложения на события ............................................................................51
+Заключение ..................................................................................................................................52
+Список использованных источников ........................................................................................53
+ПРИЛОЖЕНИЕ А. Генерация заголовков классов по модели...............................................55
+ПРИЛОЖЕНИЕ Б. Список прилагаемых файлов ....................................................................56
+
+                                                          3
+ПРИЛОЖЕНИЕ В. Дискета с исходными текстами................................................................57
+                                                          4
+                        Перечень условных обозначений
+
+• СКУД – Системы Контроля и Управления Доступом;
+• КУД – Контроль и управление доступом;
+• CКД – Системы Контроля Доступа;
+• ПИН – Персональный Идентификационный Номер;
+• СРВ – Системы Реального Времени;
+• АРМ – Автоматизированное Рабочее Место;
+• UML – Unified Modeling Language – Унифицированный язык моделирования;
+• CASE – Computer Aided System Engineering – автоматизированное проектирование
+
+    систем;
+• MFC – Microsoft Foundation Class library – базовая библиотека классов Микрософт.
+
+                                                     5
+                                            Введение
+
+        В настоящее время на предприятиях, где необходимо контролировать и
+ограничивать доступ людей в различные помещения, широкое применение нашли
+автоматизированные системы контроля и управления доступом (СКУД). Эти системы
+предназначены для обеспечения санкционированного прохода в помещения и охраняемые
+зоны. Помимо своих основных функций по организации доступа к ресурсу, СКУД
+помогают решить многие другие задачи. Сюда можно отнести учет рабочего времени,
+быстрое определение местонахождения сотрудников, управление лифтами, вентиляцией,
+пожарной сигнализацией и многое другое.
+
+        Сегодня главным направлением развития систем контроля и управления доступом
+является их интеллектуализация, передача максимально возможного количества функций
+по сбору, обработке информации и принятию решений, аппаратным средствам СКУД и
+компьютерам. Освобождение человека от рутинного труда особенно важно в процессе
+обеспечения безопасности объектов, где цена ошибки, а иногда и элементарной
+невнимательности, очень велика. С другой стороны важно обеспечить оператора полной и
+точной информацией о происходящих на объекте событиях и удобными средствами для
+безошибочного и своевременного принятия оперативных решений.
+
+        Но системы контроля доступа могут быть использованы не только для снижения
+издержек предприятия при организации системы безопасности. Их применяют и как
+средства автоматизации маркетинга в гостиницах, на курортах и т. д. При этом
+возможность доступа в различные помещения рассматривается как некоторый
+оплачиваемый ресурс, что позволяет говорить о такой системе как об автоматизированной
+системе управления маркетингом. Особенностью этих СКУД является реализация
+механизма расчетов пользователей системы с ее владельцем.
+
+        Целью данной работы является разработка гибкой архитектуры системы контроля
+и управления доступом к оплачиваемому ресурсу, поддерживающей схему расчетов
+пользователей-клиентов с владельцем СКУД. Под архитектурой здесь понимается
+организационная структура системы, включающая в себя разделение системы на части,
+связи между этими частями, механизмы взаимодействия и основные принципы
+проектирования системы (см.[1]).
+
+         Актуальность темы. Существующие в настоящее время СКУД слишком
+специализированы. Например, в одних системах недостаточно поддерживаются функции
+оплаты используемых ресурсов, в других – обслуживания владельцев дружественных
+
+                                                          6
+систем и т.д. Поэтому встала проблема разработки системы, которая бы комплексно
+решала все задачи СКД. Комплексное проектирование системы позволит решить и все
+возникающие при ее внедрении проблемы безопасности.
+
+        Для достижения поставленной цели необходимо решить следующие задачи:
+    • Провести аналитическое исследование систем контроля доступа и на его основе
+
+         осуществить построение модели предметной области;
+    • Разработать, реализовать и протестировать набор механизмов, обеспечивающих
+
+         выполнение требований, предъявляемых к системам доступа;
+    • Разработать архитектуру модулей системы на основе созданных механизмов;
+    • Провести комплексное тестирование архитектуры, подтверждающее возможность
+
+         ее использования.
+        В первой главе производится обзор предметной области, раскрываются основные
+понятия, состав и принципы работы, приводится классификация СКУД. Вторая глава
+посвящена объяснению выбора подходов и инструментов, а также описанию структуры
+системы и модели предметной области. В третьей главе изложены базовые механизмы,
+положенные в основу архитектуры программного обеспечения системы контроля доступа.
+Четвертая и пятая главы соответственно описывают архитектуру приложения-сервера и
+приложений-клиентов. В шестой главе рассматриваются принципы взаимодействия этих
+модулей.
+
+                                                          7
+                        1. Исследование предметной области
+                                        1.1. Состав СКУД
+
+        Система контроля и управления доступом обычно состоит (см. [2]) из серверов
+СКУД – обычных компьютеров, которые управляют подключенными к ним
+контроллерами СКУД. Контроллер (контрольная панель) – это специализированный
+высоконадежный компьютер. В нем хранится информация о конфигурации, режимах
+работы системы, список людей, которые имеют право доступа к ресурсу, а также их
+привилегии доступа к этому ресурсу. В простых случаях минимальный вариант
+контроллера может быть встроен в считыватель, турникет, замок или другое
+исполнительное устройство.
+
+        Следующим важным звеном в СКУД являются такие устройства, как
+считыватели, которые можно подключить к контроллерам. Считыватель представляет
+собой устройство, которое позволяет считывать информацию, записанную на карточке.
+Эту информацию он передает контроллеру, который и принимает решение о допуске
+человека к ресурсу. Можно настроить контроллер так, что он будет запрашивать
+подтверждение принятого решения у компьютера.
+
+        Любой считыватель предполагает ответную часть – ключ-идентификатор,
+который содержит информацию, с помощью которой происходит идентификация
+человека. Каждой карточке приписан некоторый уровень доступа, в соответствии с
+которым пользователь имеет право получить доступ к тому или иному ресурсу в
+определенные промежутки времени. Классификация ключей представлена в §1.2.
+
+        Для повышения надежности идентификации кроме считывателей к контроллеру
+может подключаться клавиатура для набора персонального идентификационного номера
+(ПИН-кода).
+
+        Другой тип устройств, которые можно подключить к контроллеру – это охранные
+панели. Это также специализированный контроллер, который отслеживает состояние
+охранных датчиков (датчики на дверях, окнах, объемные датчики и другие). Если
+состояние какого-либо датчика изменяется, то информация об этом тут же поступает в
+основной контроллер.
+
+        У охранной панели может быть набор реле, с помощью которых она осуществляет
+управление исполнительными устройствами: электромеханическими замками,
+турникетами, лифтами, автоматическими воротами и т.д.
+
+                                                          8
+                                1.2. Способы идентификации
+
+        Существует два различных направления в способах идентификации. Это
+идентификация с использованием электронных карт, и идентификация, использующая
+биометрические параметры человека. Сейчас применяются следующие типы карт,
+каждому из которых соответствует определенный тип считывателя (см. [3]):
+
+    • магнитные карты – считываются, при проведении в определенном направлении и
+         с определенной скоростью по щели считывателя. Магнитная полоса с записанной
+         на ней информацией нанесена на одну из сторон пластиковой карточки.
+         Современные магнитные полосы изготовлены из материалов, требующих сильных
+         магнитных полей для записи информации и, соответственно, для ее уничтожения,
+         поэтому можно не бояться случайного размагничивания. Однако магнитные карты
+         достаточно чувствительны к внешним воздействиям другого рода – загрязнению,
+         влаге, царапинам. Еще один недостаток связан с необходимостью точного
+         позиционирования в считывателе. Средний срок службы магнитных карт
+         составляет около года, затем магнитный слой стирается. Поэтому магнитные
+         карточки применяют, как правило, в системах, где предусмотрена частая замена
+         карт, например, в отелях или на автостоянках.
+
+    • бесконтактные радиочастотные (PROXIMITY) карты – наиболее
+         перспективный на сегодняшний день тип карт. Бесконтактные карточки действуют
+         на расстоянии и не требуют четкого позиционирования, что обеспечивает их
+         устойчивую работу и удобство использования, высокую пропускную способность.
+         Для считывания информации с бесконтактной карточки ее достаточно просто
+         поднести к считывателю. Считыватель генерирует электромагнитное излучение
+         определенной частоты и, при внесении карты в зону действия считывателя, это
+         излучение через встроенную в карте антенну питает чип карты. Получив
+         необходимую энергию для работы, карта пересылает на считыватель свой
+         идентификационный номер с помощью электромагнитного импульса определенной
+         формы и частоты. При этом карточка может находиться в кармане или в
+         бумажнике.
+
+    • карты Виганда – названные по имени ученого, открывшего сплав, обладающий
+         прямоугольной петлей гистерезиса. Внутри карты размещены отрезки проволоки
+         из этого сплава, которые при перемещении мимо считывающей головки позволяют
+         считать информацию. Эти карты более долговечны, чем магнитные, но и более
+
+                                                          9
+         дорогие. Один из недостатков – то, что код в карту занесен при изготовлении раз и
+         навсегда.
+
+    • штрих-кодовые карты – на карту наносится штриховой код. Существует более
+         сложный вариант – штрих-код закрывается материалом, прозрачным только в
+         инфракрасном свете, считывание происходит в инфракрасной области.
+
+    • Touch-memory – металлическая таблетка, внутри которой расположен чип ПЗУ.
+         При касании таблетки считывателя, из памяти таблетки в контроллер пересылается
+         уникальный код идентификатора. Достаточно дешевы и удобны.
+
+К биометрическим способам идентификации относят (подробнее см. в [4]):
+
+    • Сканирование отпечатков пальцев – сканирование отпечатков пальцев является
+         самым удобным методом, а применяемые при этом устройства – самыми
+         дешевыми. Преимуществом является и надежность сканирования отпечатков
+         пальцев: несанкционированный доступ возможен примерно в одном случае из
+         миллиона, а отказ в доступе уполномоченному пользователю возникает примерно в
+         3% случаев и связан в основном с неправильным уходом за сканером.
+
+    • Геометрия ладони и кисти рук – сканируются не линии, как у отпечатков
+         пальцев, а геометрия руки: форма ладони или кисти, длина пальцев и т. д. В
+         принципе, по надежности этот метод практически не уступает предыдущему, но
+         подобные системы занимают гораздо больше места, что затрудняет их
+         использование на обычном компьютере, да и стоят они дороже.
+
+    • Сканирование глаза – различают два типа: сканирование радужной оболочки и
+         сканирование сетчатки. Первый метод более простой и удобный, но и менее
+         надежный. Второй является самым надежным, но и самым дорогим.
+
+    • Идентификация по голосу – Преимуществом является удобство использования.
+         Но этот метод имеет низкую надежность, так как для того, чтобы голос человека
+         значительно изменился, достаточно простудиться.
+
+    • Подпись – человек расписывается на специальном устройстве типа графического
+         планшета. Компьютер сравнивает полученную написанную информацию с той,
+         которая хранится в его базе, и в зависимости от результатов сравнения
+         предоставляет доступ или отказывает в нем. Саму подпись легко подделать, но
+         современные считыватели измеряют еще и характеристики движения руки при
+         письме, что повышает надежность метода.
+
+                                                         10
+    • Геометрия лица, Клавиатурный почерк – эти методы слабо разработаны,
+         реально действующих систем не существует.
+
+                   1.3. Принципы работы систем контроля доступа
+
+        В основе работы систем контроля и управления доступом заложен принцип
+сравнения тех или иных идентификационных признаков, принадлежащих конкретному
+физическому лицу или объекту, с данными, заложенными в систему [5].
+
+        Каждый из сотрудников (посетителей) получает карту доступа или брелок,
+содержащий индивидуальный код, присваиваемый при выдаче карты доступа в бюро
+пропусков. В качестве кода могут использоваться также биометрические данные человека.
+
+        При проходе на охраняемую территорию или в охраняемое помещение
+производится считывание данных с носителя кода через считыватели. Информация о
+посетителе передается в систему, где производится анализ и дается сигнал, адекватно
+реагирующий на сложившуюся ситуацию: <Проход разрешен>, <Проход запрещен>,
+<Повторный проход по одной карте>, вывод сигнала <Тревога> на пульт охранника при
+нарушении охраняемой территории без соответствующих прав и т.д.
+
+        При необходимости вмешательства охраны в сложившуюся ситуацию на экран
+компьютера поста охраны выводится тревожный сигнал и инструкция, определяющая
+действия персонала в данной ситуации. Причем, система тут же может отреагировать на
+тревожную ситуацию, заблокировав замки в охраняемое помещение и пути прохода по
+точкам доступа.
+
+        Для анализа произошедших событий имеется возможность просмотра и распечатки
+протокола событий за определенный период времени. Для исключения злоупотреблений в
+использовании карт и ужесточения проходного режима в особо важные зоны имеется ряд
+функций, позволяющих: (см. [5])
+
+    • исключить двойной проход в зону по одной карте (различают возможности
+         блокирования повторного прохода на определенное время – для систем, не
+         оборудованных считывателями на выходе и запрет на вход в несмежную зону для
+         полных систем контроля доступа);
+
+    • разрешить доступ только по 2-м картам (войти могут только два человека,
+         встретившись вместе и обладающих соответствующими полномочиями);
+
+                                                         11
+    • ограничить количество лиц в помещении и зоне (при превышении установленного
+         порогового значения контроллер не пропустит в зону очередного человека);
+
+    • установить режим <вход под принуждением> (незаметно для окружающих охране
+         подается сигнал тревоги);
+
+    • охраннику дается право на самостоятельное принятие решения о разрешении на
+         проход посетителя (при считывании карты на монитор охранника выводится
+         фотография владельца, которая сличается с изображением, выдаваемым
+         видеокамерой);
+
+    • установить режим счетчика на использование карты (количество чтений карты на
+         конкретном считывателе ограничивается);
+
+    • установить скрытый контроль в помещении (подать сигнал тревоги на пульт
+         охраны при проникновении в защищаемое помещение и отсутствии
+         соответствующих прав, причем для злоумышленника факт обнаружения остается
+         неведомым).
+
+                                  1.4. Классификация СКУД
+
+        Рассмотрим некоторые важные классификации систем контроля и управления
+доступом, представленные в [6].
+
+Классификация СКУД по способу управления:
+    • автономные – для управления одним или несколькими преграждающими
+         устройствами без передачи информации на центральный пульт и без контроля со
+         стороны оператора. Обычно это простейшие СКУД, точнее электронные замки,
+         которые ограничивают доступ в помещения. К преимуществам таких систем
+         можно также отнести возможность легкого удаления номера ключа из
+         энергозависимой памяти системы при его утере, таким образом, нашедший ключ
+         никогда не сможет им воспользоваться. Автономные системы нашли применение,
+         как правило, на небольших объектах (входы в жилые дома, коттеджи и т.п.).
+         Существуют и автономные системы контроля доступа с функциями охраны.
+    • централизованные (сетевые) – для управления преграждающими устройствами за
+         счет обмена информацией с центральным пультом, для контроля (управления) со
+         стороны оператора. Сетевые системы контроля применяются там, где требуется
+         постоянный контроль состояния объекта, возможность оперативного
+                                                         12
+         вмешательства в работу системы и получение различных статистических данных о
+         движении персонала. Управление доступом в сетевых системах в основном
+         осуществляется автоматически, на основе различных объектных и временных
+         ограничений доступа, задаваемых как для отдельных владельцев ключей, так и для
+         групп владельцев, выделенных по какому-либо признаку с помощью специальной
+         программы. Оператор имеет возможность работать с базами данных пользователей,
+         регистрировать и редактировать права доступа. При запущенной программе все
+         события, происходящие в системе, выводятся на монитор в режиме реального
+         времени и протоколируются для последующего получения отчетов по каждому
+         пользователю. Система позволяет получить полный набор стандартных отчетов о
+         перемещениях сотрудников, а также вести учет рабочего времени. Сети связи в
+         системе защищены от злоумышленников аппаратно и программно. Сетевые
+         системы оптимальны для применения в небольших и средних офисах или
+         предприятиях (до 256 контролируемых точек прохода).
+    • универсальные – включающие функции как автономных, так и сетевых систем,
+         работающие в сетевом режиме под управлением центрального устройства
+         управления и переходящие в автономный режим при возникновении отказов в
+         сетевом оборудовании, в центральном устройстве или обрыве связи.
+По количеству контролируемых точек доступа различают:
+    • системы малой емкости (менее 16 точек);
+    • системы средней емкости (не менее 16 и не более 64 точек);
+    • системы большой емкости (64 точки и более).
+Классификация по виду объектов контроля:
+    • для контроля доступа к физическим объектам;
+    • для контроля доступа к информации.
+
+          1.5. Системы контроля доступа в автоматизации маркетинга
+
+        В настоящее время наиболее широко распространено понимание «системы
+контроля доступа» как средства организации контрольно-пропускного режима на
+предприятии. В этих системах в качестве пользователей понимаются сотрудники
+предприятия – владельца СКУД, и наибольшее внимание уделяется непосредственному
+
+                                                         13
+обеспечению безопасного доступа в зоны и помещения. Такое использование СКУД,
+способствует уменьшению расходов предприятия на организацию безопасности.
+
+        Использование систем контроля доступа как средств автоматизации маркетинга
+преследует уже несколько иные цели: получение прибыли за счет продажи возможности
+доступа к ресурсу. В этом смысле система контроля доступа становится
+специализированной системой автоматизации маркетинга. Подробнее о карточных
+системах в автоматизации маркетинга изложено в [7].
+
+        В таких системах пользователи понимаются более широко – как предприятия и
+частные лица. Здесь уже огромное значение приобретает механизм организации расчетов
+этих пользователей с владельцем СКУД, который вовсе отсутствует в первичном
+понимании систем контроля доступа, где в качестве пользователей выступали сотрудники.
+
+        Если в первом случае группировка пользователей востребуется лишь как средство
+более удобного управления доступом, то в системах автоматизации маркетинга, она
+приобретает большую значимость благодаря внедрению понятия счета. Один счет может
+использоваться как одним человеком, так и группой людей (предприятие, семья и пр.) и
+даже группой групп (ассоциация групп), что задает возможности построений сложных
+иерархий.
+
+        В целом понимание СКУД как системы автоматизации маркетинга можно считать
+обобщением первичного понятия, так как все взаимодействие сотрудников с системой
+можно интерпретировать через механизм счетов. Например, для сотрудников стоимость
+доступа может быть нулевой. В противном случае, счета естественным образом
+позволяют оценивать интенсивность использования системы данным сотрудником.
+
+        Системы автоматизации маркетинга нагружают дополнительным смыслом и
+различные отчеты, формируемые СКУД, позволяя на их основе производить
+статистические исследования востребованности ресурса в конкретной точке доступа. Эти
+исследования могут использоваться для гибкой настройки системы на нужды
+пользователей. Статистика доступа конкретного пользователя или группы позволяет
+эффективно стимулировать постоянных клиентов с помощью различных схем скидок и
+поощрений.
+
+        Использование СКУД открывает широкие возможности по автоматизации работы
+различных гостиниц, курортов, дискотек и других учреждений, торгующих доступом в
+различные помещения. Например, система контроля доступа, автоматизирующая работу
+гостиницы, позволяет не только снизить издержки на обеспечение безопасности, но и
+
+                                                         14
+организовать платное использование сауны, бара, ресторана или других сервисов
+гостиницы. СКУД горнолыжного курорта может организовать удобный для клиентов
+платный доступ к подъемникам и т.д.
+
+       1.6. Особенности систем контроля доступа, как систем реального
+                                                 времени
+
+        В силу своей специфики, системы контроля доступа являются системами реального
+времени (СРВ). СРВ, как аппаратно-программный комплекс, включает в себя датчики,
+регистрирующие события на объекте, модули ввода-вывода, преобразующие показания
+датчиков в цифровой вид, пригодный для обработки этих показаний на компьютере, и,
+наконец, компьютер с программой, реагирующей на события, происходящие на объекте.
+Всякая СРВ ориентирована на обработку внешних событий. Ее основная задача –
+реагировать в предсказуемые времена, на непредсказуемый поток внешних событий. Это
+означает, что система должна отреагировать на событие, произошедшее на объекте,
+своевременно, то есть в течение времени, критического для этого события. Величина
+критического времени для каждого события определяется объектом и самим событием, и,
+естественно, может быть разной, но время реакции системы должно быть предсказано
+(вычислено) при создании системы. Отсутствие реакции в предсказанное время считается
+ошибкой для систем реального времени [8].
+
+        Кроме этого, система должна успевать реагировать на одновременно происходящие
+события. Даже если два или большее число внешних событий происходят одновременно,
+система должна успеть среагировать на каждое из них в течение временных интервалов,
+критических для этих событий [8]. Различают системы реального времени двух типов –
+системы жесткого реального времени и системы мягкого реального времени. Системы
+жесткого реального времени не допускают никаких задержек реакции системы, так как:
+
+    • результаты могут оказаться бесполезными в случае опоздания;
+    • может произойти катастрофа в случае задержки реакции;
+    • стоимость опоздания может оказаться бесконечно велика.
+
+        Системы мягкого реального времени характеризуются тем, что задержка реакции
+допустима, хотя и может привести к увеличению стоимости результатов и снижению
+производительности системы в целом. СКУД относят именно к этому типу систем.
+Вообще, основное отличие между системами жесткого и мягкого реального времени
+
+                                                         15
+можно выразить так: система жесткого реального времени никогда не опаздывает с
+реакцией на событие, система мягкого реального времени – не должна опаздывать с
+реакцией на событие.
+
+        Понимание системы контроля доступа как системы реального времени требует от
+разработчика использования ряда специфических механизмов, оказывающих
+существенное влияние на архитектуру всей системы.
+
+                                                         16
+                                 2. Моделирование СКУД
+                              2.1. Подходы и инструментарий
+
+        Основной целью любого разработчика программных систем является написание
+эффективного приложения. Эффективного во всех смыслах: надежного, удобного,
+расширяемого. Поэтому, чем удобнее и понятнее используемый подход, тем меньше
+придется разработчику совершить ошибок, меньше затратить времени на написание
+программы, проще ее будет понять и расширить.
+
+        На сегодняшний день для написания любых программ часто используется
+объектно-ориентированный подход, позволяющий разработчику абстрагироваться от
+алгоритма, как последовательности указаний. Объектно-ориентированный подход
+предлагает программисту представлять абстрактные сущности своей программы в виде
+взаимодействующих между собой объектов. Такой подход более близок и понятен
+человеку, поскольку он наиболее удобно отражает окружающий реальный мир. Объектное
+мышление позволяет представлять и понимать все более сложные системы.
+
+        В погоне за дальнейшей эффективностью и снижением времени разработки
+программных систем, одного существования такого подхода и соответствующих
+объектно-ориентированных языков программирования оказывается мало. Требуются
+специальные средства, помогающие продумать, промоделировать систему, избежать
+фатальных ошибок, проявляющихся, когда множество строк программного кода уже
+написано. Нужны средства, позволяющие визуально изобразить объекты и их
+взаимодействия, нужны методики, позволяющие последовательно найти и изучить
+взаимодействующие объекты, продумать процесс разработки и адаптировать его к
+изменяющимся потребностям.
+
+        Модели позволяют наглядно продемонстрировать структуру и поведение системы.
+Они необходимы для визуализации и управления архитектурой системы, минимизации
+рисков. Модели позволяют добиться лучшего понимания систем, что приводит к их
+упрощению и возможностям повторного использования. Система может быть описана с
+разных точек зрения, для чего используются различные модели, каждая из которых
+является семантически значимой абстракцией системы. Различают структурные модели,
+представляющие организацию системы, и поведенческие, отражающие ее динамику.
+
+        Необходимость универсализации подходов к построению моделей привела к
+созданию в 1997 году специального языка для описания. Универсальный язык
+
+                                                         17
+моделирования (UML = Unified Modeling Language) получил широкое распространение и
+был своевременно стандартизован.
+
+        С появлением стандарта в моделировании, возникли CASE-средства, позволяющие
+визуализировать этот процесс, объединить модели с документацией и даже генерировать
+части программного кода. Одним из наиболее известных средств этого типа является
+Rational Rose компании Rational. Созданное авторами UML это CASE-средство наиболее
+полно поддерживает нотации языка и его диаграммы. Оно позволяет организовать
+генерацию заголовков классов и некоторых простейших функций на основе созданных
+моделей, что позволяет вносить даже существенные изменения в существующую
+структуру системы. Универсальность языка моделирования позволяет сгенерировать
+участки кода и описаний на любом объектно-ориентированном языке Delphi, Java, С++,
+Visual Basic и других.
+
+        Для системы контроля доступа были созданы необходимые структурные и
+поведенческие модели на языке UML с помощью CASE-средства Rational Rose 2001.
+Подробно о нотации UML можно прочитать в [9],[10]. Наиболее тесно Rational Rose
+интегрируется со средой разработки Microsoft Visual Studio 6.0, поэтому в качестве языка
+программирования для генерации кода был выбран Visual C++.
+
+                                     2.2. Структура СКУД.
+
+        Как уже отмечалось выше, основным направлением развития СКУД является их
+интеллектуализация, агрегирование максимально возможного количества функций по
+сбору, обработке информации и принятию решений. Системы КУД способны
+автоматизировать множество процессов, связанных с организацией доступа к ресурсу.
+Сюда входят регистрация субъектов (пользователей и персонала) и объектов (ресурсов)
+СКУД, непосредственное предоставление доступа к ресурсу, организация контроля
+работы персонала, сбор и предоставление статистики о функционировании системы и
+многое другое. В автоматизации маркетинга системы контроля доступа расширяют свои
+возможности за счет организации системы счетов и платежей за использование ресурса.
+
+        СКУД, ориентированные на обслуживание большого числа клиентов, обычно
+имеют модульную структуру, позволяющую организовать рабочие места для различных
+служб, обеспечивающих эффективное функционирование системы. Модульная схема
+обеспечивается за счет использования архитектуры клиент-сервер. Количество и
+
+                                                         18
+функциональность модулей зависят от назначения системы и производителя. Например,
+набор модулей может быть таким:
+
+• «бюро пропусков» - рабочее место менеджера по работе с клиентами. Эта служба
+    занимается регистрацией новых клиентов, выдачей электронных карт, созданием
+    счетов, назначением прав доступа группам и отдельным пользователям.
+
+• «АРМ кассира» - специализированное рабочее место, предназначенное для приема
+    платежей за использование услуг, предоставляемых системой.
+
+• «АРМ оператора» - рабочее место оператора (охранника). Оператор отвечает за
+    корректное функционирование системы в течение своей смены. Он контролирует
+    работу системы, реагирует на внештатные ситуации.
+
+• «АРМ администратора». Администратор осуществляет настройку системы,
+    прием карт-идентификаторов, регистрацию персонала.
+
+• «Генератор отчетов». Используется для построения различных отчетов о работе
+    системы.
+
+Служ ебное                    Для небольших систем, где роль обслуживающего
+приложение            персонала играет лишь один человек, вся необходимая
+                      функциональность может быть сведена в единый модуль.
+<<LAN >>
+                              Модули (служебные приложения) взаимодействуют с
+   Сервер             центральным сервером СКУД (см. рис.1), который
+    СКУД              исполняет роль некоторого диспетчера, обрабатывающего
+                      запросы приложений и события контроллеров, датчиков и
+                      других исполнительных устройств.
+
+Контроллеры  Датчики          В качестве среды взаимодействия служебных
+                      приложений и сервера СКУД могут выступать локальная
+   Рис.1. Диаграмма   вычислительная сеть или адресное пространство одного
+развертывания СКУД.   компьютера.
+
+                            2.3. Описание предметной области
+
+        Модель предметной области представлена на рисунке 2.
+        Группа представляет собой любое объединение людей (фирма, семья и т.д.).
+Каждый человек в системе обязательно приписан какой-либо группе. Доступ
+
+                                                         19
+пользователей к своим учетным записям осуществляется по паролю. Когда новый клиент
+желает зарегистрироваться, для него создается группа, и он считается ее
+администратором. Администратор имеет следующие полномочия:
+
+    • Добавлять в группу новых членов,
+    • Настраивать права и расписания доступа членов группы,
+    • Создавать и настраивать счета,
+    • Назначать счета для использования членам группы,
+    • Устанавливать ассоциации для своей группы.
+
+            связывать
+
+1..n           1
+
+      Группа                    работать 1..n      Персона
+
+                             1                                                         Расписание
+
+              1..n           использовать                       0..1          0..n
+                                               0..n
+обладать                                                                 иметь доступ
+                                                иметь
+
+                                                            0..1
+
+                                               Карта
+
+      0..n          0..n                       Услуга                                        0..n
+                       0..n
+      Счет                                                                             Зона
+
+                             0..1                                     1        0..1
+                                                                                                        2
+0..1        1
+
+      0..n
+
+              ассоциировать        СКД
+
+                                    1
+
+                             содержать
+
+         1                           1..n                 включать                               1..n
+
+   Схема                     Контроллер                                        Направление
+поощрения
+                                                       1                 1..n
+
+                    Рис.2. Модель предметной области.
+
+        Для того, чтобы клиент мог воспользоваться системой, ему выдается карта. На
+каждую учетную запись может быть выдано не более одной карты. Несколько учетных
+записей не могут использовать одну карту.
+
+        Для того чтобы построить иерархию групп, между ними можно устанавливать
+связи. Группа, установившая связь, разрешает использовать свои счета для установления
+
+                                               20
+ассоциации между ними. Группа обязательно содержит хотя бы одного члена (ее
+администратора).
+
+        Каждая зона (ресурс) связана с некоторой услугой. С другой стороны, группой
+могут быть созданы различные счета для различных услуг. Услуга задает цену единицы
+ресурса. Для того чтобы производить каскадное обновление, можно устанавливать
+ассоциацию счетов. Счету может быть приписана определенная схема поощрения,
+влияющая на стоимость использования единицы ресурса.
+
+        В зависимости от типа контроллера-турникета у него может быть несколько
+направлений доступа. Каждое направление связано с двумя зонами (зона, откуда
+осуществляется доступ, и зона, куда осуществляется доступ).
+
+                                                         21
+                             3. Архитектурные механизмы
+
+        Архитектура программного обеспечения СКУД строится на основе ряда
+механизмов, определяемых требованиями, предъявляемыми к системе.
+
+        Трактовка СКУД как системы реального времени требует реализации механизмов
+диспетчеризации, межобъектного взаимодействия и средств работы с таймерами.
+Параллелизм в обработке одновременно происходящих внешних событий должен
+обеспечивается за счет использования многопоточности. Клиент-серверный подход
+вносит необходимость реализации механизма и способов взаимодействия между сервером
+и приложениями, а общие требования безопасности и надежности заставляют выбирать
+особые способы хранения данных и работы с ними.
+
+        Некоторые архитектурные механизмы используют нестандартный подход к
+созданию объектов, требующий передачи строкового имени класса создаваемого объекта.
+Этот подход также может быть рассмотрен как вспомогательный механизм (или механизм
+более низкого уровня).
+
+        Все нижеописанные архитектурные механизмы были реализованы на Visual C++
+6.0. Список прилагаемых файлов-модулей приведен в Приложении Б.
+
+                      3.1. Организация взаимодействия объектов
+
+        Диспетчер сообщений. Для реализации механизма межобъектного
+взаимодействия был создан специальный объект – диспетчер. Диспетчер «знает» все
+объекты, которые желают обмениваться сообщениями, а эти объекты в свою очередь
+«знают» о существовании диспетчера. Помимо таблицы зарегистрированных объектов,
+важной частью диспетчера является очередь сообщений. Принцип отправки сообщения
+можно описать следующим образом (см. рис.3):
+
+    • Объект-отправитель создает сообщение и инициализирует его данными. Затем он
+         вызывает функцию отправки сообщения (SendEvent) диспетчера.
+
+    • Диспетчер осуществляет постановку сообщения в очередь, проверяет, запущен ли
+         поток обработки очереди сообщений. Если поток не запущен, то диспетчер его
+         запускает. После этого управление возвращается объекту отправителю.
+
+                                                         22
+    Объект-отправитель                Диспетчер       Поток обработки очереди                           Объект-получатель
+
+        начало          Занесение сообщения
+                                 в очередь
+
+    конец
+             [ Поток активен ]
+
+                                [ Поток не активен ]
+
+                                Запуск потока                           [ Очередь пус та ]  Завершение
+                                                      [ Очередь не пуста ]                      потока
+
+23                                                    Извлечение с ообщения
+                                                               из очереди
+                                                                                            завершение потока
+
+                                                      Поис к адресатов
+
+                                                      Вызов функции обработки                                  Обработка
+                                                           сообщений объекта                                   с о обще ния
+
+                                Рис.3. Диаграмма деятельности, отражающая принцип обработки сообщения.
+    • Поток обработки сообщений извлекает следующее сообщение из очереди, ищет
+         объект-получатель по таблице зарегистрированных объектов и вызывает функцию
+         обработки сообщения получателя (ProcEvent), передавая ей в качестве параметра
+         объект сообщение. Когда управление возвращается диспетчеру, поток
+         осуществляет проверку наличия сообщений в очереди. Если сообщения
+         отсутствуют, то поток завершается, в противном случае поток осуществляет
+         обработку сообщения.
+
+        Перед вызовом функции ProcEvent получателя осуществляется запуск таймера.
+Если к моменту таймаута управление не возвращено объекту диспетчера, то поток
+прерывается и запускается снова со следующего элемента очереди сообщений. Если же
+получатель знает, что время обработки сообщения превышает время таймаута, то он
+запускает свой поток и возвращает управление диспетчеру.
+
+        Очередь сообщений диспетчера представляет собой массив элементов сообщений.
+Сообщения в очередь укладываются последовательно. При достижении конца очереди
+следующее сообщение записывается на первое место, таким образом, очередь зациклена.
+Обработка очереди потоком прекращается, когда номер следующего обрабатываемого
+элемента равен номеру следующего добавляемого элемента, что означает, что в очереди
+отсутствуют сообщения.
+
+        Выделение объекта диспетчера с его очередью сообщений разрешает все проблемы
+синхронизации многопоточного приложения, при условии, что взаимодействие объектов
+осуществляется только через очередь обработки сообщений диспетчера.
+
+        Каждый взаимодействующий объект в системе характеризуется тремя значениями:
+номером класса, номером объекта и дополнительным кодом. Для уникальной
+идентификации объекта используются первые два значения. Номера объектов выдаются
+диспетчером последовательно, с заполнением пустот (т.е. объект занимает первый
+свободный номер). Дополнительный код призван выражать пользовательскую нумерацию
+объектов. Кроме того, он может быть использован для поиска объектов в системе (Seek,
+Select).
+
+        Трудоемкость поиска элемента по таблице взаимодействующих объектов является
+логарифмической от числа объектов, принадлежащих классу искомого. Это объясняется
+тем, что диспетчер работает с классами, как элементами массива фиксированной длины, а
+с объектами класса как с расширяемым массивом. Поиск по списку объектов
+осуществляется дихотомически.
+
+                                                         24
+        Проведенное тестирование показало, что диспетчер способен поддерживать
+неограниченное количество объектов. Единственным «узким» местом может выступить
+очередь сообщений: поскольку она зациклена, то ее переполнение может закончиться
+потерей ряда начальных сообщений.
+
+        Диспетчер событий. Для реализации возможности подписки одних объектов на
+события других диспетчер сообщений был расширен функциями диспетчера событий. Это
+выразилось в добавлении таблицы подписчиков и функций работы с событиями. Объект,
+желающий заявить о событии, создает объект-сообщение и заполняет часть его полей,
+касающихся события. После этого осуществляется вызов функции уведомления о событии
+(ThrowEvent). Эта функция находит всех подписчиков, и отправляет им сообщения о
+событии, удаляя их подписные записи из таблицы. Если объект желает получить событие
+снова, он должен опять на него подписаться.
+
+        Объекты имеют возможность подписываться на события монопольно (для этого в
+объекте сообщения предусмотрен соответствующий атрибут). При возникновении
+события диспетчер определяет наличие монопольных подписок, и рассылает сообщения,
+уведомляя подписчиков, была ли заявлена монопольная подписка и является ли он
+монопольным подписчиком. В зависимости от этого объект принимает решение о
+соответствующей реакции на событие.
+
+        Диспетчер таймеров. Для снижения загруженности системы таймерами было
+решено организовать службу таймеров на основе диспетчера сообщений. Для этого были
+добавлены таблицы таймеров объектов. При запуске диспетчера автоматически
+запускается периодический таймер. После истечения каждого периода счетчик каждого
+объекта, заказавшего таймер (SetTimer), уменьшается на единицу. При достижении
+нулевого значения объекту посылается сообщение об истечении таймаута, при этом
+запись таймера не удаляется и может быть инициализирована снова повторным вызовом
+SetTimer. Для удаления записи таймера используется функция DeleteTimer.
+
+        Если вызывается деструктор объекта, зарегистрированного у диспетчера, то
+происходит удаление регистрации данного объекта, удаление всех его подписок (как
+входящих, так и исходящих), а также удаление всех его таймеров. Кроме этого
+организуется просмотр очереди сообщений диспетчера и удаление всех сообщений,
+направленных удаляемому объекту.
+
+        Трудоемкость поиска по таблице событий и таблице таймеров логарифмическая от
+числа всех элементов соответствующей таблицы. На рис.4 представлена диаграмма
+классов системы межобъектного взаимодействия.
+
+                                                         25
+26              <<struct>>                          CEventDi s patcher                                  CInteractionObject                                 CObjEvent
+
+      ITEM_INTER_OBJ                   (f rom Управ ление в заимодейств ием объектов )     (f rom Управ ление в заимодейств ием объектов )      (f rom Управ ление в заимодейст...)
+
+    (f rom Управ ление в заи...)          m_nEv entFif oNextPos : int                       m_bObjIsRegistred : BOOL                                m_ics : int
+        pObj : v oid*                     m_nEv entFif oFirstPos : int                      m_nClassTy pe : int                                     m_ios : int
+        nObjNum : int                     m_bDispatcherInProc : BOOL                        m_nObjNum : int                                         m_pes : int
+                                          m_dwDispatchThreadID : DWORD                      m_nAuxCode : int                                        m_icd : int
+                   <<struct>>             m_hDispatchThread : HANDLE                        m_nCurState : int                                       m_iod : int
+                                          m_CS_Send : CRITICAL_SECTION                                                                              m_pe : int
+           TIMER_INFO                     m_CS_Reg : CRITICAL_SECTION                       <<v irtual>> ProcEv ent()                               m_tDeparture : _timeb
+                                          m_nInteractionObjNum[CLASSTY PES_MAX]...          SendEv ent()                                            m_nEv entTy pe : int
+    (f rom Управ ление в заимоде...)      m_pI nt erac tionObjTable[ CLASSTY PES_MAX]. ..   <<v irtual>> ~CInteractionObject()                      m_bExclusiv e : bool
+        nIndex : int                      m_nAuxCodeObjNum[GROUPS_MAX] : int                <<f riend>> CEv entDispatcher::UnregisterEv ent...      m_bIsAny Exclusiv e : bool
+        nClassTy pe : int                 m_pAuxCodeObjTable[GROUPS_MAX] : v oid*           <<f riend>> CEv entDispatcher::ProcEv entObj()
+        nObjectNum : unsigned short       m_CS_Time : CRITICAL_SECTION                      GetObjNum()                                             CObjEv ent()
+        nTimerID : unsigned short         m_MainTimerID : unsigned int                      GetObjClassTy pe()                                      CObjEv ent()
+        nTimerSteps : int                 m_nTimersCount : int                              <<f riend>> CEv entDispatcher::RegisterEv entO...       CObjEv ent()
+                                          m_nSubscribersCount : int                         GetAuxCode()                                            operator=()
+                    <<struct>>            m_CS_Sub : CRITICAL_SECTION                       ThrowEv ent()
+                                                                                            SendEv ent()
+       SUBSCRIBER_INFO                    ProcEv entObj()                                   Subscribe()
+                                          UnregisterEv entObj()                             ThrowEv ent()
+    (f rom Управ ление в заимодей...)     SendEv ent()                                      CInteractionObject()
+        nIndex : __int64                  CEv entDispatcher()                               CInteractionObject()
+        nClassDest : unsigned short       <<v irtual>> ~CEv entDispatcher()                 <<f riend>> CEv entDispatcher::SetTimer()
+        nObjDest : unsigned short         Select()                                          <<f riend>> CEv entDispatcher::DeleteTimer()
+        bIsExclusiv e : bool              Seek()                                            <<f riend>> CEv entDispatcher::Subscribe()
+                                          RegisterEv entObj()
+                                          StopDispThread()
+                                          UpdateTimerValues()
+                                          ThrowEv ent()
+                                          Subscribe()
+                                          SetTimer()
+                                          DeleteTimer()
+                                          FindSubscriber()
+                                          BuildIndex()
+                                          FindTimer()
+                                          <<static>> Ev entDispatcherThread()
+                                          <<static>> MainTimerFunc()
+                                          <<static>> AuxTimerFunc()
+
+                                       Рис.4. Диаграмма классов механизма межобъектного взаимодействия.
+        Класс CEventDispatcher реализует диспетчер событий, сообщений и службу
+таймеров. Класс CObjEvent представляет собой объект событие, содержащий
+информацию об отправителе, получателе, типе сообщения, структуре события и времени
+отправления. Класс CInteractionObject задает общий интерфейс для всех
+взаимодействующих объектов в системе. Структуры ITEM_INTER_OBJ, TIMER_INFO,
+SUBSCRIBER_INFO представляют, соответственно, записи в таблице объектов, таблице
+таймеров и таблице подписчиков. Данный механизм реализован в модулях
+InteracitonObject.cpp(h), EventDispatcher.cpp(h), ObjEvent.cpp(h).
+
+                                   3.2. Сохранение объектов
+
+        Сохранение объекта в файл. Некоторые объекты системы требуют сохранения на
+диск и последующего восстановления. Для этого применяется механизм сериализации
+(преобразования объекта в последовательную форму и обратно). Принцип работы этого
+механизма следующий:
+
+    • При вызове функции сохранения в файл (Save) объект прежде всего записывает
+         строку с именем своего класса. После этого происходит вызов функции
+         сериализации (Serialize) с параметром «сохранить».
+
+    • В этой функции объект осуществляет запись на диск всех своих атрибутов. После
+         этого объект считается сохраненным.
+
+    • При вызове функции загрузки объекта (Load) из файла считывается имя класса
+         загружаемого объекта. Эта строка передается механизму параметризованного
+         создания объектов, который осуществляет создание соответствующего объекта.
+         После чего вызывается функция Serialize с параметром «загрузить».
+
+    • В функции Serialize происходит считывание из файла атрибутов сохраняемого
+         объекта.
+
+        Таким образом, мы можем хранить в одном файле произвольное число объектов.
+Однако, чтобы получить доступ к какому-либо объекту, нам придется последовательно
+загрузить все предыдущие. Поэтому сериализацию удобно использовать лишь для
+сохранения состояния одиночных объектов, либо групп объектов, используемых
+одновременно.
+
+        На рис.5 представлена диаграмма классов, отображающая структуру данного
+механизма.
+
+                                                         27
+                                  CStore                              CCreator
+
+                            <<v irtual>> ~CStore()        (f rom Параметризов анное созд...)
+                            <<v irtual>> WriteData()
+                            <<v irtual>> ReadData()           CCreator()
+                                                              <<v irtual>> ~CCreator()
+                                                              Create()
+
+    CFileStore                  CFileExStore                      CStorab le
+
+m_pFile : FILE*             CFileExStore()                m_iClassSize : int
+                            <<v irtual>> ~CFileExStore()  m_pDataStart : v oid*
+CFileStore()                <<v irtual>> ReadData()       <<static>> Load()
+<<v irtual>> ReadData()     <<v irtual>> WriteData()      <<const>> Sav e()
+<<v irtual>> WriteData()                                  <<v irtual>> Serialize()
+<<v irtual>> ~CFileStore()                                <<v irtual, const>> GetVersion()
+
+                CFileEx                                                     CFile
+
+script : CString                                                         (f rom File Serv ices)
+ID : int
+reaction : CString
+position : int
+lexdata : CString
+lexarg : CString
+Stack : CString
+
+CFileEx()
+CFileEx()
+CFileEx()
+~CFileEx()
+Duplicate()
+Open()
+Close()
+Read()
+ReadHuge()
+Write()
+...
+
+                       Рис.5. Диаграмма классов механизма сериализации.
+
+        Для использования этого механизма все классы, желающие, чтобы их объекты
+сохранялись, должны наследовать от класса, задающего интерфейс для сериализации
+(CStorable, модуль Storable.cpp(h)). Класс CStore задает интерфейс для использования
+различных типов файловых хранилищ. Например, класс CFileStore использует для работы
+с файлами функции API, а класс CFileExStore – функции класса CFileEx (реализация в
+модуле СStore.h). Кроме них могут быть использованы любые классы-обертки,
+обеспечивающие работу с файлами.
+
+                            28
+        Этот механизм является полностью объектно-ориентированным, так как только сам
+объект знает порядок загрузки/сохранения своих атрибутов. Сериализация реализована и
+используется в стандартной библиотеке классов MFC. Однако MFC-реализация этого
+механизма может быть неприемлема в случаях, когда применяется множественное
+наследование или предполагается обеспечить кроссплатформенность приложений. В [11]
+описана альтернативная реализация этого подхода, без привлечения MFC. Она требует
+использования механизма параметризованного создания объектов, который будет описан
+отдельно. Кроме этого, требуется, чтобы компилятор умел определять информацию о
+классе объекта во время исполнения.
+
+        Чтобы ускорить процесс записи объекта в файл, было принято следующее решение.
+Вместо того чтобы записывать на диск по-очереди все свои атрибуты, объект записывает
+себя целиком путем копирования области памяти. Этот способ позволяет сэкономить на
+времени записи, но при этом копируются не только атрибуты, но и таблицы виртуальных
+функций объекта и всех его базовых классов. Однако таблицы виртуальных функций
+объекта меняются лишь от компиляции к компиляции. Данный подход может
+применяться лишь в случаях, когда необходимо проводить постоянные сохранения
+объектов.
+
+        Склад. Сохранение в файл не позволяет нам организовать быстрый поиск и
+извлечение объектов. Для решения этой задачи был разработан специализированный
+класс CStock (см. рис.6), являющийся контейнером одно- или двуключевых записей и
+реализующий возможности сохранения и поиска объектов (модуль СStock.cpp(h)). Склад
+может хранить только объекты одного типа. Для этого он инициализируется именем
+класса хранимых объектов, положением и длиной ключей в записи, характеризующей
+объект.
+
+        Для помещения объектов на склад используется механизм, похожий на
+сериализацию. Каждый объект, желающий сохраняться на складе, должен иметь
+функции, задаваемые интерфейсом CStockItem (модуль CStockItem.cpp(h)). При
+добавлении объекта на склад, вызывается функция преобразования (Transform), которая
+по аналогии с функцией Serialize осуществляет запись атрибутов объекта и их
+извлечение. Однако в качестве хранилища атрибутов здесь выступает не файл, а строка
+(область памяти). Полученная строка добавляется в таблицу элементов и включается в
+индекс в соответствии со своим ключом (ключами).
+
+                                                         29
+                   CStock                   CTra ns form a ble
+
+m_nItemsCount : DWORD                      (f rom Передача данных)
+m_sClassName[CLASS_NAME_LENGTH] : char       m_nPackSize : int
+m_nKey Size : int                            <<v irtual>> Transf orm()
+m_nFullItemLen : int                         GetPackSize()
+m_nItemLength : int
+m_nKey Len1 : int                              CSto ck I tem
+m_nKey Pos1 : int
+m_nKey Len2 : int                            Store()
+m_nKey Pos2 : int                            CStockItem()
+m_bUseTwoKey s : bool                        AddToStock()
+m_pKey Index1 : v oid*                       <<v irtual>> Transf orm()
+m_pKey Index2 : v oid*
+m_pDataTable : v oid*                                      CCreator
+
+Locate()                                (f rom Параметризов анное создание объектов )
+FindSy mbol()
+BuildIndexKey s()                          CCreator()
+AddRecord()                                <<v irtual>> ~CCreator()
+Remov eRecord()                            Create()
+GetItemData()
+GetItemIndex1()
+GetItemIndex2()
+GetItemBusy Flag()
+GetItemPos()
+SetItemData()
+SetItemIndex1()
+SetItemIndex2()
+SetItemBusy Flag()
+SetItemPos()
+<<v irtual>> Serialize()
+Initialize()
+<<v irtual>> ~CStock()
+NewItem()
+AddItem()
+Remov eItem()
+GetItem()
+ShowItem()
+Store()
+GetItemDataLength()
+ShowSelItems()
+ShowSelItemsData()
+ShowAllItemsData()
+CStock()
+GetSelItemsKey s()
+
+                  Рис.6. Диаграмма классов механизма складирования объектов.
+
+        Класс CStock имеет два индекса (по одному на каждый ключ), которые
+используются для быстрого поиска элементов. Поиск элементов по индексам
+осуществляется c помощью дихотомии, с использованием лексикографического
+сравнения, что дает возможность использования в качестве ключей любых типов, в том
+числе и строк.
+
+        Со склада можно извлекать либо один элемент, характеризуемый двумя ключами,
+либо все элементы, имеющие одинаковые значения какого-либо одного ключа.
+
+                                                         30
+Реализованы возможности извлечения элемента со склада с блокировкой записи и без
+блокировки. Для создания объектов извлекаемых элементов используется механизм
+параметризованного конструирования объектов.
+
+                       3.3.Параметризованное создание объектов
+
+        Для параметризации создаваемого объекта именем класса использовался механизм,
+описанный в шаблоне проектирования «Абстрактная фабрика» (см. [12]). Применяемый
+подход также описан в [11].
+
+        Класс CAbstractFactory задает общий интерфейс для создания продукта (объекта)
+различными фабриками объектов. Класс CFactory инициализируется создаваемым
+продуктом и реализует интерфейс абстрактной фабрики. Класс CFactoryListItem
+представляет собой элемент списка фабрик. Класс CCreator осуществляет перебор списка
+фабрик для создания конкретного продукта, определенного переданным ему параметром.
+Диаграмма классов представлена на рис.7
+
+     CAbs tractFactory                                   CCreator
+
+(f rom Параметризов анное со...)                (f rom Параметризов анное...)
+
+    <<abstract>> CreateObject()                     CCreator()
+                                                    <<v irtual>> ~CCreator()
+                         -m anufacturer             Create()
+
+                            Product                    CFacto ryLis tIte m
+
+           CFactory                             (f rom Параметризов анное созда...)
+
+(f rom Параметризов анное со...)         -next  CFactory ListItem()                  -$head
+    object : Product                            <<v irtual>> ~CFactory ListItem()
+                                                <<f riend>> CCreator::Create()
+    CFactory ()                                 ClearAll()
+    CreateObject()
+
+                                                -lis tIte m
+
+Рис.7. Диаграмма классов механизма параметризованного создания объектов.
+
+Все описанные классы реализованы в модуле dynamic.cpp(h)
+Общая последовательность действий выглядит следующим образом:
+
+                                         31
+    • Создается новый объект класса CFactory, параметризованный классом объекта-
+         продукта. При этом автоматически осуществляется создание нового элемента
+         CFactoryListItem и его добавление к существующему списку фабрик.
+
+    • Вызывается функция Create класса CCreator, которой, в качестве параметра,
+         передается строка, содержащая имя класса создаваемого объекта. Класс CCreator
+         осуществляет просмотр списка фабрик и вызывает функцию создания продукта для
+         каждой фабрики.
+
+    • Фабрика проверяет, совпадает ли переданный параметр с именем класса ее
+         продукции, и в зависимости от этого создает либо нет объект. Для создания
+         объекта используется конструктор по-умолчанию.
+
+    • Как только очередная фабрика возвращает непустое значение, класс CCreator
+         прерывает просмотр списка фабрик и, в свою очередь, возвращает созданный
+         объект. Если ни одна фабрика не смогла создать запрашиваемый объект, то
+         возвращается пустой указатель.
+
+        Для корректной работы с продуктами, использующими множественное
+наследование, необходимо осуществить динамическое преобразование созданного
+объекта к его типу. Объекты-фабрики можно создавать единожды при старте программы и
+уничтожать при ее завершении. С другой стороны, если параметризованное создание
+объектов производится редко, то фабрики можно создавать и удалять по мере
+необходимости.
+
+                                     3.4. Работа с файлами
+
+        Необходимость обеспечения гибкой и надежной работы с файлами в механизмах
+сохранения объектов требует разработки специальной системы для обработки особых
+ситуаций – исключений. Они представляют собой некоторые события, которые
+прерывают нормальный процесс выполнения программы. Многие стандартные
+библиотеки учитывают возможность возникновения исключений, но обработкой их
+должен заниматься непосредственно разработчик.
+
+        Стандартная библиотека классов Microsoft (MFC) предоставляет особый класс для
+работы с файлами CFile, который умеет генерировать исключения при работе с файлами.
+Но, при его прямом использовании в коде программы, придется «защищать» операторами
+обработки исключения каждую файловую операцию, что приведет к непомерному росту
+
+                                                         32
+объема программы. Это послужило стимулом для написания собственного класса работы
+с файлами, который является наследуемым от CFile и дополняет его специальными
+возможностями.
+
+        Помимо непосредственной защиты самих операций программисту - пользователю
+предоставлена возможность самому назначать функцию обработки для каждого
+файлового объекта или воспользоваться процедурой обработки по умолчанию. Для
+обеспечения более эффективного и гибкого управления исключениями был создан
+специальный язык. При возникновении исключения в режиме интерпретации будет
+выполняться специальная программа на этом языке - управляющий скрипт.
+
+        Разработанный язык позволяет однозначно сопоставить набору стимулов (причин
+исключения) последовательность действий, которые необходимо выполнить. Причем
+необходимые действия или последовательности действий могут повторяться любое число
+раз. Такая конструкция языка является вполне достаточной: количество стимулов
+конечно, и, сопоставив каждому стимулу последовательность действий, мы определим
+реакцию системы на все возможные файловые исключения для данного файлового
+объекта. Использование последовательности, а не единого действия, повышает гибкость
+языка за счет конструирования сложных действий на основе простых. Операция
+повторения позволяет строить сложные реакции на основе неоднократного выполнения
+блоков действий: например, ожидание освобождения файла при совместном его
+использовании и пр. Для стимулов, требующих одинаковой обработки, предусмотрена
+возможность сопоставления реакции их набору.
+
+        Поскольку специфика исключений дает возможность однозначно определять их
+причину, поиск имени процедуры, определяющей реакцию на стимул, был вынесен в
+функции транслитератора. Это, помимо ускорения обработки скрипта, упростило и сам
+язык. Он перешел, без потери функциональности, к одному из стандартных типов –
+«списку с одной ассоциативной операцией» со следующей q –грамматикой (более
+подробно описано в [13]):
+
+                          <S>→a<S>
+
+                          <S>→*<A><S>
+
+                          <S>→ε
+
+                          <A>→a
+
+                          < A > →(< S >)
+
+                                                         33
+        В качестве операции (*) в нем выступает повторение действий – элементов списка
+(a), а ε – пустая цепочка. Рассмотрим типичный пример управляющей программы
+обработки исключений:
+
+         shareViolation = 5*(ask ,wait ,tryAgain), notify, terminate;
+        При возникновении исключения shareViolation (ошибка совместного
+использования) пять раз выполнится блок функций: ask – спросить пользователя о
+необходимости ожидания, wait – подождать определенное время, tryAgain – попробовать
+снова открыть файл. После неудачи на пятой попытке вызывается функция notify, которая
+уведомит пользователя о невозможности открыть файл и, наконец, функция terminate,
+которая завершит работу программы.
+        Использование разработанного языка позволяет нам, помимо создания набора
+стандартных действий, предоставлять пользователю возможность регистрации своих
+собственных функций обработки исключений, что обуславливает дальнейшую
+расширяемость класса и приспособление его к любым потребностям.
+        Представление управляющего скрипта в виде строки разрешает нам подменять
+реакцию на файловые исключения прямо во время исполнения программы. Кроме этого,
+при наличии хорошо разработанной библиотеки функций, можно организовать систему,
+загружающую управляющий скрипт из файла и таким образом изменять схему обработки
+файловых исключений без рекомпиляции программы.
+        Данный механизм реализован в модуле FileEx.h
+
+                             3.5. Взаимодействие приложений
+
+        Команды. Архитектура «клиент-сервер» подразумевает, что приложения-клиенты
+посылают запросы серверу, а тот их выполняет. Часто к серверу выдвигаются требования
+организации протоколирования этих запросов. Для реализации подобной схемы был
+использован шаблон проектирования «Команда». Он инкапсулирует запрос как объект,
+позволяя тем самым задавать параметры клиентов для обработки соответствующих
+запросов, ставить запросы в очередь или протоколировать их, а также поддерживать
+отмену операций.
+
+         Все команды имеют общий интерфейс, задаваемый классом CCommand (см. рис.8).
+В этом классе определена виртуальная функция Execute, которая инициирует выполнение
+
+                                                         34
+команды. Такой подход позволяет выполнить команду, не зная, какая это команда и что
+она должна сделать.
+
+        Если требуется выполнить не одну команду, а несколько, то можно определить
+класс CMacroCommand как наследник класса CCommand, дополнив его операциями
+добавления и удаления команды и переписав операцию Execute таким образом, чтобы она
+осуществляла последовательное выполнения списка команд.
+
+CMacroCom m and                       CCommand                                                     CStorab le
+
+   AddCommand()              m_nSenderClass : unsigned short                                   (f rom Запись на диск)
+   Remov eCommand()          m_nSenderObj : unsigned short                                 m_iClassSize : int
+   <<v irtual>> Serialize()  m_nReceiv erClass : unsigned short                            m_pDataStart : v oid*
+   <<v irtual>> Execute()    m_nReceiv erObj : unsigned short
+                             m_nDataSize : int                                             <<static>> Load()
+                             m_pData : v oid*                                              <<const>> Sav e()
+                                                                                           <<v irtual>> Serialize()
+                             <<v irtual>> Execute()                                        <<v irtual, const>> GetVersion()
+                             Initialize()
+                             CCommand()
+                             <<v irtual>> ~CCommand()
+
+                             CSam pleCo m m an d1             CSam pleCom m and2
+
+                                <<v irtual>> Execute()           <<v irtual>> Execute()
+                                <<v irtual>> Serialize()         <<v irtual>> Serialize()
+
+                                Рис. 8. Диаграмма классов механизма команд.
+
+        Для того чтобы организовать протоколирование команд воспользуемся
+механизмом сохранения объектов в файл, описанным выше. Для этого унаследуем класс
+CCommand (модуль Command.h) от класса CStorable. Это позволит осуществить
+последовательную запись команд в файл. Протокол может быть использован для
+восстановления состояния системы в случае сбоя.
+
+        Передача объектов. Сервер и клиенты производят обмен данными. Часто эти
+данные представляют собой различные объекты. Для того чтобы организовать передачу
+объекта от одного приложения другому, можно воспользоваться механизмом,
+аналогичным сериализации, и осуществлять преобразование объекта в строку. Тогда весь
+процесс передачи объекта будет выглядеть следующим образом:
+
+                                                          35
+    • Приложение-отправитель создает объект, инициализирует его данными и вызывает
+         функцию преобразования в строку (Transform).
+
+    • Полученная строка передается приложению-получателю вместе с именем класса
+         объекта ( или другим идентификатором, определяющим объект).
+
+    • Получатель создает объект и вызывает функцию преобразования, передавая ей
+         полученную строку.
+        Использование этого механизма предполагает, что и отправитель и получатель
+
+знают о классе передаваемых объектов. Существенным преимуществом же является тот
+факт, что только сами объекты знают, как себя упаковать. Это позволяет не разрабатывать
+дополнительный формат пакета для передачи каждого объекта и облегчает возможности
+замены объектов и их повторного использования, поскольку изменить потребуется лишь
+логику функций класса объекта.
+
+        Для того чтобы иметь возможность унифицированного преобразования в строку
+был разработан класс CTransformable (модуль Transformable.h). Этот класс также был
+использован в механизме сохранения объектов на склад (см. рис.6).
+
+                                                         36
+                    4. Архитектура приложения-сервера СКУД
+
+        Используя вышеописанные принципы, была разработана схема для представления
+архитектуры приложения-сервера СКУД. На рисунке 9 отражены пакеты, определяющие
+функциональную группировку классов, и показаны зависимости между ними.
+
+                                                   Cистема связи
+                                                         сервера
+
+    Структурные                Сохранение
+       объекты                   объектов
+
+(f rom Разделяемые эл...)
+
+Исполнительная                     Объек ты
+    п одсистем а                    данные
+
+                               (f rom Разделяемы...)
+
+                      Рис.9. Пакеты и связи приложения-сервера СКУД.
+• «Система связи сервера» - пакет, отвечающий за связь клиентов и сервера, а также
+
+    сервера и оборудования СКУД, такого как турникеты, датчики и т.д.. Он
+    организует прием входящих сообщений и отправку исходящих. Входящие
+    сообщения интерпретируются как события, их публикация осуществляется от лица
+    структурных объектов.
+
+• Пакет «Структурные объекты» содержит объекты, являющиеся агентами внешних
+    элементов системы: контроллеров, приложений-клиентов и других. Агенты
+    используют систему связи для общения с внешним миром.
+
+• Пакет «Объекты-данные» осуществляет группировку ряда пакетов,
+    представляющих такие элементы предметной области, как карты, счета, группы,
+    ресурсы и персоны.
+
+• Пакет «Исполнительная подсистема» отвечает за выполнение запросов от
+    приложений и обработку событий контроллеров. Он представляет собой
+    адаптированную к системе реализацию механизма команд. Команды работают как
+    с объектами-данными, так и со структурными объектами.
+
+                           37
+    • Пакет «Сохранение объектов» показывает, каким образом сервер использует
+         механизмы сохранения объектов. Этот пакет используется командами,
+         структурными объектами и объектами-данными.
+
+                            4.1.Пакет «Система связи сервера»
+
+        Рассмотрим состав (см. рис.10) и принципы работы системы связи приложения-
+сервера СКУД.
+
+                                                                             CBlockingSocket
+
+                                                                                                      (f rom Blocking Socket)
+
+CSPDevice  CAppSocket                           CLis teningSocket
+
+(f rom Комму ника...) (f rom Комму никац...)  (f rom Комму никационны...)
+
+ CCom m Object                                CCom m Manage r
+
+(f rom Комму никаци...)                           (f rom Комму никацион...)
+
+                            <<disp_link>>
+
+ CInteractionObject                                      CApp
+
+(f rom Межобъектное в ...)                    (f rom Стру кту рные объекты)
+
+                                   Рис.10. Пакет «Система связи сервера».
+
+        Класс CCommManager задает общий интерфейс для приема входящих соединений.
+При приеме соединения создается объект класса CCommObject, через который и
+осуществляется дальнейшее взаимодействие с подсоединившимся приложением. В
+данном случае в качестве коммуникационных объектов были выбраны сокеты (для их
+объектно-ориентированного представления используется класс CBlockingSocket,
+являющийся оберткой функций API Winsock). Однако в случае необходимости сокеты
+могут быть заменены любым другим средством межпроцессного взаимодействия
+(каналами, файловыми очередями и др.).
+
+         Кроме коммуникационного объекта создается структурный объект,
+представляющий собой образ приложения в системе (CApp). Образ приложения знает
+реквизиты своего коммуникационного объекта и может общаться с ним через диспетчер,
+что отражено на диаграмме стрелкой с пометкой «disp_link».
+
+         Связь с контроллерами обеспечивается при помощи связной платы, подключенной
+к компьютеру. Класс CSPDevice представляет в системе драйвер связной платы. Он тоже
+
+                            38
+наследует интерфейс коммуникационного объекта. Такой подход позволяет
+унифицировать обработку внешних сигналов в системе.
+
+        Каждый пакет данных, полученный коммуникационным объектом, считается
+системным событием. Например, событие «вставлена карта» от контроллера или событие
+«новый клиент» от приложения. Данные об объекте-источнике и типе события заложены в
+формат пакета. Используя эти сведения, коммуникационный объект осуществляет
+публикацию события от лица источника.
+
+        Коммуникационный объект осуществляет отправку только готовых пакетов,
+упаковкой же данных в пакет со стороны сервера занимается образ приложения CApp.
+
+                                  4.2.Структурные объекты
+
+        Все структурные элементы системы контроля доступа имеют специальных агентов,
+представляющих интересы данных элементов внутри программы-сервера.
+Взаимодействие между агентами и другими объектами сервера происходит с помощью
+диспетчера (интерфейс CInteractionObject). Для обеспечения надежности системы
+структурные объекты сохраняются в файл (интерфейс CStorable). В случае необходимости
+можно передать объект со всеми его данными другому приложению в виде строки
+(интерфейс CTransformable).
+
+  CTransformab le            CInteractionObject                 CStorab le
+
+(from Преобразование в...)  (f rom Межобъектное в з...)  (from Сохранение в файл)
+
+CSys tem                                                             CController
+
+                            CStructObject
+
+CApp                                                     CRes ource  CTurns tile
+
+  <<ty pedef >>                 <<ty pedef >>                   <<disp_link>>
+
+TServiceKey                 TR es ou rce Key             CZone       CDirection
+
+ (f rom Общее)                 (f rom Общее)
+
+          Рис.11. Пакет «Структурные объекты».
+
+        На рис.11 представлены классы пакета «Структурные объекты». Класс CSystem
+представляет собой систему и является источником системных событий. Класс CApp
+является источником для объектов-агентов приложений, подключенных к серверу. Класс
+CController задает общий интерфейс для различных типов контроллеров, а CResource для
+
+                            39
+различных ресурсов. Таким образом, наследуя от этих классов, мы получаем возможность
+создания не только СКУД, но и некоторых других систем автоматизации маркетинга.
+
+        Для ресурсов-помещений в качестве контроллера должен использоваться класс
+турникета (CTurnstile), а класс CZone в качестве ресурса. Для конкретного класса
+CTurnstile важно направление доступа: с направлением доступа связана соответствующая
+зона-ресурс. Все ресурсы в системе последовательно перенумерованы для организации
+возможности ограничения доступа конкретного пользователя к выбранному ресурсу
+(TResourceKey). Ключи используются для организации поиска связанных элементов на
+складах.
+
+                                     4.3. Объекты-данные
+
+        В отличие от структурных элементов эти объекты не регистрируются у диспетчера,
+не общаются между собой, они пассивны. Это просто хранилища данных о некоторых
+элементах предметной области, таких как группы, персоны, карты и счета. Все объекты-
+данные хранятся на складах, поэтому для каждого такого элемента выделяется ключ –
+уникальный идентификатор, с помощью которого объект можно найти на складе. Помимо
+списков объектов предметной области, хранящихся на складах в виде одноключевых
+записей, используются списки отношений. Они хранят двуключевые элементы,
+представляющие связи объектов предметной области.
+
+         Объекты-данные можно разделить на два подпакета: «Клиенты» и «Счета».
+
+                  <<ty pedef >>                     <<ty pedef >>
+
+                TPers onKey                     TRes ourceKey
+
+                 (f rom Общее)                     (f rom Общее)
+
+                   CCard         <<ty pedef >>               CPRSlot      <<ty pedef >>
+
+C Pers on                        TCardKey                             TTim eta bleKey
+
+                                 (f rom Общее)                           (f rom Общее)
+
+ <<ty pedef >>  CGroup                 C Sto ck I tem                 CYearTim etable
+
+TGroupKey                        (from Сохранение на скл...
+
+(f rom Общее)
+
+                                 CGGSlot                              CDayTim etab le
+
+           Рис.12. Пакет «Клиенты» из пакета «Объекты-данные».
+
+                                 40
+        Пакет «Клиенты» (см. рис.12) задает логическую структуру данных о клиентах-
+пользователях системы. Так, класс CPerson представляет собой сведения о персонах,
+CGroup – о группах, CCard – о картах. Класс CGGSlot задает возможность ассоциаций
+групп путем установления связи между ними. Для определения прав доступа конкретной
+персоны к определенному ресурсу используется отношение CPRSlot. Наличие элемента
+этого отношения говорит о возможности доступа конкретного клиента к определенному
+ресурсу с использованием расписания. Класс CDayTimetable представляет собой
+расписание доступа на один день, а CYearTimetalbe – на год.
+
+        Другой пакет – «Счета» (см. рис.13) задает реализацию объектов-счетов
+(CAccount), схем поощрения (CBonus) и услуг (CService). Класс CGASlot задает связь
+между счетами и группами, а класс СPASlot – связь между группами и персонами.
+Описание основных элементов предметной области представлено в §2.3.
+
+ <<ty pedef >>                     <<ty pedef >>                         <<ty pedef >>
+
+TGroupKey                        TAccountKey                     TPers onKey
+
+(f rom Общее)                     (f rom Общее)                         (f rom Общее)
+
+ CGASlot                                                            CPASlot
+
+                  <<ty pedef >>                    <<ty pedef >>
+
+                TServiceKey                       TBonus Key
+
+                 (f rom Общее)                    (f rom Общее)
+
+                                 CAccount           CBonus
+
+                CService
+
+                                                                       CStock I tem
+
+                                                                                     (from Сохранение на склад)
+
+                       Рис.13. Пакет «Счета» из пакета «Объекты-данные».
+        Все классы, представляющие одноключевые записи, обладают возможностью
+генерировать уникальные в пределах системы ключи своего типа.
+
+                              4.4.Исполнительная подсистема
+
+        Исполнительная подсистема сервера построена на основе механизма команд, с
+учетом использования диспетчера и требований протоколирования запросов (см. рис 14).
+
+        Класс CCommandHandler отвечает за создание и запуск команд в системе. Он
+подписан на ряд событий и имеет таблицу, сопоставляющую имя класса конкретной
+
+                                                         41
+команды определенному событию. В случае возникновения события обработчик команд
+проверяет, зарегистрирована ли за этим событием команда. Если соответствие найдено, то
+осуществляется создание экземпляра соответствующей команды с помощью механизма
+параметрического создания объектов. После создания команды происходит ее
+инициализация входными данными, на основе которых команда определяет своего
+получателя. Запуск команды осуществляется с помощью отправки ей сообщения.
+
+        Каждая команда имеет своего получателя (объект, который должен быть уведомлен
+о результате выполнения команды). Когда необходимая последовательность действий
+выполнена, команда осуществляет запись необходимых данных в файл протокола,
+отправляет результат получателю и завершается. Команды, требующие длительных
+вычислений, могут запускаться в отдельном потоке.
+
+                                                      CInteractionObject
+
+                                                            (f rom Межобъектное в заимодейств ...
+
+CCom m andHandler    CCommand                      Объекты данные
+
+                     (f rom Команды)           (f rom Разделяемые элементы)
+
+    CCreator                CStorab le
+
+(f rom Параметр...)  (from Сохранение в фа...
+
+Рис.14. Пакет «Исполнительная подсистема».
+
+        Команды являются активными объектами системы, содержащими всю логику
+запросов приложений. Каждый объект-команда регистрируется у диспетчера и поэтому
+может осуществлять обмен сообщениями с другими объектами, подписываться на
+события и т.д.
+
+        Использование механизма параметрического создания объектов позволяет строить
+обобщенные команды. Например, вместо специфичных команд для создания каждого
+пассивного объекта (объекты-данные) можно написать единую команду. Для этого
+необходимо лишь передать код склада и строку, содержащую упакованный объект. Склад
+автоматически создаст объект нужного класса, а общий интерфейс преобразования
+позволит наполнить его данными, после чего объект можно благополучно добавить на
+склад. Применяя аналогичный подход, мы получим команды, реализующие запросы
+«Получить», «Демонстрировать», «Модифицировать», «Удалить» и др. Можно обобщить
+команды не только для объектов данных, но и для структурных объектов.
+
+                                                         42
+        Наравне с обобщенными командами присутствуют и специфические команды.
+Например, команда «Новая группа» требует не только создания объекта «группа», но и
+объекта «персона», представляющего администратора данной группы. Вообще
+специфичные команды применимы в тех случаях, где семантика предметной области
+предполагает выполнение нескольких действий, либо единственное действие требует
+особого внимания.
+
+        Подход с использованием команд удобен тем, что позволяет простым образом
+добавить новую команду или модифицировать одну из существующих.
+
+                                   4.5.Сохранение объектов
+
+        Этот пакет показывает, каким образом приложение-сервер СКУД использует
+механизмы сохранения объектов (см. рис.15).
+
+                                                                                                             C Sto ck I tem
+
+                                                                                                                                         (from Сохранение на...)
+
+       CStore                  CStorab le                                      CStock
+
+(f rom Сохранение в...)   (from Сохранение в...)                        (f rom Сохранение н...)
+
+CFileStore  CFileExStore                              CCreator            CInteractionObject
+
+(f rom Сохранение в...) (f rom Сохранение ...)  (f rom Параметризо...)  (f rom Межобъектное в заи...)
+
+                                  Рис.15. Пакет «Сохранение объектов».
+
+Различные типы объектов в системе используют различные механизмы сохранения.
+
+    • Структурные объекты «живут» в системе постоянно. Они зарегистрированы у
+         диспетчера, общаются с другими объектами, подписываются на события. Их
+         «образ жизни» не позволяет им храниться на складе, поэтому для сохранения они
+         используют сериализацию в файлы.
+
+    • Объекты-данные, в отличие от структурных объектов, многочисленны и пассивны.
+         Они лишь хранят информацию о соответствующих элементах предметной области
+         и не требуют регистрации у диспетчера. При работе с ними большую важность
+         приобретает механизм поиска, поэтому для их сохранения и используется склад.
+
+                                                43
+    Для того чтобы обеспечить доступ к своим записям, склад должен быть
+    зарегистрирован у диспетчера. Наследование же интерфейса сериализации
+    позволяет организовать сохранение множества объектов на диск более удобным и
+    быстрым способом.
+• Объекты-команды, являющиеся носителями логики запросов приложений. Эти
+    объекты, так же как и структурные, являются «живыми», но «живут» они
+    временно. Для их сохранения применяется сериализация в отдельные файлы. А
+    после того, как команда выполнилась, организуется ее сохранение в общий файл
+    протокола.
+
+                                                    44
+                   5. Архитектура приложения-клиента СКУД
+
+        Несмотря на то, что различных типов приложений может быть несколько, можно
+выделить и описать их общую часть, каркас приложения. Разработанная архитектура
+предполагает, что приложение-клиент, так же как и сервер, является многопоточным.
+Поэтому для обеспечения межобъектного взаимодействия используются те же механизмы,
+которые применялись в сервере. В каркас приложения были включены следующие пакеты
+(см. рис.16):
+
+                         Система связи  Клиент
+                              клиента
+
+Диалоговые
+   классы
+
+    Объекты данные                      Структурные объекты
+
+(f rom Разделяемые элементы)            (f rom Разделяемые элементы)
+
+                    Рис.16. Пакеты и связи приложения-клиента СКУД.
+
+• «Система связи клиента» - обеспечивает прием и публикацию информации от
+    приложения-сервера.
+
+• «Клиент». Этот пакет состоит из единственного класса, представляющего собой
+    само приложение клиент. Он первым инициализируется при создании приложения
+    и отвечает за установление связи между сервером и клиентом.
+
+• «Диалоговые классы» - объединение классов, занимающееся визуализацией и
+    представлением информации, полученной от сервера. Сюда входят как основной
+    диалог, так и классы «помощников» (wizard), обеспечивающие возможность
+    построения необходимых запросов приложению-серверу.
+
+• С пакетами «Объекты-данные» и «Структурные объекты» мы уже познакомились
+    при рассмотрении архитектуры сервера. Присутствие их в приложении объясняется
+    используемым способом передачи объектов от приложения приложению, который
+    описан в архитектурных механизмах.
+
+                              45
+                        5.1. Система связи приложения-клиента
+
+        Система связи клиента использует те же коммуникационные объекты, что и сервер
+(см рис.17). Это оказалось возможным благодаря унифицированной работе
+коммуникационных объектов. Как уже говорилось при рассмотрении сервера,
+коммуникационный объект расценивает все всходящие сообщения как события и
+осуществляет их публикацию. Тип сообщения и источник события заданы в формате
+пакета. Если источник события не указан, то коммуникационный объект производит
+публикацию от своего имени. Для отправки же сообщений используются лишь готовые
+пакеты.
+
+                                                                           CAppSocket
+
+                                                                                     (f rom Комму никационные объек...
+
+        CCom m Ob ject             CBlockingSocket
+
+(f rom Комму никационные объек...  (f rom Blocking Sock...
+
+                                                CInteractionObject
+
+                                                           (f rom Межобъектное в заи...)
+
+                                    Рис.17. Пакет «Система связи клиента».
+
+        В качестве реализации коммуникационного объекта мы рассматриваем сокеты.
+
+                    5.2. Пакеты «Клиент» и «Диалоговые классы»
+
+        Так как пакет «Клиент» состоит лишь из одного класса, мы рассмотрим его вместе
+с пакетом «Диалоговые классы» (см. рис.18). Для того чтобы интегрировать класс
+приложения (CClientApp) в структуру СКУД, мы наследуем его от структурного класса
+CApp. Это автоматически заставляет его регистрироваться у диспетчера. В связи с тем,
+что класс CClientApp является первым классом, создаваемым приложением, вся начальная
+инициализация помещена в его функцию InitInstance. Здесь создается диспетчер,
+коммуникационный объект, инициализируется функция подключения к серверу,
+устанавливаются начальные подписки и т.д.
+
+        Класс CDialogClass является основным окном в системе. Он использует интерфейс
+CInteractoionObject для получения необходимых событий, после чего отображает
+
+                                                         46
+произошедшие изменения. Параллельно с этим классом могут существовать другие
+диалоговые классы, отображающие любую информацию.
+
+        Приложение-клиент может содержать также диалоговые классы «помощников»
+(CWizard), которые шаг за шагом позволят пользователю внести необходимые изменения
+(создать группу, добавить нового члена группы и т.д).
+
+                         CInteractionObject                                     CApp
+
+                      (f rom Межобъектное в заим...)                 (f rom Стру кту рные объекты)
+
+CWizardPage           CWizard                  CDialogClass          CClientApp
+
+                                                                     (f rom Клиент)
+
+CPropertyPageEx CPropertySheetEx                   CDialog                    CWinApp
+
+(f rom Dialog Boxes)  (f rom Property Sheets)  (f rom Dialog Boxes)  (f rom Application Architecture)
+
+Рис.18. Пакеты «Клиент» и «Диалоговые классы».
+
+        Для того чтобы отображать необходимую информацию, диалоговые классы
+должны «знать» о структурных объектах и объектах-данных.
+
+                                               47
+                6. Принципы взаимодействия клиента и сервера
+                                    6.1.Установление связи
+
+        Схематичная последовательность действий объектов при установлении связи
+изображена на рис.19 Данная диаграмма не отображает наличие диспетчера как
+организатора межобъектного взаимодействия.
+
+        После запуска сервера, во время инициализации объектов создается экземпляр
+класса CCommManager, который ожидает входящего соединения. При запуске
+приложения-клиента создается коммуникационный объект CCommObject, который
+пытается соединиться с сервером. Экземпляр класса CCommManager обнаруживает
+попытку соединения, создает коммуникационный объект класса CCommObject, и
+принимает на него входящее соединение. После этого он создает структурный объект-
+приложение (CApp), составляет и отправляет пакет, уведомляющий приложение об
+успешном соединении. Этот пакет получает объект-приложение (CClientApp), который
+отправляет серверу регистрационное требование в виде особого запроса (команды).
+
+        На это событие подписан обработчик команд сервера. Он инициализирует и
+запускает соответствующую команду. Команда, выполняясь, загружает в
+соответствующий структурный объект CApp регистрационную информацию приложения,
+определяет его тип и устанавливает необходимые подписки. После этого она отправляет
+уведомление о регистрации получателю, в качестве которого выступает этот же
+структурный объект CApp. Структурный объект создает пакет и передает его
+коммуникационному объекту. Коммуникационный объект обеспечивает передачу данных
+приложению.
+
+        Приложение, получив уведомление о регистрации, активирует свои основные
+функции, запрашивает у сервера с помощью команд необходимые данные и т.д.
+
+                                   6.2. Выполнение запроса
+
+        Схематичная последовательность действий представлена на рис.20.
+
+        Один из диалоговых классов приложения отправляет через коммуникационный
+объект запрос и подписывается на ответ. Например, это может быть запрос на получение
+объекта из какого-нибудь склада. Коммуникационный объект сервера публикует
+полученный запрос как некоторое событие. На это событие подписан объект обработчик
+команд, который создает, инициализирует и запускает соответствующую команду.
+
+                                                         48
+           :              :               :                                                                     :
+    CClientApp  CCom m Object  CCom m Manager                                                     CCom m andHandler
+
+    ConnectToServer( ) присоединиться                 CCommObject( )       :         : CApp
+                                   соед. установлено
+                                                                      CCom m Object
+
+                                                      CApp( )
+
+                                                      SendPacket(PPACKET)
+
+    зарегистрироваться         SendPacket(PPACKET)
+
+                                                                              FindCommandType(int, int&)
+
+                                                                                                          CCommand( )  :
+
+49                                                                                                                     CCom m and
+
+                                                                                     Transform(ACTION, void*)
+
+                                                               SendPacket(PPACKET)   рег. успешна
+
+                               рег. успешна
+
+                Рис.19. Диаграмма последовательности для регистрации агента приложения на сервере.
+    : CWizard           :              :                  :                                                                       : CApp
+               CCom m Object  CCom m Object  CCom m andHandler
+
+    запрос серверу Publicate(PPACKET)                                                                                       :
+                                                           FindCommandType(int, int&)                               CCommand
+                                                                                                CCommand( )
+
+                                                                                                   Initialize(...)
+
+                                                     Execute( )                                                     действия
+                                             SendPacket(PPACKET)                                                     рез уль тат
+
+               ответ  Publicate(PPACKET)
+
+50
+
+                      Рис.20. Диаграмма последовательности отправки запроса на сервер.
+        Команда, выполняясь, находит необходимый склад, извлекает из него объект,
+преобразует его в строку и отправляет ее получателю, в качестве которого выступает
+агент приложения. Агент осуществляет упаковку данных в пакет и, через
+коммуникационный объект, отправляет пакет приложению. Коммуникационный объект
+приложения публикует событие ответ на команду. Диалоговый класс получает сообщение
+о событии и осуществляет необходимую обработку.
+
+                          6.3. Подписка приложения на события
+
+        Во время регистрации агент приложения подписывается на специфические для
+данного приложения события. Например, для менеджера клиентов это могут быть
+события: создание новой группы, добавление члена в группу и др. Как только такое
+событие происходит, агент о нем уведомляется. При этом он осуществляет упаковку
+полученной информации в пакет и отправляет его через коммуникационный объект
+приложению . Коммуникационный объект приложения публикует данное событие. Все
+подписчики уведомляются и производят необходимую его обработку. Например,
+отображение новой группы в списке групп.
+
+        На рисунке 21 изображена соответствующая диаграмма последовательности
+
+Источник  : CApp                            :               :            : CWizard
+ события                          CCom m Object   CCom m Object
+
+Se ndSub s cribeInfo(...)  SendPacket(PPACKET)
+
+                           Su bs cribe (...)      Publicate(PPACKET)     обработать событие
+
+Подписка агента приложения на                 Если объект желает
+соответствующие типу приложения               получить событие в
+события производится при                      следующий раз он должен
+регистрации приложения в системе              снова на него подписаться
+
+Рис.21. Диаграмма последовательности, отражающая получение подписки.
+
+                                              51
+                                          Заключение
+
+        В результате выполненных работ была создана гибкая архитектура системы
+контроля доступа, поддерживающая схему расчетов пользователей за использование
+ресурсов. Реализованы на языке C++ и протестированы все используемые архитектурные
+механизмы. Получены следующие результаты:
+
+    • Проведено системное исследование предметной области. На его основе была
+         построена соответствующая модель, учитывающая схему расчетов клиентов за
+         предоставленные услуги;
+
+    • Разработаны, реализованы и протестированы основные архитектурные механизмы
+         (межобъектное взаимодействие, сериализация в файл, сохранение на склад,
+         параметризованное создание объектов, команды, механизмы взаимодействия
+         приложений)
+
+    • Разработана архитектура модулей программного обеспечения и созданы
+         соответствующие структурные модели этих модулей.
+
+    • Реализованы тестовые приложения, подтверждающие жизнеспособность как
+         разработанной архитектуры в целом, так и правомерность применения
+         предложенных механизмов.
+
+Практическая ценность работы состоит в следующем:
+    • Разработанная архитектура модулей программного обеспечения системы контроля
+         доступа может быть использована в качестве базы для построения целого ряда
+         систем автоматизации маркетинга.
+    • Созданные механизмы могут быть повторно применены в любом проекте,
+         выдвигающем соответственные требования.
+
+                                                         52
+                     Список использованных источников
+
+1. Энциклопедия UML. - Режим доступа:
+    http://ooad.asf.ru/standarts/uml/spr/Architecture.asp, свободный.
+
+2. О Системах управления доступом. - Режим доступа:
+    http://www.gamma.kz/gt/sud.html, свободный.
+
+3. Карточки – идентификаторы, для систем контроля доступа. - Режим доступа:
+    http://www.avtolik.ru/access/systems/identifikotor.htm, свободный.
+
+4. Давлетханов М. Внимание, чужой, 2003. - Режим доступа:
+    http://daily.sec.ru/dailypblshow.cfm?rid=5&pid=6637&pos=1&stp=50, свободный.
+
+5. Принципы работы систем контроля доступа. - Режим доступа:
+    http://www.secret-c.ru/uphp/default.php?id=41, свободный.
+
+6. ГОСТ Р 51241-98 Средства и системы контроля и управления доступом.
+    Классификация. Общие технические требования. Методы испытаний.
+    Введен 01.01.2000. - Режим доступа: http://www.nist.ru/hr/doc/gost/51241-98.htm,
+    свободный.
+
+7. Гильманов А.А., Клименко А.Я., Странгуль О.Н., Тарасенко В.П. Карточные
+    технологии в автоматизации маркетинга. – Томск: Издательство НТЛ, 2000. –380 с.
+
+8. Жданов А.А. Современный взгляд на ОС реального времени. - Режим доступа:
+    http://asutp.interface.ru/articles/display_topic_threads.asp?ForumID=13&TopicID=299,
+    свободный.
+
+9. Унифицированный язык моделирования. - Режим доступа:
+    http://penguin.photon.ru/doc/uml.shtml, свободный.
+
+10. Якобсон А., Буч Г., Рамбо Дж. UML: специальный справочник – СПб, Питер, 2001
+11. Holub А. Roll your own persistence implementations to go beyond MFC frontier//
+
+    Microsoft Systems Journal, 1996, June issue.(MSDN Library 2001)
+12. Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-
+
+    ориентированного проектирования. Паттерны проектирования – СПб: Питер, 2001.
+    – 386 с.
+13. Льюис Ф., Роэенкранц Д., Стирнз Р. Теоретические основы проектирования
+    компиляторов. -М.: Мир, 1979. - 654 с.
+
+                                                    53
+14. Трофимов С.А. CASE-технологии: Практическая работа в Rational Rose.-М.:
+    Бином-Пресс, 2002 г. - 288 с.
+
+                                                    54
+        ПРИЛОЖЕНИЕ А. Генерация заголовков классов по модели
+
+        Моделирование системы контроля и управления доступом осуществлялось на
+универсальном языке моделирования (UML), с помощью CASE-средства Rational Rose
+2001.Об использовании UML в Rational Rose можно прочитать в [14].
+
+        Файл модели acs.mdl содержит необходимые диаграммы классов. Для
+осуществления генерации кода заголовков классов необходимо:
+
+    1. Создать компоненту в модели реализации.
+    2. Выбрать необходимый язык программирования.
+    3. Ассоциировать классы с необходимой компонентой.
+    4. В контекстном меню компоненты выбрать позицию «Update code».
+    5. В мастере обновления кода выбрать классы, требующие обновления.
+    6. Нажать кнопку «Finish».
+
+        Rational Rose произведет генерацию классов по информации из модели. Для языка
+Visual C++ будут сгенерированы и добавлены в проект заголовочные файлы (*.h) и файлы
+реализации (*.cpp)
+
+        При необходимости Rational Rose позволяет осуществить обновление модели по
+коду. Для этого:
+
+    1. В контекстном меню компоненты выбрать позицию «Update Model».
+    2. Нажать кнопку «Finish».
+
+        Rational Rose произведет загрузку существующих классов проекта в модель.
+
+                                                         55
+                ПРИЛОЖЕНИЕ Б. Список прилагаемых файлов
+
+.\model\acs.mdl – Файл модели Rational Rose.
+.\arcmech\dispatcher\: Механизм сохранения объектов:
+
+    • EventDispatcher.cpp(h) – реализация класса CEventDispatcher;
+    • InteractionObject.cpp(h) – реализация класса CInteractionObject;
+    • ObjEvent.cpp(h) – реализация класса СObjEvent.
+.\arcmech\saveobj\: Механизм сохранения объектов:
+    • CStorable.cpp(h) – реализация класса CStorable;
+    • CStore.cpp(h) – реализация классов CStore, CFileStore, CFileExStore;
+    • FileEx.h – реализация класса СFileEx;
+    • CStock.cpp(h) – реализация класса СStock;
+    • CStockItem.cpp(h) – реализация СStockItem.
+.\arcmech\param\: Механизм параметризованного создания объектов:
+    • Dynamic.cpp(h) – реализует классы CCreator, CAbstractFactory, CFactory,
+
+         CFactoryListItem.
+.\arcmech\app\: Механизм взаимодействия приложений:
+
+    • Transformable.cpp(h) – реализация СTransformable;
+    • Command.cpp(h) – реализация CCommand.
+.\middleware\
+    • Blocksock.cpp(h) – реализация классов СBlockingSocket, CBlockingSocketException,
+
+         CSockAddr.
+.\archtest\: тестовые проекты.
+
+    • СlientManager – тестовое приложение-клиент;
+    • Server – тестовое приложение-сервер.
+
+                                                         56
+ПРИЛОЖЕНИЕ В. Дискета с исходными текстами
+
+                                       57
+