Интеграция RFID оборудования в IT инфраструктуру
Методы интеграции RFID-оборудования FEIG Electronic в информационные системы предприятий: аппаратные возможности и программные средства
Рассматриваемые в разделе вопросы:
1. Общие вопросы интеграции
2. Средства и методы интеграции в информационные системы
2.1 Средство разработчика SDK: программные API-библиотеки, документация, примеры и исходные коды к ним
2.2 Текстовый протокол обмена "HOST - Устройство RFID" для любого интерфейса связи
2.3 Текстовый протокол обмена "HOST - Устройство RFID" при использовании интерфейса Ethernet
3. Средства и методы интеграции в 1С
4. Интеграция с различными системами без необходимости доработки ПО и модификации исходного кода системы
5. Интеграция с системами СКУД по интерфейсу Data/Clock (Wiegand или эмуляция карты с магнитной полосой)
6. Применение технологии LLRP
1. Общие вопросы интеграции
RFID-Оборудование FEIG Electronic имеет очень широкие возможности интеграции в информационные системы предприятия. Эти возможности обуславливаются тем, что продуктовая линейка FEIG Electronic достаточно широкая:
- устройства работают в различных частотных диапазонах (LF 125 кГц, HF 13.56 МГц, UHF 860-960 МГц);
- поддерживают различные стандарты, такие как ISO15693, ISO18000-3, ISO1800-6, EPC и другие стандарты, имеющие отношение к технологии радиочастотной идентификации;
- имеют различный форм-фактор, различное климатическое исполнение - существуют варианты корпусировки с высоким уровнем пыле-влагозащиты и для лабораторного применения;
- имеют различные сетевые коммуникационные интерфейсы - USB, Ethernet, RS232, RS485, DataClock (Wiegand, Magnec card emulation);
- есть ряд устройств, способных работать полностью автономно, другие работают под управлением информационной системы (под управлением хоста), большая часть устройств может работать даже под управлением микроконтроллера или программируемого логического контроллера;
- некоторые RFID-считыватели FEIG Electronic имеют реле и цифровые порты, с помощью которых можно управлять сторонним оборудованием. Также через цифровой порт, настроенный на вход, RFID-устройство может получать сигнал, например, активировать RF-поле на антенне, тем самым начать процесс инвентаризации по сигналу;
- все приборы RFID от FEIG Electronic являются не только считывателями, но и кодировщиками/программаторами RFID-меток.
- Host mode - устройство работает под управлением хоста. Например, ридер выполняет процедуру инвентаризации RFID-меток только по команде с хоста и возвращает перечень обнаруженных меток аналогично - только по команде. Хостом может выступать как ПК, так и микроконтроллер или ПЛК.
- Scan mode - это режим, аналогичный тому, что мы ежедневно наблюдаем при сканировании карточки Системы контроля доступа, приходя на работу или при сканировании карточки в метро - считыватель постоянно находится в режиме сканирования и как только наша RFID-карточка (или RFID-метка) оказывается в поле действия антенны, считыватель пересылает номер обнаруженной RFID-метки на контроллер или компьютер по интерфейсу USB, RS232, RS485 (в зависимости от наличия шины в устройстве). Этот режим часто применяется для подключения к СКУД, для интеграции применяется интерфейс Wiegand (если таковой предусмотрен в конкретной модели). RFID-Метка считывается автоматически, в зависимости от настроек прибора может считываться несколько раз с определенной периодичностью.
- Если устройство работает в режиме Scan Mode, ПК может обнаружить его драйвер Human Interface Device (HID). В этом случае все необходимые данные с RFID-метки могут вставляться в то окно программы, которое находится в фокусе, и где мерцает каретка ввода данных, то есть устройство может работать в режиме эмуляции клавиатуры. Это позволяет выделить еще один режим - HID Mode. RFID-Метка считывается автоматически, в зависимости от настроек прибора может считываться несколько раз с определенной периодичностью.
- Notification mode - устройство работает под управлением компьютера. Режим доступен только для приборов с интерфейсом Ethernet. При попадании новой RFID-метки в поле действия антенны считывателя на ПК поступает событие об обнаружении RFID-метки и данные из её памяти. RFID-Метка считывается автоматически, в зависимости от настроек прибора может считываться несколько раз с определенной периодичностью.
- Buffered mode - устройство работает под управлением компьютера. Режим доступен при работе с любым интерфейсом: USB, RS232, RS485 или Ethernet. Отличается от Notification mode тем, что ПК периодически опрашивает буфер считывателя на наличие RFID-меток. RFID-Метка считывается автоматически, в зависимости от настроек прибора может считываться несколько раз с определенной периодичностью.
2. Средства и методы интеграции RFID-оборудования в системы
2.1. Средство разработчика SDK: программные API-библиотеки, документация, примеры и исходные коды к ним
Программное обеспечение может быть написано с "нуля" - для ускорения процесса разработки за основу можете взять исходные коды из примеров FEIG (то есть использовать их как шаблон), но, также, применяя API-библиотеки, можно добавить функциональность работы с RFID считывателем в уже существующее ПО.
Основной особенностью SDK является то, что, написав программное обеспечение под одно из устройств линейки, например, настольный считыватель/программатор MRU102-USB, ПО без модификаций может работать и с другим устройствами линейки, например, со стационарным считывателем LRU1002. Притом, интерфейс подключения LRU1002 может быть любой (и USB, и Ethernet, и даже RS232). Подход справедлив в рамках устройств, работающих с одинаковыми стандартами RFID-меток: ISO15693, ISO14443 или EPC.
SDK имеет несколько модификаций:
- Под Windows, язык программирования С++ ID ISC.SDK.Win (DLLs, C++ Class Library, Samples)
- Под Windows, язык программирования C# (Visual Basic .NET) ID ISC.SDK.NET (DLLs, .NET Class Library, Samples)
- Под Linux, язык программирования С++ ID ISC.SDK.Linux (SOs, C++ Class Library, Samples)
- Под Linux Embedded, язык программирования С++ ID ISC.SDK.Linux_Embedded (SOs, C++ Class Library)
- Под Android, язык программирования С++ ID ISC.SDK.Android (SOs, C++ Class Library)
- Под MacOS, язык программирования С++ ID ISC.SDK.MacOSX (DYLIBs, C++ Class Library)
- Java -- ID ISC.SDK.Java (DLLs/SOs, Java Class Library, Samples)
- Под Windows CE, язык программирования C++ и C# ID ISC.SDK.WinCE (DLLs , C++ and . NET Class Libraries)
- Под Микролинукс, встроенный в контроллер FEIG в считывателях ID ISC.LR2500-A и LRU3x00 -- ID ISC.SDK.ACC-LR-FMB08 (SOs, C++ Class Library, Samples)
C# using OBID; int back = 0; long deviceID = 0; String scanListPara; FeUsb usbHelper = new FeUsb(); FeUsbScanSearch scanSearch = null; try { // подключаемся к первому попавшемуся RFID-считывателю // данное действие справедливо, если к ПК подключено только одно устройство // и мы знаем какое именно reader.ConnectUSB(0); ... // после подключения проверяем его статус и далее производим последующие действия } catch (Exception ex) { … } // Если к ПК подключено сразу несколько USB устройств, применяем другой алгоритм // сканирование шины и обход каждого устройства // (идентификация конкретной модели и серийного номера) try { // Сканируем шину USB и подключаемся к второму по порядку устройству // В качестве примера выбираем второе, по факту нужно перебирать все найденные устройства back = usbHelper.Scan(FeUsbScanSearch.SCAN_ALL, scanSearch); if(back == 0) { // вытаскиваем серийный номер устройства scanListPara = usbHelper.GetScanListPara(1, "Device-ID"); // для удобства серийный номер возвращается в 16-м представлении // для подключения требуется 10-е предст., // конвертируем с помощью встроенной функции SDK deviceID = FeHexConvert.HexStringToLong(scanListPara); // подключаемся к устройству reader.ConnectUSB(deviceID); ... // после подключения проверяем его статус и далее производим последующие действия } } catch (Exception ex) { … } |
C++ FEDM lib int back = 0; long dwDeviceID = 0; // подключаемся к первому попавшемуся RFID-считывателю // данное действие справедливо, если к ПК подключено только одно устройство // и мы знаем какое именно back = reader.ConnectUSB(0); if(back == 0) { // после подключения проверяем его статус и далее производим последующие действия } // также к RFID-считывателю можно подключиться по его Device-ID back = reader.ConnectUSB(dwDeviceID); ****************************************************************** С++ FEUSB and FEISC libs int back = 0; int iPortHandle = 0; int iReaderHandle = 0; long dwDeviceID = 0; char cDeviceID[16]; // C iPortHandle = FEUSB_ScanAndOpen(FEUSB_SCAN_FIRST, NULL); if(iPortHandle > 0) { // create new Reader object and connect with USB device object in FEUSB iReaderHandle = FEISC_NewReader(iPortHandle); if(iReaderHandle > 0) { // for all OBID® USB-Reader recommended (except for CPR.04-U) FEISC_SetReaderPara(iReaderHandle, "FrameSupport", "Advanced"); } } // Если к ПК подключено сразу несколько USB-устройств, применяем другой алгоритм // сканирование шины и обход каждого устройства // (идентификация конкретной модели и серийного номера) // Сканируем шину USB и подключаемся к второму по порядку устройству. // В качестве примера выбираем второе, по факту нужно перебирать все найденные устройства back = FEUSB_Scan(FEUSB_SCAN_ALL, NULL); if(back == 0) { if( FEUSB_GetScanListPara(1, "Device-ID", cDeviceID) == 0 ) { sscanf((const char*)cDeviceID, "%lx", &dwDeviceID); // подключаемся к устройству iPortHandle = FEUSB_OpenDevice(dwDeviceID); if( iPortHandle < 0 ) { // обработка ошибки и выдача всех соответствующих уведомлений } else { // после подключения проверяем его статус и далее производим последующие действия } } } |
Java import de.feig.*; int back = 0; long deviceID = 0; String scanListPara; FeUsb usbHelper = new FeUsb(); FeUsbScanSearch scanSearch = null; try { // подключаемся к первому попавшемуся RFID-считывателю // данное действие справедливо, если к ПК подключено только одно устройство // и мы знаем какое именно reader.ConnectUSB(0); ... // после подключения проверяем его статус и далее производим последующие действия } catch (Exception ex) { … } // Если к ПК подключено сразу несколько USB-устройств, применяем другой алгоритм // сканирование шины и обход каждого устройства // (идентификация конкретной модели и серийного номера) try { // Сканируем шину USB и подключаемся к второму по порядку устройству // В качестве примера выбираем второе, по факту нужно перебирать все найденные устройства back = usbHelper.scan(FeUsbScanSearch.SCAN_ALL, scanSearch); if(back == 0) { // вытаскиваем серийный номер устройства scanListPara = usbHelper.getScanListPara(1, "Device-ID"); // для удобства серийный номер возвращается в 16-м представлении // для подключения требуется 10-е предст., // конвертируем с помощью встроенной функции SDK deviceID = FeHexConvert.hexStringToLong(scanListPara); // подключаемся к устройству reader.connectUSB(deviceID); ... // после подключения проверяем его статус и далее производим последующие действия } } catch (Exception ex) { … // обработка ошибки и выдача всех соответствующих уведомлений } |
2.2. Текстовый протокол обмена "HOST - Устройство RFID"
Для решения вышеозвученной задачи можно применить так называемый "Текстовый/байтовый протокол обмена". В этом случае хост и RFID-считыватель будут обмениваться строками, а точнее байтовыми посылками, содержащими команды и данные из памяти RFID-метки. Также данный подход можно применить, если в качестве хоста выступает и обычный персональный компьютер.
К каждому устройству прилагается документ под названием "System manual" или просто "Manual". Этот документ содержит детально описание всех системных команд считывателя и описание протокола персылки информации. Ниже приводится изображение двух страниц руководства с описанием протокола процедуры "Инвентаризация".
Команда, которая посылается с хоста на RFID-считыватель "B0 01 00" означает, что мы хотим провести операцию "Инвентаризация" (то есть хотим опросить, какие метки находятся в зоне действия антенны), не указывая при этом дополнительные параметры. Для работы с протоколом не обязательно дословно изучать его содержимое, существует другой подход - взять за основу дамп (слепок) пересылки информации, зачитанный из программного обеспечения ISOStart (данное ПО предоставляется бесплатно и входит в комплект поставки). Более того, с применением ПО ISOStart можно моделировать все процессы, которые предполагается реализовать в алгоритмах создаваемого программного обеспечения: выполнять команды настройки ридера и функции работы с памятью RFID-метки!
Ниже приводится изображение экранной формы ISOStart при проведении операции "Инвентаризация". В параметрах посылки активируем встроенный в ридер мультиплекосор с коммутацией на антенны №1 и №2. В верхней половине формы указываются данные по проводимой операции, а в нижней (Protocol) дамп, в котором детально расписано содержимое пересылки данных, а именно, "Запрос" и "Ответ".
2.3. Текстовый протокол обмена "HOST - Устройство RFID" при использовании интерфейса Ethernet
Общий подход таков, что считыватель переводится в один из предпочтительных режимов (кроме Scan-mode), и общение происходит через объект типа Socket.
Ниже приведем пример под C#, в котором демонстрируется процесс запроса времени считывателя по интерфейсу Ethernet (например, для проверки рассинхронизации времени с часами ПК).
C# // Применение библиотек API FEIG не предусмотрено. // Работа производится на основе текстового/байтового протокола IPEndPoint ip = new IPEndPoint(IPAddress.Parse(readerip), readerport); Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { // пытаемся соединиться со считывателем server.Connect(ip); } catch (SocketException) { // если мы не смогли соединиться, то выводим сообщение об ошибке return; } byte[] data = null; data = new byte[7]; // общие данные для синхронизации времени с LRU1002 data[0] = 0x02; data[1] = 0x00; data[2] = 0x07; data[3] = 0xFF; data[4] = 0x86; // команда запроса времени GetSystemTimer data[5] = 0xFB; // Контрольная сумма посылки data[6] = 0xB4; // // пересылаем данные с компьютера на ридер int res = server.Send(data); // формируем буфер, в который будем принимать данные от ридера byte[] dataGet = new byte[256]; server.ReceiveTimeout = 3000; try { // смотрим, что получили по результатам пересылки данных int receivedDataLength = server.Receive(dataGet); // переносим данные из байтового массива в строку string strDataGet = BitConverter.ToString(dataGet, 0, receivedDataLength); strDataGet = strDataGet.Replace("-", " "); // Отработка дальнейшего алгоритма. В строке strDataGet содержится время, которое мы запрашивали у ридера. ... } catch (Exception) { // при возникновении ошибки выводим сообщение ... return; } |
При работе считывателя в режиме Notification Mode удобно пользоваться объектами типа Listener. В этом случае программное обеспечение производит мониторинг указанного порта по своему IP-адресу. Предварительно в параметрах считывателя нужно указаывать номер порта и IP-адрес хоста, куда именно персылать данные.
C# // Применение библиотек API FEIG не предусмотрено. // Работа производится на основе текстового/байтового протокола void startListener() { // Указываем IP адрес ПК, с которого работаем IPAddress localIPs = IPAddress.Parse(hostip); // Указываем номер порта, который будем слушать Int32 port = hostport; // начинаем слушать порт tcpListener = new TcpListener(localIPs, port); bWaitForConnection = true; // Устанавливаем флаг начала работы myThread = new Thread(func); // Создаем новый объект потока (Thread) myThread.Start(); // Запускаем поток } // обработчик потока void func() { // крутимся в бесконечном цикле до тех пор, пока работает ПО while (bWaitForEndProgramm) { try { // начинаем слушать порт с указанными параметрами tcpListener.Start(); // выполняем блокирующую команду // также можно выполнить server.AcceptSocket(). TcpClient client = tcpListener.AcceptTcpClient(); // получаем поток для чтения и записи NetworkStream stream = client.GetStream(); ... // циклически опрашиваем буфер сокета try { while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) { ... // далее полученные данные обрабатываем любыми алгоритмами } } catch (Exception) { ... } } } catch (Exception) { // при возникновении ошибки выводим сообщение ... return; } } |
3. Средства и методы интеграции в 1С
Разработчики ISBC RFID подготовили расширение конфигурации для прикладных решений 1С Предприятие 8.3., которое принимает данные от программы GetTag.О способах интеграции с 1С можно узнать в Руководстве по передаче данных из RFID-считывателей в 1С.
4. Интеграция с различными системами без необходимости доработки ПО и модификации исходного кода системы
Данный способ интеграции подходит практически для любой программы, где есть текстовое поле ввода данных, в том числе, способ работает даже с Excel.
Ниже представлена картинка с демонстрацией проведения сканирования меток ручным сканером FEIG PRHD-102-Bluetooth, данные с метки автоматически попадают в ПО, открытое на обычном коммуникаторе.
При использовании данного подхода внедрение RFID происходит по принципу - «Без привлечения программиста / ни строчки кода». Именно по такому принципу достаточно часто интегрируются штрих-код сканеры.
5. Интеграция с системами СКУД по интерфейсу Data/Clock (Wiegand или эмуляция карты с магнитной полосой)
Некоторые модели считывателей FEIG Electronic имеют цифровой интерфейс Data/Clock, с помощью которого легко можно организовать пересылку данных о метке по протоколу Wiegand. Например, из UHF или HF метки можно зачитывать определенные сектора и формировать протокол Wiegand 26, который поддерживается практически всеми контроллерами СКУД, которые представлены на отечественном и зарубежных рынках.
В настоящее время наиболее востребованной задачей является "Идентификация транспорта". Применяя RFID-считыватель FEIG Electronic LRU1002-UHF можно легко привнести в обычную систему функциональность UHF, отличительной особенностью которой является исключительная дальность считывания меток - до 16 и более метров (дальность настраивается программно и аппаратно). Таким образом, для решения задачи открытия шлагбаума или ворот можно применить СКУД-контроллер практически любого производителя и считыватель FEIG, в последующем для настройки прав доступа, администрирования системы пользоваться программным обеспечением производителя СКУДа.
Схема работы RFID-считывателя и контроллера СКУД демонстрируется на рисунке ниже.
6. Применение технологии LLRP
Для работы некоторых считывателей FEIG Electronic в составе ИС предприятия можно пользоваться программной оболочкой с протоколом LLRP (Low level reader protocol). На текущий момент LLRP оболочка доступна для считывателей LRU3000/3500/1002, MRU102. LLRP - стандартный протокол обмена данными с ридером, утвержденный международной организацией EPCGlobal Inc.