2024-08-17T06:09:04.000

La manipulation de codes QR via CLI

L'usage des codes QR (traduction de QR Codes) s'étant démocratisé, j'ai eu besoin d'outils pour encoder et décoder des codes QR. Je vous présente les outils que j'utilise pour manipuler les code QR ainsi que les quelques cas d'utilisation courante de code QR.

Les utilitaires qrtool et rxing-cli (🦀 💪)

Les deux outils supportent l'encodage et le décodage et sont tous les deux écrit en Rust. J'utilise l'un pour le décodage et l'autre pour l'encodage.

Décodage intelligent

Au niveau du décodage, j'utilise rxing-cli qui est capable de scanner une photo et de détecter les codes QR présents. Généralement les décodeurs sont très basiques et n'ont pas la fonctionnalité d'analyse et de correction visuelle d'un code QR. Avoir la fonctionnalité de scanner toute une image et de réaligner le code est assez rare en ligne de commande.

$ rxing-cli qr-code_mermaid_file.jpg decode
Detection result:
(qrcode) https://www.youtube.com/watch?v=eV7z7iJ22Bo

rxing a l'avantage de supporter d'autres formats de code bar, 2D ou 3D. Comme le format Aztec, notamment utilisé par la SNCF.

Ces autres formats sont souvent moins faciles à décoder et il est important d'assister le logiciel dans le décodage en cadrant le code correctement.

L'encodage pour tous les formats

Au contraire, pour encoder un code QR, je préfère de loin utiliser qrtool. Sa fonctionnalité de décodage est basique, mais celle d'encodage est très complète. Ainsi, pleins de formats sont supportés (BMP, JPEG, PNG, QOI (!), SVG...).

Au niveau de l'encodage, c'est simple et puissant. Par défaut la commande produit un PNG qu'elle imprime sur la sortie standard, mais pleins de formats sont supportés. En particulier ansi256 pour afficher le code QR directement dans la console ou unicode qui essaye de rendre le code QR au format caractères (simple à copier/coller dans un champ texte). Mon préféré reste svg pour obtenir une image vectoriel.

$ echo -n 'https://ache.one' | qrtool enc -t unicode
█████████████████████████████████
█████████████████████████████████
████ ▄▄▄▄▄ █ ▀▄███▀ ▄█ ▄▄▄▄▄ ████
████ █   █ █▀▀██▀▄▄▄██ █   █ ████
████ █▄▄▄█ ██▀  ▀▄▀███ █▄▄▄█ ████
████▄▄▄▄▄▄▄█ █ ▀▄▀ █ █▄▄▄▄▄▄▄████
████ █ ▄▀▄▄▄▀▀█  ▄▄█ █▄▀█▄█ ▄████
████▄▀██▄█▄▀▀▀▄▀ ▀ ▀█ ▀ ▄▀▀██████
█████ ▄▀█▄▄▄ █▀ █▀█▀▀  ▀ █▄▄ ████
████▀▄ █▄▀▄ ▀█ █ ▀▄█▀█ ▀ █▄▄▀████
██████▄▄██▄▄▀▄▄▄▀▀█▄ ▄▄▄ ▄ ▄ ████
████ ▄▄▄▄▄ █ ██▄ ██▀ █▄█ █▄ ▄████
████ █   █ █▀ █▄  ▀▀   ▄  ▀▀▀████
████ █▄▄▄█ █▄ ▄▄▄▄█▄▄ ▄█ █ ▄█████
████▄▄▄▄▄▄▄█▄█▄█▄█▄▄█▄▄▄▄▄▄▄▄████
█████████████████████████████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

Format et données des codes QR

Il n'y a pas de spécification standard du contenu des codes QR ! C'est le gros problème de ce format. Du coup, il en existe plusieurs ! 🤦

XKCD927: How standards proliferate

XKCD927: How standards proliferate

Mais un certain nombre de formats sont courants et supporter par tous les scanners. Notamment les formats de la société NTT DoCoMo et ceux basés sur les schémas d'URI (standardisation du W3C).

Partage d'une URL

Les URL sont généralement automatiquement reconnu et il n'y a pas besoin de format particulier. Tout comme le texte d'ailleurs.

N'utilisez pas le format non standard URLTO:. Vous utiliserez alors un format moins reconnu que juste mettre une URL.

Partage d'un e-mail

Pour partager une adresse e-mail, il existe encore 2 méthodes.

Pour partager juste une adresse e-mail, on peut simplement encoder l'adresse e-mail par exemple 'ache@ache.one'. Mais il existe un risque que le lecteur de code QR l'interprète comme un texte, c'est pour cela qu'on recommande d'utiliser une des deux méthodes précédentes.

Dans la pratique, lorsqu'on partage juste une adresse e-mail, il est courant d'utiliser le format W3C.

$ echo -n 'MAILTO:ache@ache.one' | qrtool enc -t unicode
█████████████████████████████████
█████████████████████████████████
████ ▄▄▄▄▄ ██▄▀▀▄▀▀▄▀█ ▄▄▄▄▄ ████
████ █   █ ██   █▄▀ ██ █   █ ████
████ █▄▄▄█ █▀ ▄▀█▄▄▄▄█ █▄▄▄█ ████
████▄▄▄▄▄▄▄█▄█▄█▄█▄█ █▄▄▄▄▄▄▄████
████▄█▀ █▄▄▀ █▄█▀▀ ▀▀ █ ▀█▀█▀████
█████▄▄▄▄ ▄▄█▄██   █▀▄ ▄▀▄▄▄ ████
█████▀▄ ▀▀▄█ ▀▄ █▀▄▀ ▄▄▄██▄ ▄████
████▄▀█▄ █▄ █▄█ █▄▄▄ ▀▄█▄█▄ ▀████
████▄▄▄███▄█ █▀█  ▀█ ▄▄▄ █  ▀████
████ ▄▄▄▄▄ █▀█▀▄ █   █▄█ █ █▀████
████ █   █ █▀▀▀▀██▀▀  ▄▄▄▀▄ ▄████
████ █▄▄▄█ ███▄███▀▄█▀▄ ▄█▀█ ████
████▄▄▄▄▄▄▄█▄█▄█▄███▄██▄▄▄▄█▄████
█████████████████████████████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

Le schéma d'URI mailto propose beaucoup d'autres options.
Consulter la RFC 6068 pour une description complèete.

Par-contre, lorsqu'on propose un patron d'e-mail, le format MATMSG semble plus utilisé, même si paradoxalement, il est moins complet.

$ echo -n 'MATMSG:TO:ache@ache.one;SUB:Test QR-Code;BODY:Thank you for your content;;' | qrtool enc -t unicode
█████████████████████████████████████████████
█████████████████████████████████████████████
████ ▄▄▄▄▄ ██ ▄█▀▄▄▄█▀▀█▀   ▄▀▀▄ █ ▄▄▄▄▄ ████
████ █   █ █ ▄▀  ▄▄▀ ▄▄██▄█▀█▄█▄ █ █   █ ████
████ █▄▄▄█ █ ████ ▀ █ █▄▀▀███▄█▀██ █▄▄▄█ ████
████▄▄▄▄▄▄▄█ █ █ █ ▀ ▀ █ █ █▄▀▄█ █▄▄▄▄▄▄▄████
████ █▄ ▄▄▄██ █▀ ▀ ▀▄█▀█▀  ▀▀██▄▄█ ▄ ▄▄▀▀████
████▄█▄▄ █▄█▄▀▄█▄▀▀ ▄█▀ ▀█▀▄█▄▄▀▄▄▄▀▀▄▄▄▄████
████ ▄▄▄▀▄▄ ▀ ██▀ █▄█▄▄▄▄▀█ ▀█ ▀▄▀   █▀▀█████
████▄▀  ▀▄▄▄▀▄▄█ ▀ ▄▄█▄█ ▄▀██▀▀▄▀▀ ▄█▀▄ █████
█████ ▄▄█ ▄███▀ █   ▀█▄██ ▀█ ▄▄ ▄▄██ ▀▄▄ ████
████ █▄█▄ ▄▄ ▀▄▀▀▀ █▀ ▀█▀  ▄▀ █▀▄▄▄▄▀▄███████
█████▀▀ ▀█▄█ ██▀ ▄ ▀█ █▄█ ▄▀▀▄▄ █▀▄▀█▄  ▀████
█████ ▄▄▀█▄▀█▀█▀▄▀ ▄█ ▀▀█▄  ▀▀  ▀  ▀█▀▄▄▀████
████ ▀▄▀▀▄▄▄▄▀█▄▄▀▀ ▄█▀▀▀▀▀█ ▄▀ █▀█▄ █  ▄████
████ █ ▄█▀▄ ▀▀█▀▄▀▀ ▄▄▀▄▀▀▄▄  ▄▀▀▄▄ █▀▀▀ ████
████▄█▄█▄█▄▄ ▀▀▀█▄▀▄▄█▀▄▀▄ ▄█  ▄ ▄▄▄ ▄  ▄████
████ ▄▄▄▄▄ █▀  ▀██▄█▄█▄▀ ▄▀▀▄▀ ▄ █▄█ ▄ ▄ ████
████ █   █ █ █▄  ▀█ ▀█▄▀▀  █▄█   ▄▄▄  ██ ████
████ █▄▄▄█ █▄▀█▀▄▄ █▀▄▀▄█▀ ▄█ ▄██▀▄▄█▀▀█▄████
████▄▄▄▄▄▄▄█▄███▄▄██▄███▄███▄▄▄█▄▄▄▄▄▄██▄████
█████████████████████████████████████████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

SMS

Pour partager un format d'SMS, on utilise le schéma d'URI sms.

$ echo -n 'sms:+33623456789?body=texte%20du%20sms' | qrtool enc -t unicode
█████████████████████████████████████
█████████████████████████████████████
████ ▄▄▄▄▄ █▀█▄▄▀▀▄██ ▄▄██ ▄▄▄▄▄ ████
████ █   █ ██▀██▄▀█▄█  ▀ █ █   █ ████
████ █▄▄▄█ █▄██▄▄▄▀▀▄▄▄▄██ █▄▄▄█ ████
████▄▄▄▄▄▄▄█▄█▄▀ █▄█ ▀▄█▄█▄▄▄▄▄▄▄████
████▄█▄█ █▄▀▀▀▄ ▀▀██ ██  ▀▀▀▄▀▀▄▀████
████▀ ▄█▀█▄▀█ ▄█▄▀ ▄▄ ▄ ▄ █▀ ▀██ ████
████▄▀█▀ ▀▄██▀█▄▀█  ▀ █▄ ▄ ▀█▀▀█ ████
██████▀▀ ▄▄▀  ▄▀▀▄█▄ ▀█▄▄ ▀ ▀ █▄▄████
█████  ██▀▄ ██  ▄▀██  █▄▀ █▄█ ▄ ▀████
████▄▀█ ▄ ▄▀ ███ ▀  ▄█▄█▄ ▄ █▀▄▄ ████
████▄█████▄█ █ ▄▄█ █ ███ ▄▄▄ █▀█ ████
████ ▄▄▄▄▄ ██▀█▄▀▄█▀ █▄▄ █▄█ ▄▄▄▄████
████ █   █ █▄▀▀▀▀▀██ ▄█ ▄▄    ▄ ▄████
████ █▄▄▄█ █▄ █▄█▀▀█▄ ▄▀█▄ ▀▀▀▄▀▄████
████▄▄▄▄▄▄▄█▄█▄▄█▄█▄▄██▄█████▄█▄▄████
█████████████████████████████████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

Un autre format existe également où plutôt que de suivre exactement la RFC 5724, le contenu du SMS est directement inscrit à la suite du numéro (avec un deux-points pour les séparer).
Je déconseille fortement de l'utiliser. Il n'est pas standard.

$ echo -n 'sms:+33623456789:texte%20du%20sms' | qrtool enc -t unicode
█████████████████████████████████████
█████████████████████████████████████
████ ▄▄▄▄▄ █ ▄    ▄▄▀ ▄▀ █ ▄▄▄▄▄ ████
████ █   █ █▀█▄▀▄█▀▀▄ █▄██ █   █ ████
████ █▄▄▄█ ██▄▄█ ▀▄▀ ▀█ ██ █▄▄▄█ ████
████▄▄▄▄▄▄▄█ ▀▄▀▄█▄▀ ▀▄█▄█▄▄▄▄▄▄▄████
████ ▀ ▄▀ ▄▄█▀▄█▀ ▀ █▀  ▀▀ █▀▄▀▄ ████
█████▄▀█ ▀▄▀▀▄▄▀█▄██ ███▄██▄▀▀█▀█████
████▄█▄███▄█▄▄▄▄▄█ ▄▀ █▄█▀▀▀██▄ ▀████
████ ▄▀▀▄▀▄▀▀  ▀█▄▀▄ █  █ ▄▄▄█▄▄▄████
████▄▄▄ ▄█▄▄▀▀▄ ▄█ ▄ █▄  ▄▄▀▄ ▄▄▄████
████▄██▀██▄  ▄▀ ▄  ▄▄█▄▄▀▄▄ ██▀▀▀████
█████▄▄███▄█  █▀▀▄▄▀ ▄ █ ▄▄▄   █ ████
████ ▄▄▄▄▄ █ ▀ ▀ ▀  █▀▄▄ █▄█ ▄▄ ▀████
████ █   █ █▀▀██▄█████▀▄     ▄▀██████
████ █▄▄▄█ █▄▀▄▀ ▀▄█  ▀ ▀▀ █▄▄█▀▄████
████▄▄▄▄▄▄▄█▄████▄▄███▄▄██▄▄▄▄█▄█████
█████████████████████████████████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

On peut aussi partager un SMS vide. L'utilisateur est ainsi invité à le remplir.

Partage de contact

Si vous souhaitez juste partager un numéro de téléphone, le plus simple est d'utiliser le format W3C. C'est-à-dire le schéma d'URI tel (RFC 3966).

Extrêmement simple :

$ echo -n tel:0623456789 | qrtool enc -t unicode
█████████████████████████████
█████████████████████████████
████ ▄▄▄▄▄ █ ▄▀█▄█ ▄▄▄▄▄ ████
████ █   █ █▄▄█ ██ █   █ ████
████ █▄▄▄█ █▄▄█▀ █ █▄▄▄█ ████
████▄▄▄▄▄▄▄█▄█▄▀ █▄▄▄▄▄▄▄████
████▄▀▀ ▄▄▄▄ █ █  ▀▀ ▀ ▄▄████
████▄▄█ ▀▄▄ ▀▄ ▀█▀████ ▄▄████
████▄▄████▄▄ ▀▄▀▀ █▀▀ ██▄████
████ ▄▄▄▄▄ █ ▄▀▀   ▄ █ █▀████
████ █   █ █ ▄▀  █▀▄▄▀█▄▄████
████ █▄▄▄█ ██ ▄██▀ ▄▄▄▀  ████
████▄▄▄▄▄▄▄█▄██▄█▄█▄▄▄▄██████
█████████████████████████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

Sinon, on peut partager une vCard directement, mais c'est beaucoup plus lourd. Pour plus d'information, se référer à la RFC6868.

Exemple :

$ cat ache.vcard
BEGIN:VCARD
VERSION:4.0
N:ache;;;Ing;
FN:ache
NICKNAME:ache
LOGO;MEDIATYPE=image/png:https://ache.one/res/ache.png
EMAIL:ache@ache.one
KEY;MEDIATYPE=application/pgp-keys:https://ache.one/ache.pgp
URL:https://ache.one
SOURCE:https://ache.one/ache.vcard
END:VCARD
$ cat ache.vcard | qrtool enc -t unicode
█████████████████████████████████████████████████████████████████████████
█████████████████████████████████████████████████████████████████████████
████ ▄▄▄▄▄ █▄▄▄ █▄ █ █▄▀▀▀█▄   ▀▀  ▄▀▄▄▀█▀▀▀ █▀ ▀▀▀ ▄▄▀█  █▄▀█ ▄▄▄▄▄ ████
████ █   █ █▀█▀███▀ █ █▀▀ ███▄█ ██▀▄█▀▄▄█▀██▀▀ █ ▀▄ ███▄▀▄ ▀▄█ █   █ ████
████ █▄▄▄█ █  ▄██  ▄ █ ▀▄█▀▀▄█  ▄▄ ▄▄▄ ▄██▄▄█▀▄▀▀▄▀█  █ ██▀█▄█ █▄▄▄█ ████
████▄▄▄▄▄▄▄█ █ ▀▄▀▄█▄▀ █▄█ █▄█▄█ ▀ █▄█ ▀▄█▄▀▄▀▄█▄▀▄▀ █▄▀ █▄▀▄█▄▄▄▄▄▄▄████
████ █▀▀ █▄▄  █▄███▄ ▀█ ▀▀▀█▀▄▀█▀▄▄▄ ▄▄▀ ▀▄█ █▀ ▄▀█▄  ▀ ▄█▀█ ▄▄ ▄▄██ ████
████▀▄▄▄█▀▄▄▄ ▀▄▀▄█▀ ██▀▀▀██▄ ▄▄█▀▀▀▀█ ▀ ▄  █ █▄▄ ▄▀▄▀▀▀██▄██    ▄█▀▄████
████▀▄▀▀▄▀▄▀▀██▀▀ ▄▀  ▀▄ ▀▀▀▄ ▀▀▄ ▀█▄█▄▀▀ ▄ ▄ ▄ █▄▀▀▀▀▄▀ ▄▄▄  ▄ ▀ ▄▄▄████
████▀▄▄███▄▀▀██▄▄   ▄  ▄▀█ ▀  ▄█  ███▄██▀ ▄▀ █▀▄▄█ ▀ ▄▀▀▄  ▄██▀▀  █▀ ████
█████▀▄▄▄ ▄ █ █ █ ▀█▀▄▀█  ▀  ▀▀▄ ▀█ ▄▄▀█▀▀▄▀▄▄▄▄▀▄█▀ ▀ ██ ▄  ▀▀ ▀█▀██████
████ █▀▄█ ▄▀ ▄▄▀▀█▄ █ █  █▄▄▄▄█▄ ▄▄▄  █▀█▀▀ ▄▄  ████▀ ▀█▀▄▀ ▀ ▀▀▀  █▀████
█████▀▄▄ ▄▄██▀  ▄ ▀▀▄ ▀ ▄▄▄▀▀▀█ ▄▀█▄▄▄▀▀▀ ▀▄▄▄ █▀▄█▀▀  ▀▄█▄▀▄██ ▄▀▀▄▀████
█████▀█▄▄ ▄▀▀▀▄ ▀██▄▀▀███▄▀▀ ▄ ▀▄▄▄ ▄██▀▀█▀██▄ █▀▄█▄█▀ ▀▄▄▀▄▀▄▄ ▄▄ ▀▀████
████▄█▀▄ █▄▄ ██ █ ▄▄▀█▀▀▄ ▄▀▀ ▀▄ ██▄▀ █▀ ▄▀█▄▀▄█ ▄█▀  ▄█▄█▄▀█▄▀▀▀██  ████
████▀▄▄▄▀▀▄█ █▀▀▄██ █▄ ▄▀█▀  ▄▄▀▀█▄▀ ▄█▀▀█▀   ▄█   ▀██▄▄ ▄▄▀█▄▀██  ▀▄████
█████ ▄█ █▄ ▄▄█▀ ▀▄▀ ▄  █▄▀▀▀ ▄▀▀ █ ▀█ ▀██ ██▄█▀ ▀▀█▄█ ███ ██ ▄▀█▄█▄▀████
████ ▀ ▄ ▄▄▄ ▄▀ ▀▀▀▀█▄█ ▀▀▄█▄▀ ▄█▀ ▄▄▄ ▄█▄▄▄  ██▄▄▀██▀▀▄  ██ ▄▄▄ █▀█ ████
████ ▀▀▀ █▄█ ▀▄▀██▄▄  █▄██ █ ▄  ▄  █▄█ ▀ ▀ ▀██ ▀ ▄█ ▀█ ▀█▄ ▀ █▄█ ▀██▀████
████ ▄ ▄ ▄▄ ▄▀▀█ ▄▀ ▀ ▀  ▀ ▀▄▄ ▀▄ ▄ ▄  ▄█▄█▄ ▄██▀▄▄  █▄▀▄▄▀▄▄▄▄ ▄  ▄▄████
████▀ ▀█▀█▄▀█▀   ▄▀▄  ▄▀▀▀█ █▀▀▀  ▄ █▀▀▀▄ ▄ ▄▄█▄█▄▀█▄ ▀██  ▄▄▄▄▀▀▄▀█▀████
████▄ █ ▄▄▄██ ▀ █  ▀▀▀▄██▄█▀▄▀ █ █▀▄▄ ▄ ▄▀▄ ▀ ███▀▀▀▀██ █▄█▀  ▄▄█ ▄▀ ████
█████ ▄ ▄▀▄█▄▄▄█▄▀▀ ██▄▀█ █  ▀ ██▀█ ▄▀█ ▄   ██ █▀ ██ ▀  ▄██▄▄ ▄▀ ▄▄▄▄████
████▀ ▀▀  ▄▄▀ ▄█▄ ▄███ ▀▀▄▀█ ▀██▄▄▀▀▄▄ ▀█     █▄▀█▄▀▄ ▄▀█▄█ █▀▀▀██▀ ▄████
████▀█▀██▀▄█ ▀▀▀█▀ ▄▀▄▄ █  █▄▄ ▄█▀█▄▄▄▀█▄ ▄ ▄ ▄  ▀▀█▄ ▄█▄▄▄▄▀▀ ▄  ▀▄▄████
████ ▀ ▀ ▀▄▀    ▀▄ █▄ █   ▀█▄ ▄█▄█▀▀ ▄▄█▄  ▀▀ █▄▄ ▀▀▄ ▄▄▀▀▄▀█▄▀▀▄▄  ▀████
████  ▀ ▀ ▄▀▀█▄▀▀▀▀█▀▀▄█▄█▄ ▄ ▀▄▀█▄█▀ ▀▀▀▀▄▀█▄▄▄▀▀▀▀ ▀ ▀▄▄▄▀▄█ ▀▄█▀ ▄████
████▄▄▀██▀▄▀ ▀▄  ▄▀ ▄▄   ▄▀ ▀█▄▀▄▀█▄▀ █ █▀ ▀ █▀█ ▄█▀█   ▀▀▄ ▀████ █▄▀████
████ ▀██▀█▄▀▀▄▄█▄▄▀ █▄▄▀██ ▄ █▀██▄█ ▄▀█▀▀▄▄ ▄ ▄▄▀▀█ ▀ ▀▀▄█  ▄▀▀▀█▀▀█ ████
████▀█▄ █▄▄█▀█▄█▄▄██ ▄█ █ ▀▀ ██   ▄▀ ▄▀▀▄█ ▄▄▄ ▀▄▄██ ▀██ ▄█▄█ ████▀█ ████
█████▄▄█▄█▄▄ ▀▄ ▀▀▄▄  ▀   ██▄▄▄▄   ▄▄▄ ██▀▄▀██▀███▀▄ █▄▄▀ ▄▄ ▄▄▄  ▀█ ████
████ ▄▄▄▄▄ █▄▄▀██▄▀█ █▄ █  ▄ ▄▄▀▀▀ █▄█  ▀█▀▀  █▄▀ ▀▄▀▀▄▀  █  █▄█ ▄█▀█████
████ █   █ █▄  ▄█▄▄▀▀▄▀▀▄▄█  ▄▄▄█▄  ▄  ▄▀▀▀▄█▄█   ▄  █ ██ ▄█ ▄▄▄ ██▄█████
████ █▄▄▄█ ██▄█▀  ▀ █▀▄▀▀ ▄▀   ▀ ▄▀█▄▀▄▀█▀▀  █▀▄█  ▄▀▄▀▄  ▄▀▄▀ ▀█▄▀ ▄████
████▄▄▄▄▄▄▄█▄██▄▄▄██▄▄▄▄▄███▄███▄█▄██▄▄▄█▄█▄▄██▄▄██▄████▄█▄▄▄██▄█▄▄██████
█████████████████████████████████████████████████████████████████████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

Le problème est que comme on peut le voir, c'est assez lourd. Le format vCard n'est pas prévu pour être succinct.

Le format MeCard est certainement plus adapté et au moins aussi répandu dans les codes QR.

$ echo -n 'MECARD:N:ache;EMAIL:ache@ache.one;URL=https¥://ache.one;;' | qrtool enc -t unicode
█████████████████████████████████████████
█████████████████████████████████████████
████ ▄▄▄▄▄ █  █ ▄█  ██▀ ▀ █▀██ ▄▄▄▄▄ ████
████ █   █ █▀▄▀▀█▄▄ ▄▀ ▄▀ ▄▄▄█ █   █ ████
████ █▄▄▄█ ██▄ ▀▄█▀▀ ▄▄█▄█ ▄ █ █▄▄▄█ ████
████▄▄▄▄▄▄▄█ █ █▄█▄▀ █ ▀ █▄▀▄█▄▄▄▄▄▄▄████
████ ▀ ▄▀▄▄▄█ ▄█ ▀▀▄█▄█ ▄▄█▀▄█▄▀█ ▀ ▄████
█████▄▀ █▀▄ █▀   ▄███▀ ███▄ █ ▄██ █▀▀████
████▄▀ ▀█▀▄   ▄█▀█ ▄█  ▀ ▄▀▄ ▀██ █ █▀████
████ ▀ ▄ ▄▄█▄██ █▄ ▀▄█ ▄▀▀▀▄ ▄ █▀▄██ ████
█████▄█▄▀▀▄ ▀▄█ █▀▀▀ █▀▀████▀ ███  ▄▀████
████▄▄█▀  ▄▄█▄ ▄▄ ██▄ ▀▀▀▀  ▄█▄▀▀ ▄▀█████
████  ▄ ▀ ▄▀▀▄▄█▄█▄▀▄▄█▀▄█ ▀  ▀ ▄▄▄▀▀████
█████▀▄▀▄█▄ ███▀█▄▀▄▄▀█ ██▀▄█▀ ▀ ▄ ▀█████
████▄███▄▄▄▄ ██▄   ▀▄ ▄▀██ ▄ ▄▄▄ ▀█ █████
████ ▄▄▄▄▄ █ █▀█▄ ▄ ▄ ▀▀▀▄▀▀ █▄█ ▄   ████
████ █   █ █▀  ▄ ▀▀█ ▄▀▄█▄██ ▄   █  ▄████
████ █▄▄▄█ █▄▀▀▄█▄ █ ▀▄▄▀▄ ▄ ██▄  ▄██████
████▄▄▄▄▄▄▄█▄██▄█▄█▄█▄█▄▄█▄██▄▄▄██▄▄█████
█████████████████████████████████████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

Le code est effectivement beaucoup plus petit.

Le caractère : dans contact au format MeCard doit être échappé. Pour cela, il faut le précéder de ¥, comme dans l'URL de l'exemple précédent.

Configuration Wi-Fi rapide

Avec le préfixe WIFI, proposé par la bibliothèque zxing et supporter par Android et iPhone.

Je traduis ici la documentation de la bibliothèque zxing, la seule référence sur ce sujet :

ParamètreExempleDescription
TWPAType d'authentification ; pouvant être WEP ou WPA ou WPA2-EAP, ou nopass pour aucun mot de passe. Ou, omettre pour aucun mot de passe.
SmynetworkSSID du réseau. Obligatoire. Encadrer avec des guillemets doubles si c'est un nom ASCII, mais pourrait être interprété comme hex (c'est-à-dire "ABCD")
PmypassMot de passe, ignoré si T est nopass (auquel cas, il peut être omis). Encadrer avec des guillemets doubles si c'est un nom ASCII, mais pourrait être interprété comme hex (c'est-à-dire "ABCD")
HtrueOptionnel. Vrai si le SSID du réseau est caché. Notez que cela a été utilisé par erreur pour spécifier la méthode de phase 2 dans les versions jusqu'à 4.7.8 / Scanner de code-barres 3.4.0. Si ce n'est pas un booléen, il sera interprété comme méthode de phase 2 (voir ci-dessous) pour la compatibilité ascendante
ETTLS(WPA2-EAP uniquement) Méthode EAP, comme TTLS ou PWD
Aanon(WPA2-EAP uniquement) Identité anonyme
Imyidentity(WPA2-EAP uniquement) Identité
PH2MSCHAPV2(WPA2-EAP uniquement) Méthode de phase 2, comme MSCHAPV2

L'ordre des champs n'a pas d'importance. Les caractères spéciaux \, ;, ,, " et : doivent être échappés avec une barre oblique inverse (\) comme dans l'encodage MECARD. Par exemple, si un SSID était littéralement "foo;bar\baz" (avec les guillemets doubles faisant partie du nom du SSID lui-même), il serait encodé comme : WIFI:S:\"foo\;bar\\baz\";;

Ainsi, grosso modo, il y a 3 champs obligatoires :

Et l'ordre des champs n'a pas d'importance.

Un exemple de configuration pourrait être :

$ echo -n 'WIFI:S:MON_RESEAU;T:WPA;P:pass123;;' | qrtool enc -t unicode
█████████████████████████████████████
█████████████████████████████████████
████ ▄▄▄▄▄ █▄ ▄▀█▄▄ █▄ ▄ █ ▄▄▄▄▄ ████
████ █   █ █▄▄▀▄█▄█▀█▀ ▄▄█ █   █ ████
████ █▄▄▄█ █▀▀▄ ▀▀▀▄▄█ ▄▀█ █▄▄▄█ ████
████▄▄▄▄▄▄▄█▄▀ █▄▀▄█ █ █ █▄▄▄▄▄▄▄████
████▄█ ▀▀▀▄ ▀█▄█▄▄█▀ ▄██▀▀█ ▀▀▄▀ ████
████ ▄▀▀ ▄▄▄█▀▀▀ ▄ █  ▄▄█ █  ▄█▀▀████
████ ▀█▀█▄▄█ ▀▀ ▄  ▀ ▀█▀ ▀▀ ▄▀▀▄▀████
████▄ ▀▀▀ ▄▄█ ▄▄▀▀██   █▄█▄██▄▀▀▄████
████▄ ▄▀█ ▄█▀ ▄▀▀▄██ ▄█▄▀▀ ▄▄▀▄█ ████
████▄▄▀▀ ▄▄▀█▀▀█ ▄ █▄  ▄▀▄█▄█ ▄  ████
████▄▄█▄▄▄▄▄▀█▄ █  █ ▄▄█ ▄▄▄    █████
████ ▄▄▄▄▄ █▄ ▀▄█▀██  ▀▀ █▄█ ▀█▀▄████
████ █   █ ██ ▀▀█ █▄  ██▄▄▄  ▄▄█▄████
████ █▄▄▄█ █▄█▀█▀█▄█  ▀▄██▄▀█▄▄▄ ████
████▄▄▄▄▄▄▄█▄▄██▄███▄▄██▄▄▄█▄█▄▄▄████
█████████████████████████████████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

Position GPS

Encore une fois, on utilisera un schéma d'URI, celui de geo^{(en)}.

De manière simple, ce sont les coordonnées GPS (latitude puis longitude, dans cet ordre) format numérique avec le préfixe d'URI geo:.

$ echo -n "geo:48.858296,2.294479" | qrtool enc -t unicode
█████████████████████████████████
█████████████████████████████████
████ ▄▄▄▄▄ █  █▄▄███▄█ ▄▄▄▄▄ ████
████ █   █ █▀▀▀█ ██▀▄█ █   █ ████
████ █▄▄▄█ ██ ▄▄▀ ██ █ █▄▄▄█ ████
████▄▄▄▄▄▄▄█ ▀▄▀ ▀▄█▄█▄▄▄▄▄▄▄████
████ █  █ ▄ ▀ ██   ▄█▀ ▀█▄▀▄▄████
█████▄ █▄▀▄▄ ▀▄   ▀▄▀▄  ▀▄ ▀█████
████▄█▀▀█▄▄▀ ▄▄ █▀▀█▀ ▄▄▀█   ████
████▀▄   ▀▄ █ ▄█ ▀▄ ▄█▄▄█▀█ █████
██████▄█▄█▄█ ▄█▄▀▀█▀ ▄▄▄   █▀████
████ ▄▄▄▄▄ █ ▄▄▄ ███ █▄█ ▄█▄ ████
████ █   █ █▀█ ▄  ▀ ▄▄  ▄ ▀▄▀████
████ █▄▄▄█ █▄ ▀▄▄▄█▄ ██▀ █▀▄█████
████▄▄▄▄▄▄▄█▄█▄█▄█▄▄██▄▄▄▄▄▄▄████
█████████████████████████████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

Référez-vous à la RFC 5870 pour plus de fonctionnalités. Dans les grandes lignes, chaque paramètre est un champ séparé par un point-virgule. Il est ainsi possible de choisir un système de coordonnées différent de WGS 84 avec le paramètre "crs", mais cela à peu d'intérêt en France. Surtout, il est possible de préciser que l'emplacement est approximatif avec le paramètre "u" qui donne l'écart approximatif en mètre.

Google Map utilise un format étendu avec le paramètre q pour « query ».
Celui-ci n'est pas introduit par un point point-virgule, mais par un point d'interrogation.
Il est ainsi possible de faire une recherche autour d'un point particulier (ou si le point de référence est 0,0 autour de votre position courante) à partir d'un champ de texte.

Autre spécificité de Google Map, les coordonnées GPS ne sont pinnés que lorsqu'on passe par une requête.
Ainsi pour avoir un "pin" sur Google Map, il faudra référencer l'URI :

$ echo -n "geo:0,0?q=48.858296,2.294479" | qrtool enc -t unicode
█████████████████████████████████
█████████████████████████████████
████ ▄▄▄▄▄ █  ▄ ▀█ ▄██ ▄▄▄▄▄ ████
████ █   █ █▀█ ▄▄▄█▄▄█ █   █ ████
████ █▄▄▄█ ██ ▀▄█  █ █ █▄▄▄█ ████
████▄▄▄▄▄▄▄█ █▄█▄▀ ▀▄█▄▄▄▄▄▄▄████
████▄▀▄▄█ ▄ ██▄▄ █▀ ▀▀▄██▄▀▄▄████
████▀█▀▄▀▄▄ ▀█ ▀▀█▄▀ ▀▄ ▄▄ ▀█████
████▄  ▄▄█▄ ██▀▀▄▀ █▄█   █   ████
████▀▄█▄▀ ▄▄█▀█▀▄ █▀▄▄▀▀ ▀█ █████
███████▄▄█▄▄▀███ ▄ ▀ ▄▄▄ ▄ █▀████
████ ▄▄▄▄▄ █ ▄▀ ██▀▄ █▄█ ▄█▄▄████
████ █   █ █▀▀▀▄ ▄▄▀ ▄   █▀▄ ████
████ █▄▄▄█ █▄███▀▀▄▄▄█ ▀▄█▀▄█████
████▄▄▄▄▄▄▄█▄█▄█▄▄▄▄██▄███▄▄▄████
█████████████████████████████████
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

J'ai pensé qu'il est utile de préciser au-vue de la position dominante de Google Map dans l'univers cartographique.

Un format très extensible

Les codes QR ne sont globalement qu'une méthode d'encodage facile à décoder (d'où le nom Quick Response). On peut encoder n'importe quoi et cela laisse la possibilité de créer votre propre « standard » par exemple en adoptant un schéma d'URL spécifique à votre besoin.

Ainsi, weixin:// (WeChat) s'est largement imposé en Chine comme méthode de payement sans contact.

D'autres standards apparaissent spontanément, ainsi les suffixe bitcoin: et ethereum: sont largement utilisés pour partager l'adresse d'un portefeuille de cryptomonnaie. Même sans standard, le format texte simple est utilisé par exemple pour faciliter le partage de code temporaire d'authentification à deux facteurs (codes TOTP).


Pour finir, je voudrais mettre en avant le fait, un peu hors sujet, qu'une API Web de détection de codes-barres (incluant les codes QR) est en train se développer.

Aussi, si vous avez apprécié ce poste de blog, je suis ouvert aux dons d'ethereum. 😉

0x01CfcFB0B387B64198C820D87e4092BbE4b6e4C5.

Adresse de mon portefeuille de crypto-monnaie ♦ ETH.