introduce classes
[auerswald-callnotifier.git] / src / callnotifier / Socket.php
1 <?php
2 namespace callnotifier;
3
4 class Socket
5 {
6     protected $socket;
7     public $ip = null;
8     public $port = 42225;
9
10     public function __construct($ip)
11     {
12         $this->ip = $ip;
13     }
14
15     public function run()
16     {
17         $this->connect($this->ip, $this->port);
18         $this->init();
19         $this->loop();
20         $this->disconnect();
21     }
22
23     public function connect($ip, $port)
24     {
25         $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
26         if ($socket === false) {
27             echo "socket_create() failed: reason: "
28                 . socket_strerror(socket_last_error()) . "\n";
29         } else {
30             echo "OK.\n";
31         }
32         echo "Attempting to connect to '$ip' on port '$port'...";
33         $result = socket_connect($socket, $ip, $port);
34         if ($result === false) {
35             echo "socket_connect() failed.\nReason: ($result) "
36                 . socket_strerror(socket_last_error($socket)) . "\n";
37         } else {
38             echo "OK.\n";
39         }
40
41         $this->socket = $socket;
42     }
43
44     function init()
45     {
46         $msg = "\x00\x01DecoderV=1\n";
47         socket_write($this->socket, $msg, strlen($msg));
48         $res = $this->read_response();
49         socket_write($this->socket, "\x00\x02", 2);
50     }
51
52     function loop()
53     {
54         while (true) {
55             $dbgmsg = $this->read_response();
56             //echo $dbgmsg . "\n";
57             $this->handle_msg($dbgmsg);
58         }
59     }
60     function read_response()
61     {
62         $res = socket_read($this->socket, 2048, PHP_NORMAL_READ);
63         return substr($res, 2, -1);
64     }
65
66     function disconnect()
67     {
68         socket_write($this->socket, "\x00\x03", 2);
69         socket_close($this->socket);
70     }
71
72     function handle_msg($msg)
73     {
74         if (substr($msg, 0, 9) != '[DKANPROT') {
75             //unknown message type
76             return;
77         }
78         $regex = '#^\\[DKANPROT-([^ ]+) ([0-9]+)\\] (.*)$#';
79         if (!preg_match($regex, $msg, $matches)) {
80             //message should always be that way
81             return false;
82         }
83         list(, $type, $someid, $details) = $matches;
84
85         if ($type != 'Info') {
86             //we only want info messages
87             var_dump($type . ': ' . $details);
88             return;
89         }
90         //Vegw/Ets-Cref:[0xffef]/[0x64] - VEGW_SETUP from upper layer to internal destination: CGPN[**22]->CDPN[41], 
91         var_dump($details);
92         $regex = '#CGPN\\[([^\\]]+)\\]->CDPN\\[([^\\]]+)\\]#';
93         if (preg_match($regex, $details, $matches)) {
94             var_dump('a call!', $matches);
95         }
96     }
97
98
99 }
100
101 ?>