RFID reader control library
Project description
sllurp is a Python library to interface with RFID readers. It is a pure-Python implementation of the Low Level Reader Protocol (LLRP).
These readers are known to work well with sllurp, but it should be adaptable with not much effort to other LLRP-compatible readers:
Impinj Speedway (R1000)
Impinj Speedway Revolution (R220, R420)
Impinj Speedway xPortal
Motorola MC9190-Z (handheld)
File an issue on GitHub if you would like help getting another kind of reader to work.
sllurp is distributed under version 3 of the GNU General Public License. See LICENSE.txt for details.
Quick Start
Install from PyPI:
$ virtualenv .venv $ source .venv/bin/activate $ pip install sllurp $ sllurp inventory ip.add.re.ss
Run sllurp --help and sllurp inventory --help to see options.
Or install from GitHub:
$ git clone https://github.com/ransford/sllurp.git $ cd sllurp $ virtualenv .venv $ source .venv/bin/activate $ pip install . $ sllurp inventory ip.add.re.ss
If the reader gets into a funny state because you’re debugging against it (e.g., if your program or sllurp has crashed), you can set it back to an idle state by running sllurp reset ip.add.re.ss.
Reader API
sllurp relies on Twisted for network interaction with the reader. To make a connection, create an LLRPClientFactory and hand it to Twisted:
# Minimal example; see inventory.py for more.
from sllurp import llrp
from twisted.internet import reactor
import logging
logging.getLogger().setLevel(logging.INFO)
def cb (tagReport):
tags = tagReport.msgdict['RO_ACCESS_REPORT']['TagReportData']
print 'tags:', tags
factory = llrp.LLRPClientFactory()
factory.addTagReportCallback(cb)
reactor.connectTCP('myreader', llrp.LLRP_PORT, factory)
reactor.run()
Getting More Information From Tag Reports
When initializing LLRPClientFactory, set flags in the tag_content_selector dictionary argument:
llrp.LLRPClientFactory(tag_content_selector={
'EnableROSpecID': False,
'EnableSpecIndex': False,
'EnableInventoryParameterSpecID': False,
'EnableAntennaID': True,
'EnableChannelIndex': False,
'EnablePeakRRSI': True,
'EnableFirstSeenTimestamp': False,
'EnableLastSeenTimestamp': True,
'EnableTagSeenCount': True,
'EnableAccessSpecID': False,
}, ...)
Logging
sllurp logs under the name sllurp, so if you wish to log its output, you can do this the application that imports sllurp:
sllurp_logger = logging.getLogger('sllurp')
sllurp_logger.setLevel(logging.DEBUG)
sllurp_logger.setHandler(logging.FileHandler('sllurp.log'))
# or .setHandler(logging.StreamHandler()) to log to stderr...
Handy Reader Commands
To see what inventory settings an Impinj reader is currently using (i.e., to fetch the current ROSpec), ssh to the reader and
> show rfid llrp rospec 0
The “nuclear option” for resetting a reader is:
> reboot
If You Find a Bug
Start an issue on GitHub!
Bug reports are most useful when they’re accompanied by verbose error messages. Turn sllurp’s log level up to DEBUG, which you can do by specifying the -d command-line option to sllurp. You can log to a logfile with the -l [filename] option. Or simply put this at the beginning of your own code:
import logger
sllurp_logger = logging.getLogger('sllurp')
sllurp_logger.setLevel(logging.DEBUG)
Known Issues
Reader mode selection is confusing, not least because the LLRP specification traditionally conflated ModeIndex and ModeIdentifier. If you’re using sllurp inventory, you probably want to use --mode-identifier N instead of -mode-index. Check your reader’s manual to see what mode identifiers it supports via the C1G2RFControl parameter, or run sllurp --debug inventory against a reader to see a dump of the supported modes in the capabilities description.
Contributing
Want to contribute? Here are some areas that need improvement:
Reduce redundancy in the encode_* and decode_* functions in llrp_proto.py.
Support the AccessSpec primitive (basis for tag read and write).
Write tests for common encoding and decoding tasks.
Make get_reader_config use the fabric library to connect to readers via SSH.
Generalize LLRP support beyond Impinj readers. Remove Impinj-specific assumptions.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file sllurp-0.2.5.tar.gz
.
File metadata
- Download URL: sllurp-0.2.5.tar.gz
- Upload date:
- Size: 39.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5d26a7b748a41f1cc6500134a6fb5c78534d27efe11bd2c5cbf74d5c9bff4929 |
|
MD5 | b5fe87b86d1b979f74381399c2948eef |
|
BLAKE2b-256 | 292948f64f9fd6bc1d7806c045ae164718993adb6d91977dc023fe013183dafe |
File details
Details for the file sllurp-0.2.5-py2.py3-none-any.whl
.
File metadata
- Download URL: sllurp-0.2.5-py2.py3-none-any.whl
- Upload date:
- Size: 48.0 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f8e65cd49b89aff25f7565e30c17283725ab31f56654ff63536aafeac055bcc1 |
|
MD5 | 1537fd28831ab60aafa7e57d23a41ad1 |
|
BLAKE2b-256 | b53709f9121f5c1862593fd4c4f666a304f09599147e91157731cabca87b73b5 |