HSL2.0 - Netzwerk: TCP und HTTP
Inhalt
1.
Client (ausgehende Verbindung)
2.
Server (eingehende Verbindung)
2.1.
Firmware Version 4.5 (nur HTTP)
2.2.
Firmware Version >= 4.7
Beschreibung der Unterschiede beim Einsatz von Firmware 4.5 einerseits oder Firmware 4.7 oder neuer andererseits

## 1.Client (ausgehende Verbindung)

Beinhaltet der Logikbaustein eine Funktionalität eines Netzwerkclients (z.B. Abruf von Daten über http), verhalten sich alle Firmware Versionen gleich.

## 2.Server (eingehende Verbindung)

Beinhaltet der Baustein eine Funktionalität eines Servers bzw. erwartet er eingehende Netzwerkverbindungen, verhält sich die Firmware Version 4.5 unterschiedlich zu den Versionen 4.7. und neuer.

### 2.1.Firmware Version 4.5 (nur HTTP)

Der Zugriff auf das Netzwerk ist von Seiten der Firmware für den Logikbaustein nicht eingeschränkt. Er kann jeden Port öffnen (der von der Firmware noch nicht belegt wurde). Dabei muss der Entwickler des Bausteins Sorge tragen, dass der Inbetriebnehmer im HS-Projekt sicherstellen kann, dass sich die genutzten Ports der Firmware bzw. des Projekts und des Bausteins (oder anderer Bausteine) nicht überschneiden, d.h., dass kein Port doppelt belegt wird. Dies kann zum Beispiel durch die Nutzung eines Eingangs, mit dem die Portnummer festgelegt wird, geschehen.
Beispiel:

    01  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    02  s.bind(('', self.PIN_I_PORT))
    03  s.listen(1)
    04  conn, addr = s.accept()

### 2.2.Firmware Version >= 4.7

Durch die Einführung der Sicheren Kommunikation über HTTPS/TLS besteht die Möglichkeit der Weiterleitung der HTTPS Kommunikation durch die Firmware. Im Experte kann dem Baustein bei der Projektierung ein Basis-Pfad und ein interner Port zugeordnet werden. Die Firmware leitet alle HTTP(S)-Anfragen auf diesen Pfad an den internen Port weiter. An diesem internen Port muss der Baustein lauschen. Um die Verschlüsselung durch TLS/SSL muss sich der Baustein dabei nicht kümmern. Die Firmware liefert die HTTP-Kommunikation entschlüsselt an den Baustein weiter.
Um den entsprechenden Basis-Pfad und den internen Port zu konfigurieren, gibt es für den Logikbaustein die Eingangstypen base_path und destination_port.
Beide Eingangstypen können nur als Konstante auf den Eingang des Logikbausteins gelegt werden. Der Eingang vom Typ base_path muss dabei immer einen gültigen Wert/Pfad erhalten. Der Eingang vom Typ destination_port kann optional gesetzt, oder mit 0 belegt werden. Wird er mit 0 belegt, weist ihm der Experte beim Übertragen des Projekts einen gültigen Wert bzw. freien Port zu.
Es besteht auch die Möglichkeit eines HTTP-Zugriffs, falls dies im Experte so projektiert wurde. Dabei ist die Kommunikation mit dem HS/FS nicht mehr verschlüsselt, für die Verwendung der Schnittstelle macht dies jedoch keinen Unterschied.
Beispiel config.xml:

    01 <?xml version="1.0" encoding="UTF-8"?>
    02 <config>
    03     <modules>
    04         <module category="examples" context="examples" id="10978" name="HTTP_API" version="1.0">
    05             <inputs>
    06                 <input type="base_path" init_value="/http_api">Base-Path</input>
    07                 <input type="destination_port" init_value="0">Port</input>
    08             </inputs>
    09             <outputs>
    10                 <output type="number" init_value="0">Output value 1</output>
    11                 <output type="number" init_value="0">Output value 2</output>
    12             </outputs>
    13             <remanent_variables>
    14             </remanent_variables>
    15             <imports>
    16                 <import>hsl20_4_debug_page</import>
    17                 <import>thread</import>
    18                 <import>socket</import>
    19             </imports>
    20         </module>
    21     </modules>
    22 </config>

Beispiel Ausschnitt:

    01 ...
    02 def on_init(self):
    03     self.debug_section = self.FRAMEWORK.create_debug_section()
    04     self.debug_section.add_message("on_init")
    05     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    06     s.bind(('127.0.0.1', int(self._get_input_value(self.PIN_I_PORT))))
    07     s.listen(1)
    08     conn, addr = s.accept()
    09     self.debug_section.add_message('Connection address: ' + addr)
    10 ...