Hab mir jetzt anhand von (im www gefundenen) Skripten eine etwas komplizierte Skriptkette gebastelt, die sich über den Terminal auf dem freePBX Server starten lässt. Es wird auf allen Cisco 7975 Telefonen das aktuelle Kamerabild angezeigt und dann nach einiger Zeit wieder geschlossen. (Kamera ist eine Trivision NC-326PW) Die php-pecl-imagick Module müssen (Apache Server) installiert werden.Problem ist nur, ich weiß nicht, wie ich das für eingehende Anrufe in freePBX einbauen kann bzw. ob sowas überhaupt möglich ist, ohne Asterisk aus dem Tritt zu bringen. Asterisk sollte die Skripts nur anstoßen und nicht auf irgendwelche Meldungen warten.
In /var/lib/asterisk/agi-bin liegt showcam.agi
PHP:
#!/bin/sh
cd /var/www/html/xmlservices/
php cam-start-11.php;
sleep 1
php cam-start-12.php;
php cam-start-13.php;
php cam-start-14.php;
php cam-start-15.php;
php cam-start-17.php;
sleep 25
php cam-stop-11.php;
php cam-stop-12.php;
php cam-stop-13.php;
php cam-stop-14.php;
php cam-stop-15.php;
php cam-stop-17.php;
die cam-start u. stop Skripte liegen in /var/www/html/xmlservices/
Hier die cam-start.php für das erste Telefon
PHP:
<?php
$ip = "192.168.0.211";
$uri = "http://192.168.0.34/xmlservices/cam.php";
$uid = "admin";
$pwd = "cisco";
function push2phone($ip, $uri, $uid, $pwd)
{
$auth = base64_encode($uid.":".$pwd);
$xml = "<CiscoIPPhoneExecute><ExecuteItem Priority=\"0\"URL=\"".$uri."\"/></CiscoIPPhoneExecute>";
$xml = "XML=".urlencode($xml);
$post = "POST /CGI/Execute HTTP/1.0\r\n";
$post .= "Host: $ip\r\n";
$post .= "Authorization: Basic $auth\r\n";
$post .= "Connection: close\r\n";
$post .= "Content-Type: application/x-www-form-urlencoded\r\n";
$post .= "Content-Length: ".strlen($xml)."\r\n\r\n";
$fp = fsockopen ( $ip, 80, $errno, $errstr, 30);
if(!$fp){ echo "$errstr ($errno)<br>\n"; }
else
{
fputs($fp, $post.$xml);
flush();
while (!feof($fp))
{
$response .= fgets($fp, 128);
flush();
}
}
return $response;
}
echo push2phone($ip, $uri, $uid, $pwd);
?>
Da ich nicht weiß, ob es ein Problem ist, wenn gleichzeitig mehrere Skripte versuchen eine Image Datei anzulegen, hab ich bei den anderen Telefonen die cam-start nur auf die Bildanzeige beschränkt (denke ich zumindest)
PHP:
<?php
$ip = "192.168.0.212";
$uri = "http://192.168.0.34/xmlservices/image.php";
$uid = "admin";
$pwd = "cisco";
function push2phone($ip, $uri, $uid, $pwd)
{
$auth = base64_encode($uid.":".$pwd);
$xml = "<CiscoIPPhoneExecute><ExecuteItem Priority=\"0\"URL=\"".$uri."\"/></CiscoIPPhoneExecute>";
$xml = "XML=".urlencode($xml);
$post = "POST /CGI/Execute HTTP/1.0\r\n";
$post .= "Host: $ip\r\n";
$post .= "Authorization: Basic $auth\r\n";
$post .= "Connection: close\r\n";
$post .= "Content-Type: application/x-www-form-urlencoded\r\n";
$post .= "Content-Length: ".strlen($xml)."\r\n\r\n";
$fp = fsockopen ( $ip, 80, $errno, $errstr, 30);
if(!$fp){ echo "$errstr ($errno)<br>\n"; }
else
{
fputs($fp, $post.$xml);
flush();
while (!feof($fp))
{
$response .= fgets($fp, 128);
flush();
}
}
return $response;
}
echo push2phone($ip, $uri, $uid, $pwd);
?>
Es war etwas schwierig den richten Befehl zu finden, um das Camera-Fenster zu schließen, egal ob Hörer abgehoben oder ob das Fenster schon manuell geschlossen. Mit "Init:Services" bin ich dann fündig geworden.
Die cam-stop Skripte schauen so aus:
PHP:
<?php
$ip = "192.168.0.211";
$uri = "Init:Services";
$uid = "admin";
$pwd = "cisco";
function push2phone($ip, $uri, $uid, $pwd)
{
$auth = base64_encode($uid.":".$pwd);
$xml = "<CiscoIPPhoneExecute><ExecuteItem Priority=\"0\"URL=\"".$uri."\"/></CiscoIPPhoneExecute>";
$xml = "XML=".urlencode($xml);
$post = "POST /CGI/Execute HTTP/1.0\r\n";
$post .= "Host: $ip\r\n";
$post .= "Authorization: Basic $auth\r\n";
$post .= "Connection: close\r\n";
$post .= "Content-Type: application/x-www-form-urlencoded\r\n";
$post .= "Content-Length: ".strlen($xml)."\r\n\r\n";
$fp = fsockopen ( $ip, 80, $errno, $errstr, 30);
if(!$fp){ echo "$errstr ($errno)<br>\n"; }
else
{
fputs($fp, $post.$xml);
flush();
while (!feof($fp))
{
$response .= fgets($fp, 128);
flush();
}
}
return $response;
}
echo push2phone($ip, $uri, $uid, $pwd);
?>
und nicht zu vergessen, die image.php
PHP:
<?php
////////////////////////////////////////////////////////////////////////
// IP-Camera image on your Cisco 7970G IP-phone
////////////////////////////////////////////////////////////////////////
// This simple script downloads an image from your ip-camera (Axis) and
// convert the image to a 7970G browser format.
// Script by ipas 27-10-2012
////////////////////////////////////////////////////////////////////////
// You need php-pecl-imagick installed on your apache-server
////////////////////////////////////////////////////////////////////////
$camurl="http://192.168.0.37/live/1/jpeg.jpg";
$camtext="Haustor";
$buttontext="Haustor";
//the path to the imagefile. must be world-writable! chmod 777
$imagepath="/var/www/html/xmlservices/cam-image/jpeg.png";
$imageurl="http://192.168.0.34/xmlservices/cam-image/jpeg.png";
$camscripturl="http://192.168.0.34/xmlservices/cam.php";
$output= "
<CiscoIPPhoneImageFile>
<Prompt>" . $camtext . "</Prompt>
<URL>" . $imageurl . "</URL>
</CiscoIPPhoneImageFile>
";
header("Content-type: text/xml");
header("Connection: close");
header("Expires: -1");
echo $output;
?>
Die image.php ist nur verkürzt von hier
http://hq.ipas.nl/?p=43
und die angepasste cam.php, die das Jpeg-Image der Camera in ein png-Image umwandelt und abspeichert:
PHP:
<?php
////////////////////////////////////////////////////////////////////////
// IP-Camera image on your Cisco 7970G IP-phone
////////////////////////////////////////////////////////////////////////
// This simple script downloads an image from your ip-camera (Axis) and
// convert the image to a 7970G browser format.
// Script by ipas 27-10-2012
////////////////////////////////////////////////////////////////////////
// You need php-pecl-imagick installed on your apache-server
////////////////////////////////////////////////////////////////////////
$camurl="http://192.168.0.37/live/1/jpeg.jpg";
$camtext="Haustor";
$buttontext="Haustor";
//the path to the imagefile. must be world-writable! chmod 777
$imagepath="/var/www/html/xmlservices/cam-image/jpeg.png";
$imageurl="http://192.168.0.34/xmlservices/cam-image/jpeg.png";
$camscripturl="http://192.168.0.34/xmlservices/cam.php";
// Get the image from the camera
$image = file_get_contents($camurl);
// Create Imagick object
$im = new Imagick();
// Convert image into Imagick
$im->readimageblob($image);
// Resize image to match a cisco 7970 browser
$im->resizeImage(296,166,Imagick::FILTER_LANCZOS,1);
// Add a subtle border
$color=new ImagickPixel();
$color->setColor("rgb(220,220,220)");
$im->borderImage($color,1,1);
$im->setImageChannelDepth(imagick::CHANNEL_RED, 5);
$im->setImageChannelDepth(imagick::CHANNEL_GREEN, 12);
$im->setImageChannelDepth(imagick::CHANNEL_BLUE, 12);
$im->setImageFormat("png");
// Output the image
$output = $im->getimageblob();
$outputtype = $im->getFormat();
// output to file
$fp = fopen($imagepath, 'w');
fwrite($fp, $im);
fclose($fp);
$output= "
<CiscoIPPhoneImageFile>
<Prompt>" . $camtext . "</Prompt>
<URL>" . $imageurl . "</URL>
</CiscoIPPhoneImageFile>
";
header("Content-type: text/xml");
header("Connection: close");
header("Expires: -1");
echo $output;
?>
WAS muss nun in extensions_custom.conf rein, um die Sache über Asterisk zu starten...? Geht das überhaupt? Bei mir hängt ein Auerswald 301 Türsprechmodul an einer Fritzbox 7390 (Nebenstelle **1), an der Fritzbox ist Asterisk (freePBX) als SIP-Telefon registriert. In freePBX geht diese Verbindung als Trunk Fritzbox in Asterisk rein. Dort hab ich eine Incoming Rule mit CID **1 die auf Ringgroup Haustor umleitet.
Ciao
Reinhard