linux_love_3gkey

Utiliser une clef 3G sur un raspberry Pi

Les clefs 3G sont de l’histoire ancienne maintenant que tout le monde est équipé d’un smartphone qui fait point d’accès wifi en 2s ! Cependant, celles-ci ont droit à une nouvelle vie dans nos solutions domotique pas chères 🙂

Vous pouvez vous en servir pour envoyer et recevoir des SMS et déclencher des actions en fonction. Les plus poilus pourront même aller jusqu’à s’en servir comme accès internet de secours en ouvrant une connexion internet dessus.

Ces clefs sont quasiment toutes sur le même modèle : lorsqu’on les branche sur une machine, elles se font passer pour une clef USB de stockage, sur lequel se trouve un bout de logiciel que vous pouviez installer sous Windows XP…
Une fois ce logiciel installé, celui-ci interagit avec la clef en lui disant que tout est OK et qu’elle peut passer en mode modem. Celle-ci se démonte de la machine et pif paf pouf se transforme en carte réseau USB !

Cette mécanique, prévue pour nous simplifier la vie sous windows, est une vraie galère sous linux. En effet, à chaque fois qu’on branche la clef, linux voit donc un stockage de masse, au lieu de voir notre carte réseau… Il faut donc produire des instructions particulières pour forcer la clef à se mettre en mode modem. Par dessus cette problématique, on ajoute le fait que les clefs ne se présente pas toujours sous leur vrai nom, il faut donc forcer certaines configurations à la main…

Ayant plusieurs fois subit cette galère, voici un petit billet qui explique comment monter une clef 3G sur un debian. Ce tutorial va aller jusqu’au point où la clef est montée dans /dev/ttyUSB* . Vous pourrez ensuite utiliser votre outil préféré gammu, jeedom ou un script python maison par ex pour vous brancher sur ce point de montage.

Identification

Ces 2 commandes vont vous servir :

lsusb  vous remonte les équipements USB identifiés par votre machine.

Dans l’exemple ci-dessous, on vois ma clef 3G huawei identifiée techniquement (pas de numéro de model commercial par ex)

# lsusb
Bus 001 Device 007: ID 12d1:141b Huawei Technologies Co., Ltd.

dmesg  remonte les logs relatives au matériel, vous y trouverez des informations lorsque vous branchez votre matériel.

Dans l’exemple ci-dessous, on voit que ma clef 3G a d’abord été montée en tant que stockage de masse, puis plus tard « transformée » en modem.

# dmesg
[...]

[ 6.239440] usb 1-1.4: new high-speed USB device number 6 using dwc_otg
[ 6.361332] usb 1-1.4: New USB device found, idVendor=12d1, idProduct=1446
[ 6.361360] usb 1-1.4: New USB device strings: Mfr=3, Product=2, SerialNumber=4
[ 6.361373] usb 1-1.4: Product: HUAWEI Mobile
[ 6.361386] usb 1-1.4: Manufacturer: HUAWEI Technology
[ 6.361408] usb 1-1.4: SerialNumber: 1234567890ABCDEF
[ 6.364316] usb-storage 1-1.4:1.0: USB Mass Storage device detected
[ 6.369842] scsi host0: usb-storage 1-1.4:1.0
[ 6.370872] usb-storage 1-1.4:1.1: USB Mass Storage device detected
[ 6.374115] scsi host1: usb-storage 1-1.4:1.1

[...]

[ 7.371107] scsi 1:0:0:0: Direct-Access HUAWEI SD Storage 2.31 PQ: 0 ANSI: 2
[ 7.372651] scsi 0:0:0:0: CD-ROM HUAWEI Mass Storage 2.31 PQ: 0 ANSI: 2
[ 7.378902] sd 1:0:0:0: [sda] Attached SCSI removable disk
[ 7.397290] sd 1:0:0:0: Attached scsi generic sg0 type 0
[ 7.397774] scsi 0:0:0:0: Attached scsi generic sg1 type 5
[ 7.440736] usb-storage 1-1.4:1.0: USB Mass Storage device detected

[...]

[ 12.232038] usb 1-1.4: New USB device found, idVendor=12d1, idProduct=141b
[ 12.232063] usb 1-1.4: New USB device strings: Mfr=3, Product=2, SerialNumber=4
[ 12.232076] usb 1-1.4: Product: HUAWEI Mobile
[ 12.232088] usb 1-1.4: Manufacturer: HUAWEI Technology
[ 12.232100] usb 1-1.4: SerialNumber: 1234567890ABCDEF
[ 12.235030] usb-storage 1-1.4:1.0: USB Mass Storage device detected
[ 12.236752] usb-storage 1-1.4:1.1: USB Mass Storage device detected
[ 12.237625] usb-storage 1-1.4:1.2: USB Mass Storage device detected
[ 12.238198] scsi host5: usb-storage 1-1.4:1.2
[ 12.478389] usbcore: registered new interface driver option
[ 12.479072] usbserial: USB Serial support registered for GSM modem (1-port)
[ 12.481212] option 1-1.4:1.0: GSM modem (1-port) converter detected
[ 12.481729] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB1
[ 12.481829] option 1-1.4:1.1: GSM modem (1-port) converter detected
[ 12.482237] usb 1-1.4: GSM modem (1-port) converter now attached to ttyUSB2
[ 13.231211] scsi 5:0:0:0: Direct-Access HUAWEI SD Storage 2.31 PQ: 0 ANSI: 2
[ 13.232476] sd 5:0:0:0: Attached scsi generic sg0 type 0
[ 13.241592] sd 5:0:0:0: [sda] Attached SCSI removable disk

Transformation

Vous aurez constaté dans les commandes ci-dessus est monté en tant que  12d1:141b alors que le système l’a identifié comme  12d1:1446 . Il s’agit donc du même vendor Id 12d1 mais pas du même product Id qui passe de 1446 à 141b. Une petite recherche sur interne avec le modèle de ma clef (une Hawei E1752 de Orange) m’a permis de trouver cette référence.

Ainsi, la commande suivante permet de transformer ma clef en modem 3G:

usb_modeswitch --default-vendor 0x12d1 --default-product 0x1446 --target-vendor 0x12d1 --target-product 0x141b -s 8 --message-endpoint 0x01 --message-content 55534243000000000000000000000011060000000000000000000000000000

Cependant, Cendrillon redeviendra citrouille au prochain reboot ! Il faut donc trouver un moyen de pérenniser cette transformation.

Transformation persistante

Voici une méthode avec les valeurs de ma propre clef, évidement, il vous faudra adapter avec vos propres vendor et product Ids.

Configuration de usb_modeswitch

Premièrement, on ajoute l’instruction suivante dans le fichier de configuration de usb_modswitch

sudo vim /lib/udev/rules.d/40-usb_modeswitch.rules
#Orange Huawei E1752
ATTR{idVendor}=="12d1", ATTR{idProduct}=="1446", RUN+="usb_modeswitch '%b/%k'"

Ensuite, on ajoute le fichier qui configure la transformation

sudo vim /usr/share/usb_modeswitch/12d1:1446
#orange Huawei E1752
TargetVendor=0x12d1
TargetProductList="141b"

Ces deux actions devraient suffirent, mais un bug dans usb_modeswitch 2.2.0 m’a obligé à produire un petit script pour le contourner. Vous pouvez tenter de le contourner en installant la version 2.2.5 (source) mais qui n’est pas encore dans la branche stable à l’heure où j’écris ces lignes.

# usb_modeswitch -e

 * usb_modeswitch: handle USB devices with multiple modes
 * Version 2.2.0 (C) Josua Dietze 2014
 * Based on libusb1/libusbx

 

Forcer l’application de la nouvelle configuration

Il s’agit très simplement de produire un script qui se lance à la fin du boot de la machine (source).

On crée le script dans /etc/init.d . Vous pouvez l’appeler comme bon vous semble; ici, je l’ai appelé usb_modswitch .

sudo vim /etc/init.d/usb_modeswitch
#! /bin/sh
### BEGIN INIT INFO
# Provides:          usb_modeswitch
# Required-Start:    $all
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Switch USB 3G Key to modem
# Description:       Switch USB 3G Key to modem
### END INIT INFO

# Some things that run always
touch /var/lock/usb_modeswitch

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script usb_modeswitch custom rexave "
    usb_modeswitch -v 12d1 -p 1446 -J
    ;;
  stop)
    echo "Stopping script usb_modeswitch Custom"
    echo "Nothing to do here"
    ;;
  *)
    echo "Usage: /etc/init.d/usb_modeswitch {start|stop}"
    exit 1
    ;;
esac

exit 0

Vous pourrez trouver de la doc sur ce sujet par ici.

On lui applique les bons droits :

sudo chmod 755 /etc/init.d/usb_modeswitch

Enfin, on l’ajoute dans la liste des scripts de démarrage:

sudo update-rc.d usb_modeswitch defaults

update-rc se chargera de faire les liens qui vont bien en fonction des règles que vous aurez mises dans l’entête LSB.

Notez que vous pouvez supprimer à tout moment celui-ci très simplement à l’aide de la commande remove

sudo update-rc.d usb_modeswitch remove

That’s it !

Au reboot, votre clef 3G est à présent bien reconnue en tant que modem et est montée dans /dev/ttyUSB*

 

Edit 26/08/2018 – solution alternative

Petit ajout sur cet article, j’ai trouvé une solution alternative à l’aide de commandes AT.

Certaines clef 3G proposent une « configuration » permettant de changer le comportement de celle-ci lors du branchement. Par exemple, beaucoup de clef Huawei acceptent la commande AT^U2DIAG . Un tableau détaillant les valeurs possibles est disponible par ici.

Ainsi, il « suffit » d’ouvrir une connexion série sur la clef puis de lire la valeur de la configuration avec la commande AT^U2DIAG? . On peut ensuite setter cette valeur à 256 afin de supprimer le montage du pseudo CD virtuel avec la commande AT^U2DIAG=256

Ce changement de configuration permet de s’épargner la mécanique un peu fastidieuse de usb_modeswitch !

2 thoughts to “Utiliser une clef 3G sur un raspberry Pi”

  1. bonjour,

    J’ai longtemps cherché pour faire reconnaitre mon modem 3G en modem et non en USB, car il changeait de port chaque fois, et instable.
    Votre tuto, c’est ok il est bien reconnu en modem.
    Mais je n’ai plus du tout le ttyUSB0,***USB1,***USB2 et ***USB-3G
    Que s’est-il passé? comment puis-je le résoudre?

    Je vous en remercie d’avance

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *