--- pubDate = 2024-08-17T06:09:04 tags = ['multimedia', 'cli', 'programmation', 'linux', 'code QR'] lang = "fr" type = "note" [author] name = "ache" email = "ache@ache.one" --- # 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](https://crates.io/crates/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. ```sh $ rxing-cli qr-code_mermaid_file.jpg decode Detection result: (qrcode) https://www.youtube.com/watch?v=eV7z7iJ22Bo ``` :::note rxing a l'avantage de supporter d'autres formats de code bar, 2D ou 3D. Comme le [format Aztec](https://fr.wikipedia.org/wiki/Code_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](https://crates.io/crates/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. ```sh $ 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](https://xkcd.com/927/): How standards proliferate](/notes/res/standards.png) > [XKCD927](https://xkcd.com/927/): 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. :::note 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. - Celle standardisée par le W3C : `mailto:ache@ache.one?subject=Test code QR&body=Thank you for your content` - Et celle de NTT DoCoMo : `MATMSG:TO:ache@ache.one;SUB:Test code QR;BODY:Thank you for your content;;` :::note 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. ```sh $ echo -n 'MAILTO:ache@ache.one' | qrtool enc -t unicode █████████████████████████████████ █████████████████████████████████ ████ ▄▄▄▄▄ ██▄▀▀▄▀▀▄▀█ ▄▄▄▄▄ ████ ████ █ █ ██ █▄▀ ██ █ █ ████ ████ █▄▄▄█ █▀ ▄▀█▄▄▄▄█ █▄▄▄█ ████ ████▄▄▄▄▄▄▄█▄█▄█▄█▄█ █▄▄▄▄▄▄▄████ ████▄█▀ █▄▄▀ █▄█▀▀ ▀▀ █ ▀█▀█▀████ █████▄▄▄▄ ▄▄█▄██ █▀▄ ▄▀▄▄▄ ████ █████▀▄ ▀▀▄█ ▀▄ █▀▄▀ ▄▄▄██▄ ▄████ ████▄▀█▄ █▄ █▄█ █▄▄▄ ▀▄█▄█▄ ▀████ ████▄▄▄███▄█ █▀█ ▀█ ▄▄▄ █ ▀████ ████ ▄▄▄▄▄ █▀█▀▄ █ █▄█ █ █▀████ ████ █ █ █▀▀▀▀██▀▀ ▄▄▄▀▄ ▄████ ████ █▄▄▄█ ███▄███▀▄█▀▄ ▄█▀█ ████ ████▄▄▄▄▄▄▄█▄█▄█▄███▄██▄▄▄▄█▄████ █████████████████████████████████ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ``` :::note [Le schéma d'URI `mailto`](https://fr.wikipedia.org/wiki/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. ```sh $ 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](https://datatracker.ietf.org/doc/html/rfc5724). ```sh $ 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. ```sh $ 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 : ```sh $ 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](https://datatracker.ietf.org/doc/html/rfc6868). Exemple : ```sh $ 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. ```sh $ echo -n 'MECARD:N:ache;EMAIL:ache@ache.one;URL=https¥://ache.one;;' | qrtool enc -t unicode █████████████████████████████████████████ █████████████████████████████████████████ ████ ▄▄▄▄▄ █ █ ▄█ ██▀ ▀ █▀██ ▄▄▄▄▄ ████ ████ █ █ █▀▄▀▀█▄▄ ▄▀ ▄▀ ▄▄▄█ █ █ ████ ████ █▄▄▄█ ██▄ ▀▄█▀▀ ▄▄█▄█ ▄ █ █▄▄▄█ ████ ████▄▄▄▄▄▄▄█ █ █▄█▄▀ █ ▀ █▄▀▄█▄▄▄▄▄▄▄████ ████ ▀ ▄▀▄▄▄█ ▄█ ▀▀▄█▄█ ▄▄█▀▄█▄▀█ ▀ ▄████ █████▄▀ █▀▄ █▀ ▄███▀ ███▄ █ ▄██ █▀▀████ ████▄▀ ▀█▀▄ ▄█▀█ ▄█ ▀ ▄▀▄ ▀██ █ █▀████ ████ ▀ ▄ ▄▄█▄██ █▄ ▀▄█ ▄▀▀▀▄ ▄ █▀▄██ ████ █████▄█▄▀▀▄ ▀▄█ █▀▀▀ █▀▀████▀ ███ ▄▀████ ████▄▄█▀ ▄▄█▄ ▄▄ ██▄ ▀▀▀▀ ▄█▄▀▀ ▄▀█████ ████ ▄ ▀ ▄▀▀▄▄█▄█▄▀▄▄█▀▄█ ▀ ▀ ▄▄▄▀▀████ █████▀▄▀▄█▄ ███▀█▄▀▄▄▀█ ██▀▄█▀ ▀ ▄ ▀█████ ████▄███▄▄▄▄ ██▄ ▀▄ ▄▀██ ▄ ▄▄▄ ▀█ █████ ████ ▄▄▄▄▄ █ █▀█▄ ▄ ▄ ▀▀▀▄▀▀ █▄█ ▄ ████ ████ █ █ █▀ ▄ ▀▀█ ▄▀▄█▄██ ▄ █ ▄████ ████ █▄▄▄█ █▄▀▀▄█▄ █ ▀▄▄▀▄ ▄ ██▄ ▄██████ ████▄▄▄▄▄▄▄█▄██▄█▄█▄█▄█▄▄█▄██▄▄▄██▄▄█████ █████████████████████████████████████████ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ``` Le code est effectivement beaucoup plus petit. :::attention 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](https://github.com/zxing/zxing/wiki/Barcode-Contents#wi-fi-network-config-android-ios-11) 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ètre | Exemple | Description | | --------- | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | T | `WPA` | Type d'authentification ; pouvant être `WEP` ou `WPA` ou `WPA2-EAP`, ou `nopass` pour aucun mot de passe. Ou, omettre pour aucun mot de passe. | | S | `mynetwork` | SSID 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"`) | | P | `mypass` | Mot 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"`) | | H | `true` | Optionnel. 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 | | E | `TTLS` | (WPA2-EAP uniquement) Méthode EAP, comme `TTLS` ou `PWD` | | A | `anon` | (WPA2-EAP uniquement) Identité anonyme | | I | `myidentity` | (WPA2-EAP uniquement) Identité | | PH2 | `MSCHAPV2` | (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 : - Le champ "S" pour le nom du réseau ; - Le champ "P" pour le mot de passe ; - Le champ "T" pour le type de sécurité en pratique toujours "WPA" pour les particuliers. Et l'ordre des champs n'a pas d'importance. Un exemple de configuration pourrait être : ```sh $ 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`](https://en.wikipedia.org/wiki/Geo_URI_scheme)^{(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:`. ```sh $ 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. :::attention 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 : ```sh $ 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](https://fr.wikipedia.org/wiki/Sch%C3%A9ma_d%27URI) 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](https://developer.mozilla.org/en-US/docs/Web/API/Barcode_Detection_API) (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.](/res/qr-code_eth-wallet.svg)