Raspberry-pi : connection 3G et envoi de SMS (en même temps)

RaspberryPi avec une clé 3G

J'ai en tête depuis un moment de mettre en place un système de "rescue" sur mon réseau à la maison. L'idée est d'avoir un rPi avec une clé 3G qui permette d'envoyer des SMS en cas de problème (coupure d'électricité, connection ADSL down, etc...) et un acces internet indépendant de l'acces ADSL principal (pour venir voir de l'exterieur, ou sortir sur les internets de la maison si l'ADSL est down).

Pour faire ca, la première étape est de trouver une clé 3G et une carte SIM avec un petit forfait (idéalement SMS illimité, et un peu de data, avec la possibilité de prendre plus de data occasionelement). Ensuite il faut configurer tout ca pour pouvoir envoyer des sms (avec gammu-smsd) et maintenir la connection 3G (qui fait passer surtout un lien VPN). Ce post présente une partie du setup.

Configuration de la clé 3G (modeswitch)

Première chose à faire : faire marcher ca clé 3G sur le raspberry Pi... Il peut-être utile de consulter cette liste de clés supportées.

J'utilise une clé alcatel X500D qui fonctionne out of the box (bien que non présent dans la liste sur elinux.org). La principale difficulté avec ce genre de périphérique est de les faire switcher en mode "modem", car par défaut ils se présentent comme de lecteurs de CD-Rom (avec les drivers dedans... pour windows).

Attention à l'allimentation: les clé 3G on tendance à consomer pas mal... Ma clé X500D fini par faire freezer completement le rPi (B+) à priori à cause d'un pb d'allimentation insifisante. Avec un allimentation USB dédié pour la clé il semble ne plus y avoir de problème. Sinon ca marche avec une (seule) allimentation 2A et en configurant max_usb_current=1 dans /boot/config.txt.

Il est possible de vérifier les log systeme lorsque l'on branche la clé pour voir ce qu'il se passe. J'ai ca :

$ tail -50 /var/log/syslog 
Sep 11 20:28:36 rescuepi kernel: [  703.597477] usb 1-1.4: new high-speed USB device number 4 using dwc_otg
Sep 11 20:28:36 rescuepi kernel: [  703.700651] usb 1-1.4: New USB device found, idVendor=1bbb, idProduct=f000
Sep 11 20:28:36 rescuepi kernel: [  703.700691] usb 1-1.4: New USB device strings: Mfr=3, Product=2, SerialNumber=4
Sep 11 20:28:36 rescuepi kernel: [  703.700715] usb 1-1.4: Product: HSPA Data Card
Sep 11 20:28:36 rescuepi kernel: [  703.700734] usb 1-1.4: Manufacturer: USBModem
Sep 11 20:28:36 rescuepi kernel: [  703.700751] usb 1-1.4: SerialNumber: 1234567890ABCDEF
Sep 11 20:28:37 rescuepi kernel: [  704.046191] usb-storage 1-1.4:1.0: USB Mass Storage device detected
Sep 11 20:28:37 rescuepi kernel: [  704.055754] scsi host0: usb-storage 1-1.4:1.0
Sep 11 20:28:37 rescuepi usb_modeswitch: switching device 1bbb:f000 on 001/004
Sep 11 20:28:37 rescuepi kernel: [  704.897142] usb 1-1.4: USB disconnect, device number 4
Sep 11 20:28:43 rescuepi kernel: [  710.257597] usb 1-1.4: new high-speed USB device number 5 using dwc_otg
Sep 11 20:28:43 rescuepi kernel: [  710.362814] usb 1-1.4: New USB device found, idVendor=1bbb, idProduct=0017
Sep 11 20:28:43 rescuepi kernel: [  710.362856] usb 1-1.4: New USB device strings: Mfr=3, Product=2, SerialNumber=4
Sep 11 20:28:43 rescuepi kernel: [  710.362879] usb 1-1.4: Product: HSPA Data Card
Sep 11 20:28:43 rescuepi kernel: [  710.362898] usb 1-1.4: Manufacturer: USBModem
Sep 11 20:28:43 rescuepi kernel: [  710.362914] usb 1-1.4: SerialNumber: 1234567890ABCDEF
Sep 11 20:28:43 rescuepi kernel: [  710.709550] usb-storage 1-1.4:1.4: USB Mass Storage device detected
Sep 11 20:28:43 rescuepi kernel: [  710.711631] scsi host1: usb-storage 1-1.4:1.4
Sep 11 20:28:43 rescuepi kernel: [  710.917702] usbcore: registered new interface driver usbserial
Sep 11 20:28:43 rescuepi kernel: [  710.917970] usbcore: registered new interface driver usbserial_generic
Sep 11 20:28:43 rescuepi kernel: [  710.918125] usbserial: USB Serial support registered for generic
Sep 11 20:28:44 rescuepi kernel: [  711.002538] usbcore: registered new interface driver option
Sep 11 20:28:44 rescuepi kernel: [  711.005207] usbserial: USB Serial support registered for GSM modem (1-port)
Sep 11 20:28:44 rescuepi kernel: [  711.006277] option 1-1.4:1.0: GSM modem (1-port) converter detected
Sep 11 20:28:44 rescuepi kernel: [  711.009558] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB0
Sep 11 20:28:44 rescuepi kernel: [  711.010331] option 1-1.4:1.1: GSM modem (1-port) converter detected
Sep 11 20:28:44 rescuepi kernel: [  711.019576] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB1
Sep 11 20:28:44 rescuepi kernel: [  711.020416] option 1-1.4:1.2: GSM modem (1-port) converter detected
Sep 11 20:28:44 rescuepi kernel: [  711.026240] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB2
Sep 11 20:28:44 rescuepi kernel: [  711.027006] option 1-1.4:1.3: GSM modem (1-port) converter detected
Sep 11 20:28:44 rescuepi kernel: [  711.033926] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB3
Sep 11 20:28:44 rescuepi kernel: [  711.034799] option 1-1.4:1.5: GSM modem (1-port) converter detected
Sep 11 20:28:44 rescuepi kernel: [  711.036435] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB4

On peut verifier que l'on a un certain nombre de /dev/ttyUSBx (ca peut être aussi des /dev/ttyACMx)

$ ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2  /dev/ttyUSB3  /dev/ttyUSB4

Si votre clé n'est pas reconu, je vous laisse avec google (ou "duckduckgoer)" pour trouver comment faire !

Note : avec une clé TP-Link MA260 que j'ai finalement réussi a faire "modeswitcher" grace à cette doc (merci à l'auteur !), je n'ai que /dev/ttyUSB0, /dev/ttyUSB1 et /dev/ttyUSB2. Le /dev/ttyUSB2 marche bien pour la connection 3G, mais je n'ai pas réussi a envoyer des SMS...

Connection 3G

Code pin: le plus simple est de virer la protection de la SIM par code PIN (en utilisant un téléphone classique).

La connection 3G est géré par wvdial. Il se configure dans le fichier /etc/wvdial.conf. Voici ma configuration :

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = AT+CGDCONT=1,"IP","internet69"
Stupid Mode = 1
Modem Type = Analog Modem
ISDN = 0
New PPPD = yes
Phone = *99#
Modem = /dev/ttyUSB4
Username = '';
Password = '';
Baud = 460800
Auto DNS = Off

En fonction du FAI, il faut changer le internet69 par le nom de l'APN qui va bien. Il faut par contre tester les différents /dev/ttyUSBx pour trouver celui qui marche.

Pour tester wvdial :

$ sudo wvdial

On peut donc itérer pour trouver le bon /dev/ttyUSBx (je n'ai pas plus efficace que de tout tester à la main, des idées ?). Une fois que ca marche il faut configurer de /etc/network/interface pour que la connection soit établie au démarage. Voici ce qu'il faut ajouter a /etc/network/interface :

auto ppp0
iface ppp0 inet wvdial

A noter, il est possible de tester cette config avec :

$ sudo ifup ppp0
$ sudo ifdown ppp0

Configuration de routes statiques

Pour mon installation cette connection 3G est juste la en secours. Je ne veux donc y faire passer (par defaut) que le trafique vers un serveur VPN distant. Pour ca je rajoute une route statique dans /etc/network/interfaces :

# clé 3G
auto ppp0
iface ppp0 inet wvdial
    # Route vers kimlux
    up sleep 5 && route add -host IP_SERVER_VPN ppp0
    down route del -host IP_SERVER_VPN ppp0

A noté: j'ai besoin de rajouter un sleep 5 un peu crade, sinon l'ajout de la route semble fait avant que ppp0 ne soit réelement up, et ca foire... si vous avez une meilleure solution, je suis preneur !

Ne pas utiliser les DNS fournis par le FAI

wvdial à la facheuse tendance a prendre les serveurs dns que propose notre FAI 3G... Pour éviter cela, il faut editer le fichier /etc/ppp/peers/wvdial et commenter la ligne usepeerdns :

#usepeerdns

Il faut aussi desactiver Auto DNS dans la config de wvdial. dans /etc/wvdial.conf :

Auto DNS = Off

Envoyer des SMS avec Gammu

Voyons maintenant comment envoyer des SMS (alors que la connection 3G est active). On va utilisé un soft qui s'appelle Gammu, et en particulier gammu-smsd. Il se configure assez facilement par le fichier /etc/gammu-smsdrc. Voici ma config :

[gammu]
port = /dev/ttyUSB3
connection = at

[smsd]
service = files
logfile = syslog
# Increase for debugging information
#debuglevel = 4
debuglevel = 0
RunOnReceive = /var/www/RaspiSMS/parseSMS.sh
# Paths where messages are stored
inboxpath = /var/spool/gammu/inbox/
outboxpath = /var/spool/gammu/outbox/
sentsmspath = /var/spool/gammu/sent/
errorsmspath = /var/spool/gammu/error/

La seule difficulté de configuration consite a trouver le bon /dev/ttyUSBx. La encore on test... Pour ca on peut passer le debuglevel à '4' et ensuite lancer à la main gammu-smsd dans un terminal et surveiller le log dans un autre terminal (avec screen ou byobu par exemple).

Dans un 1er terminal :

$ tail -f /var/log/syslog

Dans un second terminal :

$ sudo service stop gammu-smsd
$ sudo gammu-smsd

Il suffit de recommencer avec les différents /dev/ttyUSBx jusqu'à trouver le bon... cad quand les log ne donnent plus d'erreur. Une fois que c'est bon il faut relancer le service en tache de fond :

$ sudo service restart gammu-smsd

Ensuite pour tester l'envoie d'un SMS:

$ sudo gammu-smsd-inject TEXT 0601234567 -text "Hello world"

Il est aussi possible de surveiller l'activité de gammu-smsd avec :

$ sudo gammu-smsd-monitor

Il est possible d'envoyer les SMS en depuis un petit script Python, avec les binding Python de Gammu, j'y reviendrait certainement plus tard. Aussi, il est possible de déclancher des actions en cas de réception de SMS.