martes, 5 de junio de 2012

SPA3102 y Raspberry Pi

Dejando que el RaspberryPi haga uso de la línea

... esperemos que sepa atender las llamadas

Buenas tardes, en el post anterior hemos visto como compilar Asterisk en el RaspberryPi. Ahora vamos a crear una extensión de prueba y además vamos a configurar nuestro sistema para que nuestro RaspberryPi gestione la línea analógica de nuestro hogar. Primero un coco de teoria.

La línea de teléfono doméstica, esa donde conectamos el router ADSL y los teléfonos, es una línea analógica convencional, y si queremos hacer uso de ella desde Asterisk, necesitaremos un dispositivo (pci o gateway) con al menos una boca FXO. Si además queremos tener al menos un teléfono analógico, por aquello de estar más acostumbrados y a modo de respaldo en caso de que el Asterisk deje de funcionar correctamente, necesitaremos un dispositivo (pci o gateway) con al menos una boca FXS. O lo que viene a ser más cómodo, un gateway con una boca FXO, otra FXS y como es lógico, con una boca de red rj-45. Como viene a ser el caso del Linksys SPA3102, uno de los más reconocidos y que funciona a las 99 maravillas (a las 100 no llega ninguno):
A este gateway conectaremos la línea de la calle, la analógica de toda la vida, y el teléfono analógico (el de toda la vida). Lo que significa que cuando nos llamen, sonará el teléfono analógico y/o aquellas extensiones vozip que tengamos configuradas. Cuando llamemos haciendo uso de la linea analógica, lo podremos hacer desde el teléfono analógico y/o desde las extensiones vozip que tengamos configuradas. Está es el esquema del conexionado físico:
Suponemos que nuestro RaspberryPi tiene la ip 192.168.1.87. A la extensión analógica, le vamos a asignar la 1002 (o la que quieras, pero no la olvides). El cable de red tiene que ir en la boca etiquetada como "internet" ¡¡OJO!! no la confundas con la ethernet (es para tema de rutados). El cable del teléfono tiene que ir en la boca etiquetada como "phone" y la línea (el cable marrón que va al teléfono) en la que pone "line"

Configurando Asterisk

Os pongo mi configuración:
vim /etc/asterisk/sip.conf

[general]
port=5060
bindaddr=0.0.0.0
context=nulo
videosupport=no
language=es
disallow=all
allow=alaw,gsm,h264
localnet=192.168.1.0/255.255.255.0    ; RED DE USUARIO
nat=no
;externalip=0.0.0.0 ; tu IP publica en caso de ser fija
externhost=TU_HOST.dyndns.org
echocancel=yes
echocancelwhenbridged=yes

[android](!)
host=dynamic
context=usuarios
type=friend
qualify=yes
canreinvite=no
dtmfmode=rfc2833
limitonpeers=yes
call-limit=2
nat=no
allow=all

[Juanlu](android)
callerid=Juanlu
secret=clave_supersecretisima
defaultuser=Juanlu

[Mari](android)
callerid=Mari
secret=clave_supersecretisima
defaultuser=Mari

[1002]
host=dynamic
callerid=1002
secret=clave_supersecretisima
defaultuser=1002
context=usuarios
type=friend
qualify=yes
canreinvite=yes
dtmfmode=rfc2833
limitonpeers=yes
call-limit=2

[gateway]
host=dynamic
secret=spa3102
defaultuser=gateway
context=entrantes
type=friend
dtmfmode=rfc2833
qualify=yes
canreinvite=no
call-limit=2
Aunque no se tengan muchas ideas de Asterisk, la configuración no es complicada. En el ejemplo que os he puesto, se ven dos extensiones: Juanlu y Mari, que usan la máscara Android. Uso una máscara para las configuraciones que se repiten, de vago total. Además vemos la extension 1002 y la gateway, que son las dos que usa el SPA3102. La 1002 para el teléfono analógico y la otra para la línea FXO.
El dialplan quedaría más o menos así:
vim /etc/asterisk/extensions.conf

[general]
autofallthrough=yes

[globals]
TIMEOUT=60
opc=tTrkKwW
todas=sip/Juanlu&sip/Mari&sip/1002
gtw=sip/gateway

[default]

[usuarios]
include => internos
include => salientes

[internos]
include => parkedcalls

exten => 1002,1,NoOp(llamada entrante al telefono analogico conectado al SPA3102)
same => n,Dial(sip/1002,${TIMEOUT},${opc})
same => n,Goto(nulo,s,1)

exten => 100,1,NoOp(llamada al cliente sip de Android)
same => n,Dial(sip/Juanlu,${TIMEOUT},${opc})
same => n,Goto(nulo,s,1)

exten => 200,1,NoOp(llamada al cliente sip de Android)
same => n,Dial(sip/Mari,${TIMEOUT},${opc})
same => n,Goto(nulo,s,1)

[salientes]
exten => 112,1,Dial(${gtw}/112)

exten => _[69]XXXXXXXX,1,NoOp(llamada saliendo por la linea analogica conectada al SPA3102)
same => n,Dial(${gtw}/${EXTEN},,tT)
same => n,Goto(nulo,s,1)

exten => h,1,Goto(nulo,s,1)

[entrantes]
exten => s,1,NoOp(llamada analogica entrante del numero: ${CALLERID(num)})
same => n,Dial(SIP/1002&SIP/Juanlu,${TIMEOUT},${opc})
same => n,Goto(nulo,s,1)

[nulo]
exten => s,1,Hangup()
exten => h,1,Hangup()
exten => _X,1,Hangup()
exten => _X.,1,Hangup()
Creo que sobran las explicaciones, se alcanza a las extensiones sip/Juanlu y sip/Mari llamando al 100 y 200, respectivamente. Llegamos al teléfono analógico llamando al 1002 ... fácil.
Ahora vamos a configurar el SPA3102 ¡¡NO TE SALTES NINGÚN PASO!!.

Configuración del SPA3102


Conectamos un teléfono analógico a la boca 'Phone' (FXS) del gateway, conectamos un cable de red a la boca 'Internet' y lo conectamos a la red eléctrica. De momento no conectamos la línea telefónica.
Esperamos unos segundos y realizamos los siguiente:


  1. Descolgamos el teléfono analógico.
  2. Marcamos **** (4 asteriscos) para entrar en el menú del Linksys.
  3. Marcamos 7932# para activar la interfaz web para la boca 'Internet'.
  4. Marcamos 1# para activarla y posteriormente 1 para confirmar.
  5. Colgamos.
  6. Descolgamos de nuevo.
  7. Marcamos **** (4 asteriscos) para entrar en el menú del Linksys.
  8. Marcamos 110# para averiguar la IP asignada por DHCP al Linksys.
  9. Colgamos.

Acto seguido podremos entrar en la configuración web del gateway. En el navegador web hay que introducir la ip (la del paso 8).
Una vez en el panel, en la parte superior, nos ponemos en modo Admin pinchando en 'Admin Login' y a continuación en 'advanced'.

Configuración por pestañas y secciones.

Router/Lan Setup

Desactivamos el router del Linksys con las siguientes opciones:
  • Networking Service Bridge
  • Enable DHCP Server No

Pulsamos en 'Submit All Changes'

Voice/Regional/Call Progress Tones


  • Dial Tone 425@-10;10(*/0/1)
  • Second Dial Tone 425@-10;10(*/0/1)
  • Outside Dial Tone 425@-10;10(*/0/1)
  • Prompt Tone
  • Busy Tone 425@-20;10(.2/.2/1)
  • Reorder Tone 425@-10;60(.2/.2/1,.2/.2/1,.2/.6/1);60(.2/.2/1,.2/.6/1)
  • Off Hook Warning Tone 425@-10;10(.25/.25/1)
  • Ring Back Tone 425@-20;*(1/4/1)
  • Confirm Tone
  • SIT1 Tone 950@-10,1400@-10,1800@-10;10(.33/0/1,.33/0/2,0.33/1/3)
  • SIT2 Tone
  • SIT3 Tone
  • SIT4 Tone
  • MWI Dial Tone 425@-10;10(1/0.1/1)
  • Cfwd Dial Tone 425@-10;10(0.5/0.05/1)
  • Holding Tone 1400@-20;10(0.4/5/1)
  • Conference Tone
  • Secure Call Indication Tone
  • VoIP PIN Tone 600@-10;*(0/1/1,.1/.1/1,.1/.1/1,.1/.5/1)
  • PSTN PIN Tone 600@-10;*(0/.7/1,.2/.1/1,.2/.1/1,.2/.5/1)
  • Feature Invocation Tone 350@-16;*(.1/.1/1)



Voice/Regional/Miscellaneous




  • Caller ID Method ETSI DTMF With PR
  • Caller ID FSK Standard v.23
  • FXS Port Impedance 600+2.16uF


Voice/Line 1/Proxy and Registration




  • Proxy 192.168.1.87


Voice/Line 1/Subscriber Information



  • Display Name Telefono
  • User ID 1002
  • Password clave_supersecretisima
  • Use Auth ID 1002
  • Auth ID 1002


Voice/Line 1/Audio Configuration



  • Preferred Codec G711a


Voice/PSTN Line/Proxy and Registration



  • Proxy 192.168.1.87


Voice/PSTN Line/Subscriber Information



  • Display Name gateway
  • User ID gateway
  • Password spa3102
  • Use Auth ID yes
  • Auth ID gateway


Voice/PSTN Line/Audio Configuration



  • Preferred Codec G711a


Voice/PSTN Line/Dial Plans


  • Line 1 VoIP Caller DP 2


Voice/PSTN Line/PSTN-To-VoIP Gateway Setup



  • PSTN Ring Thru Line 1 no
  • PSTN CID For VoIP CID yes
  • PSTN Caller Default DP 2


Voice/PSTN Line/FXO Timer Values (sec)



  • VoIP Answer Delay 2
  • PSTN Answer Delay 2


Voice/PSTN Line/PSTN Disconnect Detection



  • Disconnect Tone 425@-10,425@-10;4(.2/.2/1,.2/.2/1,.2/.6/1)


Voice/PSTN Line/International Control



  • FXO Port Impedance 600+1uF

**NOTA: Para guardar todos los cambios tenemos que pulsar sobre el botón 'Submit All Changes'.


Comprobando el registro del gateway.


# asterisk -r
asterisk*CLI> sip show peers


Conclusión
Ahora ya tendríamos configurado el gateway Linksys SPA3102. Podemos realizar llamadas internas desde la extensión 1001 a la 1002 y viceversa, además de poder realizar llamadas al exterior a través de la línea de teléfono analógica.


----

PLUS!! ¿Cómo llamar desde Noruega (o donde sea) a tu familia a coste de tarifa local?

Usando tu Asterisk, tu SPA3102 y tu RaspberryPi.

Aprovechando que he estado la semana pasada de crucero por Noruega, os comento lo que he hecho para poder llamar a mis padres sin que me cueste un riñón y sin tener que tener rollos con el roaming. En realidad no invento nada, pero os lo cuento:
  1. Localiza un MacDonalds, BurgerKing, Starbuks o similar, también te vale un centro comercial o ... casi en cualquier parte. Necesitamos WIFI gratis, que en países como Noruega es algo bastante común.
  2. Conéctate al WIFI con el móvil (Android en mi caso)
  3. Abre un navegador web y abre cualquier página. Lo más seguro es que te salga un portal cautivo, acepta los términos y condiciones.
  4. Abre tu cliente VPN en el móvil y conéctate a tu RaspberryPi.
  5. Abre tu cliente SIP preferido en tu Android, SipDroid en mi caso.
  6. Llama a tus padres como si estuvieses en casa, no marques prefijo.
Insisto que parece una tontería, pero a mi me ha resultado un poco raro eso de que vayas a donde vayas, hasta en la calle mas cutre de Oslo (que tiene bastantes) hay WIFI gratis.
Una de mis cientos de asignaturas pendientes es saltarme un portal cautivo de esos que te piden que pagues, cuando lo consiga lo compartiré con vosotros.

Actualización 5 de Abril de 2013:
Por recomendación de Xesco, he incluido un dialplan de ejemplo. Gracias Xesco.

15 comentarios:

  1. Justo lo que estaba buscando. Un 10 para este post!

    ResponderEliminar
  2. Sirve para llamar a moviles o solo fijos .Gracias

    ResponderEliminar
  3. Hoy me han llegado mi regalo de navidades! No ha sido un cuadricoptero del copón, pero es un SPA3102.

    Seguido el tutorial al pie de la letra y ha ido de lujo!
    Muy bien explicado y funciona de maravilla!

    La unica cosa que me faltaria aprender en asterisk seria a hacer un buzon de voz y que la grabacion la mande por gmail (por ejemplo).

    Y también como puedo impedir que se llame a numeros moviles desde asterisk. Para no hacer llamadas con coste sin querer queriendo.

    Gracias!

    ResponderEliminar
  4. Tengo una duda. ¿Cómo encaja todo este modelo si además tengo un router ADSL en mi casa (que evidentemente está enganchado también a la línea telefónica)?

    Es decir, que me gustaría acceder a mi Rasberry (por SSH) desde cualquiera de los ordenadores/teléfonos de mi LAN para configurarla y gestionar la centralita, y también poder registrar una extensión VoIP con un "softphone" contra la centralita, y por tanto poder llamar desde esos "softphones".

    Gracias, y fantástico el artículo.

    ResponderEliminar
    Respuestas
    1. Soy el mismo de antes ...
      Supongo además que deberé usar los típicos filtros en ambas conexiones analógicas del SPA3102.

      Eliminar
    2. yo tengo un ruter adsl conectado a la linea analógica. Desde la linea analógica puedo llamar y recibir llamadas y ademas me llega el adsl. En este post:
      http://rsppi.blogspot.com.es/2012/05/mi-red-domestica-en-este-post-voy.html
      puedes ver, lo que creo que me estás preguntando ¿no?
      Vamos, puedes hacer sin problemas eso que me dices, tanto desde tu red como desde internet.
      Ponte un nombre la próxima vez, no me gusta esto de hablar a un Anónimo ;)

      Eliminar
  5. Hola Juan! Cuanto tiempo sin molestarte, eh?

    Tengo 2 preguntas.
    La primera es: Tengo todo el "harware" conectado tal cual lo has hecho tu. Pero me surje un problema que no se si tengo algo mal. Si en SPA3102 se cae o se queda sin corriente no puedo realizar ni rcibir ninguna llamada como si fuera una linea analogica normal. Hay alguna solucion a eso?

    La segunda: He configurado el extensions.conf para que al recibir una llamada suene a todas partes. El error es que si quien llama cuelga, todos siguen sonando hasta que alguien descuelga y descubre que han colgado. Ademas el tono es indefinido.
    La verdad es que no quiero problemas con los vecinos y si no estoy en casa que no esté sonando desde la mañana hasta la noche cuando llego... Mil gracias como siempre!

    ResponderEliminar
    Respuestas
    1. hola! si se queda sin corriente, juraría que puentea la entrada analógica a la salida analógica. Muy seguro no estoy de eso, lo que si es seguro es que si pierde el registro te puentea al teléfono. De hecho hay una opción que pone algo como "on failover bridge" o algo así, mira a ver.

      Lo de que no cuelga la llamada, es porque no detecta la inversión de polaridad, que es lo más puñetero a lo que nos podemos enfrentar. En mi casa, con Jazztel, el spa detecta la inversión de polaridad y cuelga a los 2~3 segundos. Con el mismo spa, a un compañero del curro le pasa lo mismo que a ti, al final lo solucionó forzando el timeout del comando dial:
      same => n,Dial(sip/100&sip/200,60,tTr)
      a los 60 segundos es el propio Asterisk el que cuelga la llamada si o si. Si quien te llama cuelga a los 40 segundos, estaría sonándote el ring 20 segundos más. No es la solución más elegante, pero funciona.

      Eliminar
    2. Lo de los 60 segundos ya me sirve! (bien) Lo que probare es poner en practica el cotestador y que al cortar pare las llamadas y salte el cotestador. Probare, pues soy muy novatillo en eso.

      Lo del "on failover bridge" no tengo huvos de encntrar esa opcion ni nad parecido.
      Te agradeceria muchisimo un cable en ese aspecto

      Eliminar
    3. lo encontré!! lo tienes en admin - advanced y luego voice - line 1:
      VoIP Fallback To PSTN
      Auto PSTN Fallback:
      ponlo a yes

      Eliminar
  6. Buenas soy nuevo en esto y comence a configurar un server asterisk como lo pones aqui, el problema es que no me da salida de una extension digital hacia un telefono local o movil, el prefijo que pusiste lo cambie a esta forma

    exten => _9.,1,Dial(SIP/gateway,60,D(${EXTEN:1}),tTr)

    fue la unica forma que encontre para mardar el 9 y llamar suena dos veces y da un tono de ocupado alguien podria decirme que sera?

    gracias por su atencion

    ResponderEliminar
  7. PSTN-ruterVoIP-FXO-dmtf: yo se que cuando mides un teléfono con un tester salen 12 V bueno eso lo medí antes de la ADSL, creo que el dmtf lo que hace es aplicar una impedancia cuando se descuelga el telefono, es como si cerrase el circuito entonces en vez de 12 V hay unos 50 V, pues bien a mi me salia en el pstn line status algo de 12 V o 7 mA no recuerdo y ahora me dice 49 y 0 mA con hook state ON. Segun he leido hay que ponerlo en la configuración del ruter ADSL con VoIP ya que por ejemplo si en el fxs lo pones en forward en vez de reverse el descuelgue llamada lo hace la central y en reverse pasa por el fxo al servidor sip del ruter que luego va al fxs y lo pone en llamando o lo que sea. Hay otros valores que no se buscar en google PSTN Timer Values, PSTN Disconnect Detection, International Settings, regional ... es algo similar a las configuraciones PPPoA cuando empezó la ADSL tenias que buscar como iva en la red ya que paso a ip dinamica pppoe, etc... Entiendo que mi linea de teléfono no sabe configurarse sola con los parámetros dmtf telefonicos que me dan el tono de llamada creo que incluso se pone en modo reverse a veces y no me va, me gustaria saber cual son las configuraciones para España de todo esto, la configuración por defecto de fábrica del ruter para voz tampoco me dice cual es la de la central y no sabría conectarlo configurando des de 0 que es lo que busco ya que creo que como no sea así no va a ir tiene como 10 menús de configuración fácilmente restaurable ya que el ruter es un CISCO y la central no va ha cambiar. Tampoco sé como habilitar los parámetros de control en el ruter la voz viene completamente separada y necesito habilitarla en administración, estado, etc.

    ResponderEliminar
  8. hola buen día, disculpen tengo un proyecto en la cual necesito integrar python, asterisk y la raspberry pi (en mi caso me dieron la raspberrypi 2 model B) el proyecto es bastante enredado pero si alguien pudiera mandarme un ejemplo de como marcar a través de una extension de extensions.conf y este se dirija a un código python y el código python a su vez encienda y apague un led en sus terminales GPIO se lo agradecería mucho, encuentro información pero no logro implementarla, se me había ocurrido usar el teclado de un teléfono analógico y con ayuda del spa3102 conectarlo a la raspberry para poder usar sus botones como si fueran push button pero el problema seria usarlo en otros dispositivos

    ResponderEliminar