Construire une trame d'echanges

Introduction

Désigner une trame d’échange c'est prévoir les types d’échanges possibles a travers la constitution d'une trame.

Cette trame est codée par l’émetteur, puis décodée par le récepteur

On intègre donc des commandes, des données et un checksum pour vérifier que toutes les données ont été reçues et sont cohérentes.


Convertir des binaires en hexadecimal

J'ai souhaité faire un rappel sur la conversion en hexadécimal car les trames vont s’écrire sous cette forme.

 

un Octet est composé 8 bits

Chaque bit prend la valeur 0 ou 1

En découpant un octet en 2 groupes de 4 bits, on peut définir 255  combinaisons différentes,

Ainsi chaque lettre de la table ASCII trouve sa correspondance dans la table du même nom

Si je souhaite coder le chiffre "1" correspondant à 31 en hexa dans la table ascii, je vais construire un octet comme suit 3 =0011 et 1=0001

soit la concaténation des 2 : 00110001

 

Convention d’écriture :

pour indiquer qu'un nombre est en hexadecimal, vous trouver un préfixe : 0x ou /0x

ou bien un suffixe x

il faut bien comprendre que 10 en decimal, c'est 10, mais 0x10 en hexadécimal correspond à 16 en décimal.

donc prudence

 

Dans la suite de cette page, je m'exprime en hexadécimal par défaut


Description de la trame

A partir de la console, je souhaite être capable de vérifier le bonne connexion des différents modules a une table. On peut faire une erreur d'association lors du  rattachement.

 

Modele de trame

02 début de trame  - invariant

xx : Mode sur 2 caractères

xx: longueur de la Mac adresse

xxxxxxxxxx : Mac Adresse

[..... BLOCK DATA en fonction du Mode

  .....]

xxxxxx :  Checksum

03 : fin de trame

 

Séparateur :

Chaque valeur ou bloc sera séparé par le caractère ";"

 

Liste des modes  :

- 14 : Mode message

- 15 : Whoami

- 17 : fin de main - pas de reponse

- 16: reponse à Whoiam

-18 : Transmission Uid

 

 




Le BLOCK DATA

La dimension du bloc DATA peut être induite par la commande, mais comme je n'ai pas encore défini les commandes, je vais intégrer un système de découpage dans le bloc data

 

un bloc data est toujours composé :

xx : Nb d’éléments >=01 - normalement ce nombre ne peut être nulle, il définit le nombre de paire (nb de caractère, informations) inclus dans le bloc data.

la doctrine est de toujours respecter le template ci dessous :

 xx : longueur ( max 255)

xxxxxxxxx : data

 

Le bloc data ne peut pas être vide,  c'est 01;01;x et dans ce cas, le x ne sera jamais interprété.

 

Précision : le bloc data ne contient pas une agrégations de plusieurs éléments, par exemple plusieurs TagId, ou un mélange de plusieurs informations comme le nom du joueur et sa position à table.

 



Bloc data pour Whoiam

La dimension du bloc DATA va être induite par la commande

un bloc data est toujours composé :

 xx : longueur ( max 200)

xxxxxxxxx : data

 

exemple :

Dans le cas d'un whoami, la réponse comprendra l'adresse mac et l'adresse ip

02: taille du descripteur

02 : descripteur

xx : Nombre de caractère ( maximum FF, soit 255 caractères)

xxxxxxxxxxxxxx ; @mac

xx :Nombre de caractere de l'adresse Ip

xxxxxxxxxxxx


bloc data pour Uid

02 : nombre de caractère du descripteur

03 : descripteur - nombre d'informations fournies

//1ere information

02 : longueur du numéro du port

xx : Numero du port :

01 = 1er carte

02 = 2nd carte

03 = 1er carte du flop

04 = 2nd carte du flop

05 =3eme carte du flop

06 =turn

07 =river

 

//seconde information

xx : Longueur de l'uid ( va dépendre des protocoles de tag RFID utilisé)

xxxxxxxxxxx : uid

 

// Troisième information

xx : longueur de l'identificateur de la main

xxxxxxxxxx  : identificateur de la main 



BLOC Data des messages OLED

02 : nombre de caractère du descripteur

04 : descripteur - nombre d'informations fourni ( valeur min =4, valeur max =12)

 

 

(Ligne1 de l'ecran OLED)

03: Longueur de la couleur - max 255

xxx : couleur

01 : taille des caractères de 08 à 12

x:  taille

02 : taille pour la typographie

xx : code typographie: 01 - Normal ou  02-Gras ou  03-italique

xx : Nb caractères du message ( max 40 )

xx  : Message

 

(ligne2 de l'ecran OLED)

03: Longueur de la couleur - max 255

xxx : couleur

01 : taille des caractères de 08 à 12

xx:  taille

02 : taille pour la typographie

xx : code typographie: 01 - Normal ou  02-Gras ou  03-italique

xx : Nb caractères du message

xx  : Message

 

(ligne 3 de l’écran OLED)

03: Longueur de la couleur - max 255

xxx : couleur

01 : taille des caractères de 08 à 12

x:  taille

02 : taille pour la typographie

xx : code typographie: 01 - Normal ou  02-Gras ou  03-italique

xx : Nb caracteres du message

xx  : Message

 

 

display.setTextSize(Taille);       Définit la taille des caractères, la plus petite valeur étant 1.

1 : Matrice 5×7, 2 : Le double, (10×14) 3 : Le triple (15×21) etc.



bloc data pour info joueur

Objectif : Faire le lien entre une position et un joueur.

Au préalable, la position a été liée à la table

et les informations du joueurs ont été enregistrés ( nom, prénom, aka, club).

il faut lier ensuite une carte avec l'identité du joueur

et celui ci présente sa carte au lecteur, ainsi on fait le lien table, position, joueur.

 

Commande : 10 

02 : nombre de caractère du descripteur

02 : descripteur

xx : nb de caractere du tag

xxxxxxxx : tag 

 

 

Pour android :

Mode=11

04 : nb de blocs du descripteur

xx : nb de caractère nom-prénom

xxxxxxxxx : nom prenom

xx : nb de caractères Pseudo

xxxxxxxxxx  : Pseudo

xx : nb de caractères Club

xxxxxxxxx   : club

xx : nb de caractères compléments

xxxxxxxxx : complements

Le complément peut être une phrase fétiche ou un résumé des meilleurs performances.


Bloc data pour @ip

Pour android uniquement

 

Mode 12 

descripteur : 02

xx: taille de l'adresse IP ( max xxx.xxx.xxx.xxx soit 15)

xxxxxxxxx ; adresse Ip

xx : taille de la mac adresse

xxxxxxxxxx : mac adresse


Bloc data pour main à retenir

pour android uniquement

 

Mode :13

descripteur 01

xx : taille de la référence de la main

xxxxxxx : référence de la main


bloc data pour main à cacher

 

Mode :14

descripteur 01

xx : taille de la référence de la main

xxxxxxx : référence de la main



Calcul du checksum

mode de calcul :

la somme des données et du checksum doit être nulle... Donc, le checksum doit être le complément à deux de la somme afin d'arriver à zéro

 

Formule en C

public static byte[] CalculateCS(byte[] data)

{

short cs = 0;

foreach (byte b in data) cs += b; //Somme des octets

cs = (short)((~cs) + 1); //Complément à 2

return System.BitConverter.GetBytes(cs);

}

Heureusement, internet est inépuisable

http://www.locoduino.org/spip.php?article70

Source :

http://www.locoduino.org/spip.php?article70

Le ~ (non bit à bit)

l’opérateur ~ effectue un non bit à bit. Chaque bit de l’opérande est inversé : le non de 0 est 1 et le non de 1 est 0. Le programme ci-dessous montre ce qui se passe pour un non appliqué à la variable a :

 

byte a = 85; // 85 en base 10 est égal à 01010101 en binaire

 

byte b = ~a; // Le résultat est égal à 10101010 en binaire

Je fais un renoncement sur cette fonction apres 4 heures de programmations infructueuses.
Le checksum sera composé de la somme en décimal de la valeur de chaque caracteres en hexa.
 

Dimensionnement du checksum

Hors bloc data, j'ai 19 octets avec 4 séparateurs

La longueur max du bloc data (hors message OLED) est fixé à 200 caracteres (separateurs compris)

la valeur max d'un octet est : 125

 

255*125=31875 ( 0x7c83)

donc 2 octets sont suffisants pour le checksum

 

 


checksum pour message OLED

je vais considérer que je n'ai pas besoin de vérifier l'intégrité de la trame pour les messages OLED.

Ça me permet de ne pas augmenter le nombre d'octets du checksum.

Le checksum par défaut de ce type de trame sera donc de : FFFF

 



Le code pour arduino

Arduino - codage de trame


..

Arduino-décodage de trame

Télécharger
Arduino - décodage de trame
arduino decodage de trame.pdf
Document Adobe Acrobat 21.7 KB


Le code pour PHP

PHP -codage de trame

Télécharger
code PHP et HTML pour le codage de trame
PHP - codage de trame.pdf
Document Adobe Acrobat 30.6 KB

PHP- décodage de trame

Télécharger
code PHP et HTML pour le décodage de trame
PHP - decodage de trame.pdf
Document Adobe Acrobat 33.9 KB


Le code pour Android

En parallèle, je développe le meme code pour Android



Cahier de tests

Tests PHP - codage

Télécharger
Cahier de test PHP - codage de la trame
cahier de test - codage PHP.pdf
Document Adobe Acrobat 39.6 KB

Tests PHP - décodage

Télécharger
cahier de test PHP - décodage de la trame
cahier de test - decodage PHP.pdf
Document Adobe Acrobat 50.9 KB

Tests Arduino - codage

Tests Arduino- décodage

Télécharger
cahier de test Arduino-décodage de la trame
cahier de test - decodage arduino.pdf
Document Adobe Acrobat 51.6 KB