Se connecter à l'internet avec le téléphone mobile 3G S750 de Sanyo sous Ubuntu 6.06

Plan

Introduction
1. Les modules
2. La reconnaissance du téléphone
3. La configuration de la connexion
4. L'automatisation du chargement du module de communication série
5. L'utilisation

Introduction

Le matériel utilisé est :

L'auteur de cette page préfère la liaison par câble à la connexion bluetooth un peu trop consommatrice de batteries.

Cette procédure s'inspire d'une page salvatrice de Guillaume Lohez (cette page semble avoir disparu du paysage). Toutefois, la procédure proposée "là-bas" utilisait l'application wvdial, seule tolérée par le Nokia de son auteur. Au test, il apparaît que cette manière de faire fonctionne avec mon Sanyo S750 mais induit une certaine lenteur de connexion. La procédure présentée ci-dessous utilise donc pppd et les scripts de dialogue de connexion classiques, qui fonctionnent parfaitement avec le S750 et sont beaucoup plus réactifs. En outre, elle est complétée par la mise en place du chargement automatique du module de communication série au branchement du mobile sur la prise USB.

Prêts pour les grandes manoeuvres ? Alors, on y va...

1. Les modules

D'abord, vérifier que usbserial et serial_cs sont bien présents dans la liste obtenue dans un terminal par :

$ modprobe -l *serial*

Cette commande donne une réponse du genre :

/lib/modules/2.6.15-26-386/volatile/ltserial.ko
/lib/modules/2.6.15-26-386/kernel/sound/drivers/snd-serial-u16550.ko
/lib/modules/2.6.15-26-386/kernel/drivers/usb/serial/usbserial.ko
/lib/modules/2.6.15-26-386/kernel/drivers/usb/serial/safe_serial.ko
/lib/modules/2.6.15-26-386/kernel/drivers/usb/gadget/g_serial.ko
/lib/modules/2.6.15-26-386/kernel/drivers/serial/serial_cs.ko
/lib/modules/2.6.15-26-386/kernel/drivers/parport/parport_serial.ko
/lib/modules/2.6.15-26-386/kernel/drivers/char/generic_serial.ko

Sinon, installer ces deux modules.

2. La reconnaissance du téléphone

Brancher le téléphone sur son câble et le câble sur la prise USB. Faire un branchement direct car il semble que passer par un hub USB puisse engendrer des soucis... Le téléphone réagit. Lui confirmer le passage dans l'état "transfert de données" et confirmer l'attente de données ; patienter quelques secondes puis faire dans le terminal :

$ cat /proc/bus/usb/devices

Le système répond un discours formé d'une suite de paragraphes du genre :

[...]
T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=ff(vend.) Sub=ff Prot=ff MxPS=64 #Cfgs= 1
P: Vendor=0474 ProdID=0708 Rev= 1.00
S: Manufacturer=SANYO Electric Co., Ltd.
S: Product=SANYO USB Phone
S: SerialNumber=353845001076265
C:* #Ifs= 2 Cfg#= 1 Atr=c0 MxPwr=100mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=88 Prot=01 Driver=(none)
E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=32ms
I: If#= 1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=(none)
E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
[...]

Dans cette sortie, repérer le paragraphe relatif au téléphone (reproduit ci-dessus) et noter son numéro de "Vendor" et de "ProdID", ici 0474 et 0708 respectivement.

Faire au terminal (noter qu'il faut ajouter 0x devant les numéros relevés, pour indiquer qu'ils sont en hexadécimal) :

$ sudo modprobe serial_cs

Password: (ici donner le mot de passe root)

$ sudo modprobe usbserial vendor=0x0474 product=0x0708
$ dmesg | tail -10

La deuxième commande permet juste d'afficher la fin du journal système adéquat :

[17180891.864000] usb 2-1: new full speed USB device using uhci_hcd and address 2
[17181145.544000] usbcore: registered new driver usbserial
[17181145.544000] drivers/usb/serial/usb-serial.c: USB Serial support registered for generic
[17181145.544000] usbserial_generic 2-1:1.0: generic converter detected
[17181145.544000] usbserial_generic 2-1:1.0: Generic device with no bulk out, not allowed.
[17181145.544000] usbserial_generic: probe of 2-1:1.0 failed with error -5
[17181145.544000] usbserial_generic 2-1:1.1: generic converter detected
[17181145.544000] usb 2-1: generic converter now attached to ttyUSB0
[17181145.544000] usbcore: registered new driver usbserial_generic
[17181145.544000] drivers/usb/serial/usb-serial.c: USB Serial Driver core

Nota : le message "no bulk out" n'est pas une erreur, le "generic converter" est attaché plus loin à une sortie.

Justement, noter le nom du fichier de sortie qui s'affiche sur la ligne correspondante :

[17181145.544000] usb 2-1: generic converter now attached to ttyUSB0

donc ici ttyUSB0.

A ce stade, le téléphone est reconnu comme périphérique de communication série branché sur l'USB. Il faut maintenant configurer le processus de connexion.

3. La configuration de la connexion

Dans le terminal, ouvrir l'éditeur de texte gedit en mode administrateur par :

$ gksudo gedit

et entrer le mot de passe administrateur s'il est demandé. Le terminal répond une bizarrerie :

(gedit:6337): GnomeUI-WARNING **: While connecting to session manager:
Authentication Rejected, reason : None of the authentication protocols specified are supported and host-based authentication failed.

Ce message n'empêche pas le lancement de l'application.
Créer un nouveau fichier contenant :

###########################################
# Fichier de configuration PPPD
# /etc/ppp/peers/orange pour internet en 3G avec S750
###########################################

# La plupart des téléphones ne répondent pas aux echos LCP
lcp-echo-failure 0
lcp-echo-interval 0

# Script de connexion
connect "/usr/sbin/chat -v -f /etc/chatscripts/ppp0"

# Script de deconnexion
disconnect /etc/chatscripts/orange-disconnect-chat

# Le device du modem
# Pour mon Sanyo S750 en USB
/dev/ttyUSB0

# Vitesse de la ligne serie
115200

# Controle de flux materiel
crtscts

# Ignorer la detection de porteuse
local

# pppd ne propose pas d'IP a l'hote distant
noipdefault

# pppd accepte l'IP envoyé par l'hote distant
ipcp-accept-local

# pppd ajoute la route par defaut qui utilise l'interface ppp
defaultroute

# Si une route par defaut existe, on la remplace
# Necessite une version récente de pppd
replacedefaultroute

# pppd accepte les DNS envoyes par l'hote distant
# ne fonctionnerait pas avec tous les telephones
usepeerdns

# Compression entre le telephone et le PC n'est pas necessaire
novj
nobsdcomp
novjccomp
nopcomp
noaccomp

#Détacher le processus de la console (optionnel)
updetach

# le telephone ne necessite pas d'authentification
noauth

# username et password
# le username doit correspondre a celui du fichier /etc/ppp/chap-secret
# et/ou /etc/ppp/pap-secret ; ces deux fichiers doivent contenir la ligne
# "orange" * "orange"
# (sans le # de commentaire initial évidemment)

user "orange"
password "orange"

########################################

Enregister ce fichier dans le dossier /etc/ppp/peers/ sous le nom orange et refermer gedit pour retourner dans le terminal.
Il reste à créer les scripts de connexion et de déconnexion dans /etc/chatscripts/.
Vérifier qu'il y existe bien un script ppp0 par :

$ gksudo gedit /etc/chatscripts/ppp0

et qu'il contient :

TIMEOUT 60
ABORT ERROR
ABORT BUSY
ABORT VOICE
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT "NO DIAL TONE"
ABORT "NO ANSWER"
"" "ATZ"
"" "AT&FH0M0"
OK-AT-OK "ATDT*99#"
TIMEOUT 75
CONNECT

Il ne devrait pas être nécessaire de le modifier.
Refermer ce fichier et, toujours dans gedit, ouvrir un nouveau fichier. Y coller :

exec /usr/sbin/chat -V -s -S  \
ABORT "BUSY"  \
ABORT "ERROR"  \
ABORT "NO DIALTONE"  \
SAY "\nSending break to the modem\n"  \
"" "\K"  \
"" "+++ATH"  \
SAY "\nPDP context detached\n"

et l'enregistrer sous le nom orange-disconnect-chat dans /etc/chatscripts/. Refermer gedit.

Si elle n'y figure pas déjà, ajouter la ligne :

"orange" * "orange"

aux deux fichiers /etc/ppp/chap-secret et /etc/ppp/pap-secret.
L'essentiel est terminé.

4. L'automatisation du chargement du module de communication série

Pour automatiser le chargement du module usbserial avec les bon paramètres, on peut utiliser les capacités de Ubuntu à réagir lors de la détection du branchement d'un périphérique USB. Depuis Dapper Drake, cela se fait avec la procédure "udev" (pour avoir plus d'information, faire man udev et man udevinfo et jeter un coup d'oeil sur ce site).
Voici la manipulation adaptée au cas présent.

1/ On branche le téléphone sur la prise USB et, après quelques secondes, on vérifie qu'il est reconnu par :

$ ls /dev/ttyUSB*

qui répond :

/dev/ttyUSB0

On cherche la place de l'appareil dans les fichiers du système par :

$ find /sys -name dev | grep USB

qui renvoie :

/sys/class/tty/ttyUSB0/dev

Pour avoir les caractéristiques utilisables dans une règle udev, on enlève le "/dev" final de la réponse et on fait :

$ udevinfo -a -p /sys/class/tty/ttyUSB0

ce qui donne :

udevinfo starts with the device the node belongs to and then walks up the
device chain, to print for every device found, all possibly useful attributes
in the udev key format.
Only attributes within one device section may be used together in one rule,
to match the device for which the node will be created.

device '/sys/class/tty/ttyUSB0' has major:minor 188:0
looking at class device '/sys/class/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    SYSFS{dev}=="188:0"

follow the "device"-link to the physical device:
looking at the device chain at '/sys/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1:1.1/ttyUSB0':
    BUS=="usb-serial"
    ID=="ttyUSB0"
    DRIVER=="generic"

looking at the device chain at '/sys/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1:1.1':
    BUS=="usb"
    ID=="1-1:1.1"
    DRIVER=="usbserial_generic"
    SYSFS{bAlternateSetting}==" 0"
    SYSFS{bInterfaceClass}=="0a"
    SYSFS{bInterfaceNumber}=="01"
    SYSFS{bInterfaceProtocol}=="00"
    SYSFS{bInterfaceSubClass}=="00"
    SYSFS{bNumEndpoints}=="02"
    SYSFS{interface}=="Data Interface"
    SYSFS{modalias}=="usb:v0474p0708d0100dcFFdscFFdpFFic0Aisc00ip00"

looking at the device chain at '/sys/devices/pci0000:00/0000:00:1d.0/usb1/1-1':
    BUS=="usb"
    ID=="1-1"
    DRIVER=="usb"
    SYSFS{bConfigurationValue}=="1"
    SYSFS{bDeviceClass}=="ff"
    SYSFS{bDeviceProtocol}=="ff"
    SYSFS{bDeviceSubClass}=="ff"
    SYSFS{bMaxPacketSize0}=="64"
    SYSFS{bMaxPower}=="100mA"
    SYSFS{bNumConfigurations}=="1"
    SYSFS{bNumInterfaces}==" 2"
    SYSFS{bcdDevice}=="0100"
    SYSFS{bmAttributes}=="c0"
    SYSFS{configuration}==""
    SYSFS{devnum}=="3"
    SYSFS{idProduct}=="0708"
    SYSFS{idVendor}=="0474"
    SYSFS{manufacturer}=="SANYO Electric Co._ Ltd."
    SYSFS{maxchild}=="0"
    SYSFS{product}=="SANYO USB Phone"
    SYSFS{serial}=="353845001076265"
    SYSFS{speed}=="12"
    SYSFS{version}==" 1.10"

looking at the device chain at '/sys/devices/pci0000:00/0000:00:1d.0/usb1':
    BUS=="usb"
    ID=="usb1"
    DRIVER=="usb"
    SYSFS{bConfigurationValue}=="1"
    SYSFS{bDeviceClass}=="09"
    SYSFS{bDeviceProtocol}=="00"
    SYSFS{bDeviceSubClass}=="00"
    SYSFS{bMaxPacketSize0}=="64"
    SYSFS{bMaxPower}==" 0mA"
    SYSFS{bNumConfigurations}=="1"
    SYSFS{bNumInterfaces}==" 1"
    SYSFS{bcdDevice}=="0206"
    SYSFS{bmAttributes}=="c0"
    SYSFS{configuration}==""
    SYSFS{devnum}=="1"
    SYSFS{idProduct}=="0000"
    SYSFS{idVendor}=="0000"
    SYSFS{manufacturer}=="Linux 2.6.15-26-386 uhci_hcd"
    SYSFS{maxchild}=="2"
    SYSFS{product}=="UHCI Host Controller"
    SYSFS{serial}=="0000:00:1d.0"
    SYSFS{speed}=="12"
    SYSFS{version}==" 1.10"

looking at the device chain at '/sys/devices/pci0000:00/0000:00:1d.0':
    BUS=="pci"
    ID=="0000:00:1d.0"
    DRIVER=="uhci_hcd"
    SYSFS{class}=="0x0c0300"
    SYSFS{device}=="0x2658"
    SYSFS{irq}=="209"
    SYSFS{local_cpus}=="1"
    SYSFS{modalias}=="pci:v00008086d00002658sv0000104Dsd000081B9bc0Csc03i00"
    SYSFS{subsystem_device}=="0x81b9"
    SYSFS{subsystem_vendor}=="0x104d"
    SYSFS{vendor}=="0x8086"

looking at the device chain at '/sys/devices/pci0000:00':
    BUS==""
    ID=="pci0000:00"
    DRIVER=="unknown"

Dans cette description de la chaîne USB associée au téléphone, dans le bloc qui contient "SANYO USB Phone", on voit:

    SYSFS{idProduct}=="0708"
    SYSFS{idVendor}=="0474"

Ceci indique que l'on peut utiliser ces paramètres dans les règles udev.

On ouvre le fichier de règles de modprobe par :

$ sudo gedit /etc/udev/rules.d/90-modprobe.rules

et on ajoute les deux lignes suivantes à la fin du fichier (juste avant la ligne LABEL="modprobe_end") :

# Charge le module usbserial pour le s750
SYSFS{idProduct}=="0708",SYSFS{idVendor}=="0474", RUN+="/sbin/modprobe usbserial vendor=0x0474 product=0x0708"

La première ligne est un commentaire quelconque pour mémoire.
La seconde a pour effet de déclencher à chaud, au branchement du téléphone sur l'USB, le lancement de modprobe avec l'option voulue.

On enregistre, on referme le fichier et gedit. C'est terminé.

On débranche le téléphone.
Après quelques secondes, on le rebranche.
Après quelques secondes, on peut lancer la connexion :-)

5. L'utilisation

Vérifier sur le téléphone que l'icône indiquant la bonne réception de la 3G est bien présente. Dans ce cas, la connexion se lance depuis le terminal par :

$ pon orange

Serial connection established.
Using interface ppp0
Connect: ppp0 <--> /dev/ttyUSB0
PAP authentication succeeded
Cannot determine ethernet address for proxy ARP
local IP address 10.15.135.230
remote IP address 212.234.96.27
primary DNS address 10.11.12.13
secondary DNS address 10.11.12.14

On ne résiste pas à la tentation de faire une mesure de débit sur le site de 60 millions de consommateurs.


La connexion s'arrête par :

$ poff orange

Pour ne pas être obligé de rouvrir un terminal à chaque connexion, il est plus confortable de créer deux lanceurs dans le tableau de bord supérieur.

  • le premier lance la commande "pon orange" ;
  • le second lance la commande "poff orange".

Maintenant, la manip de connexion est légère, après avoir branché le téléphone sur la prise USB et l'avoir mis en attente de transfert de données pendant quelques secondes : (i) cliquer sur le premier lanceur (là on voit le téléphone afficher différentes choses jusqu'à "connexion orange.fr"), lancer son firefox préféré et surfer ; (ii) à la fin de la séance de surf, cliquer sur le second lanceur (le téléphone revient à son écran d'accueil).


Retour à l'accueil LINUX