diff --git a/demo_V2GTP.py b/demo_V2GTP.py deleted file mode 100644 index acf115c..0000000 --- a/demo_V2GTP.py +++ /dev/null @@ -1,75 +0,0 @@ - - -# 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.' -# -# -# urn:din:70121:2012:MsgDef -# 2 -# 0 -# 1 -# 1 -# -# -# -# -# -# - -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 diff --git a/exiConnector.py b/exiConnector.py new file mode 100644 index 0000000..8a1d550 --- /dev/null +++ b/exiConnector.py @@ -0,0 +1,90 @@ + + +# EXI is specified in w3.org/TR/exi +# For decoding and encoding, different decoders are availabe: +# 1. 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:\> +# +# java -jar V2Gdecoder.jar -e -s 8000dbab9371d3234b71d1b981899189d191818991d26b9b3a232b30020000040040 +# ERROR: 'Premature EOS found while reading data.' +# +# +# urn:din:70121:2012:MsgDef +# 2 +# 0 +# 1 +# 1 +# +# +# +# 2. OpenV2G from https://github.com/Martin-P/OpenV2G +# Pro: The schema-specific files are already included as generated C-code, this +# makes it very fast. +# Contra: Is only a demo, does not provide an interface which could be used for decoding/encoding. +# Work in progress: Fork in https://github.com/uhi22/OpenV2Gx, to add a command line interface (and maybe a socket interface). +# +# +# Example data: +# (1) From the Ioniq: +# In wireshark: Copy as hex stream +# 01fe8001000000228000dbab9371d3234b71d1b981899189d191818991d26b9b3a232b30020000040040 +# remove the 8 bytes V2GTP header +# 8000dbab9371d3234b71d1b981899189d191818991d26b9b3a232b30020000040040 +# (2) From OpenV2G main_example.appHandshake() +# 8000ebab9371d34b9b79d189a98989c1d191d191818981d26b9b3a232b30010000040001b75726e3a64696e3a37303132313a323031323a4d73674465660020000100880 +# +# +# +# +# + +from helpers import showAsHex, twoCharHex +import subprocess +import sys +import time + + + + +if __name__ == "__main__": + + # 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. + # + # + exiframe = [ + 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 ] + + print("Testing the exiConnector...") + pathToOpenV2GExe = "..\\OpenV2Gx\\Release\\OpenV2G.exe"; + s = "" + for i in range(0, len(exiframe)): + s = s + twoCharHex(exiframe[i]) + print("exi as hex=" + s) + param1 = "DH" + s # DH for decode handshake + start_time = time.time() + for i in range(0, 10): + result = subprocess.run( + [pathToOpenV2GExe, param1], capture_output=True, text=True) + + print("--- %s seconds ---" % (time.time() - start_time)) + print("stdout:", result.stdout) + print("stderr:", result.stderr) + strConverterResult = result.stdout + if (strConverterResult.find("ProtocolNamespace=urn:din")>0): + print("Detected DIN") + + param1 = "ED1" # ED for encode DIN, session setup response + result = subprocess.run([pathToOpenV2GExe, param1], capture_output=True, text=True) + print("stdout:", result.stdout) + print("stderr:", result.stderr)