diff options
| author | Christian Weiske <cweiske@cweiske.de> | 2012-07-16 22:58:34 +0200 |
|---|---|---|
| committer | Christian Weiske <cweiske@cweiske.de> | 2012-07-16 22:58:34 +0200 |
| commit | 0073743d7518e5899f0cd075a1c7755a9d603bbd (patch) | |
| tree | c48e95609e678627529b1ca4ee5b43c7a3a43ab4 /src | |
| parent | f66acab69b4981bbb21bccd2754cb1e870f3d360 (diff) | |
| download | auerswald-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.php | 35 | ||||
| -rw-r--r-- | src/callnotifier/EDSS1/Parameter.php | 16 | ||||
| -rw-r--r-- | src/callnotifier/EDSS1/Parser.php | 41 | ||||
| -rw-r--r-- | src/callnotifier/Logger/Echo.php | 20 | ||||
| -rw-r--r-- | src/callnotifier/MessageHandler.php | 44 |
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])) { |
