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.
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
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
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.
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
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
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.
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.
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
pour android uniquement
Mode :13
descripteur 01
xx : taille de la référence de la main
xxxxxxx : référence de la main
Mode :14
descripteur 01
xx : taille de la référence de la main
xxxxxxx : référence de la main
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
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
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
..