From a2ba187cfb11cd7ef7887358364fa3aef6a7aaa8 Mon Sep 17 00:00:00 2001 From: uhi22 Date: Sun, 23 Oct 2022 18:05:34 +0200 Subject: [PATCH] added architecture documentation --- .gitignore | 1 + doc/pyPlc_architecture.png | Bin 0 -> 42729 bytes doc/pyPlc_architecture.puml | 53 ++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 doc/pyPlc_architecture.png create mode 100644 doc/pyPlc_architecture.puml diff --git a/.gitignore b/.gitignore index a348e50..7547c58 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /__pycache__/ +/doc/*.jar \ No newline at end of file diff --git a/doc/pyPlc_architecture.png b/doc/pyPlc_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..8663db65d2843205dc8a97d3935f380dc6e9900e GIT binary patch literal 42729 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�M$C<{1+qvXv1YX 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 E7j%*%82|tP literal 0 HcmV?d00001 diff --git a/doc/pyPlc_architecture.puml b/doc/pyPlc_architecture.puml new file mode 100644 index 0000000..6654e01 --- /dev/null +++ b/doc/pyPlc_architecture.puml @@ -0,0 +1,53 @@ +@startuml + +package "pyPLC" { + package "pyPlcIPv6" { + [miniIPv6] + [pyPlcUdp] + [pyPlcSDP] + [pyPlcTcpExiSniff] + [pyPlcV2GEXI] + } + + package "pyPlcHomeplug" { + [dispatcher] + [SLAC] + } + + + [xmlProcessing] +} + +[ControlPilotLine] +[HomeplugAdaptor] +[pcap DLL] as pcap +[wireshark] +[FlUxIuS/V2Gdecoder] as dec + +package "WindowsOS or Linux" { + [OS_Ethernet] + [OS_IPv6] + [OS_TCP] + [OS_ICMP] +} + +[ControlPilotLine] <-up-> [HomeplugAdaptor] +[HomeplugAdaptor] <-up-> [OS_Ethernet] +[OS_Ethernet] <-up-> [pcap] +[OS_Ethernet] <-up-> [OS_IPv6] +[OS_Ethernet] <-up-> [OS_ICMP] +[OS_IPv6] <-up-> [OS_TCP] + +[pcap] <-up-> [pcap-ct] +[pcap] -up-> [wireshark] +[pcap-ct] <-up-> [dispatcher] +[dispatcher] <-up-> [SLAC] +[dispatcher] <-up-> [miniIPv6] +[miniIPv6] <-up-> [pyPlcUdp] +[miniIPv6] -up-> [pyPlcTcpExiSniff] +[pyPlcUdp] <-up-> [pyPlcSDP] +[OS_TCP] <-up-> [pyPlcV2GEXI] +[pyPlcV2GEXI] -r-> [dec] +[pyPlcTcpExiSniff] -r-> [dec] +[dec] -l-> [xmlProcessing] +@enduml \ No newline at end of file