vendredi 22 juin 2012

Codes barres et billets SNCF

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 :

  1. Zone générale
    1. Type d'entrée (ie., comment décoder la suite).
    2. 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.
    3. 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").
    4. Référence de la réservation.
    5. Numéro de titre de transport.
    6. Drapeau indiquant un vrai billet.
    7. Version des informations.
    8. Informations de chaînage. Ici c'est la page 1/1.
    9. Réservé.
    10. 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.
    11. Un adulte.
    12. Zéro enfant.
    13. Dernier chiffre de l'année d'achat (il fallait l'inventer celui-là), ici 0 comme 2010.
    14. Quantième dans l'année du jour d'achat. J'ai donc acheté ce billet le 5 novembre 2010.
    15. Quantième de début de validité (le "not valid before" des billets d'avion).
    16. Quantième de fin de validité (le "not valid after" des billets d'avion).
  2. Premier segment
    1. Code gare de départ : Paris Gare de Lyon.
    2. Code gare d'arrivée : Frasne.
    3. Numéro de train, padé par des espaces.
    4. 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.
    5. 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.
    6. Numéro de voiture.
    7. Numéro de place.
    8. Classe.
    9. Code tarif (vide si "plein tarif"). Notez que les Prem's sont au plein tarif.
    10. Classe de service.
  3. 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é.

4 commentaires:

  1. Bonjour,

    J'ai fait une petite recherche et la lecture des PDF417 s'est bien améliorée sur android:

    Barcode Scanner+ (de Sean Owen de la ZXing team) le fait super vite, et directement depuis la caméra du tel (bien que l'appli coûte 2,50€)

    Barcode Scanners (de Manatee Works) le fait aussi super bien, et l'appli est gratuite


    Donc au final, maintenant les inconvénients ont un peu évolué, bien que c'est clair que les codes Aztec sont vraiment bien adaptés à ce travail (ils ont d'ailleurs été conçus dans cette optique)


    Merci beaucoup pour votre billet qui a pu faire avancer un peu ma curiosité de fanatique de transports et de billettique ^^ Cordialement.

    RépondreSupprimer
  2. Bonjour

    je revends parfois des billets A/R sur troc des train comme ce sont des A/R les personnes voyagent avec mon nom (ou moi avec le leur pour le retour) (ils ne demandent jamais les carte d identité) par contre la date de naissance peut éveiller des soupçons questions lors du scan par les contrôleurs voient ils la DDN ?

    RépondreSupprimer
    Réponses
    1. Pour faire simple, un billet sur lequel y a marqué « Billet à composter » n'est pas nominatif, et peut être revendu.

      En revanche un passager qui utilise un e-billet qui n'est pas à son nom est en fraude.

      Supprimer
  3. Tu n'as pas analysé le billet imprimé VAD TER qui me semble un peu plus complexe..

    RépondreSupprimer