jueves, 20 de junio de 2013

Llamadas y SMS usando un dongle USB en RaspberryPi

... dándole más canales a nuestro RaspberryPi.

Buenas tardes, para un plan malévolo que estoy preparando, necesito que mi RaspberryPi tenga capacidad GSM de comunicación, lo que viene a ser enviar/recibir llamadas y enviar/recibir SMS (de los que se pagan). Y puestos a pedir, si consigo hacerlo reutilizando algún cacharrito de algún proyecto anterior, pues mejor que mejor. Así que me he puesto a buscar ...

y me he encontrado con el chan_dongle (web) que nos da GSM en los modems 3G de Huawei, que resulta que ya tenia uno desde hace un siglo:
Ese modelo es el Huawei k3520, que es compatible 100% con el chan_dongle, aquí tienes más modelos. La ventajas de estos dispositivos es que son muy baratos (~30€), comparados con lo que cuesta un GSM-SIP( que viene a ser una barbaridá). Como además son USB, podemos poner varios cientos de ellos conectados a nuestro RaspberryPi, en mi caso he conectado sólo uno y he necesitado un HUB USB alimentado.
Los pasos que he seguido son:

  1. Tener Asterisk en correcto funcionamiento, en mi caso es la versión 11, aquí tienes unas muy buenas instrucciones de como instalar Asterisk.
  2. Parar Asterisk:
    /etc/init.d/asterisk stop
    
  3. Descargar y compilar:
    apt-get install usbutils
    cd /usr/src/
    wget http://www.draisberghof.de/usb_modeswitch/usb-modeswitch-1.2.5.tar.bz2
    wget http://www.draisberghof.de/usb_modeswitch/usb-modeswitch-data-20121109.tar.bz2
    tar -jxvf usb-modeswitch-1.2.5.tar.bz2
    tar -jxvf usb-modeswitch-data-20121109.tar.bz2
    cd usb-modeswitch-1.2.5
    make all
    make install
    cd ../usb-modeswitch-data-20121109
    make install
    cd ..
    
  4. Activar modo modem (OJO aquí):
    lsusb | grep Huawei
    #Bus 001 Device 010: ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem
    usb_modeswitch -v 0x12d1 -p 0x1001 -H -s 5 -M 55534243000000000000000000000011060000000000000000000000000000
    
  5. Instalar chan_dongle (para Asterisk 11, insisto):
    cd /usr/src/asterisk/asterisk-11.1.2/
    wget https://github.com/jstasiak/asterisk-chan-dongle/archive/asterisk11.zip
    unzip asterisk11.zip
    cd asterisk-chan-dongle-asterisk11/
    aclocal
    autoconf
    automake -a
    ./configure
    make all
    make install
    
  6. /etc/asterisk/dongle.conf:
    [general]
    interval=15
    
    [defaults]
    
    context=dongle-incoming
    group=0
    rxgain=0
    txgain=0
    autodeletesms=yes
    resetdongle=yes
    u2diag=-1
    usecallingpres=yes
    callingpres=allowed_passed_screen
    disablesms=no
    language=es
    smsaspdu=yes
    mindtmfgap=45
    mindtmfduration=80
    mindtmfinterval=200
    callwaiting=auto
    disable=no
    initstate=start
    exten=entrante
    dtmf=relax
    
    [dongle0]
    audio=/dev/ttyUSB1
    data=/dev/ttyUSB2
  7. /etc/asterisk/extensions.conf
    [dongle-incoming]
    exten => sms,1,Set(sms=${SMS})
    same => n,NoOp(el mensaje del ${CALLERID(num)}: ${SMS})
    same => n,Goto(nulo,s,1)
    
    exten => entrante,1,NoOp(llamada entrante por el Dongle USB)
    same => n,Answer()
    same => n,Dial(SIP/1002&SIP/Juanmol,${TIMEOUT},${opc})
    same => n,Goto(nulo,s,1)
    
Y ya está, sorprendentemente fácil. Arrancamos Asterisk y en la consola probamos:
raspberrypi*CLI> dongle show devices
ID           Group State      RSSI Mode Submode Provider Name  Model      Firmware          IMEI             IMSI             Number
dongle0      0     Free       9    5    4       vodafone ES    K3520      11.314.21.31.00   353436333212201  214062201179907  Unknown
Evidentemente no tengo Vodafone, tengo Pepephone y el dongle esta liberado. Llamamos con:
raspberrypi*CLI> originate dongle/dongle0/666555444 application musiconhold
y aquí vemos como se recibe un sms:
raspberrypi*CLI> 
 [dongle0] Got SMS from +34666777888: 'Hola, esto es un sms con tíldés y eñes'
    -- Executing [sms@dongle-incoming:1] Set("Local/sms@dongle-incoming-00000000;1", "sms=Hola, esto es un sms con tíldés y eñes") in new stack
    -- Executing [sms@dongle-incoming:2] NoOp("Local/sms@dongle-incoming-00000000;1", "el mensaje del +34666777888: Hola, esto es un sms con tíldés y eñes") in new stack
    -- Executing [sms@dongle-incoming:3] Goto("Local/sms@dongle-incoming-00000000;1", "nulo,s,1") in new stack
    -- Goto (nulo,s,1)
    -- Executing [s@nulo:1] Hangup("Local/sms@dongle-incoming-00000000;1", "") in new stack
  == Spawn extension (nulo, s, 1) exited non-zero on 'Local/sms@dongle-incoming-00000000;1'
    -- Executing [h@nulo:1] Hangup("Local/sms@dongle-incoming-00000000;1", "") in new stack
  == Spawn extension (nulo, h, 1) exited non-zero on 'Local/sms@dongle-incoming-00000000;1'

raspberrypi*CLI> 
Genial, perfecto, superfácil y barato. Os recomiendo leer la documentación, vienen más configuraciones y ejemplos.

10 comentarios:

  1. Hola.

    Una pregunta: seguiría sirviendo el dongle como módem 3g o al estar utilizándose como gateway gsm se anula la conectividad?

    Gracias y felicidades por el blog tan interesante que tienes!

    ResponderEliminar
    Respuestas
    1. no lo he probado, tengo pendiente probar el modem como modem. Me gustaría pensar que puedes hacer las dos cosas a la vez, como hace Orange o Vodafone en los ADSL domésticos sin línea.

      Eliminar
    2. Exacto, yo hasta donde se, en UMTS (3G) voz y datos viajan por diferentes canales y que no pueden estar ambos al mismo tiempo, osea, mientras estas llamando se te corta los datos eso en 3G CDMA pero en 3G GSM si que se puede.

      Entonces como respuesta a tu pregunta, si y no, sí porque puedes usar para ambos, y no porque no puedes usar ambos al mismo tiempo, ésto no por el modem o móvil, si no por la tecnología en si, y depende de tu operadora y su sistema que usan por debajo. Yo por ej. soy de Bolivia y no puedo usar Datos y Voz al mismo tiempo con mi operadora Tigo (millicom)

      Al parecer me hice un lío explicando pero si hay cualquier duda con gusto la responderé lo que sepa ya que acabo de terminar la carrera de redes y teleco y sólo se teoría jeje :D

      Saludos!

      PD me leí tu configuración por encima, ahí llamas al número y éste te envía simplemente un sms no? Pensé que saldría la llamada a través del módem, de cualquier forma tenía pensado implementar ésto con llamadas y sms, cuando tenga listo les aviso.

      Eliminar
  2. Hola! Estupendo blog!

    Con respecto a lo de utilizar el modem como modem, quizá esto te sirva:
    http://www.instructables.com/id/Raspberry-Pi-as-a-3g-Huawei-E303-wireless-Edima/#step1

    Saludos.

    ResponderEliminar
  3. Hola buenas tardes

    Tengo problema al ejecutar make ya que me da un error que no puedo solucionar.

    Alguno me podra ayudar??

    http://pastebin.com/Jgtvv8Qg

    Gracias de antemano

    ResponderEliminar
  4. Hola,

    La entrada de tu blog me ha ayudado bastante pero aún tengo problemas para echar andar mi dongle. Tengo una duda ¿Es necesario cambiar a modo modem el dongle para usar chan_dongle?

    Es el e153 el que estoy usando actualmente.

    Saludos,

    ResponderEliminar
    Respuestas
    1. No he probado ese modelo, pero te diría que si. Supongo que se hace para poder enviar comandos AT más fácilmente.

      Eliminar
  5. Saludos
    El costo del envio del sms, seria lo que mi compañia telefonica cobre por sms enviado?.

    Gracias

    ResponderEliminar