{ "info": { "author": "Christian Sandberg", "author_email": "christiansandberg@me.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Framework :: AsyncIO", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Topic :: Scientific/Engineering" ], "description": "ISO-TP for asyncio Python\n=========================\n\nThis package implements ISO-TP_ over CAN as an asyncio_ transport layer,\nenabling simultaneous receiving and transmitting messages with any number\nof connections.\n\nRaw CAN communication uses python-can_ which offers compatibility for many\ndifferent CAN interfaces and operating systems.\n\nIf SocketCAN `ISO-TP module`_ is loaded and Python 3.7+ is used, the transport is\ndelegated to the kernel if possible for better timing performance.\nUse the 'socketcan' interface. If unsuccessful, raw CAN will be used as fallback.\n\nThe isotpserver from `can-utils`_ can also be used to bridge a SocketCAN ISO-TP\nconnection over TCP/IP.\nUse the 'isotpserver' interface and 'host:port' as channel.\n\n\nWhy asynchronous?\n-----------------\n\nAsynchronous programming simplifies some possible use-cases:\n\n* Full duplex receiving and transmitting on a single connection.\n* Communicate on multiple connections simultaneously.\n* Functional addressing where one request is sent out and all nodes respond,\n then processing the responses as they arrive.\n* Implementing or simulating multiple servers.\n\nNo threads need to be handled with all the locking mechanisms required by it.\n\n\nInstallation\n------------\n\nInstall from PyPI::\n\n $ pip install aioisotp==0.1.1\n\n\nDocumentation\n-------------\n\nA basic documentation can be built using Sphinx::\n\n $ python setup.py build_sphinx\n\n\nQuick start\n-----------\n\nHere is an example of an echo server implemented using a callback based\nprotocol and a client implemented as sequencial reader and writer streams.\n\n.. code:: python\n\n import asyncio\n import aioisotp\n\n\n class EchoServer(asyncio.Protocol):\n\n def connection_made(self, transport):\n self.transport = transport\n\n def data_received(self, data):\n # Echo back the same data\n self.transport.write(data)\n\n\n async def main():\n network = aioisotp.ISOTPNetwork('vcan0',\n interface='virtual',\n receive_own_messages=True)\n with network.open():\n # A server that uses a protocol\n transport, protocol = await network.create_connection(\n EchoServer, 0x1CDADCF9, 0x1CDAF9DC)\n\n # A client that uses streams\n reader, writer = await network.open_connection(\n 0x1CDAF9DC, 0x1CDADCF9)\n\n writer.write(b'Hello world!')\n response = await reader.read(4095)\n assert response == b'Hello world!'\n\n\n loop = asyncio.get_event_loop()\n loop.run_until_complete(main())\n\n\nUDS\n---\n\nThis package is meant to enable the use of other protocols that require\nISO-TP. One of the most common is UDS. A third party library like udsoncan_\nor pyvit_ can be used to encode and decode payloads.\n\n.. code:: python\n\n import aioisotp\n import udsoncan\n\n ...\n\n reader, writer = await network.open_connection(0x1CDAF9DC, 0x1CDADCF9)\n\n # Construct and send request\n request = udsoncan.Request(\n udsoncan.services.ReadDataByIdentifier, data=b'\\xF1\\x90')\n writer.write(request.get_payload())\n\n # Wait for response and decode the payload\n payload = await reader.read(4095)\n response = udsoncan.Response.from_payload(payload)\n\n print(response)\n print(response.data)\n\n\n.. _ISO-TP: https://en.wikipedia.org/wiki/ISO_15765-2\n.. _asyncio: https://docs.python.org/3/library/asyncio.html\n.. _python-can: https://github.com/hardbyte/python-can\n.. _udsoncan: https://github.com/pylessard/python-udsoncan\n.. _pyvit: https://github.com/linklayer/pyvit\n.. _ISO-TP module: https://github.com/hartkopp/can-isotp\n.. _can-utils: https://github.com/linux-can/can-utils\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/christiansandberg/aioisotp", "keywords": "CAN ISO-TP 15765", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "aioisotp", "package_url": "https://pypi.org/project/aioisotp/", "platform": "any", "project_url": "https://pypi.org/project/aioisotp/", "project_urls": { "Homepage": "https://github.com/christiansandberg/aioisotp" }, "release_url": "https://pypi.org/project/aioisotp/0.1.1/", "requires_dist": [ "python-can (~=3.0)" ], "requires_python": ">=3.5", "summary": "Asyncio implementation of ISO-TP (ISO 15765-2)", "version": "0.1.1" }, "last_serial": 4514238, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "5b8ca0e91900959607ecdb5803fba7f3", "sha256": "82ee23184fd3d5014699c1ce09bf6d67ae6657e1745d777ca8a93d7400a8922f" }, "downloads": -1, "filename": "aioisotp-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "5b8ca0e91900959607ecdb5803fba7f3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 14303, "upload_time": "2018-10-05T19:38:50", "url": "https://files.pythonhosted.org/packages/92/e6/a93c41bacdc35ca537a06f66802f00791e8f26f5893c99b33b743cd4e911/aioisotp-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "53d6f24291033ece7882418022dc8995", "sha256": "b4b567ef7019f0a8479ae542aae93e4316d11e4faff0f51bce4b2b1766ed08d6" }, "downloads": -1, "filename": "aioisotp-0.1.0.tar.gz", "has_sig": false, "md5_digest": "53d6f24291033ece7882418022dc8995", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 9644, "upload_time": "2018-10-05T19:38:51", "url": "https://files.pythonhosted.org/packages/20/2b/9b4a3545bd76a9268925bbca5311bd93eb4e5f1099ff36f84b4afdf06369/aioisotp-0.1.0.tar.gz" } ], "0.1.0.dev0": [ { "comment_text": "", "digests": { "md5": "c4baeb23c4c127c791d08c2becd12fc6", "sha256": "a58e9fb8adbd03b102b46f0429706704ccccf0e711f8fa2c919e781012766933" }, "downloads": -1, "filename": "aioisotp-0.1.0.dev0-py3-none-any.whl", "has_sig": false, "md5_digest": "c4baeb23c4c127c791d08c2becd12fc6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 8506, "upload_time": "2018-09-11T20:02:48", "url": "https://files.pythonhosted.org/packages/79/68/3a0b0b123b67542f8ee418dede83c59a63c98c80f9e2756365f5d3d90727/aioisotp-0.1.0.dev0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "2bf1a6319f8edcd7c5e3d61b9c421c1d", "sha256": "f144ae64e9806571da5b98c19bf2459214c3d4f942c4f257ea6033b9d2fd0f95" }, "downloads": -1, "filename": "aioisotp-0.1.0.dev0.tar.gz", "has_sig": false, "md5_digest": "2bf1a6319f8edcd7c5e3d61b9c421c1d", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 7852, "upload_time": "2018-09-11T20:02:50", "url": "https://files.pythonhosted.org/packages/cc/69/c2e90357f75c0eedc4b3c99147a761e1decdf9de0e74b9e9151a41bf29d6/aioisotp-0.1.0.dev0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "fb50f706373a2f038887551655bc59e3", "sha256": "f998284978a7a41a5b527fdcf1555fe7996fd98e80b48dbe95c005df1ddf1b4a" }, "downloads": -1, "filename": "aioisotp-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "fb50f706373a2f038887551655bc59e3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 14306, "upload_time": "2018-11-21T20:54:24", "url": "https://files.pythonhosted.org/packages/ea/38/946a69888f76627b4e311b1ee3d834306245dad3d52c8916822dab8e5296/aioisotp-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b3e34615e034d790906a0d6298c915a", "sha256": "27bcffe39835e937e7be2f3374e613399d2c95631b324d292caf1f5a18f829bd" }, "downloads": -1, "filename": "aioisotp-0.1.1.tar.gz", "has_sig": false, "md5_digest": "4b3e34615e034d790906a0d6298c915a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 9711, "upload_time": "2018-11-21T20:54:26", "url": "https://files.pythonhosted.org/packages/bd/cd/09dda8536f05cd00e350e8ee217594e29fee57e495769fc4aa0fee13afba/aioisotp-0.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "fb50f706373a2f038887551655bc59e3", "sha256": "f998284978a7a41a5b527fdcf1555fe7996fd98e80b48dbe95c005df1ddf1b4a" }, "downloads": -1, "filename": "aioisotp-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "fb50f706373a2f038887551655bc59e3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 14306, "upload_time": "2018-11-21T20:54:24", "url": "https://files.pythonhosted.org/packages/ea/38/946a69888f76627b4e311b1ee3d834306245dad3d52c8916822dab8e5296/aioisotp-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b3e34615e034d790906a0d6298c915a", "sha256": "27bcffe39835e937e7be2f3374e613399d2c95631b324d292caf1f5a18f829bd" }, "downloads": -1, "filename": "aioisotp-0.1.1.tar.gz", "has_sig": false, "md5_digest": "4b3e34615e034d790906a0d6298c915a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 9711, "upload_time": "2018-11-21T20:54:26", "url": "https://files.pythonhosted.org/packages/bd/cd/09dda8536f05cd00e350e8ee217594e29fee57e495769fc4aa0fee13afba/aioisotp-0.1.1.tar.gz" } ] }