#include #include #include "SimpleWiNo.h" #include //Objet Wino SimpleWiNo wino; //Constantes de configuration des noeuds #define ADRESSE_CLUSTER 0x4A89 #define ADRESSE_NOEUD 0x0001 #define CANAL 7 #define DELAI_ENVOI 60000 //Variables pour le paquet uint8_t txbuf[40]; //Buffer d'émission uint8_t rxbuf[40]; //Buffer de réception uint8_t packetLenTX; //Longueur du paquet émis uint8_t packetLenRX; //Longueur du paquet reçu uint16_t adresseSource; //Adresse du noeud source uint16_t adresseDestination; //Adresse du noeud source uint16_t adresseMulticast; //Adresse multicast reçue uint8_t numSeq=0; //Propriétés du paquet #define ADRESSE_MULTICAST 0x7878 //Adresse multicast du noeud #define NB_PAYLOAD 10 //Nombre de données de payload #define TTL_MAX 2 //Time To Live avant expiration //Indices des champs du paquet #define CHAMP_ADRESSE_DST 0 //Position de l'adresse de destination #define CHAMP_TTL 2 //Position du TTL dans le paquet #define CHAMP_ADRESSE_SRC 3 //Position du champ d'adressage #define CHAMP_NUM_SEQ 5 //Position du numéro de séquence #define CHAMP_MIN_PAYLOAD 6 //Position du premier octet de la payload //Procédure de formatage de l'en tête et de la payload //du paquet en émission void formaterPaquet(uint8_t* longueur, uint8_t donnees[], uint8_t nSeq){ *longueur=0; //Ajout En-tete //Adresse Destination wino.encodeUi16(ADRESSE_MULTICAST, &donnees[CHAMP_ADRESSE_DST]); *longueur +=2; //Ajout du TTL donnees[CHAMP_TTL]=0; *longueur+=1; //Adresse Source wino.encodeUi16(ADRESSE_NOEUD, &donnees[CHAMP_ADRESSE_SRC]); *longueur +=2; //Numéro de séquence donnees[CHAMP_NUM_SEQ]=nSeq; *longueur +=1; //Ajout de la payload for(int i=0; i attente){ Serial.println("====Envoi Paquet===="); formaterPaquet(&packetLenTX, txbuf, numSeq); afficherPaquet(packetLenTX, txbuf); wino.send(0xFFFF, txbuf, packetLenTX); numSeq+=1; attente=millis()+DELAI_ENVOI; } //Test Reception if(wino.recv(&adresseSource, rxbuf, &packetLenRX) && (adresseSource!=3)){ //Affichage des éléments du paquet reçu M5.Lcd.println("=====Reception====="); Serial.println("=====Reception====="); //Affichage du noeud source adresseSource=wino.decodeUi16(&rxbuf[CHAMP_ADRESSE_SRC]); M5.Lcd.printf("Noeud Source : %X \n", adresseSource); Serial.printf("Noeud Source : %X \n", adresseSource); //Affichage Adresse Multicast adresseMulticast=wino.decodeUi16(&rxbuf[CHAMP_ADRESSE_DST]); M5.Lcd.printf("Adresse Multicast : %X \n", adresseMulticast); Serial.printf("Adresse Multicast : %X \n", adresseMulticast); //Affichage TTL M5.Lcd.printf("TTL : %d \n", rxbuf[CHAMP_TTL]); Serial.printf("TTL : %d \n", rxbuf[CHAMP_TTL]); //Incrémentation TTL rxbuf[CHAMP_TTL]+=1; //Affichage du numéro de séquence M5.Lcd.printf("Num Seq : %d \n", rxbuf[CHAMP_NUM_SEQ]); Serial.printf("Num Seq : %d \n", rxbuf[CHAMP_NUM_SEQ]); //Affichage Payload afficherPayload(CHAMP_MIN_PAYLOAD, packetLenRX, rxbuf); //Test pour la réemission //Paquet non émis par le noeud if(adresseSource != ADRESSE_NOEUD){ //Même adresse multicast et TTL inférieur au max if((adresseMulticast==ADRESSE_MULTICAST) && (rxbuf[CHAMP_TTL]<=TTL_MAX)){ M5.Lcd.println("=====Réemission Paquet====="); Serial.println("=====Réemission Paquet====="); wino.send(0xFFFF, rxbuf, packetLenRX); } } else{ M5.Lcd.println("=== Paquet emis par le noeud ==="); Serial.println("=== Paquet emis par le noeud ==="); } } }