bagneris.net


geek stuff > connexion internet via gprs

Utilisation d'un téléphone mobile GPRS avec GNU/Linux

J'explique ici comment j'ai pu exploiter mon mobile GPRS pour connecter mon portable à Internet par l'infrarouge. Ces informations sont spécifiques à ma configuration matérielle et logicielle, mais facilement transposables.

Comme d'habitude, tout cela fonctionne chez moi, mais vous est livré sans garantie d'aucune sorte. En particulier, suivez bien les recommandations du Linux Infrared Howto (voir liens) en ce qui concerne les précautions à prendre avant les premiers tests.

Le matériel et les logiciels utilisés :

Voici les étapes nécessaires :

  1. Mise en place de l'infrarouge sur le T20
  2. Configuration GPRS du téléphone
  3. Configuration pppd
  4. Paramètres des chatscripts
  5. Mise en place des DNS
  6. Test de la connexion
  7. Se connecter en trois lignes (quand tout fonctionne !)

Pour finir, on trouvera les liens dont je me suis largement inspiré pour ce document.

Mise en place de l'infrarouge sur le T20

Avant toute chose, utilisons la simplicité debian :

$ sudo apt-get install irda-common irda-tools

Ces deux paquets installeront les programmes nécessaires, tels que irattach, findchip, irdadump.

J'ai suivi les informations du Linux Infrared Howto (voir les liens) en ce qui concerne la compilation des modules et leur configuration.

Il faut bien sûr vérifier au niveau du BIOS que le port infrarouge de la machine est bien activé, et en noter au passage les paramètres (IRQ, port et DMA).

Il existe trois sortes de drivers infrarouges de bas niveau : SIR, dongle et FIR. Le FIR permet d'obtenir de plus grandes vitesses, mais n'est pas forcément reconnu - cela dépend du chipset de votre machine.

Le chipset FIR du Thinkpad T20 est parfaitement reconnu :

$ sudo findchip -v
Found NSC PC87338 Controller at 0x2e, DevID=0x0b, Rev. 2
    SIR Base 0x2f8, FIR Base 0x2f8
    IRQ = 3, DMA = 3
    Enabled: yes, Suspended: no
    UART compatible: yes
    Half duplex delay = 0 us

Les paramètres d'adresse, d'IRQ et de DMA sont bien sûr ceux choisis au niveau du BIOS.

Les options de compilation du noyau que j'ai retenues sont les suivantes (j'ai supprimé quelques lignes concernant des options inutiles) :

#
# IrDA (infrared) support
#
CONFIG_IRDA=m
#
# IrDA protocols
#

CONFIG_IRLAN=m
CONFIG_IRNET=m
CONFIG_IRCOMM=m
# CONFIG_IRDA_ULTRA is not set

#
# IrDA options
#
CONFIG_IRDA_CACHE_LAST_LSAP=y
CONFIG_IRDA_FAST_RR=y
CONFIG_IRDA_DEBUG=y

#
# Infrared-port device drivers
#
# SIR device drivers
#
CONFIG_IRTTY_SIR=m
#
# FIR device drivers
#
CONFIG_NSC_FIR=m

J'ai adapté la configuration des modules de façon à intégrer le module nsc-ircc qui gère le chipset NSC PC87338, et à m'assurer qu'il n'y a pas de conflit sur les dispositifs série qui empêcherait le montage de celui-ci (voir la ligne pre-install).

Voici le contenu de /etc/modutils/irda :

# la ligne ci-dessous est commentée car le module
# irtty n'est pas nécessaire pour moi dans la mesure
# ou j'utilise le driver FIR nsc-ircc
# alias tty-ldisc-11 irtty
alias char-major-161 ircomm-tty
# alias char-major-60 ircomm_tty
alias char-major-10-187 irnet

# module FIR
alias irda0 nsc-ircc
pre-install nsc-ircc setserial /dev/ttyS1 uart none
# cette option semble nécessaire pour certains téléphones mobiles :
options ppp_async flag_time=0

Et bien sûr, ne pas oublier après toute modification :

$ sudo update-modules
$ sudo depmod -a

Pour activer l'infrarouge, il est primordial que le module serial ne soit pas monté avant le module irda. On peut alors mettre en place les modules et activer la détection de périphériques infrarouges en une seule commande :

$ sudo irattach irda0 -s

Quelques contrôles :

$ ifconfig
irda0     Lien encap:IrLAP  HWaddr 1e:cf:c7:34
          UP RUNNING NOARP  MTU:2048  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:875 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 lg file transmission:8
          RX bytes:0 (0.0 b)  TX bytes:27375 (26.7 KiB)
[...]
$ lsmod | grep ir
nsc-ircc               13528   1
irda                  135692   1 [nsc-ircc]
$ tail /var/log/syslog
Jan  1 23:26:34 IBM_T20 kernel: nsc-ircc, Found chip at base=0x02e
Jan  1 23:26:34 IBM_T20 kernel: nsc-ircc, driver loaded (Dag Brattli)
Jan  1 23:26:34 IBM_T20 kernel: IrDA: Registered device irda0
Jan  1 23:26:34 IBM_T20 kernel: nsc-ircc, Found dongle: Sharp RY5HD01
Jan  1 23:26:34 IBM_T20 irattach: executing: 'echo 1 > /proc/sys/net/irda/discovery'
Jan  1 23:26:34 IBM_T20 irattach: Starting device irda0
Jan  1 23:26:34 IBM_T20 irattach: executing: 'echo IBM_T20 > /proc/sys/net/irda/devname'
Jan  1 23:26:34 IBM_T20 kernel: irlap_change_speed(), setting speed to 9600

On peut alors activer l'infrarouge du téléphone (Connexions / Activation IR / Activé) et le détecter :

$ cat /proc/net/irda/discovery
IrLMP: Discovery log:
nickname: T300, hint: 0x9124, saddr: 0x1ecfc734, daddr: 0x00005d05

Configuration GPRS du téléphone

Le GPRS (General Packet Radio Service) est un service relativement nouveau, complémentaire du traditionnel GSM. Avec le GPRS, la transmission se fait par paquets, et est donc facturée à la quantité, et non au temps passé. De plus les débits obtenus sont comparables à ceux d'un modem classiques, ce qui est bien meilleur que les tentatives de connexion via GSM.

Le forfait GPRS de mon opérateur me permet ainsi la transmission de 10 Mo par mois, ce qui dans un sens est ridicule, mais dans un autre est suffisant pour récupérer mes e-mails lorsque je suis absent du bureau ou de chez moi.

Les explications données ici permettent d'utiliser le modem du téléphone pour connecter l'ordinateur à Internet via mon opérateur, ce qui est différent du WAP ou de la récupération des e-mails sur le téléphone - qui sont possibles également avec le même forfait. Mais je me vois mal récupérer sur mon téléphone les mails reçus du boulot, avec force attachements Word et compagnie, pour parfois une simple note (gros gros soupir...)

Pour pouvoir se connecter au GPRS, il faut envoyer un certain nombre de paramètres fournis par votre opérateur. Ces paramètres peuvent être stockés dans le téléphone ou transmis à celui-ci avant la connexion proprement dite. Mon téléphone, acheté dans un coffret opérateur, était préconfiguré pour un certain nombre de profils (WAP, e-mail, MMS), mais pas pour le transfert de données.

Un coup de fil à l'opérateur permet d'obtenir les paramètres nécessaires. Certains téléphones peuvent même être configurés automagiquement à partir d'un SMS (OTA configuration : On The Air).

Les principaux paramètres à renseigner (dans le téléphone) sont les suivants :

APN (Access Point Name)
Fourni par l'opérateur, « websfr » dans mon cas.
ID utilisateur, Mot de passe
Sans commentaire, laissés vides dans mon cas.
Adresse IP
Laissée vide ici.
Adresse DNS
172.20.2.10 DNS primaire pour SFR.

Pour renseigner ces paramètres dans le Sony Ericsson T300, choisir le menu Connexions / Comm. Data / Comptes Data / Ajouter Compte.

Bien noter le numéro CID fourni lorsqu'on a validé les informations : il servira à identifier ce profil (parmi les autres, WAP etc.) au moment de la connexion.

Configuration pppd

La connexion entre l'ordinateur et le téléphone se fait par infrarouge, via /dev/ircomm0, et est gérée par /usr/sbin/pppd. Ce dernier à son tour utilise /usr/sbin/chat pour converser avec le modem.

Nous allons indiquer les paramètres nécessaires à chacun de ces programmes dans des fichiers de configuration.

Les paramètres de pppd sont lus par défaut successivement dans les fichiers suivants (voir manpage) :

/etc/ppp/options
~/.ppprc
/etc/ppp/options.ircomm0

De plus, on peut indiquer à pppd un fichier de paramètres particulier, stocké dans /etc/ppp/peers/, dont le nom lui sera fourni sur la ligne de commande par

$ pppd call nom du fichier

Dans ce cas, on pourra placer dans /etc/chatscripts/ la configuration de chat correspondante (voir ci-dessous). Ce fonctionnement est très utilisé, et en particulier par pppconfig sous debian.

Il faut vérifier qu'aucune option des fichiers cités plus haut ne peut gêner la connexion. Il s'agit en particulier de lcp-echo-interval et lcp-echo-failure (voir le GPRS HOWTO). Ces deux options sont présentes par défaut dans /etc/ppp/options, je les ai donc commentées, et ajoutées au fichier de connexion « classique » par le modem de l'ordinateur /etc/ppp/options.modem.

Contenu commenté de /etc/ppp/peers/gprs :

# /etc/ppp/peers/gprs
# fichier de configuration pppd
# JcB - 30/12/2002

# Ne pas fonctionner en arrière-plan et très bavard
nodetach
debug

# Pas de Harware flow control pour IrDa
nocrtscts

# Pas de "carrier detection signal" dans le GPRS via IrDa
local

# interface et vitesse de transmission
/dev/ircomm0
115200

# scripts de connexion et déconnexion
connect "/usr/sbin/chat -v -f /etc/chatscripts/gprs-connect"
disconnect "/usr/sbin/chat -v -f /etc/chatscripts/gprs-disconnect"

# pppd ne propose pas d'adresse IP à l'autre extrémité...
noipdefault
# ...et accepte son idée de notre adresse IP
ipcp-accept-local
# l'interface ppp devient la route par défaut dans la table de routage
defaultroute

# options de compression
# Il semble que la compression soit ici inutile entre l'ordinateur et le
# téléphone, car le goulot d'étranglement est plutôt le GPRS
novj
nobsdcomp
novjccomp
nopcomp
noaccomp

# authentification
# le téléphone n'a pas à s'identifier
noauth

# normalement inutile
user jcb

# passe ce paramètre aux scripts ip-up
# nécessaire pour mettre en place les paramètres
# de dns (voir ci-dessous)
ipparam gprs
#remotename gprs

Paramètres des chatscripts

Passons aux paramètres de connexion...(/etc/chatscripts/gprs-connect)

TIMEOUT 5
ECHO ON
ABORT 'BUSY'
ABORT 'ERROR'
ABORT 'NO ANSWER'
ABORT 'NO CARRIER'
ABORT 'NO DIALTONE'
'' "\rATZ"
TIMEOUT 12
SAY "CTRL-C pour déconnecter\n"
SAY "Envoi des paramètres de connexion\n"
OK 'ATD*98*3#'
TIMEOUT     22
SAY "\nAttente de connexion...\n"
CONNECT     ""
SAY "\nConnecté\n"

... et de déconnexion (/etc/chatscripts/gprs-disconnect) :

ABORT 'BUSY'
ABORT 'ERROR'
ABORT 'NO DIALTONE'
SAY "Arrêt du modem\n"
"" "\K"
"" "+++ATH"
SAY "Connexion terminée\n"

Deux commandes AT sont utilisées lors de la connexion. Le traditionnel ATZ réinitialise le modem. La commande de numérotation ATD appelle un numéro spécial *98*3# : celui-ci requiert du modem une session de données GPRS en utilisant le profil stocké sous le CID 3. C'est en effet le numéro CID sous lequel étaient stockés les paramètres de connexion entrés auparavant dans le téléphone (voir ci-dessus, Configuration pppd).

Il existe de nombreuses autres manières de démarrer une session GPRS, voir le guide des commandes AT supportées par votre téléphone ou le GPRS Howto pour quelques exemples.

Mise en place des DNS

J'ai utilisé la même mécanisme que celui qui remplace /etc/resolv.conf pour faire apparaître les serveurs de noms primaires et secondaires dans le cadre des connexions ppp « ordinaires ».

Les scripts /etc/ppp/ip-up.d/0dns-up et /etc/ppp/ip-down.d/0dns-down sont chargés de remplacer /etc/resolv.conf par /etc/ppp/resolv/[ipparam] au début de la connexion, et de rétablir celui-ci à la fin. Le paramètre ipparam est renseigné dans la configuration de pppd et vaut ici « gprs ».

Les serveurs de noms primaires et secondaires sont fournis par l'opérateur. Le contenu du fichier /etc/ppp/resolv/gprs est chez moi :

nameserver 172.20.2.10
nameserver 194.6.128.4

Test de la connexion

Il ne reste qu'à tester la connexion. Assurez-vous que l'infrarouge fonctionne et est activé sur le téléphone. Vérifiez que ce dernier est vu par l'ordinateur (voir ci-dessus Mise en place de l'infrarouge sur le T20).

On peut alors lancer le script de connexion :

$ pppd call gprs

Les options choisies permettent de suivre le déroulement des opérations. Si tout se passe bien, on peut voir les paramètres de la connexion ppp par ifconfig. Bravo, vous êtes connecté !

Dans le cas où cela ne fonctionne pas, essayer d'abord d'identifier le point noir. Les plus gros problèmes que j'aie pu avoir concernaient la liaison infrarouge téléphone-ordinateur : attention aux conflits d'IRQ et d'adresse, penser aussi à vérifier que le module serial n'est pas monté avant les modules infrarouges.

Enfin, il est possible que ces derniers ne supportent pas bien la mise en veille de l'ordinateur : il peut être prudent de les démonter avant la mise en sommeil et de les remonter ensuite.

En résumé : se connecter et se déconnecter

Se connecter :

$ sudo modprobe -r serial
$ sudo irattach irda0 -s
$ pon gprs

Il est parfois nécessaire de lancer deux fois le pon gprs avant que le téléphone (son modem) ne se manifeste. Étrange...

Se déconnecter :

A priori, il faut d'abord désactiver l'infrarouge du téléphone. En effet, toute tentative de l'arrêter après la déconnexion se solde par un blocage complet de celui-ci.

$ poff gprs
$ sudo ifconfig irda0 down

Liens

Liens généraux

Liens spécifiques à mon matériel

  • Ericsson Developper Zone : nombreuses informations sur les différents mobiles de la marque (codes AT, white papers) : Ericsson Mobility World. Il faut s'enregistrer pour télécharger la documentation, mais c'est gratuit.
  • Un fil de discussion (en anglais) sur linux.debian.laptop au sujet de l'infrarouge sur IBM Thinkpad. C'est là que j'ai (enfin) trouvé que le module serial ne devait pas être monté avant les modules ir* pour que ceux-ci fonctionnent... : infraport on ibm thinkpad.

Autres liens

  • Un tip en français sur gcu-squad pour utiliser un téléphone GSM (et non GPRS) et un fournisseur d'accès quelconque, toujours par infrarouge. C'est ce qui m'a donné l'idée de départ.
  • Un autre howto sur l'infrarouge, un peu daté (noyau 2.2.x) mais des avec informations utiles (en anglais) : The IR-DRIVER-TINY-HOWTO.
  • D'autres scripts de connexion (commentaires en finlandais et en anglais) : Linux + GPRS.

geek stuff

licence CC

Creative Commons License BY-NC-SA

A Django site.