$Host = 'x.x.x.x'; //hier IP-Adresse TV eintragen $parent_arr = IPS_GetObject(IPS_GetObject($IPS_SELF)['ParentID']); //ermitteln der Variablen_ID's $kategorie_id = $parent_arr['ObjectID']; $id_session_init_vector = IPS_GetVariableIDByName ('session_iv', $kategorie_id); $id_session_key = IPS_GetVariableIDByName ('session_key', $kategorie_id); $id_session_hmac_key = IPS_GetVariableIDByName ('session_hmac_key', $kategorie_id); $id_app_id = IPS_GetVariableIDByName ('app_id', $kategorie_id); $id_session_id = IPS_GetVariableIDByName ('session_id', $kategorie_id); $id_opensession = IPS_GetVariableIDByName ('session_is_open', $kategorie_id); $id_session_sequ_num = IPS_GetVariableIDByName ('session_sequ_num', $kategorie_id); $session_iv = base64_decode(GetValue($id_session_init_vector)); //laden der benötigten Variablen $session_key = base64_decode(GetValue($id_session_key)); $session_hmac_key = base64_decode(GetValue($id_session_hmac_key)); $app_id = GetValue($id_app_id); $session_id = GetValue($id_session_id); $openSession = GetValue($id_opensession); //ist die Session offen ? if ($openSession == false) { $session_id = request_session(); //wenn nein, dann anfordern einer session_id SetValue($id_session_id, $session_id); //speichern der ID SetValue($id_session_sequ_num, 1); //sequ_num = 1 SetValue($id_opensession, true); //session ist offen } $session_sequ_num = GetValue($id_session_sequ_num)+1; SetValue($id_session_sequ_num, $session_sequ_num); $session_sequ_num = strval($session_sequ_num); //session_sequ Integer zu 8 Zeichen String $i = 8-strlen($session_sequ_num); $add = ''; $add = str_pad( $add, $i, '0' ); $session_sequ_num = $add.$session_sequ_num; //sende Commands ================================================================================================================== //Fernbedienungskommendos zum Testen //$command = 'NRC_CHG_INPUT-ONOFF'; // AV //$command = 'NRC_TV-ONOFF'; // TV //$command = 'NRC_VOLUP-ONOFF'; //$command = 'NRC_POWER-ONOFF'; //$command = 'NRC_VOLDOWN-ONOFF'; //send_command($command); //$mute = '1'; //mute on //$mute = '0'; //mute off //SetMute($Host, $mute); //$res = GetMute($Host); //Echo $res; //$res = GetVolume($Host); //Echo $res; //SetVolume($Host, 10); // Funktionen der Fernbedienung ===================================================================================================================== function send_command($keyCode) { global $session_iv, $session_key, $session_hmac_key, $app_id, $session_sequ_num, $session_id, $Host; $data = ''.$session_id.''. ''.$session_sequ_num.''. ''. '' . $keyCode . ' '; $encrypted_command = encrypt_soap_payload($data,$session_key,$session_iv,$session_hmac_key); $action = 'X_EncryptedCommand'; $param = ''.$app_id.''.$encrypted_command.''; return SoapRequest($Host, 'nrc/control_0', 'panasonic-com:service:p00NetworkControl:1', $action, [ 'args' => $param, 'returnXml' => false],'u'); } function GetVolume($Host) { return SoapRequest($Host, 'dmr/control_0', 'schemas-upnp-org:service:RenderingControl:1', 'GetVolume', [ 'args' => '0Master', 'returnXml' => false], 'u'); } function SetVolume($Host, $volume) { $volume = intval($volume); return SoapRequest($Host,'dmr/control_0', 'schemas-upnp-org:service:RenderingControl:1', 'SetVolume', [ 'args' => '0Master' . $volume . '', 'returnXml' => true], 'u'); } function SetMute($Host, $wert){ return SoapRequest($Host,'dmr/control_0', 'schemas-upnp-org:service:RenderingControl:1', 'SetMute', [ 'args' => '0Master'.$wert.'', 'returnXml' => true], 'u'); } function GetMute($Host){ return SoapRequest($Host, 'dmr/control_0', 'schemas-upnp-org:service:RenderingControl:1', 'GetMute', [ 'args' => '0Master', 'returnXml' => false], 'u'); } // Basis-Funktionen ============================================================================================================================= function request_session() { global $Host, $session_iv, $session_key, $session_hmac_key, $app_id; $data = ''.$app_id.''; $encinfo = encrypt_soap_payload($data, $session_key, $session_iv, $session_hmac_key); $params = ''.$app_id.''.''.$encinfo.''; $res = SoapRequest($Host, 'nrc/control_0', 'panasonic-com:service:p00NetworkControl:1', 'X_GetEncryptSessionId', [ 'args' => $params, 'returnXml' => false],'u'); $res_dec = decrypt_soap_payload($res, $session_key, $session_iv, $session_hmac_key); $pattern = "|>(.*?)<|"; preg_match_all($pattern, $res_dec, $matches); return($matches[1][0]); } function SoapRequest($Host, $path, $urn, $action, $option = [], $Body_Element) { $input = '<' . '?xml version="1.0" encoding="utf-8"?>' . ' <'.$Body_Element.':' . $action . ' xmlns:'.$Body_Element.'="urn:' . $urn . '"> ' . $option['args'] . ' '; $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, 'http://' . $Host . ':55000/' . $path); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_HTTPHEADER, ['SOAPACTION: "urn:' . $urn . '#' . $action . '"']); curl_setopt($curl, CURLOPT_POSTFIELDS, $input); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); if ($option['returnXml']) { return $data; } else { $xml = simplexml_load_string($data); if ($xml === false) { trigger_error('SoapRequest failed (action = ' . $action . ')'); } $ns = $xml->getNamespaces(true); $soap = $xml->children($ns['s']); $res = $soap->children($ns['u'])->children(); return $res[0]; } } function decrypt_soap_payload($data, $key, $init_vector) { $ciphertext = base64_decode($data); $cipher="AES-128-CBC"; $result = openssl_decrypt($ciphertext, 'AES-128-CBC', $key, 3, $init_vector); return ($result); } function encrypt_soap_payload($data, $key, $init_vector, $hmac_key) { $payload = ''; for ($i = 0; $i <= 11; $i++) $payload=$payload.chr(rand(0,255)); $payload = $payload.pack("N", strlen($data)).$data; $add = 16- (strlen($payload)%16); $i = 0; while($i < $add) { $payload = $payload.chr(0); $i = $i+1; } $ciphertext = openssl_encrypt($payload, 'AES-128-CBC', $key, $options=1, $init_vector); $sig = hash_hmac('sha256', $ciphertext, $hmac_key, true); $result = base64_encode($ciphertext.$sig); return ($result); }