$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'] . '
'.$Body_Element.':' . $action . '>
';
$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);
}