mirror of
https://github.com/uhi22/pyPLC.git
synced 2024-11-10 01:05:42 +00:00
playground for sockets and EXI
This commit is contained in:
parent
19e5cd2cbf
commit
b99a0665f0
2 changed files with 118 additions and 0 deletions
75
demo_V2GTP.py
Normal file
75
demo_V2GTP.py
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
|
||||||
|
|
||||||
|
# EXI is specified in w3.org/TR/exi
|
||||||
|
# To decode and encode, we can use this Decoder/Encoder: https://github.com/FlUxIuS/V2Gdecoder
|
||||||
|
#
|
||||||
|
# https://github.com/FlUxIuS/V2Gdecoder/releases
|
||||||
|
# Install java from https://www.java.com/de/download/manual.jsp
|
||||||
|
#
|
||||||
|
# C:\>java -version
|
||||||
|
# java version "1.8.0_351"
|
||||||
|
# Java(TM) SE Runtime Environment (build 1.8.0_351-b10)
|
||||||
|
# Java HotSpot(TM) Client VM (build 25.351-b10, mixed mode, sharing)
|
||||||
|
# C:\>
|
||||||
|
#
|
||||||
|
# In wireshark: Copy as hex stream
|
||||||
|
# 01fe8001000000228000dbab9371d3234b71d1b981899189d191818991d26b9b3a232b30020000040040
|
||||||
|
# remove the 8 bytes V2GTP header
|
||||||
|
# 8000dbab9371d3234b71d1b981899189d191818991d26b9b3a232b30020000040040
|
||||||
|
#
|
||||||
|
# java -jar V2Gdecoder.jar -e -s 8000dbab9371d3234b71d1b981899189d191818991d26b9b3a232b30020000040040
|
||||||
|
# ERROR: 'Premature EOS found while reading data.'
|
||||||
|
# <?xml version="1.0" encoding="UTF-8"?><ns4:supportedAppProtocolReq xmlns:ns4="urn:iso:15118:2:2010:AppProtocol"
|
||||||
|
# xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns3="http://www.w3.org/2001/XMLSchema">
|
||||||
|
# <AppProtocol>
|
||||||
|
# <ProtocolNamespace>urn:din:70121:2012:MsgDef</ProtocolNamespace>
|
||||||
|
# <VersionNumberMajor>2</VersionNumberMajor>
|
||||||
|
# <VersionNumberMinor>0</VersionNumberMinor>
|
||||||
|
# <SchemaID>1</SchemaID>
|
||||||
|
# <Priority>1</Priority>
|
||||||
|
# </AppProtocol>
|
||||||
|
# </ns4:supportedAppProtocolReq>
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
from helpers import showAsHex
|
||||||
|
|
||||||
|
# Example: This is the first message from the EVCC.
|
||||||
|
# Means: It is an supportedAppProtocolReq message. It provides a list of charging protocols supported by the EVCC.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
v2gframe = [
|
||||||
|
0x01, 0xfe,
|
||||||
|
0x80, 0x01,
|
||||||
|
0x00, 0x00, 0x00, 0x22,
|
||||||
|
0x80, 0x00, 0xdb, 0xab, 0x93, 0x71, 0xd3, 0x23, 0x4b, 0x71, 0xd1, 0xb9, 0x81, 0x89,
|
||||||
|
0x91, 0x89, 0xd1, 0x91, 0x81, 0x89, 0x91, 0xd2, 0x6b, 0x9b, 0x3a, 0x23, 0x2b, 0x30, 0x02, 0x00,
|
||||||
|
0x00, 0x04, 0x00, 0x40 ]
|
||||||
|
|
||||||
|
|
||||||
|
if (len(v2gframe)<9):
|
||||||
|
print("size too small")
|
||||||
|
else:
|
||||||
|
if ((v2gframe[0]!=0x01) or (v2gframe[1]!=0xFE)):
|
||||||
|
print("wrong V2GTP version")
|
||||||
|
else:
|
||||||
|
if ((v2gframe[2]!=0x80) or (v2gframe[3]!=0x01)):
|
||||||
|
print("wrong payload type, expecting 0x8001 EXI")
|
||||||
|
else:
|
||||||
|
exiLen = (v2gframe[4]<<24) + (v2gframe[5]<<16) + (v2gframe[6]<<8) + v2gframe[7]
|
||||||
|
print("exiLen=" + str(exiLen))
|
||||||
|
if (exiLen+8 != len(v2gframe)):
|
||||||
|
print("exiLen does not match actual frame size")
|
||||||
|
else:
|
||||||
|
print("header ok")
|
||||||
|
exiframe = bytearray(exiLen)
|
||||||
|
exiframe = v2gframe[8:]
|
||||||
|
showAsHex(exiframe, "exiframe ")
|
||||||
|
# Header:
|
||||||
|
# 80 upper two bits: distinguishing bits 1 0
|
||||||
|
# presenceBitForExiOptions 0 means "no options"
|
||||||
|
# five bits version information: 0 0 0 0 0 means "final version 1"
|
||||||
|
#
|
||||||
|
# 00 DB AB 93 71 D3 23 4B
|
43
demo_socket.py
Normal file
43
demo_socket.py
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
|
||||||
|
# explanation of socket handling:
|
||||||
|
# https://realpython.com/python-sockets/
|
||||||
|
#
|
||||||
|
|
||||||
|
import socket
|
||||||
|
import select
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
print("Press Ctrl-Break for aborting")
|
||||||
|
|
||||||
|
TCP_IP = 'fe80::e0ad:99ac:52eb:85d3'
|
||||||
|
TCP_PORT = 15118 # The port for CCS
|
||||||
|
BUFFER_SIZE = 1024 # Normally 1024
|
||||||
|
|
||||||
|
ourSocket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0)
|
||||||
|
ourSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||||
|
|
||||||
|
ourSocket.bind((TCP_IP, TCP_PORT))
|
||||||
|
ourSocket.listen(1)
|
||||||
|
print("listening on port " + str(TCP_PORT))
|
||||||
|
|
||||||
|
# example from https://stackoverflow.com/questions/5308080/python-socket-accept-nonblocking
|
||||||
|
read_list = [ourSocket]
|
||||||
|
while True:
|
||||||
|
# The select() function will block until one of the socket states has changed.
|
||||||
|
# We specify a timeout, to be able to run it in the main loop.
|
||||||
|
print("before select")
|
||||||
|
readable, writable, errored = select.select(read_list, [], [], 0.5)
|
||||||
|
for s in readable:
|
||||||
|
if s is ourSocket:
|
||||||
|
client_socket, address = ourSocket.accept()
|
||||||
|
read_list.append(client_socket)
|
||||||
|
print("Connection from", address)
|
||||||
|
else:
|
||||||
|
data = s.recv(1024)
|
||||||
|
if data:
|
||||||
|
print("received data:", data)
|
||||||
|
else:
|
||||||
|
print("connection closed")
|
||||||
|
s.close()
|
||||||
|
read_list.remove(s)
|
Loading…
Reference in a new issue