NN as IP phone/es

From Qi-Hardware
Jump to: navigation, search

Contents

[edit] Ben NanoNote como un telefóno IP

[edit] Resumen

Como el Nano Note es un computador de bolsillo, con multimedia y conexion de red, pues seria muy útil utilizarlo para comunicarnos mediante voz ip. Para esto utilizaremos FreeSWITCH [1]. FreeSWITCH es una plataforma telefónica muy versatil y poderosa, ya que es escalable desde un simple softphone, hasta un completo PBX, e incluso un switch. Freeswitch features

[edit] ¿Cómo funciona?

Para poder cumplir con el objetivo, debemos configurar la red del nano note mediante usb (USB-over-ethernet), compilar freeswitch, instalarlo y configurarlo como un softphone.

[edit] Softphone-UN

Este proyecto ha sido desarrollado como parte de mi proyecto de grado para el titulo de ingeniero Electrónico de la Universidad Nacional de Colombia, UN, con la dirección del Ing. Carlos Camargo [2], y por supuesto con la ayuda de toda la comunidad linux del mundo. (Qi-Hardware, OpenWRT, Freeswitch-users, etc.)

[edit] Configurando la red del nano note

El nano note será conectado a un router (Router Station pro) de Ubiquiti Networks, en el cual tambien corre Openwrt, y en donde monté un servidor Asterisk. Por tanto a continuacion expondre el procedimiento para solamente el NN. Para conectarlo a un computador de escritorio pues es muy similar el procedimiento. Para mas info: Ethernet over usb

[edit] Asignando una IP y demas configuraciones

Como sabemos el Nano Note no posee un puerto RJ45 o para LAN, por tanto nuestra conexion hacia el mundo exterior es el usb device. Debajo de la capa fisica de usb, se encuentra toda la capa de red Ethernet, que nos permite usarla para conectarnos a internet. Al conectar nuestro Nano Note al computador:

En el Host:

$ lsusb
 Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
 Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
 Bus 006 Device 002: ID 0458:002e KYE Systems Corp. (Mouse Systems)
 Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
 Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
 Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
 Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
 Bus 002 Device 003: ID 0525:a4a2 Netchip Technology, Inc. Linux-USB Ethernet/RNDIS Gadget
 Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
 Bus 001 Device 003: ID 0bda:0158 Realtek Semiconductor Corp. Mass Storage Device
 Bus 001 Device 002: ID 064e:a103 Suyin Corp. 
 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Como se puede ver, la linea resaltada corresponde al NN, que tiene un dispositivo RNDIS. Esa informacion puede ser valiosa cuando lo queramos conectar a otra plataforma (como en este caso un router).

Ahora para observar como está configurado por defecto:

En el NN:

# ifconfig usb0

Para editar estas opciones, debemos ingresar al archivo de configuracion de red, /etc/config/network con vi o nano:

# cd /etc/config
# nano network

Como estamos en una red de area local, utilizamos una red con ip privada, en este caso 192.168.1.xxx. El script de configuracion debe quedar (segun las configuraciones de su router o PC) asi:

/etc/config/network
# Copyright (C) 2006 OpenWrt.org

config interface loopback
       option ifname   lo
       option proto    static
       option ipaddr   127.0.0.1
       option netmask  255.0.0.0

config interface lan
        option ifname   usb0
        option proto    static
        option ipaddr   192.168.1.21
        option gateway  192.168.1.20
        option netmask  255.255.255.0

De esta manera, cada vez que inicie el nano note, leerá este script y configurará todo tal como dice. Ahora, si queremos conectarnos a internet, debemos modificar el archivo de DNS. Este archivo esta en /etc/resolv.conf, asi que pondremos alli las direcciones de servidores DNS y ya estaremos conectados a internet a traves de la gateway, en este caso, con ip 192.168.1.20 (IP del router). Es importante aclarar que cuando se conecta el nano note a un computador son necesarias configuraciones adicionales en el mismo, para ello referirse a Ethernet over usb.

Para hacer algunas pruebas, podemos hacer ping a cualquier nodo conectado a la red 192.168.1.xxx, pero principalmente la gateway, ya que mas adelante éste será nuestro servidor SIP y los demas nodos otras extensiones a quien llamar y recibir llamadas:

# ping 192.168.1.20 #ping to Gateway
PING 192.168.1.20 (192.168.1.20): 56 data bytes
64 bytes from 192.168.1.20: seq=0 ttl=64 time=4.276 ms
64 bytes from 192.168.1.20: seq=1 ttl=64 time=0.711 ms
64 bytes from 192.168.1.20: seq=2 ttl=64 time=0.820 ms
^C
--- 192.168.1.20 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.711/1.935/4.276 ms

Cuando aseguremos la comunicacion entre el Nano Note y el servidor y demas nodos de la red, podemos continuar.

[edit] Instalando FreeSWITCH

FreeSWITCH va a ser nuestro software base. Está escrito en C. Para OpenWRT esta compilado en los repositorios, sin embargo presenta un problema producto de algunas configuraciones locales en el codigo fuente, error que fue arreglado mediante el parche (Ticket: #4891 [3]). En este caso, se hace necesario compilarlo nuevamente desde nuestro toolchain. Tambien es recomendable actualizar el nano note con la ultima version de firmware que haya disponible, ya que para algunas versiones de kernel, he tenido problemas con el sonido.

[edit] Compilando FreeSWITCH

Por fortuna, en los scripts de OpenWRT, ya podemos encontrar el Makefile actualizado y los parches necesarios para compilar sin ningun problema FreeSWITCH. Para este fin, en nuestro directorio raiz -~/openwrt-xburst en mi caso- actualizamos dichos scripts, creando e integrando los "feeds", así:

$ scripts/feeds update -a && scripts/feeds install -a

Ahora se puede ver en el arbol un nuevo directorio llamado "feeds/", en el cual se encuentrar todos los Makefiles, archivos y parches para todo el software que ha sido adaptado a OpenWRT para nuestra arquitectura.

FreeSWITCH es un programa modulado, por tal motivo es necesario saber que modulos vamos a necesitar para compilarlos y despues instalarlos. Para empezar nos dejaremos guiar por la configuracion por defecto que trae el programa, cuyo paquete se llama freeswitcth-default. Por tanto, entramos a Buildroot, con el comando:(desde la raíz del árbol):

$ make menuconfig

Ahora vamos a la opcion "Network"-> Freeswitch y ponemos "M" para indicarle al buildroot que queremos construir el paquete a parte de la imagen:

Opcion en el Buildroot: <M> en FreeSWITCH

Entrando en el menu de FreeSWITCH, ponemos <M> a todos los módulos. Luego damos "exit" sucesivamente, y guardamos la configuración. Ahora vamos a la consola:

$ make package/feeds/packages/freeswitch/compile V=99

Es necesario tener conexion a internet, pues los codigos fuente seran descargados de servidores ftp. Si se quiere aprender como se logra esto, es necesario analizar el Makefile, pero en este articulo no profundaré en el tema.

El proceso de compilacion puede tomar algunos minutos, no hay que desesperar.

Cuando termine, entramos al directorio ~/openwrt-xburst/bin/xburst/packages, en donde encontramos los paquetes de FreeSWITCH recien compilados. Podemos copiarlos al NN por medio del comando scp, o con una SD card.

[edit] Instalando los paquetes

El primer paquete que vamos a compilar es freeswitch_1.0.6-1_xburst.ipk, con el siguiente comando:

# opkg install freeswitch_1.0.6-1_xburst.ipk 

Luego instalamos freeswitch-default_1.0.6-1_xburst.ipk, el cual nos va a arrojar un error de dependecias, por tanto instalamos uno a uno cada uno de los modulos necesarios para instalar este paquete. Por ultimo, instalamos freeswitch-mod-portaudio_1.0.6-1_xburst.ipk y freeswitch-mod-portaudio-stream_1.0.6-1_xburst.ipk, modulos que nos permiten comunicarnos con la tarjeta de sonido del NN.

Para conocer para que sirve cada módulo y poder tener criterio de no cargar uno u otro, podemos consultar este sitio: [4]

[edit] Configurando FreeSWITCH como un softphone dedicado

Para entender como se configura FreeSWITCH, es necesario documentarse muy bien, pues asi como es un programa tan poderoso y extenso, tambien es complejo de configurar. FreeSWITCH soporta diferentes lenguajes intermedios de configuracion, como lua, perl, python, spidermonkey, java, etc.; sin embargo se utiliza un lenguaje fácil de entender en cuanto a su sintaxis como es XML.

[edit] freeswitch.xml: Principal archivo de configuración

Freeswitch.conf.xml es el principal archivo de configuracion. Cuando iniciamos el programa, éste lee este archivo y hace lo que le indique. En el directorio /etc/freeswitch encontramos tambien otros scripts .xml y algunos directorios:

#root@BenNanoNote:/etc/freeswitch# ls
accounts              dialplan              freeswitch.serial     ivr_menus             mime.types            sip_profiles          vars.xml
autoload_configs      directory             freeswitch.xml        jingle_profiles       mrcp_profiles         skinny_profiles       voicemail.tpl
backup                extensions.conf       fur_elise.ttml        lang                  notify-voicemail.tpl  tetris.ttml           web-vm.tpl

La mayoria de estos archivos son cargados en el archivo freeswitch.xml, es decir, esta es una manera de fragmentar en diferentes archivos de configuracion, la configuracion total del sistema. En el directorio autoload_configs/, encontramos los archivos de configuracion de cada módulo. En la carpeta dialplan/ encontramos los diferentes "dialplan" para diferentes tipos de llamadas. En FreeSWITCH, al igual que en asterisk, el dialplan le dice al programa que hacer con una llamada entrante o saliente. En el directorio directory/ se encuentra la configuracion de cada una de las extensiones. Otro directorio importante es sip_profiles/; en este directorio se configura los sip_endpoints, los cuales son esenciales para este proyecto, ya que un softphone es un SIP endpoint conectado con una tarjeta de sonido, a traves de portaudio. Mas adelante se entenderá mejor lo anterior. el scipt vars.xml es importante, porque en él declaramos todas las variables utilizadas en el sistema. Para mayor informacion al respecto, se puede consultar el wiki de los desarrolladores de FreeSWITCH.

Para empezar nuestra configuracion, creamos un directorio llamado "backup/" en donde guardaremos el archivo freeswitch.xml que fue escrito por el paquete freeswitch-default, cuando fue instalado, y describe una configuracion por defecto.

[edit] FreeSWITCH configurado como softphone

Esta configuracion está basada en la informacion recolectada tras la documentación sobre FreeSWITCH existente en internet. Los desarrolladores nos proporcionan una plantilla de configuracion como softphone: [5].

Básicamente, se debe configurar un perfil SIP, el cual tenga como "gateway" el servidor SIP que esta en la red, en este caso local. Como para este primer prototipo no vamos a configurar conexiones a servidores SIP en internet, ni pasarelas hacia PSTN (telefonia tradicional) o red celular 3G, se hace muy simple y corta la configuracion para un PBX casero. Luego de que se tenga el perfil, debemos escribir en el dialplan que para cualquier extension/llamada que salga o entre, sea enrutada a este perfil SIP que a su vez lq ta conectará a portaudio, módulo que nos permite usar la tarjeta de sonido del Nano Note.

A continuación freeswitch.xml y asterisk.xml, para ser copiados al nano note: __________________________________________________________________________________________________________________________________________________________________

freeswitch.xml

  1. <?xml version="1.0"?>
  2. <document type="freeswitch/xml">
  3.   <X-PRE-PROCESS cmd="set" data="auto_answer=false"/>
  4.   <X-PRE-PROCESS cmd="set" data="domain=$${local_ip_v4}"/>
  5.   <X-PRE-PROCESS cmd="set" data="hold_music=local_stream://moh"/>
  6.   <X-PRE-PROCESS cmd="set" data="codec_prefs=GSM,PCMU,PCMA"/>
  7.   <!-- aca debes poner la ip del NN que configuramos en /etc/config/network -->
  8.   <X-PRE-PROCESS cmd="set" data="external_rtp_ip=192.168.1.21"/>
  9.   <!-- aca debes poner la ip del NN que configuramos en /etc/config/network -->
  10.   <X-PRE-PROCESS cmd="set" data="external_sip_ip=192.168.1.21"/>
  11.   <X-PRE-PROCESS cmd="set" data="outbound_caller_name=FreeSWITCH"/>
  12.   <X-PRE-PROCESS cmd="set" data="outbound_caller_id=00000"/>
  13.   <X-PRE-PROCESS cmd="set" data="console_loglevel=info"/>
  14.   <X-PRE-PROCESS cmd="set" data="default_gateway=asterisk"/>
  15.   <X-PRE-PROCESS cmd="set" data="us-ring=%(2000, 4000, 440.0, 480.0)"/>
  16.   <X-PRE-PROCESS cmd="set" data="bong-ring=v=-7;%(100,0,941.0,1477.0);v=-7;>=2;+=.1;%(1400,0,350,440)"/>
  17.   <X-PRE-PROCESS cmd="set" data="sit=%(274,0,913.8);%(274,0,1370.6);%(380,0,1776.7)"/>
  18.  
  19.   <section name="configuration" description="Various Configuration">
  20.     <configuration name="cdr_csv.conf" description="CDR CSV Format">
  21.       <settings>
  22. 	<param name="default-template" value="example"/>
  23. 	<param name="rotate-on-hup" value="true"/>
  24. 	<param name="legs" value="a"/>
  25.       </settings>
  26.       <templates>
  27. 	<template name="example">"${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}","${accountcode}","${read_codec}","${write_codec}"</template>
  28.       </templates>
  29.     </configuration>
  30.  
  31.     <configuration name="console.conf" description="Console Logger">
  32.       <mappings>
  33. 	<map name="all" value="console,debug,info,notice,warning,err,crit,alert"/>
  34.       </mappings>
  35.       <settings>
  36. 	<param name="colorize" value="true"/>
  37. 	<param name="loglevel" value="$${console_loglevel}"/>
  38.       </settings>
  39.     </configuration>
  40.  
  41.  
  42.     <configuration name="local_stream.conf" description="stream files from local dir">
  43.       <directory name="moh/48000" path="$${base_dir}/sounds/music/48000">
  44. 	<param name="rate" value="48000"/>
  45. 	<param name="shuffle" value="true"/>
  46. 	<param name="channels" value="1"/>
  47. 	<param name="interval" value="10"/>
  48. 	<param name="timer-name" value="soft"/>
  49.       </directory>
  50.     </configuration>
  51.  
  52.     <configuration name="logfile.conf" description="File Logging">
  53.       <settings>
  54. 	<param name="rotate-on-hup" value="true"/>
  55.       </settings>
  56.       <profiles>
  57. 	<profile name="default">
  58. 	  <settings>
  59. 	  </settings>
  60. 	  <mappings>
  61. 	    <map name="all" value="debug,info,notice,warning,err,crit,alert"/>
  62. 	  </mappings>
  63. 	</profile>
  64.       </profiles>
  65.     </configuration>
  66.  
  67.     <configuration name="modules.conf" description="Modules">
  68.       <modules>
  69. 	<load module="mod_console"/>
  70. 	<load module="mod_logfile"/>
  71. 	<load module="mod_enum"/>
  72. 	<load module="mod_cdr_csv"/>
  73. 	<load module="mod_portaudio"/>
  74. 	<load module="mod_portaudio_stream"/>
  75. 	<load module="mod_sofia"/>
  76. 	<load module="mod_loopback"/>
  77. 	<load module="mod_commands"/>
  78. 	<load module="mod_dptools"/>
  79. 	<load module="mod_dialplan_xml"/>
  80. 	<load module="mod_voipcodecs"/>
  81. 	<load module="mod_sndfile"/>
  82. 	<load module="mod_tone_stream"/>
  83. 	<load module="mod_local_stream"/>
  84.       </modules>
  85.     </configuration>
  86.  
  87.     <configuration name="portaudio.conf" description="Soundcard Endpoint">
  88.       <settings>
  89. 	<param name="indev" value=""/>
  90. 	<!-- device to use for output -->
  91. 	<param name="outdev" value=""/>
  92. 	<param name="ringdev" value=""/>
  93. 	<param name="ring-file" value="tone_stream://%(2000,4000,440.0,480.0);loops=20"/>
  94. 	<param name="ring-interval" value="5"/>
  95. 	<param name="hold-file" value="$${hold_music}"/>
  96. 	<param name="timer-name" value="soft"/>
  97. 	<!--<param name="dual-streams" value="true"/> -->
  98. 	<param name="dialplan" value="XML"/>
  99. 	<param name="cid-name" value="$${outbound_caller_name}"/>
  100. 	<param name="cid-num" value="$${outbound_caller_number}"/>
  101. 	<param name="sample-rate" value="8000"/>
  102. 	<param name="codec-ms" value="20"/>
  103.       </settings>
  104.     </configuration>
  105.  
  106.     <configuration name="post_load_modules.conf" description="Modules">
  107.       <modules>
  108.       </modules>
  109.     </configuration>
  110.  
  111.     <configuration name="sofia.conf" description="sofia Endpoint">
  112.       <global_settings>
  113. 	<param name="log-level" value="0"/>
  114. 	<param name="auto-restart" value="true"/>
  115. 	<param name="debug-presence" value="0"/>
  116.       </global_settings>
  117.       <profiles>
  118. 	<profile name="softphone">
  119. 	  <gateways>
  120. 	    <X-PRE-PROCESS cmd="include" data="accounts/*.xml"/>
  121. 	  </gateways>
  122. 	  <settings>
  123. 	    <!--<param name="media-option" value="bypass-media-after-att-xfer"/>-->
  124. 	    <param name="user-agent-string" value="FreeSWITCH/SoftPhone-UN"/>
  125. 	    <!-- <param name="user-agent-string" value="FreeSWITCH Rocks!"/> -->
  126. 	    <param name="debug" value="0"/>
  127. 	    <param name="sip-trace" value="no"/>
  128. 	    <param name="context" value="public"/>
  129. 	    <param name="rfc2833-pt" value="101"/>
  130. 	    <!-- port to bind to for sip traffic -->
  131. 	    <param name="sip-port" value="5060"/>
  132. 	    <param name="dialplan" value="XML"/>
  133. 	    <param name="dtmf-duration" value="100"/>
  134. 	    <param name="codec-prefs" value="$${codec_prefs}"/>
  135. 	    <param name="use-rtp-timer" value="true"/>
  136. 	    <param name="rtp-timer-name" value="soft"/>
  137. 	    <!-- ip address to use for rtp, DO NOT USE HOSTNAMES ONLY IP ADDRESSES -->
  138. 	    <param name="rtp-ip" value="$${local_ip_v4}"/>
  139. 	    <!-- ip address to bind to, DO NOT USE HOSTNAMES ONLY IP ADDRESSES -->
  140. 	    <param name="sip-ip" value="$${local_ip_v4}"/>
  141. 	    <param name="hold-music" value="$${hold_music}"/>
  142. 	    <param name="apply-nat-acl" value="rfc1918"/>
  143. 	    <!--<param name="enable-timer" value="false"/>-->
  144. 	    <!--<param name="enable-100rel" value="true"/>-->
  145. 	    <!--<param name="minimum-session-expires" value="120"/>-->
  146. 	    <!--<param name="dtmf-type" value="info"/>-->
  147. 	    <param name="manage-presence" value="false"/>
  148. 	    <!--<param name="bitpacking" value="aal2"/> -->
  149. 	    <param name="max-proceeding" value="3"/>
  150. 	    <!--<param name="session-timeout" value="120"/>-->
  151. 	    <!--set to 'greedy' if you want your codec list to take precedence -->
  152. 	    <param name="inbound-codec-negotiation" value="generous"/>
  153. 	    <!-- if you want to send any special bind params of your own -->
  154. 	    <!--<param name="bind-params" value="transport=udp"/>-->
  155. 	    <!--Uncomment to let calls hit the dialplan *before* you decide if the codec is ok-->
  156. 	    <!--<param name="inbound-late-negotiation" value="true"/>-->
  157. 	    <!--<param name="accept-blind-reg" value="true"/> -->
  158. 	    <!--<param name="accept-blind-auth" value="true"/> -->
  159. 	    <!--<param name="suppress-cng" value="true"/> -->
  160. 	    <param name="nonce-ttl" value="60"/>
  161. 	    <!--<param name="NDLB-broken-auth-hash" value="true"/>-->
  162. 	    <!--<param name="NDLB-received-in-nat-reg-contact" value="true"/>-->
  163. 	    <param name="auth-calls" value="false"/>
  164. 	    <param name="auth-all-packets" value="false"/>
  165. 	    <param name="ext-rtp-ip" value="$${external_rtp_ip}"/>
  166. 	    <param name="ext-sip-ip" value="$${external_sip_ip}"/>
  167. 	    <!-- rtp inactivity timeout -->
  168. 	    <param name="rtp-timeout-sec" value="300"/>
  169. 	    <param name="rtp-hold-timeout-sec" value="1800"/>
  170. 	    <!-- VAD choose one (out is a good choice); -->
  171. 	    <!-- <param name="vad" value="in"/> -->
  172. 	    <!-- <param name="vad" value="out"/> -->
  173. 	    <!-- <param name="vad" value="both"/> -->
  174. 	    <param name="disable-register" value="true"/>
  175. 	    <!--<param name="NDLB-force-rport" value="true"/>-->
  176. 	    <param name="challenge-realm" value="auto_from"/>
  177. 	    <!--<param name="disable-rtp-auto-adjust" value="true"/>-->
  178. 	    <!--<param name="inbound-use-callid-as-uuid" value="true"/>-->
  179. 	    <!--<param name="outbound-use-uuid-as-callid" value="true"/>-->
  180. 	    <!--<param name="auto-rtp-bugs" data="clear"/>-->
  181. 	    <!--<param name="apply_inbound_acl" value="asterisk"/>-->
  182. 	  </settings>
  183. 	</profile>
  184.       </profiles>
  185.     </configuration>
  186.  
  187.     <configuration name="switch.conf" description="Core Configuration">
  188.       <settings>
  189. 	<param name="colorize-console" value="true"/>
  190. 	<param name="max-sessions" value="20"/>
  191. 	<param name="sessions-per-second" value="5"/>
  192. 	<param name="loglevel" value="debug"/>
  193. 	<param name="crash-protection" value="false"/>
  194. 	<param name="dump-cores" value="yes"/>
  195. 	<param name="rtp-start-port" value="16384"/>
  196. 	<param name="rtp-end-port" value="16484"/>
  197.       </settings>
  198.     </configuration>
  199.   </section>
  200.  
  201.   <section name="dialplan" description="Regex/XML Dialplan">
  202.     <context name="default">
  203.       <extension name="codec_and_sip_uri">
  204. 	<condition field="destination_number" expression="^sip:(.*):(.*)$">
  205. 	  <action application="bridge" data="{absolute_codec_string=$1}sofia/softphone/$2"/>
  206. 	</condition>
  207.       </extension>
  208.       <extension name="sip_uri">
  209. 	<condition field="destination_number" expression="^sip:(.*)$">
  210. 	  <action application="bridge" data="sofia/softphone/$1"/>
  211. 	</condition>
  212.       </extension>
  213.       <extension name="codec_and_number">
  214. 	<condition field="destination_number" expression="^(.*):(.*)@(.*)$">
  215. 	  <action application="bridge" data="{absolute_codec_string=$1}sofia/gateway/$3/$2"/>
  216. 	</condition>
  217.       </extension>
  218.       <extension name="number">
  219. 	<condition field="destination_number" expression="^(.*)@(.*)$">
  220. 	  <action application="bridge" data="sofia/gateway/$2/$1"/>
  221. 	</condition>
  222.       </extension>
  223.       <extension name="number">
  224. 	<condition field="destination_number" expression="^(.*)$">
  225. 	  <action application="bridge" data="sofia/gateway/${default_gateway}/$1"/>
  226. 	</condition>
  227.       </extension>
  228.     </context>
  229.     <context name="public">
  230.       <extension name="public_extensions">
  231. 	<condition field="$${auto_answer}" expression="^true$"/>
  232. 	<condition field="destination_number" expression="^(.*)$">
  233. 	  <action application="info"/>
  234. 	  <action application="bridge" data="portaudio/auto_answer"/>
  235. 	</condition>
  236.       </extension>
  237.       <extension name="public_extensions">
  238. 	<condition field="${sip_to_params}" expression="intercom=true"/>
  239. 	<condition field="${alert_info}" expression="Ring;Answer"/>
  240. 	<condition field="destination_number" expression="^(.*)$">
  241. 	  <action application="info"/>
  242. 	  <action application="bridge" data="portaudio/auto_answer"/>
  243. 	</condition>
  244.       </extension>
  245.       <extension name="public_extensions">
  246. 	<condition field="destination_number" expression="^(.*)$">
  247. 	  <action application="info"/>
  248. 	  <action application="set" data="ringback=${us-ring}"/>
  249. 	  <action application="pre_answer"/>
  250. 	  <action application="bridge" data="portaudio"/>
  251. 	</condition>
  252.       </extension>
  253.     </context>
  254.   </section>
  255. </document>

__________________________________________________________________________________________________________________________________________________________________

asterisk.xml

  1. <include>
  2.   <gateway name="192.168.1.20">
  3.   <!--/// account username *required* ///-->
  4.   <param name="username" value="2001"/>
  5.   <!--/// account password *required* ///-->
  6.   <param name="password" value="1234"/> 
  7.   <param name="register-transport" value="udp"/>
  8.   </gateway>
  9. </include>

__________________________________________________________________________________________________________________________________________________________________

En freeswitch.xml, se puede ver que incluye los scripts .xml que se encuentran en el directorio accounts/. Por tanto, debemos crear dicho directorio en /etc/freeswitch, y copiar alli el script asterisk.xml, en donde ponemos los diferentes parámetros de nuestra cuenta SIP. Podemos configurar mas cuentas para diferentes servidores y/o extensiones.

[edit] Breve explicación de freeswitch.xml

freeswitch.xml se divide básicamente en las siguientes partes: la parte de configuraciones que esta conformado por switch.conf y modules.conf, el dialplan, el directorio y los sip_profiles. Normalmente en este archivo se invocan las configuraciones de todos los demas scripts presentes en el directorio de configuracion de freeswitch; en este caso vamos a hacerlo directamente.

[edit] Configuraciones y variables generales

En la primera parte del script definimos variables generales del sistema y diferentes configuraciones tanto del core de FreeSWITCH como de algunos modulos.

De la linea 3 a la linea 17 con el comando "set" definimos algunos parametros importantes del sistema. Los mas importantes aca son los codecs preferidos (codec_pref). FreeSWITCH soporta casi todos los codecs de voz ip mas usados, sin embargo para esta pruebas vamos a trabajar con gsm, PCMU y PCMA.

De la linea 19 a la linea 185 tenemos los diferentes script de configuraciones:

De la linea 20 a 29, configuraciones de cdr_cvs, modulo que nos permite generar reportes de las llamadas con plantillas predefinidas. De la linea 31 a la 39, algunas configuraciones para la consola CLI. Luego algunas configuraciones de local_stream, que nos permite generar tonos DTMF y demas sonidos desde el terminal local. En seguida, configuracion para los archivos log, que nos permiten tener conocimiento de lo que esta pasando para futuras depuraciones.

La parte de modules.conf es importante, ya que nos permite decirle a FreeSWITCH que modulos cargar y que no al iniciar.

En la configuracion de portaudio, debemos tener en cuenta sobre todo el "sample-rate" y el "codec-ms" que nuestra tarjeta de sonido soporta; para en nano note estos valores funcionan. Por ultimo, en ocasiones se hace necesario cargar modulos antes de cargar FreeSWITCH, en este caso no es necesario.

[edit] Configuración de sofia: SIP endpoints

Seguidamente tenemos la configuracion del softphone como tal. Aca es importante resaltar la parte de gateways; alli incluimos los archivos .xml del directorio accounts. En este directorio vamos a configurar la cuenta de nuestro softphone. Como explique anteriormente, el servidor asterisk externo será visto por FreeSWITCH como una pasarela. En la parte de "settings", algunas cosas importantes es el puerto sip, que por defecto siempre sera 5060 y el user-agent-string, que es como se verá nuestro softphone en el momento de registrarse la extension en asterisk. Le he puesto FreeSWITCH/SoftPhone-UN.

En la parte de switch.conf, se encuentran algunos parametros del core de FreeSWITCH.

Para ampliar la información acerca de cualquiera de los scripts presentes en freeswitch.xml, pueden referirse al wiki de FreeSWITCH.

[edit] Dialplan

Desde la linea 202, se configura el dialplan. Como lo comenté anteriormente, el dialplan le dice a FreeSWITCH el procedimiento a seguir cuando se detecta una llamada entrante o saliente.

El contexto default describe las llamadas salientes; en cambio el contexto public describe las llamadas entrantes al sistema.

FreeSWITCH nos permite usar expresiones regulares, con lo que podemos generar expresiones muy generales y asignar variables. En el campo "condition" es donde se describe la condicion necesaria de cierta llamada para sea procesada con las instrucciones seguidas por medio de la etiqueta "action". Las variables $1, $2, $3, etc. se refieren a lo que se encuentra entre parentesis en la expresion regular (ej. expression="^sip:(.*):(.*)$, quiere decir que el primer parentesis se representa por $1, y el segundo por $2, asi: data="{absolute_codec_string=$1}sofia/softphone/$2).

[edit] Context name="default": Llamando!

Las extensiones del grupo "codec_and_sip_uri" y "sip_uri" son utilizadas para extensiones locales (definidas dentro de FreeSWITCH). Como en el Nano Note no hemos configurado un servidor, entonces estas extensiones no serán utilizados; sin embargo puede llegar a ser util cuando el servidor es montado en un router, y se le agrega una tarjeta de sonido al mismo para tener un terminal de pruebas.

Las extensiones del grupo "codec_and_number" y "number" son las que vamos a utilizar. Esto nos da una idea de la sintaxis a la hora de escribir el comando para llamar desde el Nano Note.

[edit] Context name="public": Recibiendo llamadas!

En este caso, tenemos un solo grupo de extensiones: "public_extensions", y en cada segmento generamos diferentes condiciones cuando entra una llamada, como informar en consola, timbrar, pre contestar, pero siempre enviando la llamada a portaudio.

[edit] asterisk.xml: configurando el softphone

Este script permite configurar nuestra cuenta SIP, similar a cualquier softphone como ekiga o Kphone. En él configuramos la IP del servidor, username, password, y el protocolo de transporte utilizado para el registro.

[edit] Corriendo FreeSWITCH

Luego de que tenemos listos los scripts en los directorios adecuados, procedemos a correr freeswitch. Antes de hacer esto, debemos abir los canales del microfono del Nano Note con el alsamixer:

# alsamixer

Vamos a "capture" y con la barra espaciadora abrimos el canal y ponemos el maximo de volumen de entrada. Para el volumen de salidad, recomiendo dejarlo al 70%, para evitar que se saturen los transistores y se escuche distorsionado:

Alsamixer

Ahora, con los siguiente comandos, ejecuatmos FreeSWITCH:

# cd /usr/bin/
# ./freeswitch

El programa, como fue configurado asi, imprime todos los mensajes de arranque. Cuando estamos conectados al nano note por SSH, se puede ver mejor. Es importante leer sobre todo los mensajes de color rojo y violeta, que son errores y advertencias. Al final, tenemos un cliente, que esta a la espera de comandos. Se tendria que ver algo como:

Running_FreeSWITCH

De inmeadiato FreeSWITCH al detectar el servidor, registra la extension que configuramos en asterisk.xml. No hay que olvidar que esta extension previamente debio ser configurada en el servidor SIP.

[edit] Escogiendo dispositivo de audio

Portaudio nos permite, con algunos comandos, configurar el dispositivo de sonido:

Nos permite ver la lista de dispositivos detectados:

# pa devlist

Portaudio realiza una prueba a cada dispositivo:

# pa dump

Seleccionamos, de acuerdo a la informacion dada, el dispositivo de entrada, salida y de timbrado respectivamente:

# pa indev #1
# pa outdev #1
# pa ringdev #1

Para el Nano Note , portaudio detecta tres dispositivos:

0;/dev/dsp(OSS);16;16;r,i,o
1;QI LB60:  (hw:0,0)(ALSA);2;2;
2;default(ALSA);128;128;

El dispositivo apropiado es el #0, dev/dsp; sin embargo, FreeSWITCH lo selecciona por defecto al iniciar, entonces no es necesario configurarlo cada vez.

[edit] Usando Softphone-UN

Por último, intentaremos ser llamados desde otra extensión. Deberiamos ver lo siguiente (ver imagen) y sonaría un tono.

Timbrando!
Llamando!

Para contestar pongo el comando:

freeswitch@BenNanoNote>pa answer

y se debe abrir el canal de comunicación y empezar la conversación!

Para colgar, utilizamos el comando:

freeswitch@BenNanoNote>pa hangup

Ahora intentemos llamar. Para ellos utilizamos el siguiente comando:

freeswitch@BenNanoNote>pa call 2000@192.168.1.20

donde 2000 es la extension a la que vamos a llamar y 192.168.1.20 es la IP del servidor. En ese momento, en espera de que nos contesten, deberiamos ver algo asi(Ver imagen).


y cuando contesten se inicia la comunicación y a charlar!

[edit] Potencial

Si configuramos nuestro servidor Asterisk casero, con una gateway hacia telefonia tradicional o celular; o si tenemos algun proveedor de voz ip como net2phone, pues desde donde podamos conectarnos a internet, tendremos desde el nanonote un teléfono para comunicarnos con cualquier parte del mundo.

[edit] Pendiente

Para este proyecto, hemos pensado crear con ayuda de librerias Qt, un entorno gráfico amable. Tambien quedaron pendientes algunas pruebas de desempeño y de uso de recursos de hardware.

Personal tools
Namespaces
Variants
Actions
Navigation
interactive
Toolbox
Print/export