pyllrp


Namepyllrp JSON
Version 3.1.1 PyPI version JSON
download
home_pagehttp://www.sites.google.com/site/crossmgrsoftware/
SummaryA complete implementation of LLRP (Low Level Reader Protocol) in pure Python.
upload_time2024-08-12 13:02:23
maintainerNone
docs_urlNone
authorEdward Sitarski
requires_python>=3.8
license Copyright (C) 2013-2019 Edward Sitarski Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords llrp rfid impinj reader
VCS
bugtrack_url
requirements bitstring
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # pyllrp

A 100% complete, pure Python implementation of LLRP (Low Level Reader Protocol) also with 100% support for Impinj extensions.

Communicate with LLRP-compliant RFID readers including Impinj, Alien and ThingMagic.
See the [LLRP spec](https://www.gs1.org/sites/default/files/docs/epc/llrp_1_0_1-standard-20070813.pdf) for full details.

__pyllrp__ supports quick-and-easy scripting in portable Python to
create LLRP applications.

It is used extensively in [CrossMgr](https://github.com/esitarski/CrossMgr) (CrossMgrImpinj and TagReadWrite) and [RaceDB](https://github.com/esitarski/RaceDB) for race timing.

All LLRP features and the full Impinj extension is supported:

* Message and Parameters are Python classes.
* 100% runtime validation of all LLRP Messages and Parameters including data types, data ranges, parameter sequence and count.
* 100% support for constant values - no hardcoded values necessary.
* Impossible to pass incorrect or malformed LLRP messages to the reader.

See TinyExample.py for how to use.

A reader connection manager is also included that can connect to a reader, transact commands,
and/or start/stop a thread to listen for tag reads.
A message handler callback can be configured to respond to reader messages in your code.

See wxExample.py for a simple method to show reader messages in
a wxPython application with a Queue (requires wxPython).

The module also supports reading and writing messages in XML format, however, I find it just as easy to create the messages in Python code.

pyllrp is picky about LLRP Messages, Parameters and data types.
For example, pyllrp passing ints as bools won't work; if the value must be True/False, 1/0 won't work.
The names of all non-default fields must be specified, with the exception of Parameters which have only one field.
In this case, the single parameter can be passed in the constructor.

## How to use it:

import pyllrp and follow the example.
TinyExample.py shows how to formulate LLRP specs, messages and parameters.
To run TinyExample, from the top pyllrp directory, enter "python3 -m pyllrp.TinyExample".


## How it works:

ParseDef.py reads the LLRP XML spec file and compiles it into a dict which it pretty-prints to a file called llrpdef.py.
ParseDef must be run every time the XML files change.

pyllrp.py imports llrpdef.py and converts the Messages, Parameters and Enums into runtime classes.
It adds the binary pack/unpack methods, data validation and human-readable formating functions to each class.
Startup time is minimal due to the llrpdef.py pre-processing, and this augementation is only done once.

Unlike other LLRP interfaces which sometimes combine messages and parameters into one call, pyllrp requires that you follow the LLRP spec accurately.
If in doubt, check the LLRP spec and follow it exactly.

## Future work:

Because the classes are created dynamically, python linters (eg. flake8) create lots of warnings for __pyllrp__ calls.
This could be migitated by code generating the full classes in llrpdef.py.
But, this is likely slower and less memory efficient than the current approach.

            

Raw data

            {
    "_id": null,
    "home_page": "http://www.sites.google.com/site/crossmgrsoftware/",
    "name": "pyllrp",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "LLRP, RFID, Impinj Reader",
    "author": "Edward Sitarski",
    "author_email": "Edward Sitarski <edward.sitarski@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/95/36/45330d9d798d2e9f7bcb621cfc2a2b0332fcc665c151c7a95fbad4c3ad6f/pyllrp-3.1.1.tar.gz",
    "platform": null,
    "description": "# pyllrp\n\nA 100% complete, pure Python implementation of LLRP (Low Level Reader Protocol) also with 100% support for Impinj extensions.\n\nCommunicate with LLRP-compliant RFID readers including Impinj, Alien and ThingMagic.\nSee the [LLRP spec](https://www.gs1.org/sites/default/files/docs/epc/llrp_1_0_1-standard-20070813.pdf) for full details.\n\n__pyllrp__ supports quick-and-easy scripting in portable Python to\ncreate LLRP applications.\n\nIt is used extensively in [CrossMgr](https://github.com/esitarski/CrossMgr) (CrossMgrImpinj and TagReadWrite) and [RaceDB](https://github.com/esitarski/RaceDB) for race timing.\n\nAll LLRP features and the full Impinj extension is supported:\n\n* Message and Parameters are Python classes.\n* 100% runtime validation of all LLRP Messages and Parameters including data types, data ranges, parameter sequence and count.\n* 100% support for constant values - no hardcoded values necessary.\n* Impossible to pass incorrect or malformed LLRP messages to the reader.\n\nSee TinyExample.py for how to use.\n\nA reader connection manager is also included that can connect to a reader, transact commands,\nand/or start/stop a thread to listen for tag reads.\nA message handler callback can be configured to respond to reader messages in your code.\n\nSee wxExample.py for a simple method to show reader messages in\na wxPython application with a Queue (requires wxPython).\n\nThe module also supports reading and writing messages in XML format, however, I find it just as easy to create the messages in Python code.\n\npyllrp is picky about LLRP Messages, Parameters and data types.\nFor example, pyllrp passing ints as bools won't work; if the value must be True/False, 1/0 won't work.\nThe names of all non-default fields must be specified, with the exception of Parameters which have only one field.\nIn this case, the single parameter can be passed in the constructor.\n\n## How to use it:\n\nimport pyllrp and follow the example.\nTinyExample.py shows how to formulate LLRP specs, messages and parameters.\nTo run TinyExample, from the top pyllrp directory, enter \"python3 -m pyllrp.TinyExample\".\n\n\n## How it works:\n\nParseDef.py reads the LLRP XML spec file and compiles it into a dict which it pretty-prints to a file called llrpdef.py.\nParseDef must be run every time the XML files change.\n\npyllrp.py imports llrpdef.py and converts the Messages, Parameters and Enums into runtime classes.\nIt adds the binary pack/unpack methods, data validation and human-readable formating functions to each class.\nStartup time is minimal due to the llrpdef.py pre-processing, and this augementation is only done once.\n\nUnlike other LLRP interfaces which sometimes combine messages and parameters into one call, pyllrp requires that you follow the LLRP spec accurately.\nIf in doubt, check the LLRP spec and follow it exactly.\n\n## Future work:\n\nBecause the classes are created dynamically, python linters (eg. flake8) create lots of warnings for __pyllrp__ calls.\nThis could be migitated by code generating the full classes in llrpdef.py.\nBut, this is likely slower and less memory efficient than the current approach.\n",
    "bugtrack_url": null,
    "license": " Copyright (C) 2013-2019 Edward Sitarski  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ",
    "summary": "A complete implementation of LLRP (Low Level Reader Protocol) in pure Python.",
    "version": "3.1.1",
    "project_urls": {
        "Homepage": "https://github.com/esitarski/pyllrp",
        "Issues": "https://github.com/esitarski/pyllrp/issues",
        "Repository": "https://github.com/esitarski/pyllrp"
    },
    "split_keywords": [
        "llrp",
        " rfid",
        " impinj reader"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a4a83886585ea39cab3a209b86427bb8914d3134e8f9c4b48dc49f47120c602f",
                "md5": "ced4be496a33a36737240e4802384978",
                "sha256": "c27f71d461e5e14eb4230f221f49e92ebdbd8c7a2121824c74d479335565ddcd"
            },
            "downloads": -1,
            "filename": "pyllrp-3.1.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "ced4be496a33a36737240e4802384978",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 39848,
            "upload_time": "2024-08-12T13:02:21",
            "upload_time_iso_8601": "2024-08-12T13:02:21.925489Z",
            "url": "https://files.pythonhosted.org/packages/a4/a8/3886585ea39cab3a209b86427bb8914d3134e8f9c4b48dc49f47120c602f/pyllrp-3.1.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "953645330d9d798d2e9f7bcb621cfc2a2b0332fcc665c151c7a95fbad4c3ad6f",
                "md5": "c046e396717a763509bd1a3692517d9c",
                "sha256": "4cf9e4203a16242615d257a79b604267ca12cf778d450e684b392d5aeeec6966"
            },
            "downloads": -1,
            "filename": "pyllrp-3.1.1.tar.gz",
            "has_sig": false,
            "md5_digest": "c046e396717a763509bd1a3692517d9c",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 38404,
            "upload_time": "2024-08-12T13:02:23",
            "upload_time_iso_8601": "2024-08-12T13:02:23.009546Z",
            "url": "https://files.pythonhosted.org/packages/95/36/45330d9d798d2e9f7bcb621cfc2a2b0332fcc665c151c7a95fbad4c3ad6f/pyllrp-3.1.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-08-12 13:02:23",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "esitarski",
    "github_project": "pyllrp",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "bitstring",
            "specs": []
        }
    ],
    "lcname": "pyllrp"
}
        
Elapsed time: 0.91034s