Captura de eventos del Manager de asterisk

480 views
Skip to first unread message

Rafael Eduardo Morales Osorio

unread,
Jul 19, 2014, 3:04:11 PM7/19/14
to aster...@googlegroups.com
Buen dìa tengo un código en PHP que captura los eventos del Manager y la idea es que por cada evento, me cree una linea de texto, pero veo que con muchos registros si lo hace pero con algunos no, alguien sabe por que ??

éste es el código:

while (!feof($socket)){ 
       $aResult= fgets($socket);
       $registro = $registro.$aResult; --> concatena la salida del socket
       if (trim($aResult) == null or substr(trim($aResult), 0, 6) == 'Event:') --> evalua si hay un espacio, un null o la palabra Event
       {
        echo $registro;
       unset ($registro); //la idea "anular" la variable es para que separe cada trama.

       }

la salida es algo asì

PHP Notice:  Undefined variable: registro in /var/www/script6.php on line 27
Event: VarSet
Privilege: dialplan,all
Timestamp: 1405786887.067008
Channel: SIP/101-SIP-00000056
Variable: SIPDOMAIN
Value: XX.XX.XX.XXX
Uniqueid: 1405786887.86

PHP Notice:  Undefined variable: registro in /var/www/script6.php on line 27
Event: VarSet
Privilege: dialplan,all
Timestamp: 1405786887.067150
Channel: SIP/101-SIP-00000056
Variable: SIPCALLID
Value: 734d3d621af7ddc6201c290c66cfc687@XX.XX.XX.XX:5060
Uniqueid: 1405786887.86


pero algunos casos no los separa

PHP Notice:  Undefined variable: registro in /var/www/script6.php on line 27
Event: Newexten
Privilege: dialplan,all
Timestamp: 1405786887.448930
Channel: SIP/101-SIP-00000056
Context: ivr-6
Extension: s
Priority: 7
Application: Answer
AppData: 
Uniqueid: 1405786887.86

PHP Notice:  Undefined variable: registro in /var/www/script6.php on line 27
Event: Newchannel
Privilege: call,all
Timestamp: 1405786887.636219
Channel: SIP/101-SIP-00000057
ChannelState: 0
ChannelStateDesc: Down
CallerIDNum: Unknown
CallerIDName: Unknown
AccountCode: 
Exten: 2000
Context: from-trunk-sip-101-SIP
Uniqueid: 1405786887.87

Event: VarSet
Privilege: dialplan,all
Timestamp: 1405786887.636744
Channel: SIP/101-SIP-00000057
Variable: SIPURI
Value: sip:Unknown@XX.XX.XX.XX:5060
Uniqueid: 1405786887.87

Event: VarSet
Privilege: dialplan,all
Timestamp: 1405786887.638064
Channel: SIP/101-SIP-00000057
Variable: SIPDOMAIN
Value: 10.10.1.107
Uniqueid: 1405786887.87

Event: VarSet
Privilege: dialplan,all
Timestamp: 1405786887.638122
Channel: SIP/101-SIP-00000057
Variable: SIPCALLID
Value: 0c06e91024826cdd...@XX.XX.XX.XX:5060
Uniqueid: 1405786887.87

Event: Newexten
Privilege: dialplan,all
Timestamp: 1405786887.641581
Channel: SIP/101-SIP-00000057
Context: from-trunk-sip-101-SIP
Extension: 2000
Priority: 1
Application: Set
AppData: GROUP()=OUT_2
Uniqueid: 1405786887.87

Event: Newexten
Privilege: dialplan,all
Timestamp: 1405786887.644271
Channel: SIP/101-SIP-00000057
Context: from-trunk-sip-101-SIP
Extension: 2000
Priority: 2
Application: Goto
AppData: from-trunk,2000,1
Uniqueid: 1405786887.87

Event: Newexten
Privilege: dialplan,all
Timestamp: 1405786887.646391
Channel: SIP/101-SIP-00000057
Context: from-trunk
Extension: 2000
Priority: 1
Application: GotoIf
AppData: 0?ext-local,2000,1
Uniqueid: 1405786887.87

Alguien que me pueda ayudar ??

la versión de mi asterisk es Asterisk 11.8.1, Copyright (C) 1999 - 2013 Digium, Inc. and others.

Les agradesco.

Augusto Sepúlveda

unread,
Jul 19, 2014, 4:26:26 PM7/19/14
to aster...@googlegroups.com

Si pones el codigo completo es mas facil

--
Este email pertenece a la lista de Asterisk-ES (http://www.asterisk-es.org)
Normas de la lista Asterisk-ES: http://comunidad.asterisk-es.org/index.php?title=Lista:normas-asterisk-es
---
Has recibido este mensaje porque estás suscrito al grupo "asterisk-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a asterisk-es...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a aster...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/asterisk-es.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Gaston Draque

unread,
Jul 19, 2014, 5:24:48 PM7/19/14
to aster...@googlegroups.com

pastebin :-P
De todos modos no se cual es el array que está pinchando pero podes evaluarlo. Acordate que los eventos en ami no son uniformes... pero es mejor ver el código.
Saludos
Gaston Draque

--

Rafael Eduardo Morales Osorio

unread,
Jul 19, 2014, 5:34:56 PM7/19/14
to aster...@googlegroups.com
El código completo es:

$sip = "sip:anon...@XX.XX.XX.XX:5060";
$socket = fsockopen($aServer,$aPort, $errno, $errstr, 10); 
if (!$socket) {
}else{ 
# Logueo en Servidor CLIENTE
fputs($socket, "Action: Login\r\n"); 
fputs($socket, "UserName: $aUser\r\n"); 
fputs($socket, "Secret: $aSecret\r\n\r\n");
while (!feof($socket)){ 
$aResult= fgets($socket);
       $registro = $registro.$aResult;
if (trim($aResult) == null or substr($aResult) == '')
{
$buscador_sip = strpos($registro, $sip);
echo $buscador_sip;
if ($buscador_sip != false)
{
$unique_id = substr($registro, $buscador_sip + 43, strlen($registro));
echo "LLAMADA NRO " . $unique_id;
}
$buscador_uid = strpos($registro, trim($unique_id));
                                if ($buscador_uid != false)
                                {
                                        echo $registro;
unset ($registro);
                                }
}else{
}
}         
}

Gracias
Value: 0c06e91024826cdd501d834203cfe0c...@XX.XX.XX.XX:5060

Gaston Draque

unread,
Jul 19, 2014, 6:12:11 PM7/19/14
to aster...@googlegroups.com

La primera vez que ejecutas esto
$registro = $registro.$aResult;

registro no está inicializada

Agrega $ registro = ""; arriba donde inicializas las otras variables (sip y socket) y el Notice desaparece.

Saludos
Gaston//

--

Rafael Eduardo Morales Osorio

unread,
Jul 19, 2014, 6:26:13 PM7/19/14
to aster...@googlegroups.com
Gracias Gaston, pero en realidad lo que busco es separar cada trama, es decir, que cada evento quede en un sólo registro


El sábado, 19 de julio de 2014 14:04:11 UTC-5, Rafael Eduardo Morales Osorio escribió:
Value: 0c06e91024826cdd501d834203cfe0c...@XX.XX.XX.XX:5060

Gaston Draque

unread,
Jul 19, 2014, 7:09:30 PM7/19/14
to aster...@googlegroups.com

Estoy en el celu y puede que me pierda de algo,  pero por lo que decís, deberías eliminar el retorno de carro con preg_replace o con str_replace.
Saludos,
Gaston//

--

Rafael Eduardo Morales Osorio

unread,
Jul 19, 2014, 9:04:33 PM7/19/14
to aster...@googlegroups.com
mmm, puedes explicarme como hacerlo??, soy muy nuevo con èsto del PHP...


El sábado, 19 de julio de 2014 14:04:11 UTC-5, Rafael Eduardo Morales Osorio escribió:
Value: 0c06e91024826cdd501d834203cfe0c...@XX.XX.XX.XX:5060

Gaston Draque

unread,
Jul 20, 2014, 1:01:54 AM7/20/14
to aster...@googlegroups.com
Rafael,
   Si en realidad cada evento es un solo echo, seguramente seria mejor que reemplazaras los retornos de carro por digamos, una coma, antes de hacer el echo, y asi ya tendrias lo que quieres, algo asi:  $registro=str_replace("\n",",",$registro);

   Por otra parte... no se cual es el resultado que buscas con todo esto, pero puede que te interese investigar CEL.

Saludos,
Gaston//

--

Rafael Eduardo Morales Osorio

unread,
Jul 20, 2014, 9:30:25 AM7/20/14
to aster...@googlegroups.com
Muchas Gracias por las respuestas pero:

1. Ya habìa revisado la opción de usar CEL pero no me arroja los datos que necesito.
2. lo que necesito es que por cada evento que me arroje el asterisk, poderlo imprimir (o insertar en una BD) como un sòlo registro, Con el còdigo que adjunte funciona en un 95%, pero ahí registros que me quedan con 4 o 5 eventos y que no entiendo porque no los toma el PHP como registros separados, o no se si es asterisk el que me envía dichos eventos seguidos.

gracias.


El sábado, 19 de julio de 2014 14:04:11 UTC-5, Rafael Eduardo Morales Osorio escribió:
Value: 0c06e91024826cdd501d834203cfe0c...@XX.XX.XX.XX:5060

Gaston Draque

unread,
Jul 20, 2014, 11:39:11 AM7/20/14
to aster...@googlegroups.com
Esto hace rato que no es Asterisk, sino programacion, habria que meter un [OT] en algun lado :)

1 - No, Asterisk no esta haciendo nada mal, manda todo lo que entra en el buffer, a veces mas de un evento.
2 - tendrias que usar split (1ro) [ie: $eventos = split("\r\n\r\n",$readbuffer); ] , despues hacer un "foreach as", y por cada array-elemment hacer $registro=str_replace("\n",",",$registro) para armar tu linea.

Osea, con split dividis los Event sets, y con str_replace, convertis Cada Event set en una linea.

Saludos,
Gaston//

--
Este email pertenece a la lista de Asterisk-ES (http://www.asterisk-es.org)
Normas de la lista Asterisk-ES: http://comunidad.asterisk-es.org/index.php?title=Lista:normas-asterisk-es
---
Has recibido este mensaje porque estás suscrito al grupo "asterisk-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a asterisk-es...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a aster...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/asterisk-es.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
{
  "fullName" : "Gaston Draque"
  "email"    : "gaston...@gmail.com"
  "twitter"  : "@gdraque"
  "google+"  : "google.com/+gastondraque"
  "tags"     : ["uc communications","telecom integrator","voip","software development"]
}

Reply all
Reply to author
Forward
0 new messages