Internet móvil con el modem 3G USB Huawei E173 en la Raspberry Pi

Hacer funcionar un módem 3G USB en la Raspberry Pi puede ser un tema peliagudo. Es posiblemente la tarea con la que más tiempo he perdido en varias Raspberry Pis y con diferentes modelos de módem USB. Uno de los motivos es que estos “pinchos USB” suelen llevar una memoria interna, o una ranura para una tarjeta microUSB, y la Raspberry Pi no lo reconoce como un módem sino como un dispositivo de almacenamiento (que es la intención de los fabricantes, para que al conectarlo a un PC con Windows, este automáticamente instale los drivers desde el almacenamiento). Para solucionar esto, y que la Raspberry Pi reconozca al dispositivo como lo que es, un modem, hay que recurrir al programa usb-modeswitch, y hay que prepararse para dedicarle muchas horas de búsqueda por internet para tu configuración, y luego mil pruebas…

Voy a emplear el modem Huawei E173 (estrictamente, el E173u-2, como pone en su interior), que es muy común y baratito (se puede comprar en amazon o en eBay por menos de 30€, o también te lo regalan las operadoras cuando contratas “internet móvil”).

Modem 3G USB Huawei E173u-2

Modem 3G USB Huawei E173u-2

Modem 3G USB Huawei E173u-2

Modem 3G USB Huawei E173u-2

Que la Raspberry Pi reconozca el modem Huawei E173u-2

Con la Raspberry Pi A+ con la que estoy trasteando ahora mismo, parece que no voy a tener este problema. Lo sé porque si ejecuto el comando lsusb me sale, entre otros dispositivos USB que tengo conectados, este:

Bus 001 Device 003: ID 12d1:1446 Huawei Technologies Co., Ltd. E1552/E1800/E173 (HSPA modem)

Aún así, es mejor hacer mil pruebas reiniciando la Raspberry Pi y ver si lo sigue reconociendo, desconectar y reconectar el modem 3G USB, para ver si lo reconoce sin problemas en todas las situaciones. Una vez que estemos seguros de esto, podremos pasar al siguiente paso.

Antes de nada hay que asegurarse de que nuestra Raspberry Pi está bien alimentada, pues el modem 3G puede consumir bastante potencia. Lo segundo es que hayamos quitado el pin de la tarjeta SIM que hemos introducido en el modem 3G (esto generalmente lo podremos hacer o bien desde un móvil, o desde el programita/página web que salta por defecto al conectar el pincho a un PC).

Pero… mi gozo en un pozo. Aunque la descripción “HSPA modem” parecía apuntar a que estaba bien reconocido, no es así. Si sigo los pasos de los apartados siguientes, no me funciona. Así que me temo que hay que recurrir a usb-modeswitch y hacer que se reconozca como modem. Googleando parece que el id correcto es el 12d1:1433 (y no el 12d1:1446). Es decir, que al hacer lsusb debería salir esto:

ID 12d1:1433 Huawei Technologies Co., Ltd.

Pues vamos a por ello.

Ocurren cosas raras. Si desconecto el pincho, ejecuto el comando tail -f /var/log/messages sale:

Mar 21 19:07:23 pigorra1 kernel: [ 2378.375864] usb 1-1.5: new high-speed USB device number 10 using dwc_otg
Mar 21 19:07:23 pigorra1 kernel: [ 2378.478258] usb 1-1.5: New USB device found, idVendor=12d1, idProduct=1446
Mar 21 19:07:23 pigorra1 kernel: [ 2378.478299] usb 1-1.5: New USB device strings: Mfr=3, Product=2, SerialNumber=0
Mar 21 19:07:23 pigorra1 kernel: [ 2378.478317] usb 1-1.5: Product: HUAWEI Mobile
Mar 21 19:07:23 pigorra1 kernel: [ 2378.478335] usb 1-1.5: Manufacturer: HUAWEI Technology
Mar 21 19:07:23 pigorra1 kernel: [ 2378.484349] usb-storage 1-1.5:1.0: USB Mass Storage device detected
Mar 21 19:07:23 pigorra1 kernel: [ 2378.485426] scsi host14: usb-storage 1-1.5:1.0
Mar 21 19:07:23 pigorra1 kernel: [ 2378.486690] usb-storage 1-1.5:1.1: USB Mass Storage device detected
Mar 21 19:07:23 pigorra1 kernel: [ 2378.491085] scsi host15: usb-storage 1-1.5:1.1
Mar 21 19:07:23 pigorra1 usb_modeswitch: switching device 12d1:1446 on 001/010
Mar 21 19:07:24 pigorra1 kernel: [ 2379.418875] usb 1-1.5: USB disconnect, device number 10
Mar 21 19:07:28 pigorra1 kernel: [ 2383.495961] usb 1-1.5: new high-speed USB device number 11 using dwc_otg
Mar 21 19:07:28 pigorra1 kernel: [ 2383.598504] usb 1-1.5: New USB device found, idVendor=12d1, idProduct=1433
Mar 21 19:07:28 pigorra1 kernel: [ 2383.598544] usb 1-1.5: New USB device strings: Mfr=4, Product=3, SerialNumber=0
Mar 21 19:07:28 pigorra1 kernel: [ 2383.598565] usb 1-1.5: Product: HUAWEI Mobile
Mar 21 19:07:28 pigorra1 kernel: [ 2383.598583] usb 1-1.5: Manufacturer: HUAWEI Technology
Mar 21 19:07:28 pigorra1 kernel: [ 2383.602533] usb-storage 1-1.5:1.0: USB Mass Storage device detected
Mar 21 19:07:28 pigorra1 kernel: [ 2383.605914] option 1-1.5:1.0: GSM modem (1-port) converter detected
Mar 21 19:07:28 pigorra1 kernel: [ 2383.608156] usb 1-1.5: GSM modem (1-port) converter now attached to ttyUSB0
Mar 21 19:07:28 pigorra1 kernel: [ 2383.609015] usb-storage 1-1.5:1.1: USB Mass Storage device detected
Mar 21 19:07:28 pigorra1 kernel: [ 2383.617225] cdc_ether 1-1.5:1.1 wwan0: register 'cdc_ether' at usb-bcm2708_usb-1.5, Mobile Broadband Network Device, 02:50:f3:00:00:00
Mar 21 19:07:28 pigorra1 kernel: [ 2383.619344] usb-storage 1-1.5:1.3: USB Mass Storage device detected
Mar 21 19:07:28 pigorra1 kernel: [ 2383.621198] option 1-1.5:1.3: GSM modem (1-port) converter detected
Mar 21 19:07:28 pigorra1 kernel: [ 2383.622309] usb 1-1.5: GSM modem (1-port) converter now attached to ttyUSB1
Mar 21 19:07:28 pigorra1 kernel: [ 2383.623885] usb-storage 1-1.5:1.4: USB Mass Storage device detected
Mar 21 19:07:28 pigorra1 kernel: [ 2383.624851] option 1-1.5:1.4: GSM modem (1-port) converter detected
Mar 21 19:07:28 pigorra1 kernel: [ 2383.627728] usb 1-1.5: GSM modem (1-port) converter now attached to ttyUSB2
Mar 21 19:07:28 pigorra1 kernel: [ 2383.628387] usb-storage 1-1.5:1.5: USB Mass Storage device detected
Mar 21 19:07:28 pigorra1 kernel: [ 2383.631475] option 1-1.5:1.5: GSM modem (1-port) converter detected
Mar 21 19:07:28 pigorra1 kernel: [ 2383.632669] usb 1-1.5: GSM modem (1-port) converter now attached to ttyUSB3
Mar 21 19:07:28 pigorra1 kernel: [ 2383.633797] usb-storage 1-1.5:1.6: USB Mass Storage device detected
Mar 21 19:07:28 pigorra1 kernel: [ 2383.635312] scsi host21: usb-storage 1-1.5:1.6
Mar 21 19:07:29 pigorra1 kernel: [ 2384.637590] scsi 21:0:0:0: Direct-Access     HUAWEI   SD Storage       2.31 PQ: 0 ANSI: 2
Mar 21 19:07:29 pigorra1 kernel: [ 2384.641548] sd 21:0:0:0: Attached scsi generic sg1 type 0
Mar 21 19:07:29 pigorra1 kernel: [ 2384.641912] sd 21:0:0:0: [sdc] Attached SCSI removable disk
Mar 21 19:07:29 pigorra1 logger: usb_modeswitch: switched to 12d1:1433 on 001/011

Es decir, ¡se ha cambiado correctamente solo! Aparece en ttyUSB0 el modem GSM, en ttyUSB1, ttyUSB2 y ttyUSB3 tres modems GSM, y luego la tarjeta SD. Y el usb_modeswitch lo ha cambiado a 12d1:1433. Es justo lo que quiero, ¡pero yo no he hecho nada para merecerme esto!, simplemente desconectarlo y volverlo a conectar. Si hago lsusb sale correcto:

Bus 001 Device 011: ID 12d1:1433 Huawei Technologies Co., Ltd. 

Creo que ya sé por qué puede ser. Antes lo estaba probando en una Raspberry A+ a través de un concentrador USB con alimentación, y ahora estoy haciendo la prueba conectando directamente el modem USB a la Raspberry Pi (en una B+).

Pruebo reiniciando, desconectando y volviendo a conectar, y compruebo que en ocasiones se reconoce como dispositivo correcto (12d1:1433, es decir, que usb_modeswitch hace bien su trabajo), pero en otras no. Así que vamos a hacer que siempre se haga el cambio a 12d1:1433.

Vamos a ver qué es lo que pasa en las tripas de usb_modeswitch. Para ello, empezamos editando el fichero /etc/usb_modeswitch.conf haciendo que EnableLogging=1. De esta forma, el fichero de registro /var/log/usb_modeswitch_XXXXXXXXXXXX contendrá más información. Cada vez que desconecte y reconecte el modem USB, veré el contenido de ese fichero para ver los pasos que sigue el programa.

En la página web de Usb_modeswitch se explica muy bien el funcionamiento del programa. Como en mi caso parece ser que, cuando funciona, usb_modeswitch reconoce bien el dispositivo y lo cambia correctamente, esto significa que la configuración está ya en la base de datos. Lo que tengo que hacer es investigar e intentar el que a veces no funcione, para que funcione siempre.

Continuo probando. En el fichero /usr/share/usb_modeswitch/configPack.tar.gz encuentro el fichero 12d1:1446, con el siguiente contenido:

# Huawei, newer modems

TargetVendor=  0x12d1
TargetProductList="1001,1406,140b,140c,1412,141b,1432,1433,1436,14ac,1506,1511"

MessageContent="55534243123456780000000000000011062000000100000000000000000000"

Esto es lo que lee automáticamente, como puedo comprobar en el log. Podemos hacer que usb-modeswitch pase de esta configuración y lea la que nosotros queramos, si colocamos el fichero correspondiente en /etc/usb_modeswitch.d/. Por defecto está vacío, así que voy a crear ahí el fichero con el que haré pruebas:

sudo nano /etc/usb_modeswitch.d/12d1\:1443

(ojo con el \:). En ese fichero pegaré el contenido del que viene por defecto y le añadiré algunas cosa:

# Mis pruebas para Huawei E173u-2

TargetVendor=  0x12d1
TargetProductList="1001,1406,140b,140c,1412,141b,1432,1433,1436,14ac,1506,1511"

MessageContent="55534243123456780000000000000011062000000100000000000000000000"

<strong>WaitBefore=2</strong>

Como parece que pueda ser un problema de tiempos, añado WaitBefore=2 para que espere 2 segundos mientras se configura. Hago varias pruebas, aumentando el número de segundos. Me deja de funcionar cuando lo conecto en caliente (desconetar y reconectar mientras está funcionando), y sólo en ocasiones funciona cuando reinicio la Raspberry Pi. Así que parece que he ido a peor.

También pruebo a ejecutar el cambio manualmente con:

sudo usb_modeswitch -I -v 12d1 -p 1446 -V 12d1 -P 1433 -M "55534243123456780000000000000011062000000100000000000000000000"

Pero no me funciona…

La solución que he encontrado, que no es demasiado limpia pero por el momento funciona, es añadir lo siguiente en el /etc/rc.local, antes de exit 9:

sudo service udev stop
sleep 2
sudo service udev start

El /etc/rc.local se ejecuta en cada arranque, y añadiendo esas líneas le estamos diciendo que pare el servicio udev, espere 2 segundos y lo vuelva a arrancar.

Elimino el fichero que había colocado en /etc/usb_modeswitch.d/, edito el fichero /etc/usb_modeswitch.conf y vuelvo a dejar EnableLogging=0 para dejarlo todo como estaba originalmente. Reinicio un par de veces con el modem enchufado y parece que todo funciona. Así que puedo pasar al siguiente paso.

Instalando el demonio pppd, UMTSKeeper y Sakis3G

El programa más utilizado para realizar la conexión 3G es Sakis3g. Sin embargo, antes de lanzarnos a instalarlo, tenemos que saber que es muy frecuente perder la conexión 3G cada cierto tiempo, por lo que se suele recurrir a otro programa, UMTSKeeper, que está constantemente comprobando la conexión y recuperándola cuando se cae. Como este último programa instala por su cuenta Sakis, no es necesario que instalemos Sakis.

Así que empezamos. Lo primero es instalarse el servicio pppd:

sudo apt-get install ppp

A continuación instalamos UMTSKeeper:

cd ~
mkdir umtskeeper
cd umtskeeper
wget "http://mintakaconciencia.net/squares/umtskeeper/src/umtskeeper.tar.gz"
tar -xzvf umtskeeper.tar.gz
chmod +x sakis3g umtskeeper

Ahora, configuramos sakis:

sudo ./sakis3g --interactive 
Configruación Sakis 3G Pantalla 1

Configuración Sakis 3G Pantalla 1

Configruación Sakis 3G Pantala 2

Configuración Sakis 3G Pantalla 2

Configuración Sakis 3G Pantalla 3

Configuración Sakis 3G Pantalla 3

Configuración Sakis 3G Pantalla 4

Configuración Sakis 3G Pantalla 4

Configuración Sakis 3G Pantalla 5

Configuración Sakis 3G Pantalla 5

Configuración Sakis 3G Pantalla 6

Configuración Sakis 3G Pantalla 6

Configuración Sakis 3G Pantalla 7

Configuración Sakis 3G Pantalla 7

Si ahora hago ifconfig, obtengo, entre otras cosas:

ppp0      Link encap:Point-to-Point Protocol  
          inet addr:88.29.135.146  P-t-P:10.64.64.64  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:130 (130.0 B)  TX bytes:333 (333.0 B)

Así que efectivamente, tenemos conexión a internet por ppp0.

Y por último, configuro UMTSKeeper. Ejecuto el siguiente comando (una sola línea), que luego añadiré a /etc/rc.local para que se ejecute siempre que se arranque la Raspberry Pi:

sudo /home/pi/umtskeeper/umtskeeper --sakisoperators "USBINTERFACE='0' OTHER='USBMODEM' USBMODEM='12d1:1433' APN='movistar.es' CUSTOM_APN='movistar.es' APN_USER='0' APN_PASS='0'" --sakisswitches "--sudo --console" --devicename 'Huawei' --log --silent --monthstart 8 --nat 'no' --httpserver &>> /home/pi/umtskeeper/error.log &

Consulto el fichero /var/log/umtskeeper.log y veo que está todo en orden. Pruebo a desconectar y reconectar el pincho USB, y veo que tras medio minuto vuelve a conectarse automáticamente.

Así que he conseguido:

  1. Que la Raspberry Pi reconozca el modem USB 3G como modem y no como unidad de alamacenamiento, y que lo haga tras un reinicio
  2. Que se conecte a internet a través del modem USB
  3. Que mantenga la conexión mientras la Raspberry Pi esté fucnionando, bien tras caidas de la red, o por desenchufar-reenchufar el modem 3G

¡Prueba superada!

Referencias

16 pensamientos en “Internet móvil con el modem 3G USB Huawei E173 en la Raspberry Pi

  1. Pingback: Internet móvil con el modem 3G USB Huawei E303 en la Raspberry Pi | Carlini's Blog

      • Vale, muchas gracias.
        Mi intención es poder acceder a la Raspberry Pi de manera remota a través de una IP estática asignada a la tarjeta que esté introducida en el modem que comentas. ¿Esto sería posible?
        Muchas gracias y disculpa las molestias.
        Un saludo.

        • Bueno… sí es posible, aunque creo que no como estás diciendo, o como entiendo lo quieres hacer. La IP que le asignará tu ISP al router USB será distinta cada vez, independientemente de la que asignes estática en tu red interna. Hay dos formas “fáciles” de hacerlo, con mucha información por internet: con un túnel inverso (reverse) SSH, o con una VPN. Entre otras formas…

          • Vale, muchas gracias.
            Había pensado en utilizar NO-IP para que la asignación de una dirección siempre se asigne a la ip dinámica que tenga el modem.
            Muchas gracias.
            Me pondré con ello.
            Un saludo.

            P.D.: los pasos a seguir con el modem Huawei E303 que nombras en sustitución al Huawei E173 de este post, ¿son los mismos?

            Otra cuestión: ¿el dispositivo funciona con cualquier SIM que introducimos?

            Gracias de nuevo y disculpa las molestias.

  2. Hola, gran tutorial! Se conectó bien. Pero al configurar el utmskeeper con la última línea, reclama error de sintaxis ‘;&’

    Espero que me puedas ayudar.

    • Gracias, Marcelo. Efectivamente, había una errata al tratar el signo &. Debería acabar así:

      &>> /home/pi/umtskeeper/error.log &

      Lo he actualizado, ya te debería funcionar.

      Un saludo

      • Gracias por su tiempo y correción. Tengo otro inconveniente; resulta que al desconectar el modem del puerto usb y volverlo a conectar, la Rpi no lo reconoce nuevamente (estando encendida y conectada a internet). Cómo puedo lograr que lo vuelva a reconocer?

        Gracias por ayudar.

        =)

        • Esto puede ser un verdadero quebradero de cabeza, prepárate…
          Pero antes de empezar a investigar, mi consejo es que compruebes que tu fuente de alimentación sea la adecuada para la Pi que estés empleando; estos modems USB consumen mucho. Parecerá una tontería, pero a veces es simplemente esto.
          Un saludo y ánimo.
          Carlos

          • Hola Carlos, gracias por tu tiempo.

            Entonces, piensas que ¿Tal vez la fuente no entrega la carga suficiente? La fuente que estoy empleando entrega 2 amperes.

            Si eso es suficiente, qué me recomiendas a modo de orientación para comenzar a investigar?

            De antemano nuevamente agradezco tu tiempo.

  3. Miles de guias y tutoriales en internet que son pura basura. Tus pasos han funcionado a la perfección. Mil gracias!

  4. No retires el chip o simcard mientras se encuentre en uso. De lo contrario, tanto la tarjeta como el Modem USB podrian estropearse y los datos almacenados en la tarjeta pueden quedar danados.

  5. Hola buen dia.

    Yo realice todo el proceso leyendo por internet, y basicamente hice lo que tu excelentemente explicas.

    Mi proyecto es un tracker GPS donde se esta mandando la ubicacion cada cierto tiempo, cada 5 segundos, parece de locos, pero a la fecha (26/09/2016) el internet de Telcel/Movistar/ATT por 150 pesos mexicanos(unos 7 USD) te dan 1GB, entonces no importa mucho que gaste 500mb de datos en un mes. Entonces busque varias opciones y todos los sistemas de GPS comerciales usan GPRS/GSM, una red lenta y no muy buena para enviar tantos datos en un minuto, asi que decidi usar un modem 3G que me costo como 8USD en ebay.

    Todo iba bien, use el UMTskeeper para mantener la conexion y tuve que poner que en cada arranque se corriera el usb_modeswitch, todo perfecto hasta aqui, lo que ocurria era que por alguna extraña razon de repente se desconectaba y ya no reconectaba, entonces vi el log del UMTskeeper y me di cuenta de quel modem se desconfiguraba y entonces volvia a los datos originales donde no es modem.

    Despues de pensar un buen rato, cada vez que pasara esta situacion anterior, se tenia que volver a correr el usb_modeswitch del arranque, pero sin tener que hacer reboot, entonces por algun lado tenia que ejecutarlo cuando el UMT descubriera que ya no estoy conectado al internet, la unica manera era insertar el comando del usb_modeswitch en el codigo del UMT.

    El UMT esta escrito en python, y para poder correr lineas de comando en python podemos usar varias opciones, pero la mas facil (y que me funciono a la primera) fue la siguiente:

    import os
    os.system(“usb_modeswitch -c /etc/usb_modeswitch.conf”)

    Aqui lo que hacemos es ejecutar el usb_modeswitch utilizando el archivo de configuracion que creamos/editamos al principio, donde tenemos los datos especificos para cambiar a modo modem nuestro dongle USB.

    Ahora, despues de buscar y leer bastante, encontre que el UMT realiza un “USB Reset” pero que a veces no funciona como nosotros queremos, entonces justamente aqui insertamos las dos lineas de codigo anteriores

    # ResetUSB – to replace resetusb.c by a Python function. This resets the USB host port.
    def ResetUSB():
    #get USB bus and device numbers of modem:
    output = subprocess.Popen(‘lsusb | grep ‘ + conf[‘deviceName’], shell=True, stdout=subprocess.PIPE).communicate()[0]
    import os
    os.system(“usb_modeswitch -c /etc/usb_modeswitch.conf”)

    if output != ”:

    Ademas como a manera de proteccion inserte mis dos lineas de codigo para ejecutar el modeswitch cuando el UMT detecta que no estas conectado a la red y empieza a tratar de reconectarse, entonces nuestro pequeño codigo tiene que ir entre que descubrio que ya no estamos conectados y entre que empieza a reconectarse, o exactamente aqui:

    else:
    sakisActors = ‘connect’ # wait wait wait wait not connected connect”

    os.system(“usb_modeswitch -c /etc/usb_modeswitch.conf”)
    sakisSw = conf[‘sakisSwitches’]
    sakisOp = conf[‘sakisOperators’]

    Ya no escribimos “import os” porque ya lo habiamos importado anteriormente.

    Y de esta manera obligo a que cada vez que se realice una nueva conexion, se pierda, o se desconfigure solo el dongle usb, el UMTskeeper solito va a correr el usb_modeswitch y ya no tendremos que preocuparnos de este tema, ademas al realizar esto, ya no es necesario que en el arranque corramos el usb_modeswitch.

    Esto lo hice en una raspberry Zero v1.3, tambien tengo una PI3 pero en esta no me habia sucedido eso.

    Espero y les ayude.

    Gracias!

  6. Hola,

    Tengo un servidor Apache en la Raspberry y me gustaría saber si tendría que hacer algo en la configuración que fuera distinto para que me funcione con el dongle 3G.

    Gracias

    • Hola Pedro. me ocurre lo mismo. me gustaría redireccionar el puerto, pero no sé de qué forma hacerlo, ya que un dongle no incluye las características de un router de la misma forma (o eso creo)
      Gracias y espero que puedan ayudarnos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *