El puerto de estado es una interfaz externa para monitorear y controlar el gatekeeper. El gatekeeper arrojará mensajes sobre las llamadas actuales hacia todos los clientes conectados y puede recibir comandos mediante esta interfaz.
Los mensajes enviados por el gatekeeper hacia el puerto de estado estan agrupados dentro de tres Niveles de rastreo de salida:
Notificacione se recarga (Reload) y respuesta directa a comandos ejecutados.
Notificacione se recarga (Reload), respuesta directa a comandos ejecutados, CDRs y Route Requests.
Todas las salidas (Notificacione se recarga (Reload), respuesta directa a comandos ejecutados, CDRs, Route Requests,RAS, ...). Este es el nivel de salida por defecto.
La interfaz es un simple puerto TCP (por defecto: 7000), usted puede conectarse hacia éste mediante telnet u otro cliente. Un ejemplo de un cliente diferente es el Java GUI, aka GkGUI. Otro ejemplo es la aplicación Automatic Call Distribution, aka GnuGk ACD.
Depende de usted lo que haga con el poder del puerto de estado, pero aqui hay algunas ideas:
Ver GkGUI.
Ver GnuGk ACD.
Analice de los mensajes CDR messages y administrelos luego desde una aplicación de facturación.
Si usted no desea publicar el código fuente de alguna característica adicional, simplemente publique la funcionalidad central y únalo mediante el puerto de estado y mantenga la parte externa como privada.
Supongamos que usted esta interesado en los CDRs (call details records) y quiere un proceso que trabaje en modo batch en intervalos regulares.
Aqui está un script simple escrito en Perl (gnugk_cdr.pl
) que inicia el gatekeeper y además conecta un simple cliente para la Status Interface y registra los CDRs dentro de un logfile. Usted debería modificar un poco este script para ajustarlo a sus necesidades.
#!/usr/bin/perl # sample program that demonstrates how to write the CDRs to a log file use strict; use IO::Socket; use IO::Handle; my $logfile = "/home/jan/cdr.log"; # CHANGE THIS my $gk_host = "localhost"; my $gk_port = 7000; my $gk_pid; if ($gk_pid = fork()) { # parent will listen to gatekeeper status sleep(1); # wait for gk to start my $sock = IO::Socket::INET->new(PeerAddr => $gk_host, PeerPort => $gk_port, Proto => 'tcp'); if (!defined $sock) { die "Can't connect to gatekeeper at $gk_host:$gk_port"; } $SIG{HUP} = sub { kill 1, $gk_pid; }; # pass HUP to gatekeeper $SIG{INT} = sub { close (CDRFILE); kill 2, $gk_pid; }; # close file when terminated open (CDRFILE, ">>$logfile"); CDRFILE->autoflush(1); # don't buffer output while (!$sock->eof()) { my $msg = $sock->getline(); $msg = (split(/;/, $msg))[0]; # remove junk at end of line my $msgtype = (split(/\|/, $msg))[0]; if ($msgtype eq "CDR") { print CDRFILE "$msg\n"; } } close (CDRFILE); } else { # child starts gatekeeper exec("gnugk"); }
Tenga siempre presente que éste es justamente un ejemplo para mostrar el uso del puerto de estado. Usted puede utilizar el módulo FileAcct para registrar los CDRs en un sistema en producción.
Hay algunas Graphical User Interface (GUI) frontends para el Gatekeeper.
Desarrollado por Jan Willamowius. Usted puede monitorear los registros y llamadas que están en el gatekeeper. Un clic derecho sobre un botón le muestra a usted un menú desplegable con información de dicho endpoint.
Esta GUI trabaja con Java 1.0 soportado por muchos navegadores web. Por razones de seguridad en GUI debe ser ejecutado como una aplicación standalone o administrada por un servidor web sobre el mismo número de IP del gatekeeper (usted no puede ejecutar esta GUI como un applet mediante el archivo local).
La aplicación está disponible en http://www.gnugk.org/h323gui.html
Una nueva aplicación standalone Java desarrollado por Citron Network Inc. Este requiere Java 1.4. Entre las nuevas características se incluyen:
El GkGUI esta lanzada bajo GNU General Public License, disponible en http://www.gnugk.org/h323develop.html#java
Esta sección muestra todos los comandos que usted puede enviar al puerto de estado (manualmente o mediante una aplicación externa). Todos los comandos son case-insensitive. Pero algunos parámetros pueden ser case-sensitive.
El comando help
o h
le mostrará una lista de todos los comando disponibles.
Reload
Recarga o reinicia la configuración.
Version
, v
Muestra la versión e información del OS del gatekeeper.
Statistics
, s
Muestra información estadística del gatekeeper.
Statistics
-- Endpoint Statistics --
Total Endpoints: 21 Terminals: 17 Gateways: 4 NATed: 2
Cached Endpoints: 1 Terminals: 1 Gateways: 0
-- Call Statistics --
Current Calls: 1 Active: 1 From Neighbor: 0 From Parent: 0
Total Calls: 1539 Successful: 1076 From Neighbor: 60 From Parent: 5
Startup: Fri, 21 Jun 2002 10:50:22 +0800 Running: 11 days 04:22:59
;
PrintAllRegistrations
, r
, ?
Muestra todos los endpoints registrados.
AllRegistrations
RCF|IP:Port|Aliases|Terminal_Type|EndpointID
...
Number of Endpoints: n
;
AllRegistrations
RCF|10.1.1.10:1720|800:dialedDigits=Wei:h323_ID|terminal|1289_endp
RCF|10.0.1.43:1720|613:dialedDigits=Jacky Tsai:h323_ID|terminal|1328_endp
RCF|10.0.1.55:1720|705:dialedDigits=Sherry Liu:h323_ID|terminal|1333_endp
Number of Endpoints: 3
;
PrintAllRegistrationsVerbose
, rv
, ??
Muestra el detalle de todos los endpoints registrados.
AllRegistrations
RCF|IP:Port|Aliases|Terminal_Type|EndpointID
Registration_Time C(Active_Call/Connected_Call/Total_Call) <r>
[Prefixes: ##] (gateway only)
...
Number of Endpoints: n
;
AllRegistrations
RCF|10.0.1.8:1720|Accel-GW2:h323_ID|gateway|1322_endp
Wed, 26 Jun 2002 16:40:03 +0800 C(1/5/33) <1>
Prefixes: 09,002
RCF|10.1.1.10:1720|800:dialedDigits=Wei:h323_ID|terminal|1289_endp
Wed, 26 Jun 2002 16:40:55 +0800 C(0/32/39) <1>
RCF|10.0.1.66:1720|716:dialedDigits=Vicky:h323_ID|terminal|1425_endp
Wed, 26 Jun 2002 16:40:58 +0800 C(1/47/53) <1>
Number of Endpoints: 2
;
PrintCurrentCalls
, c
, !
Muestra todas las llamadas acuales utilizando la misma sintaxis de ACF como en el establecimiento de llamada.
CurrentCalls
Call No. # | CallID | Call_Duration | Left_Time
Dialed_Number
ACF|Caller_IP:Port|Caller_EPID|CRV|DestinationInfo|SrcInfo|IsAnswered;
ACF|Callee_IP:Port|Callee_EPID|CRV|DestinationInfo|SrcInfo|IsAnswered;
...
Number of Calls: Current_Call Active: Active_Call From Neighbor: Call_From_Neighbor \
From Parent: Call_From_Parent
;
CurrentCalls
Call No. 29 | CallID bd c6 17 ff aa ea 18 10 85 95 44 45 53 54 77 77 | 109 | 491
Dial 0953378875:dialedDigits
ACF|10.0.1.49:1720|4048_CGK1|25263|frank:h323_ID|gunter:h323_ID|false;
ACF|10.1.1.1:1720|4037_CGK1|25263|gunter:h323_ID|frank:h323_ID|true;
Call No. 30 | CallID 70 0e dd c0 9a cf 11 5e 00 01 00 05 5d f9 28 4d | 37 | 563
Dial 0938736860:dialedDigits
ACF|10.0.1.48:1032|4041_CGK1|11896|sue:h323_ID|peter:h323_ID|false;
ACF|10.1.1.1:1720|4037_CGK1|11896|peter:h323_ID|sue:h323_ID|true;
Number of Calls: 2 Active: 2 From Neighbor: 0 From Parent: 0
;
PrintCurrentCallsVerbose
, cv
, !!
Muestra el detalle de todas las llamadas actuales.
CurrentCalls
Call No. # | CallID | Call_Duration | Left_Time
Dialed_Number
ACF|Caller_IP:Port|Caller_EPID|CRV|DestinationInfo|SrcInfo|IsAnswered;
ACF|Callee_IP:Port|Callee_EPID|CRV|DestinationInfo|SrcInfo|IsAnswered;
# Caller_Aliases|Callee_Aliases|Bandwidth|Connected_Time <r>
...
Number of Calls: Current_Call Active: Active_Call From NB: Call_From_Neighbor
;
CurrentCalls
Call No. 48 | CallID 7d 5a f1 0a ad ea 18 10 89 16 00 50 fc 3f 0c f5 | 30 | 570
Dial 0225067272:dialedDigits
ACF|10.0.1.200:1720|1448_endp|19618|frank:h323_ID|gunter:h323_ID|false;
ACF|10.0.1.7:1720|1325_endp|19618|gunter:h323_ID|frank:h323_ID|true;
# Sherry:h323_ID|Accel-GW1:h323_ID|200000|Wed, 26 Jun 2002 17:29:55 +0800 <2>
Number of Calls: 1 Active: 1 From NB: 0
;
Find
, f
Busca un endpoint registrado mediante el alias o un prefijo.
Find Alias
RCF|IP:Port|Aliases|Terminal_Type|EndpointID
;
f 800
RCF|10.1.1.10:1720|800:dialedDigits=Wei:h323_ID|terminal|1289_endp
;
f 801
SoftPBX: alias 801 not found!
FindVerbose
, fv
Busca el detalle de un endpoint registrado mediante un alias o un prefijo.
FindVerbose Alias
RCF|IP:Port|Aliases|Terminal_Type|EndpointID
Registration_Time C(Active_Call/Connected_Call/Total_Call) <r>
[Prefixes: ##] (gateway only)
;
fv 02
RCF|10.0.1.100:1720|TFN:h323_ID|gateway|4037_CGK1
Wed, 26 Jun 2002 17:47:29 +0800 C(0/84/120) <1>
Prefixes: 02,09
;
UnregisterIP
Obliga a desregistrar un endpoint mediante su dirección IP y su puerto de señalización de llamada.
UnregisterIP IP[:Port]
UnregisterIP 10.0.1.31:1720
URQ|10.0.1.31:1032|1326_endp|maintenance;
SoftPBX: Endpoint 10.0.1.31:1720 unregistered!
UnregisterAlias
Obliga a desregistrar un endpoint mediante uno de sus alias.
UnregisterAlias Alias
UnregisterAlias 601
URQ|10.0.1.31:1032|1326_endp|maintenance;
SoftPBX: Endpoint 601 unregistered!
UnregisterAllEndpoints
Obliga a desregistrar todos los endpoints registrados.
UnregisterAllEndpoints
URQ|10.0.1.7:1024|1325_endp|maintenance;
URQ|10.0.1.8:1024|1322_endp|maintenance;
URQ|10.0.1.32:1032|1324_endp|maintenance;
URQ|10.0.1.36:1032|1323_endp|maintenance;
URQ|10.0.1.42:1032|1318_endp|maintenance;
Done
;
DisconnectCall
Desconecta una llamada mediante su número.
DisconnectCall Number
DisconnectCall 1533
DisconnectIP
Desconecta todas las llamadas de un endpoint mediante su IP y su puerto de señalización de llamada.
DisconnectIP IP[:Port]
DisconnectIP 10.0.1.31:1720
DisconnectAlias
Desconecta todas las llamadas de un endpoint mediante uno de sus alias.
DisconnectAlias Alias
DisconnectAlias 601
ClearCalls
Desconecta todas las llamadas existentes en el gatekeeper.
GK
Muestra información del gatekeeper padre (parent gatekeeper).
Trace
Establece el nivel de rastreo de salida para la interfaz de estado. Este controla que mensajes son enviados a este cliente:
trace 0
o trace min
Solamente respuestas directas a comandos y notificaciones de recarga (reload).
trace 1
CDRs, respuestas directas a comandos y notificaciones de recarga (reload).
trace 2
or trace max
Muestra todo (RAS, CDRs, respuestas directas a comandos y notificaciones de recarga (reload), etc).
Debug
Solamente utilizado para propósito de debug. Opciones:
trc [+|-|n]
Muestra/modifica el nivel de rastreo.
cfg SEC PAR
Lee e muestra un parámetro de configuración de una sección.
set SEC PAR VAL
Escribe un valor a un parámetro de configuración de una sección.
remove SEC PAR
Remueve el valor de un parámetro de configuración de una sección.
remove SEC
Remueve una sección.
printrm VERBOSE
Muestra todos los registros de un endpoint removido.
debug trc 3
debug set RoutedMode H245Routed 1
Who
Muestra todos las personas que se encuentran en el puerto de estado.
RouteReject
Termina esta llamada sobre una cola virtual. Este comando es utilizado como respuesta a un evento RouteRequest (ver más adelante).
RouteReject CallingEndpointID CallRef
RouteReject endp_4711 1234
RouteToAlias
, rta
Enruta esta llamada sobre una cola virtual hacia el alias especificado. Este comando es utilizado como respuesta a un evento RouteRequest (ver más adelante).
RouteToAlias Alias CallingEndpointID CallRef
RouteToAlias Suzi endp_4711 1234
RouteToGateway
, rtg
Enruta esta llamada sobre una cola virtual hacia un alias especificado y establece el destinationSignallAddress. Este comando es utilizado como una respuesta al evento RouteRequest (ver más adelante). Usted puede utilizar este comando para rutear llamadas hacia gateways fuera de la zona (out-of-zone) o MCUs no registrados con el gatekeeper. Asegúese que las políticas 'vqueue' y 'explicit' esten en efecto para esas llamadas.
RouteToGateway Alias IP:Port CallingEndpointID CallRef
RouteToGateway Suzi 192.168.0.50 endp_4711 1234
Exit
, q
Cierra el puerto de estado.
TransferCall
Trasfiere una llamada establecida desde el alias A hacia el alias B. En un momento dado el alias A esta hablandocon el alias X, entonces el alias A eta hablando con el alias B después del TransferCall.
Actualmente éste trabaja solamente con endpoints que soportan mensajes Q.931 Facility (por consiguiente éste comando no funciona con Netmeeting).
TransferCall Source-Alias New-Destination-Alias
TransferCall Frank Peter
Esta sección describe los mensajes de salida hacia la interfaz de estado.
GCF|IP|Aliases|Endpoint_Type;
El gatekeeper recibe un GatekeeperRequest (GRQ) y responde con un GatekeeperConfirm (GCF).
GRJ|IP|Aliases|Endpoint_Type|RejectReason;
El gatekeeper recibe un GatekeeperRequest (GRQ) y responde con un GatekeeperReject (GRJ).
RCF|IP:Port|Aliases|Endpoint_Type|EndpointID;
El gatekeeper recibe un RegistrationRequest (RRQ) y responde con un RegistrationConfirm (RCF).
RRJ|IP|Aliases|Endpoint_Type|RejectReason;
El gatekeeper recibe un RegistrationRequest (RRQ) y responde con a RegistrationReject (RRJ).
ACF|Caller_IP:Port|Caller_EndpointID|CRV|DestinationInfo|SrcInfo|IsAnswered;
El gatekeeper recibe un AdmissionRequest (ARQ) y responde con un AdmissionConfirm (ACF).
ARJ|Caller_IP:Port|DestinationInfo|SrcInfo|IsAnswered|RejectReason;
El gatekeeper recibe un AdmissionRequest (ARQ) y responde con un AdmissionReject (ARJ).
DCF|IP|EndpointID|CRV|DisengageReason;
El gatekeeper recibe un DisengageRequest (DRQ) y responde con un DisengageConfirm (DCF).
DRJ|IP|EndpointID|CRV|RejectReason;
El gatekeeper recibe un DisengageRequest (DRQ) y responde con un DisengageReject (DRJ).
LCF|IP|EndpointID|DestinationInfo|SrcInfo;
El gatekeeper recibe un LocationRequest (LRQ) y responde con un LocationConfirm (LCF).
LRJ|IP|DestinationInfo|SrcInfo|RejectReason;
El gatekeeper recibe un LocationRequest (LRQ) y responde con un LocationReject (LRJ).
BCF|IP|EndpointID|Bandwidth;
El gatekeeper recibe un BandwidthRequest (BRQ) y responde con un BandwidthConfirm (BCF).
BRJ|IP|EndpointID|Bandwidth|RejectReason;
El gatekeeper recibe un BandwidthRequest (BRQ) y responde con un BandwidthReject (BRJ).
UCF|IP|EndpointID;
El gatekeeper recibe un UnregistrationRequest (URQ) y responde con un UnregistrationConfirm (UCF).
URJ|IP|EndpointID|RejectReason;
El gatekeeper recibe un UnregistrationRequest (URQ) y responde con un UnregistrationReject (URJ).
IRQ|IP:Port|EndpointID;
El gatekeeper envía un InfoRequest (IRQ) hacia un endpoint para consultarle si éste esta aún en actividad. El endpoint debe responder con un InfoRequestResponse (IRR) inmediatamente.
URQ|IP:Port|EndpointID|Reason;
El gatekeeper envía un UnregistrationRequest (URQ) hacia un endpoint para cancelar su registro. El endpoint debe responder con un UnregistrationConfirm (UCF).
CDR|CallNo|CallId|Duration|Starttime|Endtime|CallerIP|CallerEndId|
\CalledIP|CalledEndId|DestinationInfo|SrcInfo|GatekeeperID;
Después de una llamada desconectada, el registro de detalle de llamada (call detail record) es mostrado (en una línea).
RouteRequest|CallerIP:Port|CallerEndpointId|CallRef|VirtualQueue|CallerAlias;
Petición para que una aplicación externa enrute una llamada entrante sobre una cola virtual. Esto puede ser hecho con los comandos RouteToAlias o RouteReject.