initial debugging
authorChristian Weiske <cweiske@cweiske.de>
Sat, 14 Jul 2012 17:30:19 +0000 (19:30 +0200)
committerChristian Weiske <cweiske@cweiske.de>
Sat, 14 Jul 2012 17:30:19 +0000 (19:30 +0200)
README.rst [new file with mode: 0644]
callnotifier.php [new file with mode: 0644]

diff --git a/README.rst b/README.rst
new file mode 100644 (file)
index 0000000..188b878
--- /dev/null
@@ -0,0 +1,21 @@
+Auerswald Callnotifier for COMpact 3000
+***************************************
+
+Connects to the debug port of your Auerswald Compact 3000 telephony switchboard
+and listens for incoming calls.
+It will notify you whenever a call comes in.
+
+
+TODO
+====
+- multiple notification methods: XMPP, dreambox, notify-send
+- ldap name resolution
+- write a call list (who, when, how long)
+- filter/exclude by local target
+
+
+Issues
+======
+Ctrl+C does not send the disconnect command.
+This is a problem with PHP since pcntl_signal handling and blocking sockets
+do not work together. The signal will not be handled.
diff --git a/callnotifier.php b/callnotifier.php
new file mode 100644 (file)
index 0000000..605b773
--- /dev/null
@@ -0,0 +1,85 @@
+#!/usr/bin/env php
+<?php
+$ip = '192.168.3.95';
+$port = 42225;
+
+$socket = awcn_connect($ip, $port);
+awcn_init($socket);
+awcn_loop($socket);
+awcn_disconnect($socket);
+
+
+function awcn_connect($ip, $port) {
+    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
+    if ($socket === false) {
+        echo "socket_create() failed: reason: "
+            . socket_strerror(socket_last_error()) . "\n";
+    } else {
+        echo "OK.\n";
+    }
+    echo "Attempting to connect to '$ip' on port '$port'...";
+    $result = socket_connect($socket, $ip, $port);
+    if ($result === false) {
+        echo "socket_connect() failed.\nReason: ($result) "
+            . socket_strerror(socket_last_error($socket)) . "\n";
+    } else {
+        echo "OK.\n";
+    }
+    return $socket;
+}
+
+function awcn_init($socket)
+{
+    $msg = "\x00\x01DecoderV=1\n";
+    socket_write($socket, $msg, strlen($msg));
+    $res = awcn_read_response($socket);
+    socket_write($socket, "\x00\x02", 2);
+}
+
+function awcn_loop($socket)
+{
+    while (true) {
+        $dbgmsg = awcn_read_response($socket);
+        //echo $dbgmsg . "\n";
+        awcn_handle_msg($dbgmsg);
+    }
+}
+function awcn_read_response($socket)
+{
+    $res = socket_read($socket, 2048, PHP_NORMAL_READ);
+    return substr($res, 2, -1);
+}
+
+function awcn_disconnect($socket)
+{
+    socket_write($socket, "\x00\x03", 2);
+    socket_close($socket);
+}
+
+function awcn_handle_msg($msg)
+{
+    if (substr($msg, 0, 9) != '[DKANPROT') {
+        //unknown message type
+        return;
+    }
+    $regex = '#^\\[DKANPROT-([^ ]+) ([0-9]+)\\] (.*)$#';
+    if (!preg_match($regex, $msg, $matches)) {
+        //message should always be that way
+        return false;
+    }
+    list(, $type, $someid, $details) = $matches;
+
+    if ($type != 'Info') {
+        //we only want info messages
+        var_dump($type . ': ' . $details);
+        return;
+    }
+    //Vegw/Ets-Cref:[0xffef]/[0x64] - VEGW_SETUP from upper layer to internal destination: CGPN[**22]->CDPN[41], 
+    var_dump($details);
+    $regex = '#CGPN\\[([^\\]]+)\\]->CDPN\\[([^\\]]+)\\]#';
+    if (preg_match($regex, $details, $matches)) {
+        var_dump('a call!', $matches);
+    }
+}
+
+?>
\ No newline at end of file