10 марта 2015 - Дмитрий Виноградов

Основы работы с Шиной RFID через WebSocket

Шина RFID имеет в своём арсенале несколько интеграционных интерфейсов: бинарный Protocol Buffers и текстовый WebSocket. В формате небольших заметок, я расскажу о использовании WebSocket на примерах веб-приложений.

Что же такое WebSocket в Шине RFID? Это один из двух кроссплатформенных интерфейсов через которые Шина RFID взаимодействует с внешним миром. Как и через Protocol Buffers, посредством WebSocket можно полнофункционально управлять объектами Шины RFID: доступом, считывателями, принтерами, СКУД, а так же разрабатывать мобильные приложения для ТСД. В отличии от машинно-ориентированного бинарного Protocol Buffers, внутри WebSocket бегают дружественные к JavaScript и человеку JSON объекты.

Пример работы с Шиной RFID из браузера. Вывод JSON-объектов происходит в консоль JavaScript браузера.

See the Pen Readers.ObserveTags by Dmitry (@vshekun) on CodePen.

 

Подключение к Шине RFID

После установки соединения с WebSocket, требуется пройти авторизацию. Авторизация в Шине RFID осуществляется двумя способами: через пару логин/пароль или временный токен предыдущей сессии. При отправке сообщения с тремя заполненными полями приоритет отдается токену сессии.

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

{"Name":"Authorize", "Login":"demo", "Password":"demo"}
{"Name":"AuthorizeResponse", "Token":635466434693620832, "Details":null, "Status":1}

Получение списка RFID считывателей

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

{"Name":"GetReaders"}
{"Name":"GetReadersResponse",
"Details":null,
"Status":1,
"Readers":[
	{
	"Id":"6275cf41-7196-4f97-9855-c55b517e9788",
	"Name":"Impinj R420", 
	"Description":"Считыватель в кабинете 101", 
	"ReaderType":0, 
	"Device":
		{
		"Id":"e4cbad53-b4c3-4ca3-b3f8-87642b9f4788",
		"Name":"LLRP device",
		"Description":"Library to work with LLRP devices."
		},
	"IsOpen":true,
	"Mode":0,
	"IsActive":true,
	"DeactivatedBy":0,
	"DeactivationReason":null
	},
	{
	"Id":"350a185f-f7da-4ca3-a18b-ebcb428c5872",
	"Name":"FEIG ID CPR50.10-E",
	"Description":"",
	"ReaderType":0,
	"Device":
		{
		"Id":"abff320d-538c-4e2d-9fd7-499ae57c76fa",
		"Name":"FEIG ID CPR50.10-E",
		"Description":"Module to work with FEIG ID CPR50.10-E."
		},
	"IsOpen":false,
	"Mode":0,
	"IsActive":false,
	"DeactivatedBy":2,
	"DeactivationReason":""
	}
]
} 

Регистрация RFID меток

Чтобы считыватели начали передавать клиентскому приложению идентификаторов RFID меток находящихся в поле видимости антенн, нужно выполнить две команды:

  • подписать клиент на общие события считывателя
{"Name":"SubscribeToReader","ReaderId":"6275cf41-7196-4f97-9855-c55b517e9788"}
{"Name":"SubscribeToReaderResponse","Details":null,"Status":1}
  • перевести устройство в режим чтения
{"Name":"StartReading","ReaderId":"6275cf41-7196-4f97-9855-c55b517e9788"}
{"Name":"StartReadingResponse","Details":null,"Status":1}

С этого момента, Шина RFID начнет передавать клиенту события считывателя:

  • TransponderFoundEvent — нахождение метки;
  • TransponderLostEvent — потеря метки;
  • OnReaderGpiStatesChangedEvent — изменение состояния GPI (General-purpose input).
{"Name":"TransponderFoundEvent",
"ReaderRecord":{
    "Id":"6275cf41-7196-4f97-9855-c55b517e9788",
    "Name":"Impinj R420",
    "Description":"Считыватель в кабинете 101",
    "ReaderType":0,
    "Device":{
        "Id":"e4cbad53-b4c3-4ca3-b3f8-87642b9f4788",
        "Name":"LLRP device",
        "Description":"Library to work with LLRP devices."
    },
    "IsOpen":true,
    "Mode":1,
    "IsActive":true,
    "DeactivatedBy":0,
    "DeactivationReason":null
},
"Transponders":[
    {
    "Type":19,
    "Id":"MDlgYwPK5EAAB8Qt",
    "Antenna":1,
    "Data":null,
    "BlockSize":2,
    "Extended":{
        "Groups":[],
        "Items":[],
        "IsEmpty":false
        },
    "IdAsString":"3039606303CAE4400007C42D"
    }
]}

 Декодирование EPC

Шина RFID умеет декодировать EPC, для включения этой функциональности нужно оправить команду включения декодирования на считыватель:

 {"Name":"EnableDecodeEpc","ReaderId":"6275cf41-7196-4f97-9855-c55b517e9788"}

После её выполнения, в поле Extended события TransponderFoundEvent появится информация о типе и свойствах EPC:

{"Name":"TransponderFoundEvent",
"ReaderRecord":{
    "Id":"6275cf41-7196-4f97-9855-c55b517e9788",
    "Name":"Impinj R420",
    "Description":"Считыватель в кабинете 101",
    "ReaderType":0,
    "Device":{
        "Id":"e4cbad53-b4c3-4ca3-b3f8-87642b9f4788",
        "Name":"LLRP device",
        "Description":"Library to work with LLRP devices."
    },
    "IsOpen":true,
    "Mode":1,
    "IsActive":true,
    "DeactivatedBy":0,
    "DeactivationReason":null
},
"Transponders":[
    {
    "Type":19,
    "Id":"MDlgYwPK5EAAB8Qt",
    "Antenna":1,
    "Data":null,
    "BlockSize":2,
    "Extended":{
        "Groups":[
            {
            "Name":"Epc","Items":[
                {"Name":"Type","Value":"48"},
                {"Name":"Filter","Value":"1"},
                {"Name":"Gcp","Value":"360844"},
                {"Name":"Item","Value":"994193"},
                {"Name":"Serial","Value":"508973"}
            ],
            "IsEmpty":false
            }
        ],
        "Items":[],
        "IsEmpty":false
        },
    "IdAsString":"3039606303CAE4400007C42D"
    }
]}