Partenaires

CNRS
RESIF
DT
UNAVCO Facility

Rechercher

sur ce site

sur web cnrs


Accueil > Documentation technique > télécommunications > modem GPRS Fastrack M1306B sous linux

modem GPRS Fastrack M1306B sous linux

par Olivier Charade - 28 avril 2009 - modifié le 30 avril 2009

Nous décrivons ici l’établissement d’une liaison IP depuis un système Linux àtravers le réseau Orange en France métropolitaine. Certains détails changent non pas du fait du type modem, mais de l’opérateur choisi et du lieu d’exploitation.

Le système Linux est un Damn Small Linux implanté sur une carte Soekris comme décrit dans Damn Small Linux sur Soekris 4801. L’aspect minimaliste des outils disponibles dans cette configuration accroît l’intérêt pédagogique de la démonstration.


Le modem Fastrack M1306B de Wavecom est maintenant référencé parmi les produits obsolètes du constructeur, mais rien dans la procédure de connexion n’est réellement dépendant du type de modem. Ce qui est en revanche primordial, c’est qu’il s’agit d’un modem externe connecté au système Linux par un port série. La procédure pour un modem intégré dans une carte PCMCIA se révèle parfois beaucoup plus lourde car elle peut nécessiter l’installation de pilotes supplémentaires correspondant àcette carte, ainsi que l’empilage de liaisons au niveau du script de connexion (d’abord la carte PCMCIA puis le modem lui-même).

Le gros du travail a consisté àécumer les forums du Web en faisant une recherche non sur le type de modem, mais bien sur l’opérateur. En l’occurence, j’ai trouvé mon bonheur en demandant àGoogle : ppp fichier chat orange et c’est peut-être le point clef de cet article s’il doit servir àmettre en place une connexion sur un autre réseau GPRS.

La carte SIM que j’ai mise dans le modem provenait d’une carte PCMCIA Business Everywhere G+/G/EDGE/GPRS fournie bien entendu avec tout ce qu’il faut pour Windows mais rien du tout pour Linux.

La première étape consiste àconnecter le modem sur le port série (port série ttyS1 sur la Soekris pour un problème évoqué ailleurs) et àutiliser un hyperterminal pour vérifier qu’on sait parler avec lui. Sur DSL, nous lançons microcom [1] :

dsl@ttyp0[dsl]$ sudo microcom
Try /dev/ttyS0
/dev/ttyS0 not responding

Try /dev/ttyS1
at&f

OK
Modem found on /dev/ttyS1

atz
OK
at+CSQ?
+CSQ: 12,3
OK
at+cpin?
+CPIN: SIM PIN
at+cpin=0000
OK
at+cpin?
+CPIN: READY
at+creg?
+CREG: 0,2
OK

Cela nous permet de déverrouiller le code PIN. On commence par vérifier la force du signal reçu (Carrier Signal Quality). Wavecom indique qu’une valeur entre 0 et 10 aurait été insuffisante. Ici nous avons une valeur suffisante de 12 alors que nous utilisons une antenne quart d’onde même pas montée sur un plan métallique. On notera la différence de réponse àla question sur le code PIN selon que ce dernier a déjàété entré ou non. On termine en demandant si la carte SIM a été reconnue (« registrered ») par le réseau de l’opérateur. Une réponse +CREG: 0,0 serait négative [2].

Ensuite nous allons créer un fichier de configuration ppp assez standard. Sous les distributions classiques il se trouve dans /etc/ppp . Pour des question de persistence, tout le répertoire ppp a été placé sous /opt sur notre pc embarqué.

dsl@ttyp0[dsl]$ cat /opt/ppp/options-gprs
/dev/ttyS1
9600
crtscts
modem
noauth
debug
ipcp-accept-local
ipcp-accept-remote
lcp-echo-failure 0
lcp-echo-interval 0
nomagic
nomp
noccp
nopredictor1
novj
novjccomp
nobsdcomp
defaultroute
noipdefault
usepeerdns
user orange
connect "/usr/sbin/chat -vf /opt/ppp/peers/orange-auto"

L’option àne pas louper est noipdefault (associée àusepeerdns) , qui dit àppp de ne pas choisir lui-même son adresse IP mais de prendre la configuration réseau que son correspondant lui attribuera.

Sinon on retrouve les options classiques d’un fichier ppp et le plus simple lors de sa création est de recopier celui trouvé dans sa distribution pour le modifier juste ce qu’il faut. On reconnaît au début la configuration de la ligne série. L’option noauth évite des soucis supplémentaires d’authentification entre les deux acteurs de la liaison ppp et l’option debug permet d’avoir quelques pistes dans les logs du système en cas de problème.

Chez Orange, tous les forums indiquent que l’utilisateur doit être orange avec le mot de passe orange. On donne donc ce nom d’utilisateur dans le fichier de configuration ppp, et on l’associe àson mot de passe dans les deux fichiers d’authentification potentiellement utilisés lors de l’établissement de la liaison.

dsl@ttyp0[dsl]$ cat /opt/ppp/chap-secrets
#client server secret IP
"orange" * "orange"
""       *    ""  -
dsl@ttyp0[dsl]$ cat /opt/ppp/pap-secrets
#client server secret IP
"orange" * "orange" *
""       *    ""        *

La dernière ligne de chaque fichier ne sert pas dans le cas présent : c’est celle qui autorise les connexions ppp entrantes lorsque ma Soekris répond au téléphone. Mais si je l’avais cachée dans cet article, certains se seraient demandés pourquoi le système m’avertissait que j’ouvrais les accès au monde entier (cf : le log de connexion donné plus loin).

Les différentes options ipcp, lcp et no-quelquechose peuvent ne pas être nécessaires selon la façon dont l’opérateur gère la connexion. J’ai pris tout ce que j’ai trouvé sur les forums et j’ai retiré les options que ma version ancienne de ppp (puisque DSL est basé sur une distribution Debian old-stable pour en garantir la robustesse) ne reconnaissait pas.

Enfin nous arrivons au fichier chat (« bavarder ») qui constitue le point sensible de l’opération. Je vais prendre le temps d’expliquer ce qui s’y passe car c’est làqu’il faut savoir adapter les paramètres au réseau sur lequel on se connecte. Certains éléments ne peuvent d’ailleurs pas s’inventer et, comme le support technique des opérateurs ne s’intéresse souvent pas àLinux, Google reste ici notre seul ami.

dsl@ttyp0[dsl]$ cat /opt/ppp/peers/orange-auto
###########################################
# Suggested chat script called by PPPD
# File: orange-auto
# source: http://arisme.free.fr/Novatel
###########################################
ABORT BUSY
ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT 'VOICE'
ABORT 'NO DIALTONE'
ABORT 'NO ANSWER'
ABORT DELAYED
'' ATZ
OK ATM0
OK AT+CGDCONT=1,"IP","internet-entreprise"
OK ATD*99***1#
CONNECT ""
###########################################

Il s’agit de prévoir tout le dialogue entre le pc et le modem. Si ça ne marche pas du premier coup, une façon de chercher ce qui ne va pas consiste àle faire àla main sous un hyperterminal. Après les différents messages d’erreur que le modem peut émettre pendant son essai de connexion vers le monde extérieur, on trouve le dialogue lui-même dans l’ordre des répliques :

Dès qu’on a la communication sur la ligne série (donc une chaîne vide : le modem ne dit rien), on lui dit ATZ qui va lui permettre de se régler sur la vitesse de la ligne série. Lorsqu’il l’a fait, il répond OK et nous lui renvoyons alors ATM0. Je ne suis pas sà»r de savoir àquoi sert de lui dire de ne jamais activer son haut-parleur (commande Hayes M0) mais je ne vais changer un texte qui a fait ses preuves. Il va encore nous répondre OK et làse place une commande clef que j’ai dà» tester àla main pour qu’elle passe.

Celle que j’avais initialement trouvée était AT+CGDCONT=2,"IP","orange.fr" suivie de ATD*99***2# . Le numéro, initialement 2 que j’ai transformé en 1 (sur les deux commandes !), est le CID (Context ID) qui identifie le type de données GPRS qui va circuler (WAP, MMS, etc.). A ce CID on commence par associer un profil en indiquant que ce sera de l’IP et que le point d’accès (APN) sera « internet-entreprise ». Ensuite on lance la numérotation (commande ATD) en précisant le CID en fin de numéro. Le numéro appelé a toujours une drôle de tête lorsqu’on n’est plus sur les lignes téléphoniques traditionnelles. J’ai trouvé le bon CID en les essayant jusqu’àce que le modem me réponde OK au lieu de ERROR.
J’ai eu plus de mal àm’apercevoir que le nom du point d’accès était mauvais. La solution a été de vérifier les paramètres de la communication sur un ordinateur portable sous Windows sur lequel j’ai installé la carte fournie par l’opérateur àl’aide de son logiciel. L’application Business Everywhere donne cette indication dans les propriétés de la connexion.

On peut maintenant lancer la laison ppp et vérifier le log :

dsl@ttyp0[dsl]$ sudo pppd file /opt/ppp/options-gprs &
[1] 748
dsl@ttyp0[dsl]$ sudo cat /var/log/messages
Apr 24 09:54:07 box authpriv.notice sudo:      dsl : TTY=ttyp0 ; PWD=/ramdisk/home/dsl ; USER=root ; COMMAND=/usr/sbin/pppd file /opt/ppp/options-gprs
Apr 24 09:54:08 box local2.notice pppd[748]: pppd 2.4.1 started by dsl, uid 0
Apr 24 09:54:09 box local2.info chat[751]: abort on (BUSY)
Apr 24 09:54:09 box local2.info chat[751]: abort on (NO CARRIER)
Apr 24 09:54:09 box local2.info chat[751]: abort on (ERROR)
Apr 24 09:54:09 box local2.info chat[751]: abort on (VOICE)
Apr 24 09:54:09 box local2.info chat[751]: abort on (NO DIALTONE)
Apr 24 09:54:09 box local2.info chat[751]: abort on (NO ANSWER)
Apr 24 09:54:09 box local2.info chat[751]: abort on (DELAYED)
Apr 24 09:54:09 box local2.info chat[751]: send (ATZ^M)
Apr 24 09:54:09 box local2.info chat[751]: expect (OK)
Apr 24 09:54:09 box local2.info chat[751]: ATZ^M^M
Apr 24 09:54:09 box local2.info chat[751]: OK
Apr 24 09:54:09 box local2.info chat[751]:  -- got it
Apr 24 09:54:09 box local2.info chat[751]: send (ATM0^M)
Apr 24 09:54:09 box local2.info chat[751]: expect (OK)
Apr 24 09:54:09 box local2.info chat[751]: ^M
Apr 24 09:54:09 box local2.info chat[751]: ATM0^M^M
Apr 24 09:54:09 box local2.info chat[751]: OK
Apr 24 09:54:09 box local2.info chat[751]:  -- got it
Apr 24 09:54:09 box local2.info chat[751]: send (AT+CGDCONT=1,"IP","internet-entreprise"^M)
Apr 24 09:54:10 box local2.info chat[751]: expect (OK)
Apr 24 09:54:10 box local2.info chat[751]: ^M
Apr 24 09:54:10 box local2.info chat[751]: AT+CGDCONT=1,"IP","internet-entreprise"^M^M
Apr 24 09:54:10 box local2.info chat[751]: OK
Apr 24 09:54:10 box local2.info chat[751]:  -- got it
Apr 24 09:54:10 box local2.info chat[751]: send (ATD*99***1#^M)
Apr 24 09:54:10 box local2.info chat[751]: expect (CONNECT)
Apr 24 09:54:10 box local2.info chat[751]: ^M
Apr 24 09:54:10 box local2.info chat[751]: ATD*99***1#^M^M
Apr 24 09:54:10 box local2.info chat[751]: CONNECT
Apr 24 09:54:10 box local2.info chat[751]:  -- got it
Apr 24 09:54:10 box local2.info chat[751]: send (^M)
Apr 24 09:54:10 box local2.info pppd[748]: Serial connection established.
Apr 24 09:54:11 box local2.debug pppd[748]: using channel 1
Apr 24 09:54:11 box local2.info pppd[748]: Using interface ppp0
Apr 24 09:54:11 box local2.notice pppd[748]: Connect: ppp0 <--> /dev/ttyS1
Apr 24 09:54:12 box local2.warn pppd[748]: Warning - secret file /etc/ppp/pap-secrets has world and/or group access
Apr 24 09:54:12 box local2.debug pppd[748]: sent [LCP ConfReq id=0x1 <asyncmap 0x0> <pcomp> <accomp>]
Apr 24 09:54:12 box local2.debug pppd[748]: rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <pcomp> <accomp>]
Apr 24 09:54:13 box local2.debug pppd[748]: rcvd [LCP ConfReq id=0x1 <mru 1500> <asyncmap 0x0> <pcomp> <accomp> <auth pap>]
Apr 24 09:54:13 box local2.debug pppd[748]: sent [LCP ConfAck id=0x1 <mru 1500> <asyncmap 0x0> <pcomp> <accomp> <auth pap>]
Apr 24 09:54:13 box local2.warn pppd[748]: Warning - secret file /etc/ppp/pap-secrets has world and/or group access
Apr 24 09:54:13 box local2.debug pppd[748]: sent [PAP AuthReq id=0x1 user="orange" password=<hidden>]
Apr 24 09:54:16 box local2.debug pppd[748]: sent [PAP AuthReq id=0x2 user="orange" password=<hidden>]

On voit bien le dialogue qui aboutit àune connexion. En l’absence de message d’erreur on peut vérifier l’existence de la nouvelle connexion (en plus de mes trois liaisons Ethernet - excusez du peu - et de la boucle interne) :

dsl@ttyp0[dsl]$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:00:24:C1:C4:24
         inet addr:200.0.1.8  Bcast:200.0.1.255  Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:2353 errors:0 dropped:0 overruns:0 frame:0
         TX packets:2164 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:195076 (190.5 KiB)  TX bytes:155699 (152.0 KiB)
         Interrupt:10 Base address:0x9000

eth1      Link encap:Ethernet  HWaddr 00:00:24:C1:C4:25                        
         inet addr:192.168.1.1  Bcast:191.168.1.255  Mask:255.255.255.0
         UP BROADCAST MULTICAST  MTU:1500  Metric:1                            
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
         Interrupt:10 Base address:0xb000

eth2      Link encap:Ethernet  HWaddr 00:00:24:C1:C4:26
         inet addr:192.168.2.1  Bcast:191.168.2.255  Mask:255.255.255.0
         UP BROADCAST MULTICAST  MTU:1500  Metric:1
         RX packets:0 errors:0 dropped:0 overruns:0 frame:0
         TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
         Interrupt:10 Base address:0xd000

lo        Link encap:Local Loopback
         inet addr:127.0.0.1  Mask:255.0.0.0
         UP LOOPBACK RUNNING  MTU:16436  Metric:1
         RX packets:2 errors:0 dropped:0 overruns:0 frame:0
         TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:0
         RX bytes:100 (100.0 B)  TX bytes:100 (100.0 B)

ppp0      Link encap:Point-to-Point Protocol
         inet addr:80.10.53.73  P-t-P:192.168.111.111  Mask:255.255.255.255
         UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
         RX packets:3 errors:0 dropped:0 overruns:0 frame:0
         TX packets:3 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:3
         RX bytes:54 (54.0 B)  TX bytes:54 (54.0 B)

La liaison sera coupée par un simple kill -9 sur le PID du processus pppd qu’on trouvera par une commande ps.

Malheureusement, il reste encore deux détails qui posent problème dans ma configuration :

D’abord, les DNS qu’on a vu signalés dans le log n’ont pas été pris en compte par DSL, car le fichier /etc/resolv.conf n’a pas changé, en dépit de l’option usepeerdns de la commande pppd. Je dois donc le changer àla main.

Ensuite, la route par defaut n’a pas non plus été modifiée du fait de la complexité de ma configuration réseau (je pense qu’une carte àune seule interface Ethernet - avec une IP fixe - connectée uniquement au récepteur n’aurait pas posé de problème àce niveau). Làje donne les deux commandes àpasser car, même si tout le monde les connaît en gros, je perds souvent du temps àen retrouver la syntaxe exacte :

sudo route del default
sudo route add default gateway 192.168.111.111

Il y a bien sà»r moyen de vérifier ce qu’on vient de faire :

bash-2.05b# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.111.111 0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 eth2
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
200.0.1.0       0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         192.168.111.111 0.0.0.0         UG    0      0        0 ppp0
bash-2.05b#

La passerelle par défaut correspond àla destination 0.0.0.0 (tous les réseaux).

Et enfin un ping ou un wget passe !


[1Attention : je travaille par une connexion ssh sur ma Soekris ! Cette même commande depuis un hyperterminal sur le port série 1 (/dev/ttyS0) crée un« verrou mortel » dont on ne sort que si une autre session vient tuer le processus correspondant. Dans ce cas de figure il faut préciser sudo microcom -D/dev/ttyS1

[2La commande AT+CREG correspond àla partie GSM de la carte SIM, celle qui a un vrai numéro de téléphone qu’on peut appeler comme au bon vieux temps des lignes téléphoniques analogiques. L’équivalent GPRS, AT+CGREG, nous dit que la carte n’est pas enregistrée. Ce sera fait àtravers la procédure qui suit. Mais ça n’aurait pas été la peine d’aller plus loin si le GSM n’avait pas été valide.