TIA HTTP Put Befehl Senden

netriska

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!

Ich versuche mich gerade daran einen HTTP Put Befehl zu senden um Philips Hue Leuchten über eine Simatic Steuerung steuern zu können. Leider scheitere ich daran, dass es mir nicht ganz klar ist wie dieser korrekt zusammengebaut wird. Ich habe mich daran versucht, dass ich mittel TSEND (da 315-2 PN/DP) ein Array of Char sende wo der korrekte Befehl drinnen ist. Leider stellt dies, laut Wireshark, aber "nur" TCP Verkehr dar und keine HTTP Methode. Sende ich hier nur die falschen zeichen oder geht das so gar nicht? Mir würde es schon ungemein helfen, wenn mir jemand sagen könnte welche Zeichen man exakt schicken damit es als HTTP Header interpretiert wird.

Im Prinzip versuche ich nachzubauen, was der Siemens Forumuser Jannes1987 schon gemacht hat: https://support.industry.siemens.co...heimautomatisierung/119873?page=0&pageSize=10

Leider komme ich nicht genau dahinter wie er das gemacht hat und die Bibliothek, welche er angehängt hat, ist bei mir leer.
Hat von euch jemand Ideen hierzu?

LG
 
Zuletzt bearbeitet:
Das nennt sich nicht Put, sondern HTTP Post. Wie der http-Header aufgebaut ist findest du z.B. bei Wikipedia, oder wenn du Wireshark schon laufen hast dann kannst du es dir auch da abschauen.
https://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_POST

Letztenendes musst du deinen Post-Daten die du an eine URL absetzen willst einen weitestgehend konstanten Header voranstellen, einzig die Längenangabe ist variabel. Wenn deine Daten die du mittels http-Post abschicken willst immer die gleiche Länge haben, dann kannst du auch die Länge fix eintragen.
Wenn nicht, dann baust du dir erst die post-Daten zusammen, ermittelst die Länge und trägst diese im http-Header ein. Dann hängst du beides zusammen und verschickst es über TSEND.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Thomas,

danke für deine Antwort. Ich würde, meiner Meinung nach, tatsächlich aber eine PUT Methode benötigen. Sie ist auch in deinem Wiki Link beschrieben. Auf dem Philips Hue Gateway läuft ein kleiner Webserver, welchen man zum testen nutzen kann. Ein Wireshark Mitschnitt von diesem ergibt folgendes (ich hoffe man sieht was, k.A.warum kopieren nicht geht):

Hue_korrekt.png
So geht die Leuchte auch brav aus und an.

Ich setze nun über TSEND folgenden String ab:
'PUT /api/JYovmG-QlRTkvCP5C1dACTooftBZVptQAjKWO0D9/lights/1/state HTTP/1.1$R$LHost: 192.168.1.40$R$LConnection: keep-alive$R$LContent-Length: 13$R$L$R$L{"on":false}'

Hieraus ergibt sich laut Wireshark folgendes:

Hue_inkorrekt.png

Wie man hoffentlich sehen kann, unterscheiden sich die Daten vor dem PUT. Ich habe aber leider keine Ahnung wie ich dies verändern kann. (Die Länge ist zwar auch unterschiedlich aber die restlichen sonstigen Informationen sind eher irrelevant).

LG
 
Die Daten davor gehören zum TCP-Teil. Die sind unterschiedlich weil a) deine SPS eine andere IP-Adresse und b) einen anderen Port verwendet.

Wo kommt denn die URI her? Ist diese überhaupt statisch? Denn das sieht mir nach einer sitzungsabhängigen URI aus. Ist diese wenn du es mit einem Webserver verwendest auch immer gleich, auch wenn du mal die Cookies löschst?
 
Weil ich mit dem Gerät an einem Switch hänge. Zum testen und beobachten des Paketes schicke ich es an den PC (192.168.1.40). Das Hue Gateway ist die 192.168.1.23.

Zu deiner Frage vorher, die URI ist statisch. Die Zahlen und Buchstabenkombination stellt einen fixen aber zufällig angelegten Benutzer dar. Dieser ändert sich jedoch nicht. Auch wenn ich den Rechner wechsle kann ich nur mit diesem Benutzer etwas verstellen.
Was ich aber noch nicht ganz verstanden habe: Was macht ein TCP Paket zu einem HTTP Paket? Was muss ich hier noch beachten?

LG
 
Ich habe das Problem nun gelöst und den Fehler gefunden. Falls es jemanden interessiert:

Ich habe folgenden Sting abgesendet:

'PUT /api/JYovmG-QlRTkvCP5C1dACTooftBZVptQAjKWO0D9/lights/1/state HTTP/1.1$R$LHost: 192.168.1.23$R$LConnection: keep-alive$R$LContent-Length: 13$R$L$R$L{"on":false}'

Richtig war aber:

'PUT /api/JYovmG-QlRTkvCP5C1dACTooftBZVptQAjKWO0D9/lights/1/state HTTP/1.1$R$LHost: 192.168.1.23$R$LConnection: keep-alive$R$LContent-Length: 12$R$L$R$L{"on":false}'

Ich habe mich in der Content Length verzählt.

Danke für die Hilfe.
 
danke,
ich habe eine 315 2DP CPU und den CP343-1
Tsend läßt sich nicht im Projekt einfügen. wie es aussieht muss ich den AG_Send Baustein nutzen.
Ich habe absolut keinen Plan wie man den Baustein beschalten soll. könnte mir da jemand etwas unter die Arme greifen?
Ich habe TIAv13
Es gibt auch PUT und GET Bausteine. kann man diese für due HUE benutzen?
Bildschirmfoto 2018-01-08 um 00.48.36.jpg
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei Verbindungen über CP343-1 muß man AG_SEND benutzen und die Verbindungen in der Netzsicht projektieren und die Projektierung in die CPU laden.
Wie projektieren Sie in STEP 7 (TIA Portal) eine Verbindung?

Es gibt anscheinend im Siemens Support noch keine AG_SEND-Programmierbeispiele für TIA-Dummies, man muß sich noch die vielen Beiträge zu Step7 classic zu TIA umdenken, z.B.:
Wie werden die Kommunikationsbausteine FC5 "AG_SEND" und FC6 "AG_RECV" programmiert?

Man darf auch das in TIA integrierte Hilfesystem benutzen, z.B. indem man den AG_SEND markiert und F1 drückt.
Weitere Programmbeispiele und Erklärungen siehe die FAQ in meiner Signatur

Die PUT/GET-Bausteine kannst Du nicht benutzen, weil damit greift man mit einem speziellen Siemens-S7-Protokoll auf Speicherbereiche in einer remote S7-CPU zu. Ich habe noch nie gehört, daß HUE dieses Protokoll versteht.

Harald
 
vielen Dank für die Hilfe, bin jetzt ein Stückchen weiter gekommen.
folgende Fragen habe ich noch:
Bei der Verbindungsprojektierung gebe ich als Partner IP, die IP von der Hue Bridge oder? Frage weil ich das mit dem String nicht ganz verstehe, weil da ja auch die IP drin steht. genauso wie Port. SPS hat 2000, Bei der HUE habe ich 80 eingegeben.
Anhang anzeigen 39926

Dann noch der String den man sendet.
gebe ich das so ein im Send Eingang des Bausteines? :
'PUT /api/srocoos3mlFYz8H1uv9R2weEQFisTH0H9QUQBtR4/lights/8/state HTTP/1.1$R$LHost: 192.168.1.210$R$LConnection: keep-alive$R$LContent-Length: 12$R$L$R$L{"on":false}'

ich bekomme da einen Syntax Fehler.

Bildschirmfoto 2018-01-08 um 13.18.45.jpg
 
Hallo Zusammen
Gerne möchte ich über einen HTTP_POST Funktionsblock (aus der Bibliothek WagoLibHttp_02 von CoDeSys V2.3 auf WAGO 750-881 Kontroller) auf einem hausinternen Raspberry aufrufen (dort ist ein php-Skript installiert) und ausführen lassen. Das Skript funktioniert einwandfrei, wenn ich es aus dem Browser aufrufe.

Beim Laden von CoDeSys erhalte ich jedoch den Fehler 3740: (52) Unbekannter Typ 'TCP_Client2'. Dieser ist im Funktionsblock HTTP_POST untergebracht und wäre im HTTP_GET definiert. Den HTTP_GET Block habe ich jedoch aus der Übersetzung ausschliessen müssen, da ich diesen bereits in der Bibliothek codesys_network_121 verwende.

Meine Fragen:
-Wie kann ich CoDeSys dazu bringen, diesen TCP_Client2 andersweitig zu holen oder zu definieren?
-Benötigt der HTTP_POST Funktionsblock noch weitere Angaben als unten stehende (zur Ausführung des Skripts benötigt es zur Zeit kein Passwort und auch kein User)?
-Gibt es ev. gar eine einfachere Möglichkeit, einen http Befehl auszulösen z.bsp. über strukturierter Text? Ich brauche keine Rückmeldung, ob das Skript empfangen wurde oder nicht

Ich danke euch für eure Inputs :)
Unbenannt.jpg


ilfBdSYAAH87kQYAAFAhIg0AAKBCRBoAAECFiDQAAIAKEWkAAAAV8h24hG0ZdgQVzgAAAABJRU5ErkJgggA=
 
Zuletzt bearbeitet:
Moin sps_bond,

in dem (alten) Thread ging es um Step7 classic und eine 315er Steuerung. Da gibt es kein TSEND_C. Der TSEND_C hat keinen Formalparameter "PUT-Request". Des Weiteren erfolgt die Parametrierung über einen Parameter-Datenbaustein. Da können nur IP-Adressen, aber keine URLs eingetragen werden.

VG

MFreiberger
 
Zurück
Oben