Требования к разработке драйверов для считывателей RFID-меток для платформы "1С:Предприятие 8.1"

Обновлено: 15.04.2009

Введение

Общий принцип работы любой системы RFID состоит в следующем. В системе всегда есть два основных компонента: это считыватель и идентификатор (RFID-метка). Считыватель излучает в окружающее пространство электромагнитную энергию. Идентификатор принимает сигнал от считывателя и формирует ответный сигнал, который принимается антенной считывателя и обрабатывается его электронным блоком.

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

Система программ 1С:Предприятие поддерживает обмен данными с различным оборудованием RFID по согласованной технологии (рис.1).

Рис.1

Драйвер для считывателей RFID-меток должен быть реализован в соответствии с общей концепцией использования внешних компонент для взаимодействия с торговым оборудованием, подключаемым к системе программ 1С:Предприятие. Использование данного подхода позволяет упростить процесс подключения нового торгового оборудования к 1С:Предприятию.

Общие требования к драйверу:

Названия свойств и методов должны быть русскоязычными и англоязычными (например, Порт - Port, Скорость - Speed, Сигнал() – Signal()).

Также драйвер должен поддерживать множественные подключения (в соответствии с идеологией COM технологии) и поддерживать работу с несколькими устройствами.

При возникновении ошибки в работе драйвер должен сообщить об этом и передавать описание произошедшей ошибки.

Описание работы с драйвером

Начало работы с драйвером

Система 1С:Предприятие (в дальнейшем "система") инициализирует соединение с драйвером и загружает его. Далее устанавливаются конфигурационные параметры, необходимые для работы, и происходит подключение к устройству.

Система активизирует драйвер. После этого от драйвера могут поступать сообщения о наступлении внешнего события при появлении меток в поле считывателя. При этом передача данных о метках не ведется.

Работа с драйвером предполагается в активном и пассивном режимах. Пассивный режим подразумевает, что драйвер выполняет какие-либо действия в ответ на команды от системы. При активном режиме работы драйвер должен сам послать сообщение о внешнем событии по изменению своего внутреннего состояния.

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

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

При активном режиме и открытой сессии выполнение команд пассивного режима, а также попытки открыть еще одну сессию для того же логического устройства, должны блокироваться и драйвер должен возвращать сообщение об ошибке.

Примечание. Команды общего назначения выполняются независимо от режима и состояния сессии.

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

Чтение данных из меток

При пассивном режиме:

1. Дается команда на обнаружение меток в поле считывателя. В ответ возвращается количество обнаруженных RFID-меток.
2. Последовательно вызывается функция на получение данных из каждой обнаруженной метки*. Драйвер возвращает данные из меток. Команда посылается N раз, где N – количество обнаруженных меток.

* На радиочастотной метке может храниться код EPC (Electrinic Product Code, электронный код продукта). Это уникальный номер, определяющий конкретный товар (предмет).

При открытой сессии:

  1. Система дает команду на начало сессии на чтение.
  2. При появлении меток, или если метки уже находятся в поле считывателя, драйвер должен считать данные из них и передать системе. Определены следующие ситуации, когда следует передавать полученные данные из меток: Все перечисленные ситуации порождают одно и тоже внешнее событие "ЧтениеМеток". В течение сессии драйвер должен передать данные по каждой метке один единственный раз, т.е. драйвер должен "помнить", какие метки он уже передал. После отправки события драйвер должен приостановить отправку следующего и ожидать команды сверху о возможности продолжения отправки событий. Если результат обработки события положительный, то драйвер инициирует отправку следующего события, в противном случае требуется перепосылка последнего события, того, после которого драйвер приостановился. То есть из старых событий необходимо хранить только последнюю сформированную строку для отправки (при этом в драйвере при поступлении новые данные должны буферизироваться и высылаться по мере освобождения системы). Пример последовательности такой:
    • Отправка События 1;
    • Получен ответ СобытиеОбработано(Истина);
    • Отправка События 2;
    • Получен ответ СобытиеОбработано(Истина);
    • Отправка События 3;
    • Получен ответ СобытиеОбработано(Ложь);
    • Отправка События 3;
    • Получен ответ СобытиеОбработано(Ложь);
    • Отправка События 3;
    • Получен ответ СобытиеОбработано(Истина);
    • Отправка События 4;
    • Получен ответ СобытиеОбработано(Истина);
  3. По окончании процесса приема меток система дает команду на окончание сессии чтения. При этом драйвер не должен более передавать данные о метках наверх и не запоминать их. Также драйвер должен очистить информацию об обнаруженных метках, накопленных в течение сессии.

Запись данных в метки

Запись меток протекает в пассивном режиме:

  1. Посылается команда на отключение активного режима (если был включен).
  2. Дается команда на обнаружение меток в поле считывателя. В ответ возвращается количество обнаруженных RFID-меток.
  3. Вызывается функция на запись данных в метки. Драйвер записывает переданные данные во все обнаруженные метки. При этом производит проверку, что все метки были успешно записаны. В противном случае возвращает ошибку записи, и передает количество успешно прописанных меток.
  4. Восстанавливается предыдущий режим.

Состояния переходов между режимами

Состояния могут изменяться только последовательно:

"Пассивный" <=> "Активный" <=> "Сессия".

Все прочие попытки некорректного изменения состояния должны приводить к ошибке.

Например, нельзя из пассивного режима открыть сессию или переключить в пассивный режим, пока открыта сессия.

Завершение работы

По окончании работы с драйвером система закрывает соединение с устройством.

Соединение с драйвером закрывается только при завершении работы системы, либо при пересоздании объекта, связанного с драйвером.

Описание свойств

Описание свойств

Название (alias)

Тип

Доступность

Описание

Чтение Запись
 

 

     

Описание методов

Описание методов

Название (alias) – режим работы *  

Параметры

Возвращаемое значение

Описание

Имя

Тип

Описание

ПолучитьОшибку (GetLastError) – ОК ОписаниеОшибки
(ErrorDescription)

BSTR [OUT]

Описание ошибки

LONG

Возвращает код и описание последней произошедшей ошибки
Подключить (Open) – ОК МассивЗначений
(ValuesArray)

IDispatch*
[IN]

Массив значений для настройки подключения

BOOL

Подключает устройство для использования
ИДУстройства
(DeviceID)

BSTR
[OUT]

Идентификатор устройства
Отключить (Close) – ОК ИДУстройства
(DeviceID)

BSTR
[IN]

Идентификатор устройства

BOOL

Отключает устройство
ВключитьАктивныйРежим (EnableActiveMode) - КПР ИДУстройства
(DeviceID)

LONG
[IN]

Идентификатор устройства

BOOL

Включает активный режим
ВыключитьАктивныйРежим (DisableActiveMode) - КАР ИДУстройства
(DeviceID)

BSTR
[IN]

Идентификатор устройства

BOOL

Выключает активный режим
ОткрытьСессию (OpenSession) – КАР ИДУстройства
(DeviceID)

BSTR
[IN]

Идентификатор устройства

BOOL

Начинает сессию получения меток (из всех обнаруженных меток прочитанные данные передаются системе). Если сессия уже открыта, вернуть ошибку
ЗакрытьСессию (CloseSession) – КС ИДУстройства
(DeviceID)

BSTR
[IN]

Идентификатор устройства

BOOL

Заканчивает сессию работы с метками. Сессия, при наличии меток в поле считывателя, закрывается, только если параметр ИгнорироватьМеткиВПоле (IgnoreCardsInField) имеет значение Истина. Если сессия не была закрыта, то возвращается ошибка
ИгнорироватьМеткиВПоле (IgnoreCardsInField)

BOOL [IN]

Если Ложь, то при наличии в поле меток сессия не закрывается, в противном случае сессия остается открытой
КоличествоМеток (CardsCount)

LONG
[OUT]

Количество меток в поле при закрытии сессии
СессияОткрыта (SessionIsOpened) – ОК ИДУстройства
(DeviceID)

BSTR
[IN]

Идентификатор устройства

BOOL

Проверяет, была ли открыта сессия на чтение/запись
НайтиМетки (FindCards) – КПР ИДУстройства
(DeviceID)

BSTR
[IN]

Идентификатор устройства

BOOL

Осуществляет поиск меток в поле считывателя и возвращает количество обнаруженных меток
КоличествоМеток
(CardsCount)

LONG
[OUT]

Количество обнаруженных меток
СчитатьСледДанные (GetNextData) – КПР ИДУстройства
(DeviceID)

BSTR
[IN]

Идентификатор устройства

BOOL

Считать по очереди из каждой метки данные
ИДМетки (CardID)

BSTR
[OUT]

Идентификатор метки
ДанныеМетки
(CardData)

BSTR
[OUT]

Данные, записанные в метке
ЗаписатьДанные (WriteData) – КПР ИДУстройства
(DeviceID)

BSTR
[IN]

Идентификатор устройства

BOOL

Записывает переданные данные в метки, находящиеся в поле считывателя
Данные
(Data)

BSTR [IN]

Данные для записи в метки
Количество

LONG
[OUT]

Кол-во успешно прописанных меток
СобытиеОбработано
(EventProcessed) - ОК
ИДУстройства
(DeviceID)

BSTR
[IN]

Идентификатор устройства

BOOL

Оповещает драйвер о том, что событие системой было получено. Параметр "ФлагСостояния" указывает на успешность обработки.
ФлагСостояния
(StateFlag)

BOOL
[IN]

Флаг обработки события
ПодатьСигнал (Signal) – ОК ИДУстройства
(DeviceID)

BSTR
[IN]

Идентификатор устройства

BOOL

Подает сигнал на устройстве длительностью, указанной в параметре (если устройство поддерживает данную возможность)
Длительность (Duration)

LONG
[IN]

Длительность сигнала в мс.
ПоддерживаетПБ (AntistealBitSupported) - ОК ИДУстройства
(DeviceID)

BSTR
[IN]

Идентификатор устройства

BOOL

Данная функция проверяет, поддерживает ли оборудование работу с противокражным битом
УстановитьПБ (SetAntistealBit) - КПР ИДУстройства
(DeviceID)

BSTR
[IN]

Идентификатор устройства

BOOL

Функция устанавливает состояние противокражного бита в состояние установлен/снят в зависимости от передаваемого значения. Если Адрес метки передается пустой строкой, то установка бита происходит у всех меток в поле считывателя
АдресМетки
(CardAddress)

BSTR
[IN]

Идентификатор метки
Состояние
(State)

BOOL
[IN]

Режим установки/снятия противокражного бита
УстановитьПБ (SetAntistealBit) - КПР ИДУстройства
(DeviceID)

BSTR
[IN]

Идентификатор устройства

BOOL

Функция получает состояние противокражного бита
АдресМетки
(CardAddress)

BSTR
[IN]

Идентификатор метки
Состояние
(State)

BOOL
[OUT]

Режим получения противокражного бита
ТестУстройства (DeviceTest) МассивЗначений
(ValuesArray)

IDispatch*
[IN]

Массив значений для настройки подключения

BOOL

Выполняет пробное подключение и опрос устройства. При успешном выполнении подключения в описании возвращается описание устройства. При отрицательном результате возвращается описание возникшей проблемы при подключении.
ДополнительноеОписание (AdditionalDescription)

BSTR
[OUT]

Описание результата выполнения теста

* КАР команды активного режима; КПР – команды пассивного режима; КС - команды сессии; ОК – общие команды

Дополнительное описание:
«МассивЗначений» (пример значений для устройства, подключаемого на последовательном порту)
Тип данных "1С:Предприятия 8" - Массив.

Наименование параметра   Наличие в структуре Типы данных Описание параметра
Порт (Port) Необязательно LONG Номер последовательного порта
Скорость (Speed) Необязательно LONG Скорость, на которой происходит подключение
ТипУстройства (DeviceType) Необязательно LONG Тип устройства (по способу подключения)
РазделительМетки (CardDelimiter) Обязательно BSTR Символ, для разделения идентификатора метки и данных при передаче строки в событии «ЧтениеМеток»
ПредельноеКолвоМеток (CardsLimit) Обязательно LONG Предельное количество меток, после которого генерируется событие «ЧтениеМеток» (в соответствии с гл. 3.2 п. 2а)
Таймаут (Timeout) Обязательно LONG Таймаут, после которого при отсутствии изменения количества меток посылается событие (в миллисекундах)
МаксКоличМетокСобытия (EventMaxCardsCount) Обязательно LONG Максимальное количество меток, передаваемое в событии

Внешние события от драйвера

Во время подключения драйвер возвращает параметр "Идентификатор устройства". Данный параметр используется в дальнейшем драйвером для указания источника события (устройства) при отправке события, а также конфигурациями для определения связанной с событием обработки обслуживания. Идентификатор устройства должен быть уникальным для каждого подключения, для этого предлагается вести сопоставление «Подключенное устройство – Идентификатор устройства», добавляя новые строки при подключении к устройству и удаляя при отключении от него. Т.е. драйвер при вызове метода Подключить() должен сформировать новый идентификатор устройства (предлагается в качестве имени использовать GUID в виду простоты его получения программным путем) и передать в выходном параметре.
При наступлении событий в драйвере в систему можно посылать сообщение о возникновении внешнего события. При посылке сообщения о внешнем событии необходимо указать: источник внешнего события (Идентификатор устройства), наименование (тип) события и данные.

Описание аргументов события чтения из меток

Имя события – "ЧтениеМеток" ("CardsReading")

Событие наступает только при открытой сессии.

При получении данных от драйвера в виде строки необходимо их разобрать, проверить и погрузить в структуру (для удобства работы прикладного уровня). Наиболее подходящей для этих целей будет структура данных "Соответствие", где Ключу сопоставляется уникальный идентификатор метки, а в поле "Значение" записываются данные, считанные из метки.

Для передачи данных используется тип данных "Строка", поэтому ниже будет определена структура передаваемой строки с целью упрощения дальнейшего разбора.

Для драйвера определена следующая структура строки для передачи данных из меток:

<ИДМетки><РазделительМетки><Данные>#13<ИДМетки><РазделительМетки><Данные>#13<ИДМетки><РазделительМетки><Данные>#13 и т.д.
(<CardID><CardDelimiter><Data>#13<CardID><CardDelimiter><Data>#13<CardID><CardDelimiter><Data>#13 etc.),
где ‘<CardDelimiter>’ (настраиваемый параметр) и ‘#13’ (символ перевода строки) – специальные символы-разделители.

Максимальное количество меток в строке – количество, передаваемое в параметре при открытии сессии. Определяет то количество меток, которое прикладное решение готово отработать в одном событии.

Описание аргументов события в активном режиме

Имя события – "МеткаВПоле" ("CardDetected")

Данные – описание события.

Событие наступает если сессия не открыта, а в поле считывателя появилась одна или несколько меток. Повторное наступление события возможно только после исчезновения всех меток из поля считывателя.

Описание аргументов общих событий

Имя события – "ОшибкаВДрайвере" ("Error")

Данные – описание ошибки.

Событие наступает, если в процессе работы драйвера возникли ошибки.