Entwickler-Experten-Unterstützung gesucht wg. IO::Socket::INET

Begonnen von KölnSolar, 31 Oktober 2017, 15:05:09

Vorheriges Thema - Nächstes Thema

KölnSolar

Hallo Kommunikations-Experten,
ich bräuchte mal etwas Hilfe zur Selbsthilfe. Ich versuche gerade mit einem anderen FHEMler herauszufinden, ob eine bei mir funktionierende Lösung bzw. die zugrunde liegende technische Basis auch auf dessen Fernseher vorhanden ist, was eben leider nirgends dokumentiert ist.

Ich habe ein existierendes FHEM-Modul vor Jahren angepasst. Das Ziel(eigene Nachrichten auf dem TV anzeigen) ist eigentlich egal. Ich hatte damals herausgefunden, dass sich bei mir gegenüber früheren Modellen des TV-Herstellers der Kommunikationsport geändert hatte. Diesen entsprechend verändert, konnte ich via SOAP-messages, die ich mehr oder weniger per cut&Paste erstellt hatte, mein Ziel erreichen.

Nun hat der Hersteller mal wieder etwas geändert. Generell wird nun die Kommunikation über websockets durchgeführt. Es gibt auch mittlerweile eine indirekte FHEM-Lösung den TV zu schalten. Indirekt eben deshalb, weil ein "fremdes" Phyton-Skript verwendet wird. Leider gibt es aber (mal wieder) weit u. breit nichts zu finden, um Nachrichten anzuzeigen.

Der Besitzer des aktuellen TV-Modells fand dann heraus, dass überraschenderweise der selbe Port offen ist, obwohl genau dieser Port mal wieder nirgends dokumentiert ist. Also haben wir uns gedacht, wir probieren meine Modifikation einfach aus, denn vielleicht gibt es zwar die neue websocket-Methode aber aus Kompatibilitätsgründen hat man (undokumentiert) die "alte" SOAP-Kommunikation "mitgeschleppt".

Ist der Gedanke aus Expertensicht evtl. völliger Schwachsinn ?

Zumindest funktioniert mein Modul für seinen TV nicht. :'( Daher sind wir in die Tiefen der Kommunikation eingestiegen. Konkretes Perl:
my $sock = new IO::Socket::INET (
        PeerAddr => $TV,
        PeerPort => '7676',
        Proto => 'tcp',
        Timout => 5
        );
Log 4, "socket: $sock";
    Log 4, "tmp: $tmp";

if (defined ($sock)){
print $sock $tmp;
my $buff ="";
while ((read $sock, $buff, 1) > 0){
$buffer .= $buff;
}
@tmp2 = split (/\n/,$buffer);
Log 3, "$TV response: $tmp2[0]";
Log 4, "$TV buffer response: $buffer";
$sock->close();
Log 4, "$TV: socket closed";
}else{
Log 4, "$TV: not able to close socket";
}
}


Ich habe dann ein paar zusätzliche Log's eingebaut. Das new gibt irgendwie immer so etwas zurück IO::Socket::INET=GLOB(0x4991818)

und bei print immer 1, unabhängig, ob funktionierender Aufruf oder auch nicht.
Lediglich die Returns beim read und unterschiedlichen Ports fallen differenziert aus.
Bei ihm:
Port 8001,80 --> Kommunikation kommt überhaupt nicht zustande
Bei 8080 --> RC=20 und bei 7676 --> RC=6 

Bei mir:
Test der funktionsfähigen Funktion auf Port 7676 --> RC=12
Port 8001,8080 --> Kommunikation kommt überhaupt nicht zustande
Port 80 --> RC=18


Und wer bis hier hin Geduld hatte, kommt auch in den "Genuss" der Gretchenfrage:
Das scheint doch offensichtlich eine Aussage zu sein, dass der Server das Gesendete verarbeiten konnte oder nicht. Aber wo zur Hölle finde ich, was diese Return-Codes bedeuten  :o

Any Help ?

Schöne Feiertage
Markus
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt