Ankündigung

Einklappen
Keine Ankündigung bisher.

IP Control der neuen LG WebOS TV's

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Media] IP Control der neuen LG WebOS TV's

    Hallo zusammen,

    gibt es Interesse an einer IP Control Lösung der neuen LG WebOS TVs?

    Bislang habe ich meinen "älteren" LG TV (mit RS232 Schnittstelle) per Moxa über IP gesteuert und den "mittelalten" LG NetCast 4.5 TV per LG UDAP 2.0. Das hat ganz gut funktioniert, wobei die Geräte ohne RS232 (NetCast) leider nicht remote eingeschaltet werden können. Mit dem versteckten "Hotel-Mode" und einer schaltbaren Steckdose geht das aber sehr gut. Man kann dort z.B. Input, Lautstärke und Einschaltzustand bei Stromzufuhr einstellen. Danach kann man per UDAP die meisten Funktionen der Fernbedienung ausführen.

    Da ich nun einen TV größer als 55 Zoll kaufen möchte, musste ich feststellen, dass es nur noch WebOS basierte Geräte von LG gibt und ich habe basierend auf verschiedenen Quellen und ein paar wiresharks sniffs versucht den WebOS Emulator von LG per IP zu steuern. Ich bin ganz optimistisch, dass die wesentlichen Funktionen damit steuerbar sind. Ausnahme bleibt die Funktion Power-ON. Ich hoffe dass auch die WebOS Geräte noch einen Hotelmodus haben. Implementiert habe ich bislang PowerOff, SetVolume, ShowMessage, SetVolume.

    Falls jemand hier Interesse an einer solchen Lösung hat (die sicherlich auch leicht für den HS , openHAB, etc. angepasst werden könnte) und auch ein echtes LG WebOS Gerät hat und bereit wäre mal einen kurzen Test zu machen, dann bitte melden. Es handelt sich um eine PHP Klasse, d.h. idealerweise wäre ein Linux-Rechner mit php (cli reicht) vorhanden und man muss die IP des LG TV kennen. Ich würde dann den Code noch ein wenig beautifien (ich bin kein Entwickler ).

    Freue mich auf eine Rückmeldung.

    Viele Grüße

    André


    #2
    Hallo André,

    ich bin gerade auf der Suche nach einer Möglichkeit meinen LG TV über openHAB zu steuern und bin durch meine Google-Suche hier gelandet.
    Ich könnte das mal testen, habe allerdings nur einen Windows Rechner. Auf dem läuft aber ein Apache Server über XAMPP. Damit sollte es doch auch gehen oder?

    Viele Grüße

    Tobias

    Kommentar


      #3
      Hallo André,

      ich habe ebenfalls Interesse. Als nächsten Schritt wollte ich Textmeldungen im TV (ein LB650) einblenden, falls z.B. jmd anruft. Schön wäre auch, wenn es klappt, das aktuelle TV Programm ab dann aufzuzeichnen und zu pausieren, damit ich in Ruhe telefonieren kann.

      Openhab läuft bei mir auf Lubuntu auf einem Banana Pro.

      Bin ich gespannt, ob Tobias schon etwas in Richtung Openhab Integration erreicht hat!

      Grüße,
      Simeon

      Kommentar


        #4
        Ich hätte ebenfalls Interesse, habe einen LG LB630V.
        Interessant wäre für mich auch die Quellenumschaltung (HDMI1,HDMI2 usw.).
        Grüße
        Matze

        Kommentar


          #5
          Hi,

          ich hätte ebenfalls Interesse, würdest du eventuell mal deine php bereitstellen.

          Gruß Benjamin

          Kommentar


            #6
            Hab den thread über die Suche gefunden, hat jemand schon geschafft sich mit dem TV zu verbinden ?
            es gibt ja die offizielle LG app , die eigentlich genau das kann was wir machen möchten
            es scheint etwas zu geben, allerdings für sailfish OS
            https://github.com/CODeRUS/harbour-l...ree/master/src

            Kommentar


              #7
              Hallo André,

              ich komme aus der "FHEM- Ecke" und würde ebenfalls gern unseren neuen WebOS 2.0- TV steuern. Leider gibt es einige praktische Probleme, bevor überhaupt an Netzwekbefehle zu denken ist:
              Die aktuellen LG- TVs haben zwar einen Hotel- Modus und ich komme dort bereits auch rein. Damit kann man den TV so konfigurieren, dass er bei Zuschalten der Netzspannung sofort hochfährt und eine vorgegebene Quelle oder Kanal anspringt und immer die gleiche Lautstärke einstellt. Leider ist dann aber die Netzwerkanbindung deaktiviert, sodass keine Steuerung per LAN/WLAN mehr möglich ist.
              Mein Ansatz war nun, den TV im "Normal- Modus" zu belassen und das Feature "TV per Mobilgerät einschalten" zu nutzen. Das funktioniert leider auch nicht: Ich kann den TV zwar mit der Android- App "LG TV Plus" steuern wenn er bereits läuft, ist er jedoch im Standby, findet ihn die App nicht. Obwohl er (wie im Menü beim Aktivieren der Funktion angedroht) etwas mehr Standby- Strom verbraucht (ca. 1,5 statt 0,3 Watt) und man daher vermuten könnte, dass er das WLAN wirklich aktiv hält. Und obwohl ich sogar ein LG- Smartphone benutze.
              Auch meine erste Idee, den TV per CEC mit unserem Kathrein- Receiver automatisch ein- und auszuschalten ist gescheitert, obwohl beide Geräte dieses Feature haben.
              Mit einem Raspi und der Software "CEC-O-Mat" soll das wohl gehen, aber meine Linux- Box steht weit vom TV entfernt.

              Freue mich auf euren Input und gute Ideen...

              Viele Grüße

              Frank

              Edit: Hier gibt es eine fertige Lösung für javascript. Ich hab keine Ahnung davon, aber in diesem Fall lohnt es sich, sich da mal einzulesen...
              Zuletzt geändert von Fiedel; 03.10.2015, 19:44.

              Kommentar


                #8
                Es gibt wohl LG-Geräte mit WebOS, die eine Klinkenbuchse für RS232 haben....jedenfalls ist hier viel nützlichr Input:

                https://iicybersecurity.wordpress.co...amsung-and-lg/

                Die Steuerung per SmartPhone macht ein Haus nicht zum SmartHome...

                Kommentar


                  #9
                  Sorry, hatte den Thread hier aus den Augen verloren.
                  Ich werde gleich mal was dazu hochladen.

                  Kommentar


                    #10
                    Also hier jetzt der vesprochene PHP Code zur Ansteuerung von LG WebOS TV Geräten.
                    PHP Klasse und Testskript in dasselbe Verzeichnis kopieren.
                    IP Adresse im Testskript anpassen, so dass dort die IP eures TV steht.

                    Beim ersten Start sollte das TV fragen, ob der Connect akzeptiert werden soll. Das mit "JA" bestätigen.
                    Danach wird das Testskript (zweites PHP-File weiter unten) die Meldung "YEAH, it works!!!" auf dem Bildschirm ausgeben und nach 5 Sekunden die Lauststärke auf 50 setzen. Dann habt ihr es fast geschafft, denn das Skript erzeugt bei diesem ersten Aufruf auch eine Ausgabe, die wie folgt aussieht:

                    Code:
                    Sending WS handshake
                    GET / HTTP/1.1
                    Upgrade: websocket
                    Connection: Upgrade
                    Sec-WebSocket-Version: 13
                    Sec-WebSocket-Key: XSR5UVgmU3BDQVlMNzFHIg==
                    Host: 192.168.0.200:3000
                    
                    
                    WS Handshake Response:
                    HTTP/1.1 101 Switching Protocols
                    Upgrade: websocket
                    Connection: Upgrade
                    Sec-WebSocket-Accept: QaJc/PIJ4Ctvn0Di4fFIq9tFdDA=
                    
                    
                    Sucessfull WS connection to 192.168.0.200:3000
                    
                    Sending LG handshake
                    {"type":"register","id":"register_0","payload":{"forcePairing":false,"pairingType":"PROMPT","manifest":{"manifestVersion":1,"appVersion":"1.1","signed":{"created":"20140509","appId":"com.lge.test","vendorId":"com.lge","localizedAppNames":{"":"LG Remote App","ko-KR":"리모컨 앱","zxx-XX":"ЛГ Rэмotэ AПП"},"localizedVendorNames":{"":"LG Electronics"},"permissions":["TEST_SECURE","CONTROL_INPUT_TEXT","CONTROL_MOUSE_AND_KEYBOARD","READ_INSTALLED_APPS","READ_LGE_SDX","READ_NOTIFICATIONS","SEARCH","WRITE_SETTINGS","WRITE_NOTIFICATION_ALERT","CONTROL_POWER","READ_CURRENT_CHANNEL","READ_RUNNING_APPS","READ_UPDATE_INFO","UPDATE_FROM_REMOTE_APP","READ_LGE_TV_INPUT_EVENTS","READ_TV_CURRENT_TIME"],"serial":"2f930e2d2cfe083771f68e4fe7bb07"},"permissions":["LAUNCH","LAUNCH_WEBAPP","APP_TO_APP","CLOSE","TEST_OPEN","TEST_PROTECTED","CONTROL_AUDIO","CONTROL_DISPLAY","CONTROL_INPUT_JOYSTICK","CONTROL_INPUT_MEDIA_RECORDING","CONTROL_INPUT_MEDIA_PLAYBACK","CONTROL_INPUT_TV","CONTROL_POWER","READ_APP_STATUS","READ_CURRENT_CHANNEL","READ_INPUT_DEVICE_LIST","READ_NETWORK_STATE","READ_RUNNING_APPS","READ_TV_CHANNEL_LIST","WRITE_NOTIFICATION_TOAST","READ_POWER_STATE","READ_COUNTRY_INFO"],"signatures":[{"signatureVersion":1,"signature":"eyJhbGdvcml0aG0iOiJSU0EtU0hBMjU2Iiwia2V5SWQiOiJ0ZXN0LXNpZ25pbmctY2VydCIsInNpZ25hdHVyZVZlcnNpb24iOjF9.hrVRgjCwXVvE2OOSpDZ58hR+59aFNwYDyjQgKk3auukd7pcegmE2CzPCa0bJ0ZsRAcKkCTJrWo5iDzNhMBWRyaMOv5zWSrthlf7G128qvIlpMT0YNY+n/FaOHE73uLrS/g7swl3/qH/BGFG2Hu4RlL48eb3lLKqTt2xKHdCs6Cd4RMfJPYnzgvI4BNrFUKsjkcu+WD4OO2A27Pq1n50cMchmcaXadJhGrOqH5YmHdOCj5NSHzJYrsW0HPlpuAx/ECMeIZYDh6RMqaFM2DXzdKX9NmmyqzJ3o/0lkk/N97gfVRLW5hA29yeAwaCViZNCP8iC9aO0q9fQojoa7NQnAtw=="}]}}}
                    
                    LG Handshake Response
                    {"type":"response","id":"register_0","payload":{"pairingType":"PROMPT","returnValue":true}}
                    LG Client-Key successfully received: 785cff4fef58555ef82188b83cda579e
                    Sending command      : {"id":"message","type":"request","uri":"ssap://system.notifications/createToast","payload":{"message": "YEAH, it works!!!"}}
                    Command response     : {"type":"response","id":"message","payload":{"toastId":"com.webos.service.apiadapter-1452798056512","returnValue":true}}
                    Sending command      : {"id":"set_volume","type":"request","uri":"ssap://audio/setVolume","payload":{"volume":100}}
                    Command response     : {"type":"response","id":"set_volume","payload":{"returnValue":true}}
                    Connection closed to 192.168.0.200

                    Wichtig ist hier der grün markierte Key. Das Testskript nun anpassen:

                    Aus

                    PHP-Code:
                    $tv = new webOSTV("192.168.0.200"); 
                    macht ihr

                    PHP-Code:
                    $tv = new webOSTV("192.168.0.200",3000,"785cff4fef58555ef82188b83cda579e"); 
                    Danach das Skript nochmal starten. Jetzt sollte eigentlich keine Bestätigung mehr am TV notwendig sein, da das Skript nun Autorisiert ist.
                    Es sollte nun rechts oben wieder die Meldung erscheinen "YEAH, it works!!!" erscheinen. Und nach 5 Sekunden, sollte die Lautstärke wieder auf 50 gesetzt werden.

                    Habe das alles gerade noch mal getestet mit dem LG WebOS Simulator unter VirtualBox. Es funktioniert! Ich habe derzeit selbst kein WebOS Gerät, sondern nur ein älteres Modell mit RS232, welches ich über einen Moxa steuere und 3 NetCast 4.5 TV Geräte, welche ich über das LG UDAP Protokoll ansteuere. Grundsätzlich kann man also alle Geräte der letzten 10 Jahre von LG ansteuern, solange es sich um Smart-TVs handelt. Da m.W. aber alle neuen Modell WebOS haben, ist dies hier vermutlich derzeit am interessantesten.

                    Viele Spass beim Testen....

                    André



                    Hier nun die PHP Klasse webos.inc.php :

                    PHP-Code:
                    class webOSTV
                    {
                        private 
                    $host$port$ws_key$path$lg_key$sock$connected=false$handshaked=false;

                        function 
                    webOSTV($host$port=3000$lgKey="NOKEY"$path="/")
                        {
                            
                    $this->host $host;
                            
                    $this->port $port;
                            
                    $this->lg_key $lgKey;
                            
                    $this->path $path;
                            
                    $this->ws_key $key base64_encode(generateRandomString(16falsetrue));
                            if (
                    $this->lg_key=="NOKEY") unset($this->lg_key);    
                        }
                            
                        function 
                    connect()
                        {
                            
                    $ws_handshake_cmd "GET " $this->path " HTTP/1.1\r\n";
                            
                    $ws_handshake_cmd.= "Upgrade: websocket\r\n";
                            
                    $ws_handshake_cmd.= "Connection: Upgrade\r\n";
                            
                    $ws_handshake_cmd.= "Sec-WebSocket-Version: 13\r\n";            
                            
                    $ws_handshake_cmd.= "Sec-WebSocket-Key: " $this->ws_key "\r\n";
                            
                    $ws_handshake_cmd.= "Host: ".$this->host.":".$this->port."\r\n\r\n";
                            
                    $this->sock fsockopen($this->host$this->port$errno$errstr2);
                            
                    socket_set_timeout($this->sock010000);
                            echo     
                    "Sending WS handshake\n$ws_handshake_cmd\n";
                            
                    $response $this->send($ws_handshake_cmd);
                            if (
                    $response)
                            {
                                echo 
                    "WS Handshake Response:\n$response\n";
                            } else 
                                echo 
                    "ERROR during WS handshake!\n";
                            
                    preg_match('#Sec-WebSocket-Accept:\s(.*)$#mU'$response$matches);
                            if (
                    $matches) {
                                
                    $keyAccept trim($matches[1]);
                                
                    $expectedResonse base64_encode(pack('H*'sha1($this->ws_key '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));
                                
                    $this->connected = ($keyAccept === $expectedResonse) ? true false;
                            } else 
                    $this->connected=false;
                            if (
                    $this->connected) echo "Sucessfull WS connection to $this->host:$this->port\n\n";
                            return 
                    $this->connected;  
                        }
                        
                        function 
                    lg_handshake()
                        {
                            if (!
                    $this->connected$this->connect();
                            if (
                    $this->connected)
                            {
                                
                    $handshake =    "{"type":"register","id":"register_0","payload":{"forcePairing":false,"pairingType":"PROMPT","client-key":"HANDSHAKEKEYGOESHERE","manifest":{"manifestVersion":1,"appVersion":"1.1","signed":{"created":"20140509","appId":"com.lge.test","vendorId":"com.lge","localizedAppNames":{"":"LG Remote App","ko-KR":"리모컨 ì•±","zxx-XX":"ЛГ RÑ�мotÑ� AПП"},"localizedVendorNames":{"":"LG Electronics"},"permissions":["TEST_SECURE","CONTROL_INPUT_TEXT","CONTROL_MOUSE_AND_KEYBOARD","READ_INSTALLED_APPS","READ_LGE_SDX","READ_NOTIFICATIONS","SEARCH","WRITE_SETTINGS","WRITE_NOTIFICATION_ALERT","CONTROL_POWER","READ_CURRENT_CHANNEL","READ_RUNNING_APPS","READ_UPDATE_INFO","UPDATE_FROM_REMOTE_APP","READ_LGE_TV_INPUT_EVENTS","READ_TV_CURRENT_TIME"],"serial":"2f930e2d2cfe083771f68e4fe7bb07"},"permissions":["LAUNCH","LAUNCH_WEBAPP","APP_TO_APP","CLOSE","TEST_OPEN","TEST_PROTECTED","CONTROL_AUDIO","CONTROL_DISPLAY","CONTROL_INPUT_JOYSTICK","CONTROL_INPUT_MEDIA_RECORDING","CONTROL_INPUT_MEDIA_PLAYBACK","CONTROL_INPUT_TV","CONTROL_POWER","READ_APP_STATUS","READ_CURRENT_CHANNEL","READ_INPUT_DEVICE_LIST","READ_NETWORK_STATE","READ_RUNNING_APPS","READ_TV_CHANNEL_LIST","WRITE_NOTIFICATION_TOAST","READ_POWER_STATE","READ_COUNTRY_INFO"],"signatures":[{"signatureVersion":1,"signature":"eyJhbGdvcml0aG0iOiJSU0EtU0hBMjU2Iiwia2V5SWQiOiJ0ZXN0LXNpZ25pbmctY2VydCIsInNpZ25hdHVyZVZlcnNpb24iOjF9.hrVRgjCwXVvE2OOSpDZ58hR+59aFNwYDyjQgKk3auukd7pcegmE2CzPCa0bJ0ZsRAcKkCTJrWo5iDzNhMBWRyaMOv5zWSrthlf7G128qvIlpMT0YNY+n/FaOHE73uLrS/g7swl3/qH/BGFG2Hu4RlL48eb3lLKqTt2xKHdCs6Cd4RMfJPYnzgvI4BNrFUKsjkcu+WD4OO2A27Pq1n50cMchmcaXadJhGrOqH5YmHdOCj5NSHzJYrsW0HPlpuAx/ECMeIZYDh6RMqaFM2DXzdKX9NmmyqzJ3o/0lkk/N97gfVRLW5hA29yeAwaCViZNCP8iC9aO0q9fQojoa7NQnAtw=="}]}}}";
                                if (isset(
                    $this->lg_key)) 
                                    
                    $handshake str_replace('HANDSHAKEKEYGOESHERE',$this->lg_key,$handshake);
                                else  
                    $handshake =    "{"type":"register","id":"register_0","payload":{"forcePairing":false,"pairingType":"PROMPT","manifest":{"manifestVersion":1,"appVersion":"1.1","signed":{"created":"20140509","appId":"com.lge.test","vendorId":"com.lge","localizedAppNames":{"":"LG Remote App","ko-KR":"리모컨 ì•±","zxx-XX":"ЛГ RÑ�мotÑ� AПП"},"localizedVendorNames":{"":"LG Electronics"},"permissions":["TEST_SECURE","CONTROL_INPUT_TEXT","CONTROL_MOUSE_AND_KEYBOARD","READ_INSTALLED_APPS","READ_LGE_SDX","READ_NOTIFICATIONS","SEARCH","WRITE_SETTINGS","WRITE_NOTIFICATION_ALERT","CONTROL_POWER","READ_CURRENT_CHANNEL","READ_RUNNING_APPS","READ_UPDATE_INFO","UPDATE_FROM_REMOTE_APP","READ_LGE_TV_INPUT_EVENTS","READ_TV_CURRENT_TIME"],"serial":"2f930e2d2cfe083771f68e4fe7bb07"},"permissions":["LAUNCH","LAUNCH_WEBAPP","APP_TO_APP","CLOSE","TEST_OPEN","TEST_PROTECTED","CONTROL_AUDIO","CONTROL_DISPLAY","CONTROL_INPUT_JOYSTICK","CONTROL_INPUT_MEDIA_RECORDING","CONTROL_INPUT_MEDIA_PLAYBACK","CONTROL_INPUT_TV","CONTROL_POWER","READ_APP_STATUS","READ_CURRENT_CHANNEL","READ_INPUT_DEVICE_LIST","READ_NETWORK_STATE","READ_RUNNING_APPS","READ_TV_CHANNEL_LIST","WRITE_NOTIFICATION_TOAST","READ_POWER_STATE","READ_COUNTRY_INFO"],"signatures":[{"signatureVersion":1,"signature":"eyJhbGdvcml0aG0iOiJSU0EtU0hBMjU2Iiwia2V5SWQiOiJ0ZXN0LXNpZ25pbmctY2VydCIsInNpZ25hdHVyZVZlcnNpb24iOjF9.hrVRgjCwXVvE2OOSpDZ58hR+59aFNwYDyjQgKk3auukd7pcegmE2CzPCa0bJ0ZsRAcKkCTJrWo5iDzNhMBWRyaMOv5zWSrthlf7G128qvIlpMT0YNY+n/FaOHE73uLrS/g7swl3/qH/BGFG2Hu4RlL48eb3lLKqTt2xKHdCs6Cd4RMfJPYnzgvI4BNrFUKsjkcu+WD4OO2A27Pq1n50cMchmcaXadJhGrOqH5YmHdOCj5NSHzJYrsW0HPlpuAx/ECMeIZYDh6RMqaFM2DXzdKX9NmmyqzJ3o/0lkk/N97gfVRLW5hA29yeAwaCViZNCP8iC9aO0q9fQojoa7NQnAtw=="}]}}}";
                                echo 
                    "Sending LG handshake\n$handshake\n";
                                
                    $response $this->send(hybi10Encode($handshake));
                                if (
                    $response)
                                {
                                    echo 
                    "\nLG Handshake Response\n".json_string($response)."\n";
                                    
                    $result json_array($response);
                                    if (
                    $result && array_key_exists('id',$result) &&  $result['id']=='result_0' && array_key_exists('client-key',$result['payload']))
                                    {
                                        
                    // LG client-key received: COMPARE!!!
                                        
                    if ($this->lg_key == $result['payload']['client-key'])
                                            echo 
                    "LG Client-Key successfully approved\n"
                                    } else if (
                    $result && array_key_exists('id',$result) &&  $result['id']=='register_0' && array_key_exists('pairingType',$result['payload']) && array_key_exists('returnValue',$result['payload']))
                                    {    
                    // LG TV is prompting for access rights
                                        
                    if ($result['payload']['pairingType'] == "PROMPT" && $result['payload']['returnValue'] == "true"
                                        {
                                            
                    $starttime microtime(1);
                                            
                    $lg_key_received false;
                                            
                    $error_received false;
                                            do {
                                                
                    $response = @fread($this->sock8192);
                                                
                    $result json_array($response);
                                                if (
                    $result && array_key_exists('id',$result) &&  $result['id']=='register_0' && is_array($result['payload']) && array_key_exists('client-key',$result['payload']))
                                                {
                                                    
                    $lg_key_received true;
                                                    
                    $this->lg_key $result['payload']['client-key'];
                                                    echo 
                    "LG Client-Key successfully received: $this->lg_key\n"
                                                } else if (
                    $result && array_key_exists('id',$result) &&  $result['id']=='register_0' && array_key_exists('error',$result))
                                                {
                                                    
                    $error_received true;
                                                    echo 
                    "ERROR: ".$result['error']."\n";
                                                }
                                                
                    usleep(200000);
                                                
                    $time microtime(1);
                                            } while (
                    $time-$starttime<60 && !$lg_key_received && !$error_received);
                                        }
                                    }
                                } else echo 
                    "ERROR during LG handshake:\n";
                            } else return 
                    FALSE
                        }

                        function 
                    disconnect()
                        { 
                            
                    $this->connected=false;
                            @
                    fclose($this->sock);
                            echo 
                    "Connection closed to $this->host\n";
                        }

                        function 
                    send($msg)
                        {
                            @
                    fwrite($this->sock$msg);
                            
                    usleep(250000);
                            
                    $response = @fread($this->sock8192);
                            return 
                    $response;
                        }
                        
                        function 
                    send_command($cmd)
                        {
                            if (!
                    $this->connected$this->connect();
                            if (
                    $this->connected)
                            {
                                echo 
                    "Sending command      : $cmd\n";
                                
                    $response $this->send(hybi10Encode($cmd));
                                if (
                    $response)
                                    echo 
                    "Command response     : ".json_string($response)."\n";
                                else 
                                    echo 
                    "Error sending command: $cmd\n";
                                return 
                    $response;            
                            } 
                        }
                        
                        function 
                    message($msg)
                        {
                            
                    $command "{"id":"message","type":"request","uri":"ssap://system.notifications/createToast","payload":{"message": "$msg"}}";
                            
                    $this->send_command($command);
                        }
                        
                        function 
                    power_off()
                        {
                            
                    $command "{"id":"power_off","type":"request","uri":"ssap://system/turnOff"}";
                            
                    $this->send_command($command);
                        }

                        function 
                    set_volume($vol)
                        {
                            
                    $command "{"id":"set_volume","type":"request","uri":"ssap://audio/setVolume","payload":{"volume":$vol}}";
                            
                    $this->send_command($command);
                        }
                    }    
                            
                    function 
                    hybi10Encode($payload$type 'text'$masked true) {
                            
                    $frameHead = array();
                            
                    $frame '';
                            
                    $payloadLength strlen($payload);

                            switch (
                    $type) {
                                case 
                    'text':
                                    
                    // first byte indicates FIN, Text-Frame (10000001):
                                    
                    $frameHead[0] = 129;
                                    break;

                                case 
                    'close':
                                    
                    // first byte indicates FIN, Close Frame(10001000):
                                    
                    $frameHead[0] = 136;
                                    break;

                                case 
                    'ping':
                                    
                    // first byte indicates FIN, Ping frame (10001001):
                                    
                    $frameHead[0] = 137;
                                    break;

                                case 
                    'pong':
                                    
                    // first byte indicates FIN, Pong frame (10001010):
                                    
                    $frameHead[0] = 138;
                                    break;
                            }

                            
                    // set mask and payload length (using 1, 3 or 9 bytes)
                            
                    if ($payloadLength 65535) {
                                
                    $payloadLengthBin str_split(sprintf('%064b'$payloadLength), 8);
                                
                    $frameHead[1] = ($masked === true) ? 255 127;
                                for (
                    $i 0$i 8$i++) {
                                    
                    $frameHead[$i 2] = bindec($payloadLengthBin[$i]);
                                }

                                
                    // most significant bit MUST be 0 (close connection if frame too big)
                                
                    if ($frameHead[2] > 127) {
                                    
                    $this->close(1004);
                                    return 
                    false;
                                }
                            } elseif (
                    $payloadLength 125) {
                                
                    $payloadLengthBin str_split(sprintf('%016b'$payloadLength), 8);
                                
                    $frameHead[1] = ($masked === true) ? 254 126;
                                
                    $frameHead[2] = bindec($payloadLengthBin[0]);
                                
                    $frameHead[3] = bindec($payloadLengthBin[1]);
                            } else {
                                
                    $frameHead[1] = ($masked === true) ? $payloadLength 128 $payloadLength;
                            }

                            
                    // convert frame-head to string:
                            
                    foreach (array_keys($frameHead) as $i) {
                                
                    $frameHead[$i] = chr($frameHead[$i]);
                            }

                            if (
                    $masked === true) {
                                
                    // generate a random mask:
                                
                    $mask = array();
                                for (
                    $i 0$i 4$i++) {
                                    
                    $mask[$i] = chr(rand(0255));
                                }

                                
                    $frameHead array_merge($frameHead$mask);
                            }
                            
                    $frame implode(''$frameHead);
                            
                    // append payload to frame:
                            
                    for ($i 0$i $payloadLength$i++) {
                                
                    $frame .= ($masked === true) ? $payload[$i] ^ $mask[$i 4] : $payload[$i];
                            }

                            return 
                    $frame;
                        }

                        function 
                    generateRandomString($length 10$addSpaces true$addNumbers true)
                        {  
                            
                    $characters 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"§$%&/()=[]{}';
                            
                    $useChars = array();
                            
                    // select some random chars:    
                            
                    for($i 0$i $length$i++)
                            {
                                
                    $useChars[] = $characters[mt_rand(0strlen($characters)-1)];
                            }
                            
                    // add spaces and numbers:
                            
                    if($addSpaces === true)
                            {
                                
                    array_push($useChars' '' '' '' '' '' ');
                            }
                            if(
                    $addNumbers === true)
                            {
                                
                    array_push($useCharsrand(0,9), rand(0,9), rand(0,9));
                            }
                            
                    shuffle($useChars);
                            
                    $randomString trim(implode(''$useChars));
                            
                    $randomString substr($randomString0$length);
                            return 
                    $randomString;
                        }

                        function 
                    json_array($str)
                        {
                            
                    $result json_decode(json_string($str),true);
                            return 
                    $result;
                        }
                        
                        function 
                    json_string($str)
                        {
                            
                    $from strpos($str,"{");
                            
                    $to strripos($str,"}");
                            
                    $len $to-$from+1;
                            
                    $result substr($str,$from,$len);
                            return 
                    $result;
                        } 

                    Und hier das Testskript test-lg-webos.php,


                    PHP-Code:
                    include_once 'webos.inc.php';

                    $tv = new webOSTV("192.168.0.200");    // Change to the IP of your LG device
                    $tv->connect();                        // 
                    $tv->lg_handshake();
                    $tv->message("YEAH, it works!!!");
                    sleep (5);
                    $tv->set_volume(75); 
                    sleep(10);
                    $tv->disconnect(); 
                    welches ihr mit dem php-cli aufruft, also
                    Code:
                     php test-lg-webos.php

                    Kommentar


                      #11
                      Hi,

                      erstmal danke für das script, ich hab eben mal getestet. Leider bekomme ich beim aufrufen einen "Syntax error" on line 48

                      Ich habe jetzt mal bißchen geschaut aber konnte nichts finden, läuft das script so bei dir???

                      Gruß Benjamin

                      Kommentar


                        #12
                        Hallo André und vielen Dank für den Code und...

                        ... auch ich habe das gleiche Problem wie benji - folgende Fehlermeldung:
                        Code:
                        $ php test-lg-webos.php
                        PHP Parse error:  syntax error, unexpected 'type' (T_STRING) in /home/pi/webOSTV/webos.inc.php on line 48
                        und kann nichts finden, um den Fehler aufzuspühren - vielen Dank füt Tipps

                        Gruß Marco

                        Kommentar


                          #13
                          Ich habe zwei Änderungen in der webos.inc.php vorgenommen:
                          1) In Zeile 48 das erste und letzte Anführungszeichen in Hochkomma ändern:
                          vorher:
                          Code:
                           $handshake =    "{"type":"register" ..... 9aO0q9fQojoa7NQnAtw=="}]}}}";
                          nachher:
                          Code:
                           $handshake =    '{"type":"register" ..... 9aO0q9fQojoa7NQnAtw=="}]}}}';

                          2) In Zeile 124 die Übergabe der Variable am Zeilenende ändern:
                          vorher:
                          Code:
                          ...payload":{"message":"$msg"}}';
                          nachher:
                          Code:
                          ...payload":{"message":"'. $msg .'"}}';
                          und dann: "YEAH, it works!!!"

                          vielen Dank André

                          Kommentar


                            #14
                            Hi,

                            ich hab nun mal getestet und noch weitere Zeilen geändert.
                            Verbindungsanfrage ist auch am TV angekommen und den Code habe ich eingetragen, mehr funktioniert allerdings derzeit noch nicht Hmmmm??

                            Gruß

                            Kommentar


                              #15
                              Habe gerade gesehen was das Problem ist:
                              Beim Kopieren hier ins Forum sind wohl alle Backslahes verlorengegangen. Ihr müsst vor jedem Anführungszeichen außer dem ersten letzten einen Backslash ergänzen.
                              Danach sollte der Fehler eigentlich weg sein:

                              $handshake = "{"type":"register","id":"register_0","payload":{" forcePairing":false,"pairingType":"PROMPT","client-key":"HANDSHAKEKEYGOESHERE","manifest":{"manifestV ersion":1,"appVersion":"1.1","signed":{"created":" 20140509","appId":"com.lge.test","vendorId":"com.l ge","localizedAppNames":{"":"LG Remote App","ko-KR":"리모컨 앱","zxx-XX":"ЛГ R�мot� AПП"},"localizedVendorNames":{"":"LG Electronics"},"permissions":["TEST_SECURE","CONTROL_INPUT_TEXT","CONTROL_MOUSE_ AND_KEYBOARD","READ_INSTALLED_APPS","READ_LGE_SDX" ,"READ_NOTIFICATIONS","SEARCH","WRITE_SETTINGS","W RITE_NOTIFICATION_ALERT","CONTROL_POWER","READ_CUR RENT_CHANNEL","READ_RUNNING_APPS","READ_UPDATE_INF O","UPDATE_FROM_REMOTE_APP","READ_LGE_TV_INPUT_EVE NTS","READ_TV_CURRENT_TIME"],"serial":"2f930e2d2cfe083771f68e4fe7bb07"},"permi ssions":["LAUNCH","LAUNCH_WEBAPP","APP_TO_APP","CLOSE","TES T_OPEN","TEST_PROTECTED","CONTROL_AUDIO","CONTROL_ DISPLAY","CONTROL_INPUT_JOYSTICK","CONTROL_INPUT_M EDIA_RECORDING","CONTROL_INPUT_MEDIA_PLAYBACK","CO NTROL_INPUT_TV","CONTROL_POWER","READ_APP_STATUS", "READ_CURRENT_CHANNEL","READ_INPUT_DEVICE_LIST","R EAD_NETWORK_STATE","READ_RUNNING_APPS","READ_TV_CH ANNEL_LIST","WRITE_NOTIFICATION_TOAST","READ_POWER _STATE","READ_COUNTRY_INFO"],"signatures":[{"signatureVersion":1,"signature":"eyJhbGdvcml0aG0 iOiJSU0EtU0hBMjU2Iiwia2V5SWQiOiJ0ZXN0LXNpZ25pbmctY 2VydCIsInNpZ25hdHVyZVZlcnNpb24iOjF9.hrVRgjCwXVvE2O OSpDZ58hR+59aFNwYDyjQgKk3auukd7pcegmE2CzPCa0bJ0ZsR AcKkCTJrWo5iDzNhMBWRyaMOv5zWSrthlf7G128qvIlpMT0YNY +n/FaOHE73uLrS/g7swl3/qH/BGFG2Hu4RlL48eb3lLKqTt2xKHdCs6Cd4RMfJPYnzgvI4BNrFU Ksjkcu+WD4OO2A27Pq1n50cMchmcaXadJhGrOqH5YmHdOCj5NS HzJYrsW0HPlpuAx/ECMeIZYDh6RMqaFM2DXzdKX9NmmyqzJ3o/0lkk/N97gfVRLW5hA29yeAwaCViZNCP8iC9aO0q9fQojoa7NQnAtw== "}]}}}";

                              Kommentar

                              Lädt...
                              X