--
Saúl -- "Nunca subestimes el ancho de banda de un camión lleno de disketes."
----------------------------------------------------------------
http://www.saghul.net/
sipsak could also be you very best friend Silvia :)
Asterisk manda los MESSAGE (con la aplicación "SendText") en modo "in-dialog",
esto es, la cabecera "To" contiene un parámetro "tag" con el mismo valor que
el "To tag" de la sesión de voz actual.
Aunque es perfectamente correcto algunos clientes no soportan recibir MESSAGE
in-dialog (como muy bien demostró Paco Gil en los X-Lite). Así que yo por mí
prescindiría totalmente de Asterisk y su cutre "SendText" y enviaría los
MESSAGE en modo "initial-request" (sin "To tag") desde otra aplicación
(SipSak es tu amigo como dice Saúl).
No cargues a Asterisk con cosas que hace fatal ;)
~~~~~~ uso de NGREP (captura traza SIP) ~~~~~~
En el servidor Asterisk:
~$ ngrep -d any -P ' ' -W byline -T port 5060
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--
Iñaki Baz Castillo
i...@in.ilimit.es
> El asunto del tag, ya me lo habia olido, intentando enviar
> MESSAGE a telefonos SIP. desde la aplicación externa, la respuesta es
> desigual, un softphone Twinkle 1.1 los recibe correctamente pero los
> telefonos Hardware que con SendText() funcionan correctamente, no
> muestran nada cuando el paquete proviene de la aplicación externa.
Algunos tfnos se pueden configurar para que sólo puedan recibir request
(INVITE, MESSAGE...) desde el proxy (ip:puerto). Si estás usando una
aplicación externa obviamente estás usando otro ip:puerto origen.
Pero dudo que sea eso ya que sólo he visto esa opción en los Linksys y no
viene por defecto.
Desde la máquina donde corres la aplicación externa que manda el MESSAGE haz
un ngrep (ver mi firma) y pega la salida.
> Voy a probar lo que me has indicado pero quizá pudieras
> sugerirme como hacerlo también con SendText() auqnue ese método a ti
> no te caiga muy simpatico.
Con SendText va a ser siempre en modo in-dialog y en X-Lite no funciona (no lo
soporta). Por lo demás no puedo decir nada que no haya dicho ya Silvia:
"con un agi o system() puedes ejecutar codigo externo a asterisk.
Haz que esa aplicacion los deje en algun sitio, o llene la base de
datos de asterisk:
asterisk -rx `database put datos LOSDATOS`
Y despues en el dialplan Set(DATOS=DB(....))"
2008/4/22 HORMAX <hor...@gmail.com>:
Da igual que la IP sea la misma, el puerto origen no puesto que ya lo está
usando Asterisk así que a efectos SIP n oes la misma comunicación ni el mismo
UAC.
> La aplicación externa puede meter los datos en la base de datos de
> Asterisk y se puede hacer que una variable Asterisk tome el valor
> almacenado en esa DB, hasta ahí todo bién.
>
> Mi problema consiste en que no se como hacer que cada vez que aparece
> un nuevo dato se ejecute un SendText(DATOS) y asi el string llegue al
> display del telefono.
Entonces tienes que tirar de un proceso externo, un cron o algo así, que
ejecute un "asterisk -r comando...".
> Por lo que veo mis telefonos solo acepten MESSAGE desde Asterisk, si
> no fuera así ya lo tendria solucionado.
A ver, no digamos tonterías (con cariño).
¿¿¿¿¿Qué es eso de que tus teléfonso sólo aceptan MESSAGE desde Asterisk????
Que no y que no, que estarás haciendo algo mal y punto.
NOTA: Salvo que tus teléfonos sólo permitan MESSAGE in dialog y da la
casualidad que Asterisk los envía in-dialog mientras que un softphone normla
te los manda como initial-request.
Haz una prueba: Coge un Twinkle y desde él envía un MESSAGE al usuario@IP del
teléfono que recibe los MESSAGE (me refiero a la IP del teléfono, no del
Asterisk). ¿Llega?
Aunque la llamada esté establecida Twinkle envía el MESSAGE fuera de diálogo
(o sea, sin "tag" en el header "To").
> Creo que tu apreciación es correcta, este teléfono parece que solo
> está admitiendo mensajes in-dialog, mientras que Twinkle lo hace con
> initial-request.
Pero algún error tiene que decir. ¿Puedes ejecutar ngrep en la máuqina donde
corres Twinkle y pegar la traza cuando Twinkle envía el MESSAGE?
o si no pega lo que te diga el log del twinkle al enviar el MESSAGE:
~/.twinkle/twinkle.log
Ok, sencillamente ni response. Entonces no creo que no permita MESSAGE fuera
de diálogo, ya que al menos tendría que responder con un "Method not
upported" o algún error 4XX. No es normal que no responda nada, luego pienso
que ese teléfono sólo permite recibir peticiones desde el proxy/pbx en el que
se registra (o sea, 172.26.0.25:5060, pero no desde 172.26.0.25:5061).
¿Qué teléfono es?
Haz una prueba bestia: apaga el Asterisk y pon a Twinkle en el 5060 y prueba
de nuevo.
2008/4/23 HORMAX <hor...@gmail.com>:
Vale, probemos una cosa. Te adjunto un scritp que he hecho en Ruby (necesitas
ruby instalado).
Quita el Asterisk y Twinkle y haz dos pruebas:
~# ruby send_message.rb user@IP_tfno "hola que tal"
~# ruby send_message.rb user@IP_tfno "hola que tal" --in-dialog
En ambos casos pega la salida.
> Con SendText() funcionó bién pero no sé como enviarle una sucesión de
> SendText() en el transcurso de una llamada para que el display se vaya
> actualizando.
Imposible. Eso no se puede hacer con el dialplan de Asterisk puesto que si se
está ejecutnado el Dial no se está ejecutando otra cosa.
No lo entiendo, es como si no se hubiese recibido el paquete UDP ya que en
caso de recibirlo ese script debe mostrar la repuesta. Ejemplo:
./send_message.rb sip:2...@192.168.1.58 "EOO"
DEBUG: Sent request from 192.168.1.58:6060 to 192.168.1.58:5060
------------------------
MESSAGE sip:2...@192.168.1.58:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.58:6060;branch=z9hG4bK3361
Max-Forwards: 70
From: <sip:tes...@192.168.1.58>;tag=20
To: <sip:2...@192.168.1.58:5060>
CSeq: 7 MESSAGE
Call-ID: 54662124714
Contact: <sip:tes...@192.168.1.58>
Content-Type: text/plain;charset=utf-8
Content-Length: 5
EOO
DEBUG: Received response from 192.168.1.58:5060 to 192.168.1.58:6060
------------------------
SIP/2.0 200 OK
v: SIP/2.0/UDP 192.168.1.58:6060;branch=z9hG4bK3361
t: <sip:2...@192.168.1.58:5060>;tag=kewhv
f: <sip:tes...@192.168.1.58>;tag=20
i: 54662124714
CSeq: 7 MESSAGE
Server: Twinkle/1.2alpha2
l: 0
> ---------------------------------------------------
> ¿Que te parece lo que dice Paco Gil?, podria crear un context que
> contenga un SendText() con los datos que quiero que reciba el display
> y ejecutarlo con <originate> a través del AMI..
Sí, seguro que funcionaría. Pero lo que me mosquea es porqué demonios ese
teléfono no recibe los MESSAGE. Su comportamiento es raro de narices.
> Sí, seguro que funcionaría. Pero lo que me mosquea es porqué demonios ese
> teléfono no recibe los MESSAGE. Su comportamiento es raro de narices.
Mira por ejemplo lo que dice el nuevo firmware de los Linksys:
10.Support reception and display of text messages sent to the phone using the SIP
MESSAGE method. A few new parameters to control this features:
[REGIONAL]<Alert Tone>: A TONE SCRIPT. This should be a brief tone which
plays whenever the phone receives a new text message
[USER]<Text Message>: Enable/disable reception of text messages sent by
the SIP Proxy server.Default is "yes"
[USER]<Text Message From 3rd Party>: Enable/disable reception of text messages sent by
a third party (other than the SIP Proxy server).
Default is "no".
[USER]<Alert Tone Off>: Enable/disable playing the Alert tone on reception
of new text messages. Default is "no"
Una vez más te sugiero que captures la traza SIP de todo esto puesto que lo
vital es saber si el tfno responde o no (aunque responda un 4XX o 5XX).
Decir "el mensaje sigue sin aparecer" no ayuda.
~~~~~~ uso de NGREP (captura traza SIP) ~~~~~~
En el servidor Asterisk:
~$ ngrep -d any -P ' ' -W byline -T port 5060
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--
Iñaki Baz Castillo
i...@in.ilimit.es
Hola. En esa traza no se ve ningún MESSAGE que haya enviado Asterisk.
Es normal.El SendText sólo vale en este reducido escenario:
- Un tfno llama a una extensión de Asterisk.
- Asterisk ejecuta el dialplan en el que se encuentra un SendText.
Lo que tú estás intentando no es ese escenario. Creo sinceramente que tienes
un buen follón de difícil solución:
- Tu tfno parece que sólo admite MESSAGE in-dialog, o sea, con el
mismo "To_tag", "From_tag" y "Call-ID" que una sesión de audio (INVITE) en
curso. Así que aunque lo envies desde una aplicación externa es necesario que
esos parámetros del paquete MESSAGE se respeten.
- Y aún así nos queda la duda de si el tfno aceptaría dich MESSAGE desde una
IP:puerto distinto que el Asterisk (que es con quien está hablando).
En caso de que esto último no fuese cierto (no hubiese dicha necesidad) te las
tendrías que ingeniar para que una aplicación externa enviase el MESSAGE
in-dialog con esos parámetros, que los puedes averiguar así:
asterisk*CLI> sip show channel
CAD2B545-C874-447B...@192.168.1.72
asterisk*CLI>
* SIP Call
Curr. trans. direction: Incoming
Call-ID: CAD2B545-C874-447B...@192.168.1.72
Owner channel ID: <none>
Our Codec Capability: 1572878
Non-Codec Capability (DTMF): 1
Their Codec Capability: 0
Joint Codec Capability: 0
Format: 0x0 (nothing)
MaxCallBR: 0 kbps
Theoretical Address: 192.168.1.72:5060
Received Address: 192.168.1.72:5060
SIP Transfer mode: open
NAT Support: RFC3581
Audio IP: 192.168.1.213 (local)
Our Tag: as2587a196
Their Tag: 3064610920472
SIP User agent:
Need Destroy: 0
Last Message: Rx: OPTIONS
Promiscuous Redir: No
Route: N/A
DTMF Mode: rfc2833
SIP Options: (none)
En el MESSAGE que deberías generar:
- From tag = as2587a196
- To tag = 3064610920472
- Call-ID = CAD2B545-C874-447B...@192.168.1.72
Pero veo demasiadas dudas. Lo mejor sería que contactases con el proveedor que
ha hecho ese firmware y te explicase qué requisitos ha introducido para
aceptar o no el MESSAGE (¿debe ser in-dialog? ¿debe ser desde la misma
IP:puerto que el proxy?).
http://www.voip-info.org/wiki/view/Asterisk+Manager+API+Action+Originate
tiene un apartado que es:
Application: Application to use on connect (use Data for parameters)
parece que no lo estás haciendo bien no???
2008/4/23 HORMAX <hor...@gmail.com>:
Pero es que ese teléfono al que llama no va a terminar de "conectar" porque
está atendiendo otra llamada, luego nunca se va a ejecutar esa aplicación.
~~~~~~ uso de NGREP (captura traza SIP) ~~~~~~
En el servidor Asterisk:
~$ ngrep -d any -P ' ' -W byline -T port 5060
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--
Iñaki Baz Castillo
i...@in.ilimit.es
no creo... ten en cuenta que en un funcionamiento normal por dialplan,
el telefono muestra mensajes (recibidos con SendText(), claro), con el
canal respondido (despues de un answer).... Yo tengo telefonos basados
en el chipset de palmmicro PA168 (el nuevo AR1688) y funcionan bien.
supongo que es cuestión de probar ;)
>
>
>
> ~~~~~~ uso de NGREP (captura traza SIP) ~~~~~~
> En el servidor Asterisk:
> ~$ ngrep -d any -P ' ' -W byline -T port 5060
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> --
> Iñaki Baz Castillo
> i...@in.ilimit.es
>
>
>
> >
>
[snom_setdndon]
exten => _.,1,NoOp(Dummy Routine Called for ${EXTEN})
exten => _.,n,TrySystem(wget -qb -O /dev/null -o /dev/null
"http://admin:${SNOM_PASSWD}@${EXTEN}/dummy.htm?settings=save&dnd_mode=on")
exten => _.,n,Hangup
[snom_setdndoff]
exten => _.,1,NoOp(Dummy Routine Called for ${EXTEN})
exten => _.,n,TrySystem(wget -qb -O /dev/null -o /dev/null
"http://admin:${SNOM_PASSWD}@${EXTEN}/dummy.htm?settings=save&dnd_mode=off")
exten => _.,n,Hangup
and then from the manager interface one can do:
Action: Originate
Channel: Local/192.168.1.21@snom_setdndon
Application: NoOp
Data: Setting DND
Tu podrías intentar
Action: Originate
Channel: elquesea
Application: SendText
Data: Chino mamon, muestrame el mensaje en pantalla
XDDD
2008/4/23 HORMAX <hor...@gmail.com>:
yo creo que hay algo que no estás haciendo bien en el manager, ya que
no estas enviando MESSAGES, sino INVITES... y obviamente el teléfono,
aunque es chino, no es tan listo :)
2008/4/23 HORMAX <hor...@gmail.com>:
2008/4/23 paco gil <pag...@gmail.com>:
Es que el originate origina una llamada, o sea, un INVITE. :)
~~~~~~ uso de NGREP (captura traza SIP) ~~~~~~
En el servidor Asterisk:
~$ ngrep -d any -P ' ' -W byline -T port 5060
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--
Iñaki Baz Castillo
i...@in.ilimit.es