ISO-TP的异步实现(ISO 15765-2)
aioisotp的Python项目详细描述
这个包作为asyncio传输层在can上实现ISO-TP, 允许同时接收和发送任意号码的消息 关系。
raw-can通信使用python-can,这为许多 不同的can接口和操作系统。
如果加载了socketcanISO-TP module并使用了python 3.7+,则传输是 如果可能,委派给内核以获得更好的计时性能。 使用“socketcan”接口。如果不成功,raw可以用作回退。
来自can-utils的isotpserver也可以用来桥接socketcan iso-tp 通过TCP/IP连接。 使用“isotpserver”接口和“host:port”作为通道。
为什么是异步的?
异步编程简化了一些可能的用例:
- 在一个连接上进行全双工接收和传输。
- 同时在多个连接上通信。
- 功能寻址,其中一个请求被发送,所有节点都响应, 然后在响应到达时进行处理。
- 实现或模拟多个服务器。
不需要使用它所需的所有锁定机制来处理线程。
安装
从pypi安装:
$ pip install aioisotp==0.1.1
文档
可以使用sphinx生成基本文档:
$ python setup.py build_sphinx
快速启动
下面是一个使用基于回调的 协议和作为顺序读写器流实现的客户端。
importasyncioimportaioisotpclassEchoServer(asyncio.Protocol):defconnection_made(self,transport):self.transport=transportdefdata_received(self,data):# Echo back the same dataself.transport.write(data)asyncdefmain():network=aioisotp.ISOTPNetwork('vcan0',interface='virtual',receive_own_messages=True)withnetwork.open():# A server that uses a protocoltransport,protocol=awaitnetwork.create_connection(EchoServer,0x1CDADCF9,0x1CDAF9DC)# A client that uses streamsreader,writer=awaitnetwork.open_connection(0x1CDAF9DC,0x1CDADCF9)writer.write(b'Hello world!')response=awaitreader.read(4095)assertresponse==b'Hello world!'loop=asyncio.get_event_loop()loop.run_until_complete(main())
UDS
此包旨在启用需要 ISO-TP标准。其中最常见的是uds。像udsoncan这样的第三方库 或者pyvit可用于对有效载荷进行编码和解码。
importaioisotpimportudsoncan...reader,writer=awaitnetwork.open_connection(0x1CDAF9DC,0x1CDADCF9)# Construct and send requestrequest=udsoncan.Request(udsoncan.services.ReadDataByIdentifier,data=b'\xF1\x90')writer.write(request.get_payload())# Wait for response and decode the payloadpayload=awaitreader.read(4095)response=udsoncan.Response.from_payload(payload)print(response)print(response.data)