Nachdem ich nun schon lange an einer Einbindung meinen C-Serie TV inkl versenden von Benachrichtigung an den TV gearbeitet habe, möchte ich euch das Herzstück meiner Bastelstunde nicht vorenthalten.
Mit welchen Geräten/Serien das Script arbeitet kann ich nicht sagen, da ich nur einen TV zum testen habe.
Die Fähigkeiten können z.B. mit dem ruSamsungTVCommunicator ermittelt werden.
Hier im Forum gibt es ja schon ein Script welches RC-Commandos per LAN versenden kann, dieses habe ich hier auch mit eingebaut und auf die Verwendung einen IPS-ClientSocket verzichtet.
Mein Gerät unterstützt außerdem per DMR (Digital-Media-Render / DLNA) das setzen und Abfragen der Lautstärke. Sowie per PMR (Personal-Message-Receiver) das empfangen und Anzeigen von Nachrichten.
Teilweise ist das ganze noch etwas umständlich und auch nicht zu 100% perfekt, so wird die Rückmeldung des TV bei RC-Commandos nicht ausgewertet.
Und da ich einfach keine Zeit/Lust hatte mich in die Verwendung von SOAP in PHP einzuarbeiten, werden die Datenpakete zu Fuß erzeugt und versendet. (Wer möchte kann das für die DMR und PMR Funktionen gerne einbauen.)
Ebenso scheiterte ich am abonnieren von DLNA-Events vom TV, welches z.B. das zykliche Abfragen der Lautstärke überflüssig machen würde.
Somit stellt nachfolgendes Script nur das Gerüst mit entsprechenden Funktionen dar, Variablen, Scripte für Steuerungen z.B. per WebFront oder per Events etc… müßt Ihr selber anlegen.
Doku:
1 ) Verwendung:
Diese Doku zeigt die Verwendung der beiliegenden Samsung.inc.php auf, welche
es ermöglicht relativ komfortabel an Samsung-Geräten (TV, BD …)
Fernbedienung-Kommandos und Nachrichten (PMR / DMR) zu senden.
Fehlermeldungen aufgrund von nicht erreichbaren Geräten bzw. fehlerhafter Übertragung etc.
werden unterdrückt. Hierfür stehen Rückgabewerte zur Verfügung.
Fehler durch nicht / falsch übergebene Parameter werden nicht unterdrückt und die
Daten / Parameter werden auch nicht verifiziert.
Script Samsung.inc.php innerhalb von IPS oder dessen Script-Ordner anlegen.
Einbindung z.B. mit
require_once("Samsung.inc.php");
2) Konfiguration
In der Samsung.inc.php sind die Konstanten und Variablen anzupassen !
Pro Gerät gibt es ein Array welches in $samy abgelegt wird.
Um bei den Funktionen nicht immer mit den IDs der $samy-Variable zu arbeiten,
wurden noch Konstanten (z.B. SamyTV, SamyBD) definiert.
Die Fähigkeiten des Gerätes vorher bitte mit dem ruSamsungTVCommunicator
ermitteln und einen Probelauf durchzuführen. Hiermit können auch die
u.U. abweichenden Ports festgestellt werden.
3) Vorbemerkungen zur PWR_VARID
Bevor Ihr beginnt:
Die in der Konfiguration anzugeben PWR_VARID ist eine bool-Var welche den
Zustand Ein/Aus des Gerätes wiederspiegelt.
Sie wird durch dieses Script nicht erzeugt !
Außerdem wird Sie erst aktualisiert, wenn ein Kommando ausgeführt wird.
Dabei wird geprüft ob das Gerät erreichbar ist und die Variable nachgeführt.
Da die Geräte nicht über das Netzwerk eingeschaltet werden können,
müßt Ihr ein eigenes Script mit eigener Hardware (z.B. WinLIRC /
CEC-Befehl eines Verstärkers / etc… ) nutzen um die Geräte einzuschalten.
Dabei könnt Ihr dann auch gleich die PWR_VARID auf true (also Gerät eingeschaltet)
setzen.
Mögliche Vorgehensweise um die PWR_VARID aktuell zu halten:
Prüfe ob LAN-Port des Gerätes UP/Down ist (Switch per SNMP anfragen).
Prüfe ob Fritz-Box meldet Gerät ist an (http://fritz.box/net/network_user_devices.lua auswerten)
Alle x sekunden Gerät versuchen anzupingen.
… Laßt auch was einfallen
4) Vorbemerkungen zur COM_ERROR_VARID
Da ich zyklisch die Lautstärke vom TV abfrage, kommt es oft zu Fehlern, wenn der TV schon aus
ist (per Hand ausgeschaltet) und IPS das somit nicht weiß. Darum führe ich einen Zähler in diesem
Script mit, welches bei >= 5 Fehlversuchen die PWR_VARID auf false setzt.
Außerdem wird der Kommunikationsfehler nicht ausgewertet, wenn das Versenden einer
SOAP-Nachricht (DMR / PMR) den Fehler 10061 bringt, weil dieser auftritt wenn ein Verstärker die
Audioausgabe übernimmt.
5) Funktionsreferenz
**** variant SAMY_SendControl(int $Command, int [$Data],int [$Device]); ****
Sendet einen Befehl an den DMR (Digital Media Render) des Gerätes.
Funktioniert nicht wenn Audio über einen angeschloßenen Verstärker wiedergegeben wird !
$Command:
SAMSUNG_CONTROL_SETVOLUME = Lautstärke setzen
SAMSUNG_CONTROL_GETVOLUME = Lautstärke lesen
SAMSUNG_CONTROL_SETMUTE = Mute / Unmute setzen
SAMSUNG_CONTROL_GETMUTE = Mute / Unmute lesen
$Data:
Neue Lautstärke bzw. neuer Status für Mute (0 = Unmute / 1 = Mute)
Wird bei SAMSUNG_CONTROL_GET* nicht benötigt, muss aber auch dann mit z.B. 0
übergeben werden, wenn Device übergeben werden soll.
$Device:
Gerät welches angesprochen wird.
Hier können die in der Samsung.inc.php definierten Konstanten (z.B. SamyTV, SamyBD)
verwendet werden. Was den Code lesbarer hält.
Bei nur einem Gerät brauch der Wert nicht übergeben werden.
Rückgabewert:
Bei allen _SET ist es ein bool für Erfolgreich (true) und nicht erfolgreich (false)
Bei allen _GET ist der es Abgefragte Wert bei Erfolg, oder false bei nicht erfolgreich.
Beispiele:
Setze Lautstärke auf 5 von Gerät 0
SendControl(SAMSUNG_CONTROL_SETVOLUME,5);
Lese Lautstärke von Gerät SamyBD
$volume = SendControl(SAMSUNG_CONTROL_GETVOLUME),0,SamyBD;
if ($volume === false) return; // Abbruch bei Fehler
echo ("Volume ist: ".$volume);
** bool SAMY_SendMessage(int $Type, array $Data, int [$Device], string [$Timeout]) **
$Type:
SAMSUNG_MESSAGE_SMS = SMS Nachricht
SAMSUNG_MESSAGE_CALL = Anruf Nachricht
SAMSUNG_MESSAGE_SCHEDULE = Termin Nachricht
SAMSUNG_MESSAGE_REMOVE = Ohne Funktion ! Soll eigentlich eine Nachricht löschen, hat mein TV aber ignoriert.
$Data:
enthält je nach $Type die Darzustellenden Daten als Array
Immer:
$Data['ID'] = string Nachrichten-ID (egal)
SAMSUNG_MESSAGE_SMS:
$Data['ReceiveTime'] = unixtimestamp [optional]
$Data['ToNumber'] = string Empfänger-Nummer
$Data['ToName'] = string Empfänger-Name
$Data['FromNumber'] = string Absender-Nummer
$Data['FromName'] = string Absender-Name
$Data['Message'] = string Nachrichteninhalt
SAMSUNG_MESSAGE_CALL:
$Data['CallTime'] = unixtimestamp [optional]
$Data['ToNumber'] = string Empfänger-Nummer
$Data['ToName'] = string Empfänger-Name
$Data['FromNumber'] = string Absender-Nummer
$Data['FromName'] = string Absender-Name
SAMSUNG_MESSAGE_SCHEDULE:
$Data['StartTime'] = unixtimestamp [optional]
$Data['EndTime'] = unixtimestamp [optional, dann ist Endtime = StartTime + 15 Minuten]
$Data['ToNumber'] = string Empfänger-Nummer
$Data['ToName'] = string Empfänger-Name
$Data['Location'] = string Treffpunkt
$Data['Subject'] = string Betreff
$Data['Message'] = string Nachrichteninhalt
$Device:
Gerät welches angesprochen wird.
Hier können die in der Samsung.inc.php definierten Konstanten (z.B. SamyTV, SamyBD)
verwendet werden. Was den Code lesbarer hält.
Bei nur einem Gerät brauch der Wert nicht übergeben werden.
$Timeout:
Anzeigedauer, optional. Standardwert ist ‚Maximum‘
Rückgabewert:
bool: für Erfolgreich (true) und nicht erfolgreich (false)
Beispiele:
if (SendMessage(SAMSUNG_MESSAGE_SMS,$message,SamyTV) === true)
{
echo "Meldung erfolgreich abgesetzt.";
}else
{
echo "Meldung konnte nicht abgesetzt werden!";
}
**** bool SAMY_SendRemote(Variant $Key, int [$WaitTime], int [$Device]) ****
$Key:
Key-Code welcher gesendet werden soll als String.
Oder wenn mehrere Tasten hintereinander gesendet werden sollen, als Array welches Strings enthält.
Codes siehe hier:
Key codes - SamyGO
D-Series Key Codes - SamyGO
$WaitTime:
Zeit im ms zwischen den senden der Tasten (optional, Standard = 50 ms)
Ohne Funktion bei einem Key-Code.
$Device:
Gerät welches angesprochen wird.
Hier können die in der Samsung.inc.php definierten Konstanten (z.B. SamyTV, SamyBD)
verwendet werden. Was den Code lesbarer hält.
Bei nur einem Gerät brauch der Wert nicht übergeben werden.
Rückgabewert:
bool: für Erfolgreich (true) und nicht erfolgreich (false)
Bedeute hier aber nur dass der Befehl übertragen wurde!
Nicht ob das Gerät auch die Aktion ausgeführt hat !
Beispiel:
SendRemote("KEY_ENTER");
SendRemote("KEY_POWEROFF",0,SamyBD);
SendRemote(array("KEY_VOLUP","KEY_VOLUP","KEY_VOLUP","KEY_VOLDOWN","KEY_VOLDOWN","KEY_VOLDOWN"),100);
6) Inhalt von Samsung.inc.php
<?
define('SamyTV',0); /* Device 1 */
define('SamyBD',1); /* Device 2 */
/* Device 1 */
$samy[0] = array(
"PWR_VARID" => 46005, // Variable (bool) welche den Status an/aus des Geräte darstellt (Muß von extern gesteuert werden!)
"HOSTADDR" => 'tv.nall-chan.net', // Hostname oder IP-Adresse des Gerätes.
"SOAP_PORT" => 52235, // Standard C-Serie
"RC_PORT" => 55000, // Standard C-Serie
"MODELNAME" => "PS50C6970", // Wichtig für die Remote-Control Funktion.
"COM_ERROR_VARID" => 21366 // Variable (int) Anzahl der Kommunikations-Fehler bei =>5 wird der TV als Aus (PWR_VARID auf false) angezeigt.
);
/* Device 2 */
$samy[1] = array(
"PWR_VARID" => 46005,
"HOSTADDR" => 'tv.nall-chan.net',
"SOAP_PORT" => 52235,
"RC_PORT" => 55000,
"MODELNAME" => "PS50C6970",
"COM_ERROR_VARID" => 21366
);
/* IPS Daten für Remote Control */
define("SAMSUNG_REMOTE_SOURCE_IP","192.168.XXX.XXX"); // IP-Adresse von IPS
define("SAMSUNG_REMOTE_SOURCE_MAC","0C-0C-0C-0C-0C-0C"); // MAC-Adresse welche registriert werden soll
define("SAMSUNG_REMOTE_NAME","IPS Samsung Remote"); // Name unter welchen IPS in Gerät registriert wird
define("SAMSUNG_REMOTE_APP_NAME","iapp.samsung"); // Scheinbar egal :)
/* Ab hier nichts mehr zu ändern */
//Dokumentation der Funktionen in dem Beispiel-Script
/* PORT zuweisung zum Array */
define("SAMSUNG_SOAP_PORT", "SOAP_PORT");
define("SAMSUNG_REMOTE_PORT", "RC_PORT");
/* PMR Control */
define("SAMSUNG_MESSAGE_SMS",1);
define("SAMSUNG_MESSAGE_CALL",2);
define("SAMSUNG_MESSAGE_SCHEDULE",3);
define("SAMSUNG_MESSAGE_REMOVE",4);
/* DMR Control */
define("SAMSUNG_CONTROL_GETVOLUME",1);
define("SAMSUNG_CONTROL_SETVOLUME",2);
define("SAMSUNG_CONTROL_GETMUTE",3);
define("SAMSUNG_CONTROL_SETMUTE",4);
function SAMY_SendMessage($type,$data,$ID = 0,$timeout='Maximum')
{
if (!SAMY_CheckTV()) return false;
switch ($type)
{
case SAMSUNG_MESSAGE_SMS:
if (!isset($data['ReceiveTime'])) $data['ReceiveTime']=time();
$body='<Category>SMS</Category>
<DisplayType>'.$timeout.'</DisplayType>
<ReceiveTime>
<Date>'.date("Y-m-d",$data['ReceiveTime']).'</Date>
<Time>'.date("H:i:s",$data['ReceiveTime']).'</Time>
</ReceiveTime>
<Receiver>
<Number>'.$data['ToNumber'].'</Number>
<Name>'.$data['ToName'].'</Name>
</Receiver>
<Sender>
<Number>'.$data['FromNumber'].'</Number>
<Name>'.$data['FromName'].'</Name>
</Sender>
<Body>'.$data['Message'].'</Body>';
break;
case SAMSUNG_MESSAGE_CALL:
if (!isset($data['CallTime'])) $data['CallTime']=time();
$body='<Category>Incoming Call</Category>
<DisplayType>'.$timeout.'</DisplayType>
<CallTime>
<Date>'.date("Y-m-d",$data['CallTime']).'</Date>
<Time>'.date("H:i:s",$data['CallTime']).'</Time>
</CallTime>
<Callee>
<Name>'.$data['ToName'].'</Name>
<Number>'.$data['ToNumber'].'</Number>
</Callee>
<Caller>
<Name>'.$data['FromName'].'</Name>
<Number>'.$data['FromNumber'].'</Number>
</Caller>';
break;
case SAMSUNG_MESSAGE_SCHEDULE:
if (!isset($data['StartTime'])) $data['StartTime']=time();
if (!isset($data['EndTime'])) $data['EndTime']=time()+(15 * 60); //Ende = Start + 15 Min.
$body='<Category>Schedule Reminder</Category>
<DisplayType>'.$timeout.'</DisplayType>
<StartTime>
<Date>'.date("Y-m-d",$data['StartTime']).'</Date>
<Time>'.date("H:i:s",$data['StartTime']).'</Time>
</StartTime>
<Owner>
<Number>'.$data['ToNumber'].'</Number>
<Name>'.$data['ToName'].'</Name>
</Owner>
<Subject>'.$data['Subject'].'</Subject>
<EndTime>
<Date>'.date("Y-m-d",$data['EndTime']).'</Date>
<Time>'.date("H:i:s",$data['EndTime']).'</Time>
</EndTime>
<Location>'.$data['Location'].'</Location>
<Body>'.$data['Message'].'</Body>';
break;
case SAMSUNG_MESSAGE_REMOVE:
$body='';
break;
}
if ($type <> SAMSUNG_MESSAGE_REMOVE)
{
$message='<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" >
<s:Body>
<u:AddMessage xmlns:u="urn:samsung.com:service:MessageBoxService:1\">
<MessageType>text/xml</MessageType>
<MessageID>'.$data['ID'].'</MessageID>
<Message>
'.htmlspecialchars(utf8_encode($body)).'
</Message>
</u:AddMessage>
</s:Body>
</s:Envelope>';
$SOAPAction='urn:samsung.com:service:MessageBoxService:1#AddMessage';
} else {
$message='<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" >
<s:Body>
<u:RemoveMessage xmlns:u="urn:samsung.com:service:MessageBoxService:1\">
<MessageType>text/xml</MessageType>
<MessageID>'.$data['ID'].'</MessageID>
</u:RemoveMessage>
</s:Body>
</s:Envelope>';
$SOAPAction='urn:samsung.com:service:MessageBoxService:1#RemoveMessage';
}
$packet = SAMY_AddHeaders('/PMR/control/MessageBoxService',$SOAPAction,$message,$ID);
if (SAMY_CheckResponse(SAMY_SendPacket($packet,$ID))===false) return false;
return true;
}
function SAMY_SendControl($type,$data = 0,$ID = 0)
{
if (!SAMY_CheckTV()) return false;
switch ($type)
{
case SAMSUNG_CONTROL_SETVOLUME:
$SOAPAction = 'SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#SetVolume';
$body = '<ns0:SetVolume xmlns:ns0="urn:schemas-upnp-org:service:RenderingControl:1">
<InstanceID>0</InstanceID>
<Channel>Master</Channel>
<DesiredVolume>'.$data.'</DesiredVolume>
</ns0:SetVolume>
';
break;
case SAMSUNG_CONTROL_GETVOLUME:
$SOAPAction = 'SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#GetVolume';
$body = '<ns0:GetVolume xmlns:ns0="urn:schemas-upnp-org:service:RenderingControl:1">
<InstanceID>0</InstanceID>
<Channel>Master</Channel>
</ns0:GetVolume>
';
$start="<CurrentVolume>";
$end="<\/CurrentVolume>";
break;
case SAMSUNG_CONTROL_GETMUTE:
$SOAPAction = 'SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#GetMute';
$body = '<ns0:GetMute xmlns:ns0="urn:schemas-upnp-org:service:RenderingControl:1">
<InstanceID>0</InstanceID>
<Channel>Master</Channel>
</ns0:GetMute>
';
$start="<CurrentMute>";
$end="<\/CurrentMute>";
break;
case SAMSUNG_CONTROL_SETMUTE:
$SOAPAction = 'SoapAction:urn:schemas-upnp-org:service:RenderingControl:1#SetMute';
$body = '<ns0:SetMute xmlns:ns0="urn:schemas-upnp-org:service:RenderingControl:1">
<InstanceID>0</InstanceID>
<Channel>Master</Channel>
<DesiredMute>'.$data.'</DesiredMute>
</ns0:SetMute>
';
break;
}
$message='<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
'.$body.'</s:Body>
</s:Envelope>';
$packet = SAMY_AddHeaders('/upnp/control/RenderingControl1',$SOAPAction,$message,$ID);
$response =SAMY_SendPacket($packet,$ID);
if (SAMY_CheckResponse($response)===false)
{
if ($response===false) return false;
$error =SAMY_GetTextBetween($response, "<errorDescription>", "<\/errorDescription>");
if ($error <> "10061")
{
IPS_LogMessage("SamsungTV","ErrorNumber: ".$error);
}
}
if (isset($start)) return SAMY_GetTextBetween($response, $start, $end);
return true;
}
function SAMY_AddHeaders($URI, $SOAPAction, $Payload,$ID)
{
global $samy;
return 'POST '.$URI.' HTTP/1.1
Content-Type: text/xml; charset="utf-8"
SOAPACTION: "'.$SOAPAction.'"
Cache-Control: no-cache
Host: '.$samy[$ID]["HOSTADDR"].':'.$samy[$ID]["SOAP_PORT"].'
Content-Length: '.strlen($Payload).'
Connection: Close
'.$Payload;
}
function SAMY_SendPacket($content, $ID, $port = SAMSUNG_SOAP_PORT, $waitforResponse = true)
{
global $samy;
$fp = @fsockopen ($samy[$ID]["HOSTADDR"], $samy[$ID][$port], $errno, $errstr, 10);
if (!$fp)
{
if ($port == SAMSUNG_REMOTE_PORT) return false;
if ($errno <> "10061")
{
IPS_LogMessage("SamsungTV","$errstr ($errno)");
SetValueInteger($samy[$ID]["COM_ERROR_VARID"],GetValueInteger($samy[$ID]["COM_ERROR_VARID"])+1);
return "<errorDescription>".$errno."<\/errorDescription>";
}
return false;
} else {
if (SAMY_fwrite_stream($fp, $content) === false) return false;
if (!$waitforResponse) return true;
$ret = false;
while (!feof($fp))
{
$ret.= fgets($fp,128);
}
fclose($fp);
}
return $ret;
}
function SAMY_CheckResponse($ret)
{
if(!(strpos($ret, "200 OK") === false))
{
return $ret;
} else {
return false;
}
}
function SAMY_GetTextBetween($string, $start, $end){
if ($string === false) return;
$preg= preg_match_all( "/$start(.*)$end/U", $string, $match );
return $match[1][0];
}
function SAMY_CheckTV($ID = 0)
{
global $samy;
if (IPS_SemaphoreEnter("Samy",100))
{
if (GetValueInteger($samy[$ID]["COM_ERROR_VARID"]) >= 5)
{
SetValueInteger($samy[$ID]["COM_ERROR_VARID"],0);
SetValueBoolean($samy[$ID]["PWR_VARID"],false);
IPS_SemaphoreLeave("Samy");
return false;
}
if (GetValueBoolean($samy[$ID]["PWR_VARID"]))
{
IPS_SemaphoreLeave("Samy");
return true;
}
if (Sys_Ping($samy[$ID]["HOSTADDR"], 250))
{
SetValueBoolean($samy[$ID]["PWR_VARID"],true);
IPS_SemaphoreLeave("Samy");
return true;
}
SetValueInteger($samy[$ID]["COM_ERROR_VARID"],0);
SetValueBoolean($samy[$ID]["PWR_VARID"],false);
IPS_SemaphoreLeave("Samy");
return false;
}
}
function SAMY_fwrite_stream($fp, $string) {
for ($written = 0; $written < strlen($string); $written += $fwrite) {
$fwrite = @fwrite($fp, substr($string, $written));
if ($fwrite === false) {
return false;
}
}
return true;
}
function SAMY_SendRemote($key,$time = 50, $ID = 0) // Auswertung Rückkanal fehlt und senden über Socket
{
global $samy;
if (!SAMY_CheckTV()) return false;
$msg = chr(0x64).chr(0x00).chr(strlen(base64_encode(SAMSUNG_REMOTE_SOURCE_IP))).chr(0x00).base64_encode(SAMSUNG_REMOTE_SOURCE_IP).chr(strlen(base64_encode(SAMSUNG_REMOTE_SOURCE_MAC))).chr(0x00).base64_encode(SAMSUNG_REMOTE_SOURCE_MAC).chr(strlen(base64_encode(SAMSUNG_REMOTE_NAME))).chr(0x00).base64_encode(SAMSUNG_REMOTE_NAME);
$auth = chr(0x00).chr(strlen(SAMSUNG_REMOTE_APP_NAME)).chr(0x00).SAMSUNG_REMOTE_APP_NAME.chr(strlen($msg)).chr(0x00).$msg;
if (is_array($key))
{
foreach ($key as $single)
{
$msg = chr(0x00).chr(0x00).chr(0x00).chr(strlen(base64_encode($single))).chr(0x00).base64_encode($single);
$pkt = $auth.chr(0x00).chr(strlen($samy[$ID]["MODELNAME"])).chr(0x00).$samy[$ID]["MODELNAME"].chr(strlen($msg)).chr(0x00).$msg;
if (SAMY_SendPacket($pkt,$ID, SAMSUNG_REMOTE_PORT, false) === false) return false;
IPS_Sleep($time);
}
return true;
} else {
$msg = chr(0x00).chr(0x00).chr(0x00).chr(strlen(base64_encode($key))).chr(0x00).base64_encode($key);
$pkt = $auth.chr(0x00).chr(strlen($samy[$ID]["MODELNAME"])).chr(0x00).$samy[$ID]["MODELNAME"].chr(strlen($msg)).chr(0x00).$msg;
return SAMY_SendPacket($pkt,$ID, SAMSUNG_REMOTE_PORT, false);
}
}
?>
Viel Erfolg,
Michael