Sur un certain nombre de documents de transport fournis par la SNCF, il y a
un code-barres. Tantôt un code PDF417 (essentiellement sur
les titres imprimés par les imprimantes de billets de train au format IATA),
tantôt un code Aztec
(la plupart du temps sur les billets à imprimer soi-même), tantôt un QR Code (sur les billets de
bord notamment).
Autant les codes Aztec qui figurent notamment sur les confirmations e-billet
et les cartes récentes de fidélité du Programme Voyageur
peuvent être décodés via l'application android NeoReader, autant les codes
barres PDF417 sont plus difficile à lire. Il n'existe pas à ma connaissance
d'application gratuite qui les lit depuis un smartphone. La raison étant que
cette technologie est plutôt faite pour être lue par un laser, et donc qu'il
faut une très bonne photographie pour avoir une chance de les décoder. Pour
les applications libres sur ordinateur, celles-ci n'en sont qu'au stade
"alpha", et donc ne savent pas faire le traitement d'image nécéssaire à la
lecture (il faut leur fournir une image « parfaite »).
Du coup, même si je peux maintenant lire le contenu du codes-barres de ma
nouvelle carte grand voyageur, je ne sais pas ce qu'il y avait dans
le code barres de l'ancienne[1], ni ce qu'il y a sur les billets de train,
cartes de réduction, abonnements etc..
Je savais qu'il y avait du code dans ZXing (la bibliothèque
derrière l'application Barcode Scanner) pour lire les PDF417, mais il est
désactivé dans l'application Android. Il faut donc passer à la version en
ligne de commande.
Pré processing
En espérant que le code de ZXing soit quand même un peu fonctionnel, je me
suis dit qu'en fournissant une image parfaite ça pourrait marcher.
L'idée est de passer d'une image de ce type (prise avec mon
téléphone) :
à un fichier comme ça :
Au bout de quelques tentatives, j'ai fini par trouver une procédure à la
main avec Gimp qui consiste à extraire l'image tranche par
tranche (qui font toutes 17 unités de largeur), redimensionner chaque
tranche en une image de 17 pixels de large, réagrandir, et enfin vérifier à
la main que l'image est conforme. Évidemment j'aurais pu automatiser ça,
mais ça serait revenu à rajouter moi-même le code de détection dans ZXing,
et je ne me sentais pas assez courageux pour faire ça.
Du coup je suis arrivé à lire le fameux contenu de ces mystérieux codes
(dont je me doutais de toutes façons qu'il n'y aurait pas grand chose de
plus que ce qui est écrit sur les billets).
Carte de fidélité
La première chose que j'ai décodé est mon ancienne carte grand voyageur. Ça
ressemble au contenu des confirmations e-billet (le
passage à la ligne est de moi) :
h0FV0000000000000000111000000000002/09/201007/12/201229090109XXXXXXXXX
GODFROY Quentin 1FZ3030/02/1980
On apprend au passage que la carte grand
voyageur a un code tarif associé ("FZ30"), que le pseudo-billet est en
première classe (le "1" juste devant le pseudo-tarif) et que les champs nom
et prénom sont tronqués à 19 caractères. Pour le reste on devine assez bien.
On pourra aussi remarquer ici que la différence entre la date de début et de
fin de ma carte ne fait pas trois ans, signe que j'ai perdu ma première
carte et que j'en ai demandé une nouvelle (changeant au passage son numéro).
Depuis un moment les cartes portent un code Aztec (probablement depuis que
les cartes sont réellement utilisées dans les trains et que les premières
remontées ont indiqué de fortes difficultés à faire avaler le code aux PDA).
Le code Aztec contient peu ou prou la même chose :
h0FV0000000000000001111000000000001/06/201201/06/201329090109XXXXXXXXX
GODFROY QUENTIN FZ3030/02/1980
La classe du pseudo-ticket a disparu, un "1" est apparu vers le début (j'en
reparlerai plus tard), mon prénom est en majuscules.
Au final ce qui intéresse le PDA du contrôleur quand il scanne la carte
voyageur pour trouver un e-billet c'est donc soit le numéro de
client, soit le triplet nom/prénom/date de naissance (de toutes façons je ne
vois pas ce que ça aurait pû être d'autre). Peut-être qu'il y a deux
recherches successsives.
En tout cas il m'est arrivé de voyager
avec un e-billet pour lequel j'avais enregistré uniquement mon numéro
d'abonné forfait sans mentionner ma carte grand voyageur alors que le
contrôleur m'a retrouvé en scannant ma carte grand voyageur. Sans
recoupement spécial de base de données il est probable que ce soit avec mon
nom/prénom/date de naissance que le PDA du contrôleur a retrouvé mon billet.
Une manière claire de vérifier serait d'essayer de voyager avec un e-billet
créé sans entrer de numéro de client et de présenter la carte voyageur au
contrôleur. Avis aux amateurs.
Billet normal
Reprenons le billet de l'entrée « Titres de
transport : billets papier » (les "|" comme les passages
à la ligne sont de moi) :
|e|E|DV|QLONTZ|301853252|1|1|11|0000000000|09|01|00|0|309| | |
FRPLY|FRFRA|09269 |3029|034|013|021|1|CJ11|AD|
FRFRA|FRGYW|33807 | |034| | |2|CJ11|B |
Déjà, on peut remarquer que ce n'était pas la peine de masquer le code
barres, il n'y a aucune information personnelle autre que celles qui figurent
déjà en clair sur le billet. Ensuite, certains champs peuvent se deviner, mais
pour les autres j'ai eu besoin du
standard RCT2 (attention, gros PDF moche), que j'avais trouvé sur le
site de l'European Railway Agency à une époque où je cherchais des
informations sur les billets au format international.
Les informations se décodent ainsi :
- Zone générale
- Type d'entrée (ie., comment décoder la suite).
- Type de fonds : les billets peuvent utiliser différentes mises en
pages pour marquer les données, ici "E" doit signifier que le billet a été
mis en page comme un billet national.
- Type de titre de transport : ici, "DV" comme titre de transport national
(il est possible dans certains cas d'avoir des titres de transport nationaux
avec la mise en page habituelle des billets internationaux, indiquée par "R").
- Référence de la réservation.
- Numéro de titre de transport.
- Drapeau indiquant un vrai billet.
- Version des informations.
- Informations de chaînage. Ici c'est la page 1/1.
- Réservé.
- Type de carte de voyageur fréquent. Ici 09 comme le 09 annonçant les
cartes voyageur qui suit le préfixe 290901 des numéros de clients chez SNCF.
- Un adulte.
- Zéro enfant.
- Dernier chiffre de l'année d'achat (il fallait l'inventer celui-là), ici
0 comme 2010.
- Quantième dans l'année du jour d'achat. J'ai donc acheté ce billet le 5 novembre 2010.
- Quantième de début de validité (le "not valid before" des billets
d'avion).
- Quantième de fin de validité (le "not valid after" des billets
d'avion).
- Premier segment
- Code gare de départ : Paris Gare de Lyon.
- Code gare d'arrivée : Frasne.
- Numéro de train, padé par des espaces.
- Code de sécurité du train (étrange, un hmac aurait été probablement
mieux), qui a l'air d'être dépendant uniquement du numéro de train et du
jour. C'est la seule information ne figurant pas en clair sur le billet.
- Quantième correspondant au segment. Ici comme il est inférieur au quantième
d'achat, il faut comprendre que c'est l'année suivante. La date du voyage est donc le 3 février 2011.
- Numéro de voiture.
- Numéro de place.
- Classe.
- Code tarif (vide si "plein tarif"). Notez que les Prem's sont au plein
tarif.
- Classe de service.
- Deuxième segment
- …
À noter que quand il n'y a pas de deuxième segment tous les champs sont
remplacés par une espace, sauf la classe où figure une étoile '*', comme sur
les billets.
Carte de réduction
gHEMRYIYXI6893886041111000000000008/07/201107/07/201229090108XXXXXXXXX
NOM PRENOM CL0030/02/1980
Ça ressemble très fort au contenu des cartes de fidélité, avec en plus que
le dossier et le numéro de titre sont renseignés. Ici c'est une carte escapades,
parce que le numéro de client commence par 08 et le code tarif est CL00 (le
code des billets au tarif escapades est CL11). Il n'y a absolument aucun
doute qu'une telle carte pourrait servir de "support" e-billet. Ça marche
peut-être même en pratique.
Confirmation e-billet
J'avais déjà décodé une confirmation imprimée à domicile,
voici ce que contient une confirmation imprimée sur un carton à
billet :
i1CVTAJNLC193970851121130/02/1980FRAETFRPMO0886612/100029090164XXXXXXXXX
NOM PRENOM 2PN000 00000
C'est presque pareil, sauf que le nom et le prénom sont padés à droite par
des espaces, alors que ceux-ci sont padés à gauche sur les confirmations
imprimées à domicile.
Format général
Manifestement il y a un facteur commun. Tous les codes (y compris au format
Aztec) commencent par le type, le fonds, le numéro de dossier, le numéro de
titre, le drapeau de vrai billet, le numéro de version et enfin les informations de
chaînage.
Deux remarques :
- J'ai trouvé des pièces en "e", "g", "h", "i". À quoi correspondent les
titres en "f" ? J'avais pensé aux coupons d'abonnement, mais ceux que
j'ai sont en "g". Peut-être les titres-repas ?
- Contrairement à ce que j'avais indiqué dans l'entrée sur les e-billets,
je pense maintenant que le "0211" indique les mêmes choses que ici (vrai
billet, version, chaînage), et donc que sur les confirmations e-billets
éditées par voyages-sncf.com on a "oublié" de positionner à "1" le drapeau
pour indiquer que les confirmations ne sont pas des specimens. Aurait-ce été
oublié après les tests initiaux ? Bien sûr cette "erreur" n'a
évidemment aucune importance puisque les confirmations e-billet ne sont que
des pointeurs vers la base de donnée des e-billets.
[1] D'ailleurs, les contrôleurs avaient eux aussi eu beaucoup de mal à faire
lire à leur PDA ma carte grand voyageur ancienne génération les rares fois
où j'ai voyagé avec un e-billet. Depuis les codes sont au format Aztec
nettement plus efficace, des PDA nouvelle génération ont un laser intégré
et je n'utilise plus les e-billets. Du coup plus de risque d'incompatibilité.