aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChristian Weiske <cweiske@cweiske.de>2012-07-16 22:58:34 +0200
committerChristian Weiske <cweiske@cweiske.de>2012-07-16 22:58:34 +0200
commit0073743d7518e5899f0cd075a1c7755a9d603bbd (patch)
treec48e95609e678627529b1ca4ee5b43c7a3a43ab4 /src
parentf66acab69b4981bbb21bccd2754cb1e870f3d360 (diff)
downloadauerswald-callnotifier-0073743d7518e5899f0cd075a1c7755a9d603bbd.tar.gz
auerswald-callnotifier-0073743d7518e5899f0cd075a1c7755a9d603bbd.zip
first try on E-DSS-1 ISDN d-channel parsing
Diffstat (limited to 'src')
-rw-r--r--src/callnotifier/EDSS1/Message.php35
-rw-r--r--src/callnotifier/EDSS1/Parameter.php16
-rw-r--r--src/callnotifier/EDSS1/Parser.php41
-rw-r--r--src/callnotifier/Logger/Echo.php20
-rw-r--r--src/callnotifier/MessageHandler.php44
5 files changed, 154 insertions, 2 deletions
diff --git a/src/callnotifier/EDSS1/Message.php b/src/callnotifier/EDSS1/Message.php
new file mode 100644
index 0000000..3d22a82
--- /dev/null
+++ b/src/callnotifier/EDSS1/Message.php
@@ -0,0 +1,35 @@
+<?php
+namespace callnotifier;
+
+class EDSS1_Message
+{
+ const ALERTING = "\x01";
+ const CALL_PROCEEDING = "\x02";
+ const SETUP = "\x05";
+ const CONNECT = "\x07";
+ const SETUP_ACKNOWLEDGE = "\x0D";
+ const DISCONNECT = "\x45";
+ const RELEASE = "\x4D";
+ const RELEASE_COMPLETE = "\x5A";
+ const INFORMATION = "\x7B";
+
+ /**
+ * @var integer
+ */
+ public $type;
+ public $parameters = array();
+
+
+ public function getTypeName()
+ {
+ $rc = new \ReflectionClass($this);
+ foreach ($rc->getConstants() as $name => $value) {
+ if (ord($value) == $this->type) {
+ return $name;
+ }
+ }
+ return '';
+ }
+}
+
+?>
diff --git a/src/callnotifier/EDSS1/Parameter.php b/src/callnotifier/EDSS1/Parameter.php
new file mode 100644
index 0000000..ded3030
--- /dev/null
+++ b/src/callnotifier/EDSS1/Parameter.php
@@ -0,0 +1,16 @@
+<?php
+namespace callnotifier;
+
+class EDSS1_Parameter
+{
+ const CALLING_PARTY_NUMBER = "\x6C";
+ const CALLED_PARTY_NUMBER = "\x70";
+ const CONNECTED_NUMBER = "\x4C";
+ const KEYPAD = "\x2C";
+
+ public $type;
+ public $length;
+ public $data;
+}
+
+?>
diff --git a/src/callnotifier/EDSS1/Parser.php b/src/callnotifier/EDSS1/Parser.php
new file mode 100644
index 0000000..5a298e5
--- /dev/null
+++ b/src/callnotifier/EDSS1/Parser.php
@@ -0,0 +1,41 @@
+<?php
+namespace callnotifier;
+
+class EDSS1_Parser
+{
+ const PARAM = 0;
+ const PARAMLENGTH = 1;
+ const PARAMVAL = 2;
+
+ public function parse($bytes)
+ {
+ $m = new EDSS1_Message();
+ $m->type = ord($bytes{7});
+
+ $curpos = 7;
+ $complete = false;
+ do {
+ //parameter type
+ $curbit = $bytes{++$curpos};
+ if ($curbit == "\xFF" && $bytes{$curpos + 1} == "\n") {
+ $complete = true;
+ break;
+ }
+ $param = new EDSS1_Parameter();
+ $m->parameters[] = $param;
+ $param->type = ord($curbit);
+
+ //parameter length
+ $curbit = $bytes{++$curpos};
+ $param->length = ord($curbit);
+
+ //parameter data
+ $param->data = substr($bytes, $curpos + 1, $param->length);
+ $curpos += $param->length;
+ } while ($curpos < strlen($bytes) - 1);
+
+ return $m;
+ }
+}
+
+?>
diff --git a/src/callnotifier/Logger/Echo.php b/src/callnotifier/Logger/Echo.php
index c716db8..9ce5b09 100644
--- a/src/callnotifier/Logger/Echo.php
+++ b/src/callnotifier/Logger/Echo.php
@@ -11,6 +11,7 @@ class Logger_Echo implements Logger
$this->blue = $cc->convert('%b');
$this->red = $cc->convert('%r');
$this->white = $cc->convert('%w');
+ $this->purple = $cc->convert('%p');
}
public function log($type, $arData)
@@ -31,6 +32,25 @@ class Logger_Echo implements Logger
);
echo $this->red . ' bytes' . $this->end . ': ' . $line . "\n";
}
+ } else if ($type == 'edss1msg') {
+ $msg = $arData['msg'];
+ echo sprintf(
+ $this->purple . 'EDSS1_Message' . $this->end
+ . ' type %02X '
+ . $this->purple . '%s' . $this->end
+ . ', %d parameters',
+ $msg->type,
+ $msg->getTypeName(),
+ count($msg->parameters)
+ ) . "\n";
+ foreach ($msg->parameters as $param) {
+ echo sprintf(
+ " Parameter type %02X, %d bytes: %s\n",
+ $param->type,
+ $param->length,
+ preg_replace('/[^[:print:]]/', '?', $param->data)
+ );
+ }
} else {
echo $this->blue . $type . $this->end . ': '
. var_export($arData, true) . "\n";
diff --git a/src/callnotifier/MessageHandler.php b/src/callnotifier/MessageHandler.php
index 89d07e7..6181e3a 100644
--- a/src/callnotifier/MessageHandler.php
+++ b/src/callnotifier/MessageHandler.php
@@ -14,7 +14,8 @@ class MessageHandler
*/
protected $logger = array(
'msgData' => array(),
- 'incomingCall' => array()
+ 'incomingCall' => array(),
+ 'edss1msg' => array(),
);
@@ -73,7 +74,7 @@ class MessageHandler
);
if ($type != 'Info') {
- //we only want info messages
+ $this->parseEDSS1($details);
return;
}
//Vegw/Ets-Cref:[0xffef]/[0x64] - VEGW_SETUP from upper layer to internal destination: CGPN[**22]->CDPN[41],
@@ -84,6 +85,45 @@ class MessageHandler
}
}
+ /**
+ * Example string: "T02: 00 A3 06 0A 08 01 01 5A FF 0A"
+ *
+ * @param string $details Detail string of a debug message
+ *
+ */
+ protected function parseEDSS1($details)
+ {
+ if ($details{0} != 'T' && $details{0} != 'N') {
+ //we only want byte data
+ return;
+ }
+ if (substr($details, 16, 4) != ' 08 ') {
+ //only E-DSS-1, no other packets
+ return;
+ }
+
+ $bytestring = substr($details, 5);
+ $bytes = '';
+ foreach (explode(' ', $bytestring) as $strbyte) {
+ $bytes .= chr(hexdec($strbyte));
+ }
+
+ $msgtype = $bytes{7};
+ static $interestingTyps = array(
+ EDSS1_Message::SETUP,
+ EDSS1_Message::CONNECT,
+ EDSS1_Message::INFORMATION
+ );
+ if (!in_array($msgtype, $interestingTyps)) {
+ //return;
+ }
+
+ $mp = new EDSS1_Parser();
+ $msg = $mp->parse($bytes);
+
+ $this->log('edss1msg', array('msg' => $msg));
+ }
+
protected function log($type, $arData)
{
if (!isset($this->logger[$type])) {