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»).
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
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:
- Que la Raspberry Pi reconozca el modem USB 3G como modem y no como unidad de alamacenamiento, y que lo haga tras un reinicio
- Que se conecte a internet a través del modem USB
- 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