1 марта 2017 - Дмитрий Виноградов

Шина RFID: HTTP API

В Шине RFID, кроме уже привычного JSON WebSocket, библиотек для .NET и 1С, появилось полнофункциональное HTTP API. Для демонстрации возможностей новинки воспользуемся утилитой curl.

 

Работа с HTTP начинается с авторизации:

$ curl -i -X POST \
       -H 'Content-Type: application/json' \
       -d '{ "Password": "demo","Login":"demo"}' \
       'http://demo.rfidbus.rfidcenter.ru/v1/login'

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{"Token":617585670490555,"Status":0}

Как Вы можете увидеть, она не сильно отличается от авторизации через WebSocket.

Теперь у нас есть своя сессия, в которой мы управляем оборудованием и его событиями. Сессия отвечает за “жадный” режим захвата считывателя в режиме чтения. Например, если сессия А перевела считыватель в режим чтения, то сессия Б не сможет перевести его в режим ожидания, пока этого не сделает сессия А или пока сессия А не будет завершена.

Токен сессии передаётся в заголовке HTTP запроса X-RfidBus-Token. HTTP сессия существует до тех пор, пока она не будет закрыта или не будет перезагружена Шина RFID.

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

Список считывателей:

$ curl -i -X POST \
	-H 'X-RfidBus-Token: 617585670490555' \
	-H 'Content-Type: application/json' \
	-d '{"Name":"GetReaders"}' \
	'http://demo.rfidbus.rfidcenter.ru/v1/sendmessage'

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{"Readers": [{"Id": "3df6128a-1dd7-4f42-a53d-f0ff012b15e7","Name": "Emulator Simple 1","Description": "Simple mode\nfirst:  300833B2DDD9014000AA0008\ncount:  4\ntimeout:  10 sec","ReaderType": 0,"Device": {"Id": "00000000-2c95-4576-9339-0e2f680dd14e","Name": "RFID Reader Emulator","Description": "Module to work with RFID Reader device emulator"},"IsOpen": true,"Mode": 0,"IsActive": true,"DeactivatedBy": 0,"DeactivationReason": null},{"Id": "1b726f44-bdd9-409b-a119-cb03e14a4159","Name": "Emulator Extended 1","Description": "Extended mode\nprefix:  300833B2DDD90140000000\ncount:  3\ntimeout:  120 sec","ReaderType": 0,"Device": {"Id": "00000000-2c95-4576-9339-0e2f680dd14e","Name": "RFID Reader Emulator","Description": "Module to work with RFID Reader device emulator"},"IsOpen": true,"Mode": 0,"IsActive": true,"DeactivatedBy": 0,"DeactivationReason": null}],"Details": null,"Status": 1,"Name": "GetReadersResponse"}

 Подпишемся на события какого-нибудь считывателя:

$ curl -i -X POST \
	-H 'X-RfidBus-Token: 617585670490555' \
	-H 'Content-Type: application/json' \
	-d '{"Name":"SubscribeToReader", "ReaderId":"3df6128a-1dd7-4f42-a53d-f0ff012b15e7"}' \
	'http://demo.rfidbus.rfidcenter.ru/v1/sendmessage'

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{"ReaderId":"3df6128a-1dd7-4f42-a53d-f0ff012b15e7", "Details":null, "Status":1, "Name":"SubscribeToReaderResponse"}

Переводим считыватель в режим чтения:

curl -i -X POST \
	-H 'X-RfidBus-Token: 617585670490555' \
	-H 'Content-Type: application/json' \
	-d '{"Name":"StartReading", "ReaderId":"3df6128a-1dd7-4f42-a53d-f0ff012b15e7"}' \
	'http://demo.rfidbus.rfidcenter.ru/v1/sendmessage'

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{"ReaderId":"3df6128a-1dd7-4f42-a53d-f0ff012b15e7", "Details":null, "Status":1, "Name":"StartReadingResponse"}

Периодически чистим буффер, забирая события считывателей:

$ curl -i -X GET \
	-H 'X-RfidBus-Token: 617585670490555' \
	-H 'Content-Type: application/json' \
	'http://demo.rfidbus.rfidcenter.ru/v1/events'

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

[{"ReaderRecord": {"Id": "3df6128a-1dd7-4f42-a53d-f0ff012b15e7","Name": "Emulator Simple 1","Description": "Simple mode\nfirst: 300833B2DDD9014000AA0008\ncount: 4\ntimeout: 10 sec","ReaderType": 0,"Device": {"Id": "00000000-2c95-4576-9339-0e2f680dd14e","Name": "RFID Reader Emulator","Description": "Module to work with RFID Reader device emulator"},"IsOpen": true,"Mode": 1,"IsActive": true,"DeactivatedBy": 0,"DeactivationReason": null},"TransponderFoundEvents": [{"Transponders": [{"Type": 19,"Id": "MAgzst3ZAUAAqgAJ","Antenna": 2,"Data": "AAAAAA==","BlockSize": 2,"Extended": {"Name": null,"IsEmpty": true,"Groups": [],"Items": []},"IdAsString": "300833B2DDD9014000AA0009","Rssi": -37.42},{"Type": 19,"Id": "MAgzst3ZAUAAqgAL","Antenna": 4,"Data": "AAAAAA==","BlockSize": 2,"Extended": {"Name": null,"IsEmpty": true,"Groups": [],"Items": []},"IdAsString": "300833B2DDD9014000AA000B","Rssi": -49.84}],"DateTime": "2017-02-26T16:09:32.4560026Z"}],"TransponderLostEvents": [],"ReaderGpiStatesChangedEvents": []}]

Также существует второй режим передачи событий, где актором выступает уже Шина RFID:

curl -i -X POST \
	-H 'X-RfidBus-Token: 617585670490555' \
	-H 'Content-Type: application/json' \
	-d '{"Uri":"http://127.1:3333"}' \
	'http://demo.rfidbus.rfidcenter.ru/v1/subscribe'

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

Теперь все события будут пересылаться POST-методом на ресурс http://127.0.0.1:3333. Этот функционал на демо-сервере закрыт.

А теперь завершим работу сессии:

curl -i -X GET \
	-H 'X-RfidBus-Token: 617585670490555' \
	-H 'Content-Type: application/json' \
	'http://demo.rfidbus.rfidcenter.ru/v1/logout'

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8