Commit initial du projet
This commit is contained in:
commit
a8ed96cb5f
69
Codes_source/Couche_2/Capsule1/emetteur/emetteur.ino
Normal file
69
Codes_source/Couche_2/Capsule1/emetteur/emetteur.ino
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#include <SPI.h>
|
||||||
|
#include <RH_RF95.h>
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Déclaration des constantes
|
||||||
|
//Communication avec le module LoRa
|
||||||
|
#define RFM95_CS 5 //M5 LoRa
|
||||||
|
#define RFM95_DIO0 36 //M5 LoRa
|
||||||
|
RH_RF95 rf95(RFM95_CS, RFM95_DIO0);
|
||||||
|
|
||||||
|
//Constantes d'état
|
||||||
|
#define EMISSION 0
|
||||||
|
#define DELAI 1
|
||||||
|
|
||||||
|
uint8_t state; //État courant
|
||||||
|
uint8_t data[16]; //Buffer d'émission
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("========Emetteur CAP1========");
|
||||||
|
M5.Lcd.println("========Emetteur CAP1========");
|
||||||
|
|
||||||
|
delay(1000);
|
||||||
|
|
||||||
|
if(!rf95.init()){
|
||||||
|
Serial.println("Echec de la mise en place");
|
||||||
|
M5.Lcd.println("Echec de la mise en place");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.println("Mise en place reussie !!!");
|
||||||
|
M5.Lcd.println("Mise en place reussie !!!");
|
||||||
|
//Configuration de la radio
|
||||||
|
rf95.setModemConfig(RH_RF95::Bw125Cr45Sf128);
|
||||||
|
rf95.setFrequency(867.8);
|
||||||
|
state=EMISSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
switch(state){
|
||||||
|
case EMISSION: //Code source à l'état d'émission
|
||||||
|
Serial.println("EMISSION");
|
||||||
|
M5.Lcd.println("EMISSION");
|
||||||
|
data[0]=0xAA;
|
||||||
|
data[1]=0x55;
|
||||||
|
data[2]=0x25;
|
||||||
|
data[3]=0x24;
|
||||||
|
data[4]=0x98;
|
||||||
|
rf95.send(data,5); //Envoi des données
|
||||||
|
rf95.waitPacketSent();
|
||||||
|
|
||||||
|
state=DELAI;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DELAI:
|
||||||
|
Serial.println("DELAI");
|
||||||
|
M5.Lcd.println("DELAI");
|
||||||
|
delay(1000);
|
||||||
|
state=EMISSION;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
96
Codes_source/Couche_2/Capsule1/recepteur/recepteur.ino
Normal file
96
Codes_source/Couche_2/Capsule1/recepteur/recepteur.ino
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
#include <SPI.h>
|
||||||
|
#include <RH_RF95.h>
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Déclaration des constantes
|
||||||
|
//Communication avec le module LoRa
|
||||||
|
#define RFM95_CS 5 //M5 LoRa
|
||||||
|
#define RFM95_DIO0 36 //M5 LoRa
|
||||||
|
RH_RF95 rf95(RFM95_CS, RFM95_DIO0);
|
||||||
|
|
||||||
|
//Déclaration des constantes
|
||||||
|
uint8_t state; //État courant
|
||||||
|
|
||||||
|
uint8_t rxbuf[RH_RF95_MAX_MESSAGE_LEN]; //buffer en reception
|
||||||
|
uint8_t rxbuflen = sizeof(rxbuf); //taille du buffer en repection
|
||||||
|
int rxFrames; //Numéro de la trame reçue
|
||||||
|
|
||||||
|
//Constantes d'état
|
||||||
|
#define ECOUTE 1
|
||||||
|
#define TEST_RX 2 //Les différents états
|
||||||
|
#define AFFICHAGE 3
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("========Recepteur CAP1========");
|
||||||
|
M5.Lcd.println("========Recepteur CAP1========");
|
||||||
|
|
||||||
|
delay(1000);
|
||||||
|
|
||||||
|
if(!rf95.init()){
|
||||||
|
Serial.println("Echec de la mise en place");
|
||||||
|
M5.Lcd.println("Echec de la mise en place");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.println("Mise en place reussie !!!");
|
||||||
|
M5.Lcd.println("Mise en place reussie !!!");
|
||||||
|
rf95.setModemConfig(RH_RF95::Bw125Cr45Sf128);
|
||||||
|
rf95.setFrequency(867.8);
|
||||||
|
|
||||||
|
state=ECOUTE;
|
||||||
|
Serial.println("Boucle principale");
|
||||||
|
M5.Lcd.println("Boucle principale");
|
||||||
|
rxFrames = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
switch(state){
|
||||||
|
|
||||||
|
case ECOUTE:
|
||||||
|
Serial.println("ECOUTE");
|
||||||
|
M5.Lcd.println("ECOUTE");
|
||||||
|
rf95.setModeRx();
|
||||||
|
state=TEST_RX;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TEST_RX:
|
||||||
|
Serial.println("TEST-RX");
|
||||||
|
M5.Lcd.println("TEST-RX");
|
||||||
|
if(rf95.available()){
|
||||||
|
state=AFFICHAGE;
|
||||||
|
}
|
||||||
|
//Ajout d'un delai pour laisser le temps de récupérer et d'afficher le message sur l'écran du M5
|
||||||
|
delay(2000);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AFFICHAGE:
|
||||||
|
if(rf95.recv(rxbuf, &rxbuflen)){
|
||||||
|
rxFrames+=1;
|
||||||
|
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
|
||||||
|
Serial.printf("AFFICHAGE : Trame[%d] de ", rxFrames);
|
||||||
|
M5.Lcd.printf("AFFICHAGE : Trame[%d] de ", rxFrames);
|
||||||
|
|
||||||
|
Serial.printf("%d octets : |",rxbuflen);
|
||||||
|
M5.Lcd.printf("%d octets : |",rxbuflen);
|
||||||
|
|
||||||
|
for(int j=0;j<rxbuflen;j++){
|
||||||
|
Serial.printf("%02x|", rxbuf[j]);
|
||||||
|
M5.Lcd.printf("%02x|", rxbuf[j]);
|
||||||
|
}
|
||||||
|
Serial.println("\n");
|
||||||
|
M5.Lcd.println("\n");
|
||||||
|
}
|
||||||
|
state=ECOUTE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
136
Codes_source/Couche_2/Capsule2/emetteur/emetteur.ino
Normal file
136
Codes_source/Couche_2/Capsule2/emetteur/emetteur.ino
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
#include <SPI.h>
|
||||||
|
#include <RH_RF95.h>
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Déclaration des constantes
|
||||||
|
#define RFM95_CS 5 //M5 LoRa
|
||||||
|
#define RFM95_DIO0 36 //M5 LoRa
|
||||||
|
RH_RF95 rf95(RFM95_CS, RFM95_DIO0);
|
||||||
|
|
||||||
|
uint8_t txbuf[RH_RF95_MAX_MESSAGE_LEN]; //Buffer d'emission
|
||||||
|
uint8_t rxbuf[RH_RF95_MAX_MESSAGE_LEN], rxbuflen=sizeof(rxbuf); //Buffer de reception
|
||||||
|
uint8_t state, RxSeq, TxSeq, credit;
|
||||||
|
uint32_t attente;
|
||||||
|
|
||||||
|
#define E0 0
|
||||||
|
#define E1 1
|
||||||
|
#define E2 2
|
||||||
|
#define E3 3
|
||||||
|
#define E4 4
|
||||||
|
#define E5 5
|
||||||
|
|
||||||
|
#define TYPE_DATA 1
|
||||||
|
#define TYPE_ACK 2
|
||||||
|
#define TIMEOUT_ACK 40
|
||||||
|
|
||||||
|
#define MAX_CREDIT 5
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("====Emetteur CAP2====");
|
||||||
|
M5.Lcd.println("====Emetteur CAP2====");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
if(!rf95.init()){
|
||||||
|
Serial.println("Echec de la mise en place");
|
||||||
|
M5.Lcd.println("Echec de la mise en place");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.println("Mise en place reussie !!!");
|
||||||
|
M5.Lcd.println("Mise en place reussie !!!");
|
||||||
|
//Configuration de la radio
|
||||||
|
rf95.setModemConfig(RH_RF95::Bw125Cr45Sf128);
|
||||||
|
rf95.setFrequency(867.8);
|
||||||
|
state=E0;
|
||||||
|
|
||||||
|
TxSeq=0;
|
||||||
|
credit=MAX_CREDIT;
|
||||||
|
Serial.println("Boucle principale.");
|
||||||
|
M5.Lcd.println("Boucle principale.");
|
||||||
|
delay(3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
switch(state){
|
||||||
|
case E0: //Code source à l'état d'émission
|
||||||
|
|
||||||
|
Serial.printf("EMISSION %d", TxSeq);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.printf("EMISSION %d \n", TxSeq);
|
||||||
|
Serial.println();
|
||||||
|
txbuf[0]=TYPE_DATA;
|
||||||
|
txbuf[1]=TxSeq;
|
||||||
|
txbuf[2]=0xAA;
|
||||||
|
txbuf[3]=0x55;
|
||||||
|
|
||||||
|
rf95.send(txbuf,4); //Envoi des données
|
||||||
|
rf95.waitPacketSent();
|
||||||
|
|
||||||
|
credit -=1;
|
||||||
|
state=E1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E1:
|
||||||
|
attente = millis()+TIMEOUT_ACK; //Armement du Chien de Garde
|
||||||
|
state = E2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E2:
|
||||||
|
rf95.setModeRx();
|
||||||
|
state=E3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E3:
|
||||||
|
if(millis() > attente){ //Test expiration CdG
|
||||||
|
Serial.println("CDG expire");
|
||||||
|
M5.Lcd.println("CDG expire");
|
||||||
|
state=E5; //Délais expiré
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if(rf95.recv(rxbuf, &rxbuflen)){
|
||||||
|
if((rxbuf[0]==TYPE_ACK) && (rxbuf[1]==TxSeq)){ //Reception d'un ACK avec le bon num de séquence
|
||||||
|
state=E4;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
state=E2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E4:
|
||||||
|
Serial.printf("ACK_RECU [%d] \n", TxSeq);
|
||||||
|
M5.Lcd.printf("ACK_RECU [%d] \n", TxSeq);
|
||||||
|
state=E0, TxSeq+=1, credit=5;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E5:
|
||||||
|
Serial.printf("Probleme\n");
|
||||||
|
M5.Lcd.printf("Probleme\n");
|
||||||
|
if (credit==0){
|
||||||
|
Serial.print("ECHEC\n");
|
||||||
|
M5.Lcd.print("ECHEC\n");
|
||||||
|
state=E0;
|
||||||
|
credit=MAX_CREDIT;
|
||||||
|
TxSeq+=1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.printf("Nouvelle tentative n %d\n", 5-credit);
|
||||||
|
M5.Lcd.printf("Nouvelle tentative n %d\n", 5-credit);
|
||||||
|
state=E0;
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
state=E0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
114
Codes_source/Couche_2/Capsule2/recepteur/recepteur.ino
Normal file
114
Codes_source/Couche_2/Capsule2/recepteur/recepteur.ino
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
#include <SPI.h>
|
||||||
|
#include <RH_RF95.h>
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Déclaration des constantes
|
||||||
|
#define RFM95_CS 5 //M5 LoRa
|
||||||
|
#define RFM95_DIO0 36 //M5 LoRa
|
||||||
|
RH_RF95 rf95(RFM95_CS, RFM95_DIO0);
|
||||||
|
|
||||||
|
uint8_t state;
|
||||||
|
uint8_t txbuf[RH_RF95_MAX_MESSAGE_LEN];
|
||||||
|
uint8_t rxbuf[RH_RF95_MAX_MESSAGE_LEN];
|
||||||
|
uint8_t rxlen=RH_RF95_MAX_MESSAGE_LEN;
|
||||||
|
uint8_t RxSeq;
|
||||||
|
|
||||||
|
#define E0 0
|
||||||
|
#define E1 1
|
||||||
|
#define E2 2
|
||||||
|
#define E3 3
|
||||||
|
|
||||||
|
#define TYPE_DATA 1
|
||||||
|
#define TYPE_ACK 2
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("====Recepteur CAP2====");
|
||||||
|
M5.Lcd.println("====Recepteur CAP2====");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
if(!rf95.init()){
|
||||||
|
Serial.println("Echec de la mise en place");
|
||||||
|
M5.Lcd.println("Echec de la mise en place");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.println("Mise en place reussie !!!");
|
||||||
|
M5.Lcd.println("Mise en place reussie !!!");
|
||||||
|
rf95.setModemConfig(RH_RF95::Bw125Cr45Sf128);
|
||||||
|
rf95.setFrequency(867.8);
|
||||||
|
|
||||||
|
state=E0;
|
||||||
|
Serial.println("Boucle principale");
|
||||||
|
M5.Lcd.println("Boucle principale");
|
||||||
|
RxSeq=255;
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
switch(state){
|
||||||
|
case E0:
|
||||||
|
Serial.println("Mode Reception");
|
||||||
|
M5.Lcd.println("Mode Reception");
|
||||||
|
rf95.setModeRx();
|
||||||
|
state=E1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E1:
|
||||||
|
if(rf95.recv(rxbuf, &rxlen)){
|
||||||
|
if(rxbuf[0]==TYPE_DATA){
|
||||||
|
state=E2;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
state=E0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E2:
|
||||||
|
|
||||||
|
if(RxSeq!=rxbuf[1]){
|
||||||
|
RxSeq=rxbuf[1];
|
||||||
|
Serial.printf("[%d] ", RxSeq);
|
||||||
|
M5.Lcd.printf("[%d] ", RxSeq);
|
||||||
|
Serial.printf("DATA de %d octets :", rxlen);
|
||||||
|
M5.Lcd.printf("DATA de %d octets :", rxlen);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
for(int i=0;i<rxlen;i++){
|
||||||
|
Serial.printf("%02x|", rxbuf[i]);
|
||||||
|
M5.Lcd.printf("%02x|", rxbuf[i]);
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.printf("Duplication\n");
|
||||||
|
M5.Lcd.printf("Duplication\n");
|
||||||
|
}
|
||||||
|
state=E3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E3:
|
||||||
|
|
||||||
|
Serial.println("Envoi ACK");
|
||||||
|
M5.Lcd.println("Envoi ACK");
|
||||||
|
|
||||||
|
txbuf[0]=TYPE_ACK;
|
||||||
|
txbuf[1]=rxbuf[1];
|
||||||
|
|
||||||
|
rf95.send(txbuf,2);
|
||||||
|
rf95.waitPacketSent();
|
||||||
|
|
||||||
|
state=E0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,105 @@
|
|||||||
|
#include <SPI.h>
|
||||||
|
#include <RH_RF95.h>
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Déclaration des constantes
|
||||||
|
//Communication avec le module LoRa
|
||||||
|
#define RFM95_CS 5 //M5 LoRa
|
||||||
|
#define RFM95_DIO0 36 //M5 LoRa
|
||||||
|
RH_RF95 rf95(RFM95_CS, RFM95_DIO0);
|
||||||
|
|
||||||
|
//Constantes d'état
|
||||||
|
#define EMISSION 0
|
||||||
|
#define DELAI 1
|
||||||
|
|
||||||
|
//Variables pour l'état et le buffer
|
||||||
|
uint8_t state; //État courant
|
||||||
|
uint8_t txbuf[RH_RF95_MAX_MESSAGE_LEN]; //Buffer d'émission
|
||||||
|
|
||||||
|
//Variables pour la correction d'erreur
|
||||||
|
uint16_t S, SP;
|
||||||
|
|
||||||
|
//Constantes pour les champs de la trame
|
||||||
|
#define CHAMP_MIN_PAYLOAD 0
|
||||||
|
#define CHAMP_MAX_PAYLOAD 19
|
||||||
|
#define CHAMP_MIN_S 20
|
||||||
|
#define CHAMP_MIN_SP 22
|
||||||
|
#define LONGUEUR_TRAME 24
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("===Emetteur CAP3 Corr===");
|
||||||
|
M5.Lcd.println("===Emetteur CAP3 Corr===");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
if(!rf95.init()){
|
||||||
|
Serial.println("Echec de la mise en place");
|
||||||
|
M5.Lcd.println("Echec de la mise en place");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.println("Mise en place reussie !!!");
|
||||||
|
M5.Lcd.println("Mise en place reussie !!!");
|
||||||
|
//Configuration de la radio
|
||||||
|
rf95.setModemConfig(RH_RF95::Bw125Cr45Sf128);
|
||||||
|
rf95.setFrequency(867.8);
|
||||||
|
state=EMISSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
switch(state){
|
||||||
|
case EMISSION: //Code source à l'état d'émission
|
||||||
|
Serial.println("EMISSION"); //Trame de 20 octets de payload et 4 octets RS
|
||||||
|
M5.Lcd.println("EMISSION");
|
||||||
|
S=0;SP=0;
|
||||||
|
|
||||||
|
for(int i=CHAMP_MIN_PAYLOAD;i<=CHAMP_MAX_PAYLOAD; i++){
|
||||||
|
txbuf[i] = 255;
|
||||||
|
S+=txbuf[i];
|
||||||
|
SP+=txbuf[i]*(i+1);
|
||||||
|
Serial.printf("|%02X", txbuf[i]);
|
||||||
|
M5.Lcd.printf("|%02X", txbuf[i]);
|
||||||
|
}
|
||||||
|
//Injection des 8 bits de poids faible
|
||||||
|
//ET logique avec masque (0000 0000 1111 1111)
|
||||||
|
txbuf[CHAMP_MIN_S] = S & 0x00FF;
|
||||||
|
|
||||||
|
//Injection des 8 bits de poids fort
|
||||||
|
//ET logique avec masque (1111 1111 0000 0000)
|
||||||
|
//Puis décalage de 8 bits vers la droite pour pouvoir les coder
|
||||||
|
//sur un octet
|
||||||
|
txbuf[CHAMP_MIN_S+1] = (S & 0xFF00) >> 8;
|
||||||
|
|
||||||
|
Serial.printf("|%02X|%02X", txbuf[CHAMP_MIN_S],txbuf[CHAMP_MIN_S+1]);
|
||||||
|
M5.Lcd.printf("|%02X|%02X", txbuf[CHAMP_MIN_S],txbuf[CHAMP_MIN_S+1]);
|
||||||
|
|
||||||
|
//Même principe que pour S
|
||||||
|
txbuf[CHAMP_MIN_SP] = SP & 0x00FF;
|
||||||
|
txbuf[CHAMP_MIN_SP+1] = (SP & 0xFF00) >> 8;
|
||||||
|
Serial.printf("|%02X|%02X", txbuf[CHAMP_MIN_SP],txbuf[CHAMP_MIN_SP+1]);
|
||||||
|
M5.Lcd.printf("|%02X|%02X", txbuf[CHAMP_MIN_SP],txbuf[CHAMP_MIN_SP+1]);
|
||||||
|
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
|
||||||
|
rf95.send(txbuf,LONGUEUR_TRAME); //Envoi des données
|
||||||
|
rf95.waitPacketSent();
|
||||||
|
|
||||||
|
state=DELAI;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DELAI:
|
||||||
|
Serial.println("DELAI");
|
||||||
|
M5.Lcd.println("DELAI");
|
||||||
|
delay(1000);
|
||||||
|
state=EMISSION;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,160 @@
|
|||||||
|
#include <SPI.h>
|
||||||
|
#include <RH_RF95.h>
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Déclaration des constantes
|
||||||
|
#define RFM95_CS 5 //M5 LoRa
|
||||||
|
#define RFM95_DIO0 36 //M5 LoRa
|
||||||
|
RH_RF95 rf95(RFM95_CS, RFM95_DIO0);
|
||||||
|
|
||||||
|
uint8_t state;
|
||||||
|
uint8_t rxbuf[RH_RF95_MAX_MESSAGE_LEN], rxbuflen=sizeof(rxbuf);
|
||||||
|
int rxFrames;
|
||||||
|
|
||||||
|
//Variables pour la correction d'erreur
|
||||||
|
int erreur, rang;
|
||||||
|
uint16_t Sr,SPr, Sc, SPc; //Sommes et Sommes pondérées calculées et reçues
|
||||||
|
|
||||||
|
//Constantes d'état
|
||||||
|
#define ECOUTE 1
|
||||||
|
#define TEST_RX 2
|
||||||
|
#define AFFICHAGE 3
|
||||||
|
|
||||||
|
//Constantes pour les champs de la trame
|
||||||
|
#define CHAMP_MIN_PAYLOAD 0
|
||||||
|
#define CHAMP_MAX_PAYLOAD 19
|
||||||
|
#define CHAMP_MIN_S 20
|
||||||
|
#define CHAMP_MIN_SP 22
|
||||||
|
#define LONGUEUR_TRAME 24
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("===Recepteur CAP3 cor===");
|
||||||
|
M5.Lcd.println("===Recepteur CAP3 cor===");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
if(!rf95.init()){
|
||||||
|
Serial.println("Echec de la mise en place");
|
||||||
|
M5.Lcd.println("Echec de la mise en place");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.println("Mise en place reussie !!!");
|
||||||
|
M5.Lcd.println("Mise en place reussie !!!");
|
||||||
|
rf95.setModemConfig(RH_RF95::Bw125Cr45Sf128);
|
||||||
|
rf95.setFrequency(867.8);
|
||||||
|
|
||||||
|
state=ECOUTE;
|
||||||
|
delay(2000);
|
||||||
|
Serial.println("Boucle principale");
|
||||||
|
M5.Lcd.println("Boucle principale");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
|
||||||
|
switch(state){
|
||||||
|
|
||||||
|
case ECOUTE:
|
||||||
|
Serial.println("ECOUTE");
|
||||||
|
M5.Lcd.println("ECOUTE");
|
||||||
|
rf95.setModeRx();
|
||||||
|
state=TEST_RX;
|
||||||
|
delay(2000);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TEST_RX:
|
||||||
|
Serial.println("TEST-RX");
|
||||||
|
M5.Lcd.println("TEST-RX");
|
||||||
|
if(rf95.available()){
|
||||||
|
state=AFFICHAGE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AFFICHAGE:
|
||||||
|
|
||||||
|
if(rf95.recv(rxbuf, &rxbuflen)){ //récupération de la trame reçue dans rxbuf
|
||||||
|
|
||||||
|
//rxbuflen=23; //Simulation d'erreur de longueur
|
||||||
|
//rxbuf[16] = 21;//Simulation modification de l'octet 17
|
||||||
|
//rxbuf[2] = 8;
|
||||||
|
|
||||||
|
rxFrames+=1;
|
||||||
|
Serial.printf("[%d] ", rxFrames);
|
||||||
|
M5.Lcd.printf("[%d] ", rxFrames);
|
||||||
|
|
||||||
|
Serial.printf("%d bytes: ", rxbuflen);
|
||||||
|
M5.Lcd.printf("%d bytes: ", rxbuflen);
|
||||||
|
for(int j=0;j<rxbuflen;j++){
|
||||||
|
Serial.printf("%02x|", rxbuf[j]);
|
||||||
|
M5.Lcd.printf("%02x|", rxbuf[j]);
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
|
||||||
|
if(rxbuflen != LONGUEUR_TRAME){
|
||||||
|
Serial.printf("erreur de longueur de trame : %d !", rxbuflen);
|
||||||
|
M5.Lcd.printf("erreur de longueur de trame : %d !", rxbuflen);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Sr = (rxbuf[CHAMP_MIN_S] & 0x00FF) + ((rxbuf[CHAMP_MIN_S+1] & 0x00FF) << 8);
|
||||||
|
SPr = (rxbuf[CHAMP_MIN_SP] & 0x00FF) + ((rxbuf[CHAMP_MIN_SP+1] & 0x00FF) << 8);
|
||||||
|
Sc=0;
|
||||||
|
SPc=0;
|
||||||
|
|
||||||
|
for(int i=CHAMP_MIN_PAYLOAD; i<=CHAMP_MAX_PAYLOAD ; i++){
|
||||||
|
Sc=Sc+rxbuf[i];
|
||||||
|
SPc=SPc+rxbuf[i]*(i+1);
|
||||||
|
}
|
||||||
|
Serial.printf("Sr=%d SPr=%d Sc=%d SPc=%d ", Sr, SPr, Sc, SPc);
|
||||||
|
M5.Lcd.printf("Sr=%d SPr=%d Sc=%d SPc=%d ", Sr, SPr, Sc, SPc);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
|
||||||
|
if(Sr != Sc){
|
||||||
|
Serial.println("Une correction est utile ! ");
|
||||||
|
M5.Lcd.println("Une correction est utile ! ");
|
||||||
|
erreur=Sc-Sr;
|
||||||
|
Serial.printf("Valeur erreur = %d", erreur);
|
||||||
|
M5.Lcd.printf("Valeur erreur = %d", erreur);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
|
||||||
|
rang=(SPc-SPr)/erreur;
|
||||||
|
Serial.printf("Rang erreur = %d", rang);
|
||||||
|
M5.Lcd.printf("Rang erreur = %d", rang);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
|
||||||
|
if(rang!=0){
|
||||||
|
Serial.printf("Correction de %02X en %02X", rxbuf[rang-1], rxbuf[rang-1]-erreur);
|
||||||
|
M5.Lcd.printf("Correction de %02X en %02X", rxbuf[rang-1], rxbuf[rang-1]-erreur);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.println("Erreur sur la redondance et non sur les DATA utiles");
|
||||||
|
M5.Lcd.println("Erreur sur la redondance et non sur les DATA utiles");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if(SPr != SPc){
|
||||||
|
Serial.println("Erreur sur la redondance et non sur les DATA utiles");
|
||||||
|
M5.Lcd.println("Erreur sur la redondance et non sur les DATA utiles");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
state=ECOUTE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,182 @@
|
|||||||
|
#include <SPI.h>
|
||||||
|
#include <RH_RF95.h>
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Déclaration des constantes
|
||||||
|
#define RFM95_CS 5 //M5 LoRa
|
||||||
|
#define RFM95_DIO0 36 //M5 LoRa
|
||||||
|
RH_RF95 rf95(RFM95_CS, RFM95_DIO0);
|
||||||
|
|
||||||
|
//Variables
|
||||||
|
uint8_t txbuf[RH_RF95_MAX_MESSAGE_LEN];
|
||||||
|
uint8_t rxbuf[RH_RF95_MAX_MESSAGE_LEN], rxbuflen=sizeof(rxbuf); //Buffer de reception et longueur
|
||||||
|
uint8_t state, TxSeq, credit;
|
||||||
|
uint32_t attente;
|
||||||
|
uint8_t FCS; //Champ de contrôle
|
||||||
|
|
||||||
|
//Constantes d'états
|
||||||
|
#define E0 0
|
||||||
|
#define E1 1
|
||||||
|
#define E2 2
|
||||||
|
#define E3 3
|
||||||
|
#define E4 4
|
||||||
|
#define E5 5
|
||||||
|
|
||||||
|
//Constantes de données et d'acquitement
|
||||||
|
#define TYPE_DATA 1
|
||||||
|
#define TYPE_ACK 2
|
||||||
|
#define TIMEOUT_ACK 40
|
||||||
|
#define MAX_CREDIT 5
|
||||||
|
|
||||||
|
//Constantes de champs de trame
|
||||||
|
#define CHAMP_TYPE 0
|
||||||
|
#define CHAMP_NUM_SEQ 1
|
||||||
|
#define CHAMP_MIN_PAYLOAD 2
|
||||||
|
#define CHAMP_MAX_PAYLOAD 19
|
||||||
|
#define CHAMP_FCS_DATA 20
|
||||||
|
#define CHAMP_FCS_ACK 2
|
||||||
|
|
||||||
|
|
||||||
|
int erreur_ack=1;
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("===Emmetteur CAP3 DET===");
|
||||||
|
M5.Lcd.println("===Emmetteur CAP3 DET===");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
if(!rf95.init()){
|
||||||
|
Serial.println("Echec de la mise en place");
|
||||||
|
M5.Lcd.println("Echec de la mise en place");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.println("Mise en place reussie !!!");
|
||||||
|
M5.Lcd.println("Mise en place reussie !!!");
|
||||||
|
//Configuration de la radio
|
||||||
|
rf95.setModemConfig(RH_RF95::Bw125Cr45Sf128);
|
||||||
|
rf95.setFrequency(867.8);
|
||||||
|
state=E0;
|
||||||
|
|
||||||
|
TxSeq=0;
|
||||||
|
credit=MAX_CREDIT;
|
||||||
|
Serial.println("Boucle principale.");
|
||||||
|
M5.Lcd.println("Boucle principale.");
|
||||||
|
delay(3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
switch(state){
|
||||||
|
case E0: //Code source à l'état d'émission
|
||||||
|
Serial.printf("EMISSION %d\n\n", TxSeq);
|
||||||
|
M5.Lcd.printf("EMISSION %d\n\n", TxSeq);
|
||||||
|
txbuf[CHAMP_TYPE]=TYPE_DATA;
|
||||||
|
txbuf[CHAMP_NUM_SEQ]=TxSeq;
|
||||||
|
|
||||||
|
//On remplit les 18 octets de payload au max (255)
|
||||||
|
for (int i=CHAMP_MIN_PAYLOAD;i<=CHAMP_MAX_PAYLOAD;i++){
|
||||||
|
txbuf[i]=255;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Calcul du FCS : XOR
|
||||||
|
FCS=0; //Champ sur un octet
|
||||||
|
for(int i=0;i<=CHAMP_MAX_PAYLOAD;i++){
|
||||||
|
//XOR des 20 octets de la trame.
|
||||||
|
FCS=FCS ^ txbuf[i];
|
||||||
|
}
|
||||||
|
//On ajoute le FCS calculé à la fin de la trame
|
||||||
|
txbuf[CHAMP_FCS_DATA] = FCS;
|
||||||
|
|
||||||
|
//Affichage pour le debug
|
||||||
|
for(int i=0; i<21; i++){
|
||||||
|
Serial.printf("|%02X", txbuf[i]);
|
||||||
|
M5.Lcd.printf("|%02X", txbuf[i]);
|
||||||
|
}
|
||||||
|
Serial.println("|");
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
|
||||||
|
//Envoi des données
|
||||||
|
rf95.send(txbuf,21);
|
||||||
|
rf95.waitPacketSent();
|
||||||
|
|
||||||
|
credit-=1;
|
||||||
|
state=E1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E1:
|
||||||
|
attente = millis()+TIMEOUT_ACK; //Armement du Chien de Garde
|
||||||
|
state = E2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E2:
|
||||||
|
rf95.setModeRx();
|
||||||
|
state=E3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E3:
|
||||||
|
if(millis() > attente){ //Test expiration CdG
|
||||||
|
state=E5; //Délais expiré
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if(rf95.recv(rxbuf, &rxbuflen)){
|
||||||
|
//Simulation d'erreur
|
||||||
|
|
||||||
|
if(erreur_ack%3==0){
|
||||||
|
rxbuf[CHAMP_FCS_ACK]=rxbuf[CHAMP_FCS_ACK]+1;
|
||||||
|
}
|
||||||
|
erreur_ack+=1;
|
||||||
|
|
||||||
|
//Reception d'un ACK avec le bon num de séquence
|
||||||
|
if((rxbuf[CHAMP_TYPE]==TYPE_ACK) && (rxbuf[CHAMP_NUM_SEQ]==TxSeq)){
|
||||||
|
//Trame reçue sans erreur
|
||||||
|
if((rxbuf[CHAMP_TYPE] ^ rxbuf[CHAMP_NUM_SEQ])==rxbuf[CHAMP_FCS_ACK]){
|
||||||
|
//Affichage de la trame reçue
|
||||||
|
state=E4;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
//Affichage de l'échec
|
||||||
|
state=E5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
//Réécoute
|
||||||
|
state=E2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E4:
|
||||||
|
Serial.printf("ACK_RECU [%d] \n", TxSeq);
|
||||||
|
M5.Lcd.printf("ACK_RECU [%d] \n", TxSeq);
|
||||||
|
state=E0, TxSeq+=1, credit=MAX_CREDIT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E5:
|
||||||
|
Serial.print("E5 ");
|
||||||
|
M5.Lcd.print("E5 ");
|
||||||
|
if (credit==0){
|
||||||
|
Serial.print("ECHEC\n");
|
||||||
|
M5.Lcd.print("ECHEC\n");
|
||||||
|
credit=MAX_CREDIT;
|
||||||
|
TxSeq+=1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.printf("Nouvelle tentative n %d\n", MAX_CREDIT-credit);
|
||||||
|
M5.Lcd.printf("Nouvelle tentative n %d\n", MAX_CREDIT-credit);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
}
|
||||||
|
state=E0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
state=E0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,141 @@
|
|||||||
|
#include <SPI.h>
|
||||||
|
#include <RH_RF95.h>
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Déclaration des constantes
|
||||||
|
#define RFM95_CS 5 //M5 LoRa
|
||||||
|
#define RFM95_DIO0 36 //M5 LoRa
|
||||||
|
RH_RF95 rf95(RFM95_CS, RFM95_DIO0);
|
||||||
|
|
||||||
|
//Variables
|
||||||
|
uint8_t state;
|
||||||
|
uint8_t txbuf[RH_RF95_MAX_MESSAGE_LEN];
|
||||||
|
uint8_t rxbuf[RH_RF95_MAX_MESSAGE_LEN], rxbuflen=sizeof(rxbuf);
|
||||||
|
uint8_t RxSeq;
|
||||||
|
uint8_t FCSc, FCSr; //Champs de contrôle d'un octet calculé et reçu
|
||||||
|
|
||||||
|
//Constantes d'état
|
||||||
|
#define E0 0
|
||||||
|
#define E1 1
|
||||||
|
#define E2 2
|
||||||
|
#define E3 3
|
||||||
|
|
||||||
|
#define TYPE_DATA 1
|
||||||
|
#define TYPE_ACK 2
|
||||||
|
|
||||||
|
//Constantes de champs de trames
|
||||||
|
#define CHAMP_TYPE 0
|
||||||
|
#define CHAMP_NUM_SEQ 1
|
||||||
|
#define CHAMP_MIN_PAYLOAD 2
|
||||||
|
#define CHAMP_MAX_PAYLOAD 19
|
||||||
|
#define CHAMP_FCS_DATA 20
|
||||||
|
#define CHAMP_FCS_ACK 2
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("===Recepteur CAP3 DET===");
|
||||||
|
M5.Lcd.println("===Recepteur CAP3 DET===");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
if(!rf95.init()){
|
||||||
|
Serial.println("Echec de la mise en place");
|
||||||
|
M5.Lcd.println("Echec de la mise en place");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.println("Mise en place reussie !!!");
|
||||||
|
M5.Lcd.println("Mise en place reussie !!!");
|
||||||
|
rf95.setModemConfig(RH_RF95::Bw125Cr45Sf128);
|
||||||
|
rf95.setFrequency(867.8);
|
||||||
|
|
||||||
|
state=E0;
|
||||||
|
Serial.println("Boucle principale");
|
||||||
|
M5.Lcd.println("Boucle principale");
|
||||||
|
RxSeq=255;
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
switch(state){
|
||||||
|
|
||||||
|
case E0: //ECOUTE
|
||||||
|
Serial.println("E0 : Attente Reception \n");
|
||||||
|
M5.Lcd.println("E0 : Attente Reception \n");
|
||||||
|
rf95.setModeRx();
|
||||||
|
state=E1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E1:
|
||||||
|
if(rf95.recv(rxbuf, &rxbuflen)){
|
||||||
|
if(rxbuf[CHAMP_TYPE]==TYPE_DATA){
|
||||||
|
//Test si FCS juste
|
||||||
|
FCSr=rxbuf[CHAMP_FCS_DATA]; //Champ de contrôle reçu
|
||||||
|
//Calcul du FCS
|
||||||
|
FCSc=0;
|
||||||
|
for(int i=0;i<=CHAMP_MAX_PAYLOAD;i++){
|
||||||
|
FCSc= FCSc ^ rxbuf[i];
|
||||||
|
}
|
||||||
|
//Mêmes FCS : Trame juste
|
||||||
|
if(FCSr==FCSc){
|
||||||
|
state=E2;
|
||||||
|
}
|
||||||
|
//Sinon trame fausse
|
||||||
|
else{
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
Serial.printf("Erreur de Trame, FCSr=%d FCSc=%d", FCSr, FCSc);
|
||||||
|
M5.Lcd.printf("Erreur de Trame, FCSr=%d FCSc=%d", FCSr, FCSc);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
state=E0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
state=E0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E2:
|
||||||
|
|
||||||
|
if(RxSeq!=rxbuf[CHAMP_NUM_SEQ]){
|
||||||
|
RxSeq=rxbuf[CHAMP_NUM_SEQ];
|
||||||
|
Serial.printf("Num Seq : [%d] \n", RxSeq);
|
||||||
|
M5.Lcd.printf("Num Seq : [%d] \n", RxSeq);
|
||||||
|
Serial.printf("DATA de %d octets :", rxbuflen);
|
||||||
|
M5.Lcd.printf("DATA de %d octets :", rxbuflen);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
for(int j=0;j<rxbuflen;j++){
|
||||||
|
Serial.printf("%02x|", rxbuf[j]);
|
||||||
|
M5.Lcd.printf("%02x|", rxbuf[j]);
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.printf("Duplication\n");
|
||||||
|
M5.Lcd.printf("Duplication\n");
|
||||||
|
}
|
||||||
|
state=E3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E3:
|
||||||
|
Serial.println("E3 : Envoi ACK");
|
||||||
|
M5.Lcd.println("E3 : Envoi ACK");
|
||||||
|
txbuf[CHAMP_TYPE]=TYPE_ACK;
|
||||||
|
txbuf[CHAMP_NUM_SEQ]=rxbuf[CHAMP_NUM_SEQ];
|
||||||
|
//Ajout du FCS du ACK
|
||||||
|
txbuf[CHAMP_FCS_ACK]=txbuf[CHAMP_TYPE] ^ txbuf[CHAMP_NUM_SEQ];
|
||||||
|
rf95.send(txbuf,3);
|
||||||
|
rf95.waitPacketSent();
|
||||||
|
state=E0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
179
Codes_source/Couche_2/Capsule4/emetteur/emetteur.ino
Normal file
179
Codes_source/Couche_2/Capsule4/emetteur/emetteur.ino
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
#include <SPI.h>
|
||||||
|
#include <RH_RF95.h>
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Déclaration des constantes
|
||||||
|
#define RFM95_CS 5 //M5 LoRa
|
||||||
|
#define RFM95_DIO0 36 //M5 LoRa
|
||||||
|
RH_RF95 rf95(RFM95_CS, RFM95_DIO0);
|
||||||
|
|
||||||
|
uint8_t txbuf[RH_RF95_MAX_MESSAGE_LEN]; //Buffer d'emission
|
||||||
|
uint8_t rxbuf[RH_RF95_MAX_MESSAGE_LEN], rxbuflen=sizeof(rxbuf); //Buffer de reception
|
||||||
|
uint8_t state, RxSeq, TxSeq, credit, backoff, NewFrame, EIT;
|
||||||
|
uint32_t attente;
|
||||||
|
|
||||||
|
//Constantes d'état
|
||||||
|
#define E0 0
|
||||||
|
#define E1 1
|
||||||
|
#define E2 2
|
||||||
|
#define E3 3
|
||||||
|
#define E4 4
|
||||||
|
#define E5 5
|
||||||
|
|
||||||
|
//Constantes de type
|
||||||
|
#define TYPE_DATA 1
|
||||||
|
#define TYPE_ACK 2
|
||||||
|
#define TIMEOUT_ACK 70
|
||||||
|
|
||||||
|
//Constante de crédit
|
||||||
|
#define MAX_CREDIT 5
|
||||||
|
|
||||||
|
//Constante d'adresse
|
||||||
|
#define LOCAL_ADDR 2
|
||||||
|
#define SINK_ADDR 0
|
||||||
|
|
||||||
|
//Constantes d'infos champ de trame
|
||||||
|
#define F_S_ADDR 0 //Adresse source
|
||||||
|
#define F_D_ADDR 1 //Adresse destination
|
||||||
|
#define F_TYPE 2 //Type
|
||||||
|
#define F_NUM_SEQ 3 //Numéro de séquence
|
||||||
|
#define F_MIN_PAYLOAD 4 //Indice du debut de payload
|
||||||
|
#define F_MAX_PAYLOAD 9 //Indice de fin de payload
|
||||||
|
#define TAILLE_TRAME 10 //Taille de la trame
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("====Emetteur CAP4====");
|
||||||
|
M5.Lcd.println("====Emetteur CAP4====");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
if(!rf95.init()){
|
||||||
|
Serial.println("Echec de la mise en place");
|
||||||
|
M5.Lcd.println("Echec de la mise en place");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.println("Mise en place reussie !!!");
|
||||||
|
M5.Lcd.println("Mise en place reussie !!!");
|
||||||
|
//Configuration de la radio
|
||||||
|
rf95.setModemConfig(RH_RF95::Bw125Cr45Sf128);
|
||||||
|
rf95.setFrequency(867.8);
|
||||||
|
state=E0;
|
||||||
|
|
||||||
|
TxSeq=0;
|
||||||
|
credit=MAX_CREDIT;
|
||||||
|
Serial.println("Boucle principale.");
|
||||||
|
M5.Lcd.println("Boucle principale.");
|
||||||
|
|
||||||
|
NewFrame=1; //Initialisation drapeau
|
||||||
|
randomSeed(analogRead(30)); // Initialisation utilisant la broche GPIO39 (VN)
|
||||||
|
delay(10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
switch(state){
|
||||||
|
case E0: //Code source à l'état d'émission
|
||||||
|
|
||||||
|
if(NewFrame==1){
|
||||||
|
EIT=random(80,120)*random(80,123);
|
||||||
|
delay(EIT); //attente pour l'envoi de la nouvelle trame
|
||||||
|
Serial.printf(" EIT : %d ", EIT);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.printf(" EIT : %d ", EIT);
|
||||||
|
M5.Lcd.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Formatage des champs de la trame
|
||||||
|
txbuf[F_S_ADDR]=LOCAL_ADDR;
|
||||||
|
txbuf[F_D_ADDR]=SINK_ADDR;
|
||||||
|
txbuf[F_TYPE]=TYPE_DATA;
|
||||||
|
txbuf[F_NUM_SEQ]=TxSeq;
|
||||||
|
|
||||||
|
//Ajout de la payload
|
||||||
|
for(int i=F_MIN_PAYLOAD; i<=F_MAX_PAYLOAD;i++){
|
||||||
|
txbuf[i]=random(0, 256);
|
||||||
|
}
|
||||||
|
Serial.printf("EMISSION %d", TxSeq);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.printf("EMISSION %d \n", TxSeq);
|
||||||
|
Serial.println();
|
||||||
|
rf95.send(txbuf,TAILLE_TRAME); //Envoi des données
|
||||||
|
rf95.waitPacketSent();
|
||||||
|
|
||||||
|
credit -=1;
|
||||||
|
state=E1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E1: //CdG
|
||||||
|
attente = millis()+TIMEOUT_ACK; //Armement du Chien de Garde
|
||||||
|
state = E2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E2: //Mode Réception
|
||||||
|
rf95.setModeRx();
|
||||||
|
state=E3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E3:
|
||||||
|
if(millis() > attente){ //Test expiration CdG
|
||||||
|
Serial.println("===CDG expire===");
|
||||||
|
M5.Lcd.println("===CDG expire===");
|
||||||
|
state=E5; //Délais expiré
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if(rf95.recv(rxbuf, &rxbuflen)){
|
||||||
|
if((rxbuf[F_TYPE]==TYPE_ACK) && (rxbuf[F_NUM_SEQ]==TxSeq) && (rxbuf[F_D_ADDR]==LOCAL_ADDR)){
|
||||||
|
//Reception d'un ACK avec le bon num de séquence et la bonne adresse de destination
|
||||||
|
state=E4;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
state=E2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E4:
|
||||||
|
Serial.printf("ACK_RECU [%d] \n", TxSeq);
|
||||||
|
M5.Lcd.printf("ACK_RECU [%d] \n", TxSeq);
|
||||||
|
state=E0, TxSeq+=1, credit=5;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E5:
|
||||||
|
//Serial.printf("Probleme\n");
|
||||||
|
//M5.Lcd.printf("Probleme\n");
|
||||||
|
if (credit==0){
|
||||||
|
Serial.print("ECHEC\n");
|
||||||
|
M5.Lcd.print("ECHEC\n");
|
||||||
|
state=E0;
|
||||||
|
credit=MAX_CREDIT;
|
||||||
|
TxSeq+=1;
|
||||||
|
NewFrame=1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.printf("Collision ? Nouvelle tentative n %d\n", MAX_CREDIT-credit);
|
||||||
|
M5.Lcd.printf("Collision ? Nouvelle tentative n %d\n", MAX_CREDIT-credit);
|
||||||
|
state=E0;
|
||||||
|
NewFrame=0; //Toujours la même trame
|
||||||
|
backoff=random(80,120)*random(80,123);
|
||||||
|
delay(backoff); //Attente aléatoire ALOHA
|
||||||
|
Serial.printf(" backoff : [[%d]] ", backoff);
|
||||||
|
M5.Lcd.printf(" backoff : [[%d]] ", backoff);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
state=E0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
133
Codes_source/Couche_2/Capsule4/recepteur/recepteur.ino
Normal file
133
Codes_source/Couche_2/Capsule4/recepteur/recepteur.ino
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
#include <SPI.h>
|
||||||
|
#include <RH_RF95.h>
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Déclaration des constantes
|
||||||
|
#define RFM95_CS 5 //M5 LoRa
|
||||||
|
#define RFM95_DIO0 36 //M5 LoRa
|
||||||
|
RH_RF95 rf95(RFM95_CS, RFM95_DIO0);
|
||||||
|
|
||||||
|
uint8_t state;
|
||||||
|
uint8_t txbuf[RH_RF95_MAX_MESSAGE_LEN];
|
||||||
|
uint8_t rxbuf[RH_RF95_MAX_MESSAGE_LEN];
|
||||||
|
uint8_t rxlen=RH_RF95_MAX_MESSAGE_LEN;
|
||||||
|
uint8_t RxSeq;
|
||||||
|
|
||||||
|
//Constantes d'états
|
||||||
|
#define E0 0
|
||||||
|
#define E1 1
|
||||||
|
#define E2 2
|
||||||
|
#define E3 3
|
||||||
|
|
||||||
|
//Constante de type
|
||||||
|
#define TYPE_DATA 1
|
||||||
|
#define TYPE_ACK 2
|
||||||
|
|
||||||
|
//Constate d'adresse
|
||||||
|
#define LOCAL_ADDR 0
|
||||||
|
|
||||||
|
//Constantes d'infos champ de trame
|
||||||
|
#define F_S_ADDR 0 //Adresse source
|
||||||
|
#define F_D_ADDR 1 //Adresse destination
|
||||||
|
#define F_TYPE 2 //Type
|
||||||
|
#define F_NUM_SEQ 3 //Numéro de séquence
|
||||||
|
#define F_MIN_PAYLOAD 4 //Indice du debut de payload
|
||||||
|
#define F_MAX_PAYLOAD 5 //Indice de fin de payload
|
||||||
|
#define TAILLE_ACK 4 //Taille de la trame
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("====Recepteur CAP4====");
|
||||||
|
M5.Lcd.println("====Recepteur CAP4====");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
if(!rf95.init()){
|
||||||
|
Serial.println("Echec de la mise en place");
|
||||||
|
M5.Lcd.println("Echec de la mise en place");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.println("Mise en place reussie !!!");
|
||||||
|
M5.Lcd.println("Mise en place reussie !!!");
|
||||||
|
rf95.setModemConfig(RH_RF95::Bw125Cr45Sf128);
|
||||||
|
rf95.setFrequency(867.8);
|
||||||
|
|
||||||
|
state=E0;
|
||||||
|
//Serial.println("Boucle principale");
|
||||||
|
//M5.Lcd.println("Boucle principale");
|
||||||
|
RxSeq=255;
|
||||||
|
delay(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
|
||||||
|
switch(state){
|
||||||
|
case E0:
|
||||||
|
//Serial.println("Mode Reception");
|
||||||
|
//M5.Lcd.println("Mode Reception");
|
||||||
|
rf95.setModeRx();
|
||||||
|
state=E1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E1:
|
||||||
|
if(rf95.recv(rxbuf, &rxlen)){
|
||||||
|
if((rxbuf[F_TYPE]==TYPE_DATA) && (rxbuf[F_D_ADDR]==LOCAL_ADDR)){
|
||||||
|
//Réception d'un ACK et pour le récepteur
|
||||||
|
state=E2;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
state=E0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E2:
|
||||||
|
|
||||||
|
if(RxSeq!=rxbuf[F_NUM_SEQ]){
|
||||||
|
M5.Lcd.printf("===Message Recu===\n");
|
||||||
|
M5.Lcd.printf("Recu de [%02X]\n",rxbuf[F_S_ADDR]);
|
||||||
|
RxSeq=rxbuf[F_NUM_SEQ];
|
||||||
|
Serial.printf("[%d] ", RxSeq);
|
||||||
|
M5.Lcd.printf("[%d] ", RxSeq);
|
||||||
|
Serial.printf("DATA de %d octets :", rxlen);
|
||||||
|
M5.Lcd.printf("DATA de %d octets :", rxlen);
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
for(int i=0;i<rxlen;i++){
|
||||||
|
Serial.printf("%02x|", rxbuf[i]);
|
||||||
|
M5.Lcd.printf("%02x|", rxbuf[i]);
|
||||||
|
}
|
||||||
|
Serial.println();
|
||||||
|
M5.Lcd.println();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
Serial.printf("===Duplication===\n");
|
||||||
|
M5.Lcd.printf("===Duplication===\n");
|
||||||
|
}
|
||||||
|
state=E3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case E3:
|
||||||
|
|
||||||
|
Serial.println("===Envoi ACK===");
|
||||||
|
M5.Lcd.println("===Envoi ACK===");
|
||||||
|
|
||||||
|
txbuf[F_S_ADDR]=LOCAL_ADDR; //Adresse du sink
|
||||||
|
txbuf[F_D_ADDR]=rxbuf[F_S_ADDR]; //Émission du ACK vers source DATA
|
||||||
|
txbuf[F_TYPE]=TYPE_ACK;
|
||||||
|
txbuf[F_NUM_SEQ]=rxbuf[F_NUM_SEQ];
|
||||||
|
|
||||||
|
rf95.send(txbuf,TAILLE_ACK);
|
||||||
|
rf95.waitPacketSent();
|
||||||
|
|
||||||
|
state=E0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
87
Codes_source/Couche_3/Sprint1/Emetteur/Emetteur.ino
Normal file
87
Codes_source/Couche_3/Sprint1/Emetteur/Emetteur.ino
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include "SimpleWiNo.h"
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Objet Wino
|
||||||
|
SimpleWiNo wino;
|
||||||
|
|
||||||
|
//Constantes de configuration des noeuds
|
||||||
|
#define ADRESSE_CLUSTER 0x4A89
|
||||||
|
#define ADRESSE_NOEUD 0x0001
|
||||||
|
#define CANAL 7
|
||||||
|
|
||||||
|
//Variables pour le paquet
|
||||||
|
uint8_t txbuf[40];
|
||||||
|
uint8_t packetLen;
|
||||||
|
|
||||||
|
//Constantes de indices de champs du paquet
|
||||||
|
#define ADRESSE_MULTICAST 0x7878
|
||||||
|
#define NB_PAYLOAD 10
|
||||||
|
|
||||||
|
//Procédure de formatage
|
||||||
|
void formaterPaquet(uint8_t* longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
*longueur=0;
|
||||||
|
|
||||||
|
//Ajout En-tete
|
||||||
|
wino.encodeUi16(ADRESSE_MULTICAST, &donnees[*longueur]);
|
||||||
|
*longueur +=2;
|
||||||
|
|
||||||
|
//Ajout de la payload
|
||||||
|
for(int i=0; i<NB_PAYLOAD; i++){
|
||||||
|
donnees[*longueur]=random(0,256);
|
||||||
|
*longueur+=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void afficherPaquet(uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
for(int i=0; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int test_envoi=0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
//Démarage M5
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("====Emetteur sprint 1====");
|
||||||
|
M5.Lcd.println("====Emetteur sprint 1====");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
//Demarage wino
|
||||||
|
wino.init();
|
||||||
|
|
||||||
|
//Adresse cluster
|
||||||
|
wino.set(NODE_PANID, ADRESSE_CLUSTER);
|
||||||
|
//Adresse noeud
|
||||||
|
wino.set(NODE_SHORT_ADDRESS, ADRESSE_NOEUD);
|
||||||
|
//Fréquence de travail
|
||||||
|
wino.set(NODE_CHANNEL, CANAL);
|
||||||
|
|
||||||
|
//Générateur de payload aléatoire
|
||||||
|
randomSeed(analogRead(30));
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wino.process();
|
||||||
|
|
||||||
|
if(test_envoi==0){
|
||||||
|
M5.Lcd.println("====Envoi Paquet====");
|
||||||
|
Serial.println("====Envoi Paquet====");
|
||||||
|
formaterPaquet(&packetLen, txbuf);
|
||||||
|
afficherPaquet(packetLen, txbuf);
|
||||||
|
wino.send(0xFFFF, txbuf, packetLen);
|
||||||
|
test_envoi+=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
88
Codes_source/Couche_3/Sprint1/Recepteur/Recepteur.ino
Normal file
88
Codes_source/Couche_3/Sprint1/Recepteur/Recepteur.ino
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include "SimpleWiNo.h"
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Objet Wino
|
||||||
|
SimpleWiNo wino;
|
||||||
|
|
||||||
|
//Constantes de configuration des noeuds
|
||||||
|
#define ADRESSE_CLUSTER 0x4A89
|
||||||
|
#define ADRESSE_NOEUD 0x0003
|
||||||
|
#define CANAL 7
|
||||||
|
|
||||||
|
//Variables pour le paquet
|
||||||
|
uint8_t rxbuf[40];
|
||||||
|
uint8_t packetLen=0;
|
||||||
|
uint8_t indicePaquet;
|
||||||
|
uint16_t adresseSource;
|
||||||
|
uint16_t adresseMulticast;
|
||||||
|
|
||||||
|
//Constantes de indices de champs du paquet
|
||||||
|
#define ADRESSE_MULTICAST 0x7878
|
||||||
|
|
||||||
|
//Procédure d'affichage de la payload
|
||||||
|
//À partir de l'indice de début uniquement
|
||||||
|
void afficherPayload(uint8_t indiceDebut, uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
M5.Lcd.printf("Payload : ");
|
||||||
|
Serial.printf("Payload : ");
|
||||||
|
for(int i=indiceDebut; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Fonction permettant d'extraire l'adresse multicast en gérant
|
||||||
|
//L'indexation du paquet
|
||||||
|
uint16_t extraireMulticast(uint8_t* indice, uint8_t donnees[]){
|
||||||
|
|
||||||
|
uint16_t adresse;
|
||||||
|
adresse=wino.decodeUi16(&donnees[*indice]);
|
||||||
|
*indice+=2;
|
||||||
|
|
||||||
|
return adresse;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
//Démarage M5
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("====Recepteur sprint 1====");
|
||||||
|
M5.Lcd.println("====Recepteur sprint 1====");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
//Demarage wino
|
||||||
|
wino.init();
|
||||||
|
|
||||||
|
//Adresse cluster
|
||||||
|
wino.set(NODE_PANID, ADRESSE_CLUSTER);
|
||||||
|
//Adresse noeud
|
||||||
|
wino.set(NODE_SHORT_ADDRESS, ADRESSE_NOEUD);
|
||||||
|
//Fréquence de travail
|
||||||
|
wino.set(NODE_CHANNEL, CANAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wino.process();
|
||||||
|
|
||||||
|
//Test Reception
|
||||||
|
if(wino.recv(&adresseSource, rxbuf, &packetLen)){
|
||||||
|
|
||||||
|
//Affichage des éléments du paquet reçu
|
||||||
|
M5.Lcd.println("=====Reception=====");
|
||||||
|
Serial.println("=====Reception=====");
|
||||||
|
M5.Lcd.printf("Noeud Source : %X \n", adresseSource);
|
||||||
|
Serial.printf("Noeud Source : %X \n", adresseSource);
|
||||||
|
adresseMulticast=extraireMulticast(&indicePaquet, rxbuf);
|
||||||
|
M5.Lcd.printf("Adresse Multicast : %X \n", adresseMulticast);
|
||||||
|
Serial.printf("Adresse Multicast : %X \n", adresseMulticast);
|
||||||
|
afficherPayload(indicePaquet, packetLen, rxbuf);
|
||||||
|
|
||||||
|
indicePaquet=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
140
Codes_source/Couche_3/Sprint2/noeudEmetteur/noeudEmetteur.ino
Normal file
140
Codes_source/Couche_3/Sprint2/noeudEmetteur/noeudEmetteur.ino
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include "SimpleWiNo.h"
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Objet Wino
|
||||||
|
SimpleWiNo wino;
|
||||||
|
|
||||||
|
//Constantes de configuration des noeuds
|
||||||
|
#define ADRESSE_CLUSTER 0x4A89
|
||||||
|
#define ADRESSE_NOEUD 0x0001
|
||||||
|
#define CANAL 7
|
||||||
|
|
||||||
|
//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
|
||||||
|
uint8_t indicePaquetRX; //Indice pour le traitement du paquet reçu
|
||||||
|
uint16_t adresseSource; //Adresse du noeud source
|
||||||
|
uint16_t adresseMulticast; //Adresse multicast reçue
|
||||||
|
|
||||||
|
//Constantes de indices de champs du paquet
|
||||||
|
#define ADRESSE_MULTICAST 0x7878 //Adresse multicast du noeud
|
||||||
|
#define NB_PAYLOAD 10 //Nombre de données de 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[]){
|
||||||
|
|
||||||
|
*longueur=0;
|
||||||
|
|
||||||
|
//Ajout En-tete
|
||||||
|
wino.encodeUi16(ADRESSE_MULTICAST, &donnees[*longueur]);
|
||||||
|
*longueur +=2;
|
||||||
|
|
||||||
|
//Ajout de la payload
|
||||||
|
for(int i=0; i<NB_PAYLOAD; i++){
|
||||||
|
donnees[*longueur]=random(0,256);
|
||||||
|
*longueur+=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Affichage du paquet à émettre
|
||||||
|
void afficherPaquet(uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
for(int i=0; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Fonction permettant d'extraire l'adresse multicast reçu en gérant
|
||||||
|
//L'indexation du paquet
|
||||||
|
uint16_t extraireMulticast(uint8_t* indice, uint8_t donnees[]){
|
||||||
|
|
||||||
|
uint16_t adresse;
|
||||||
|
*indice=0;
|
||||||
|
|
||||||
|
adresse=wino.decodeUi16(&donnees[*indice]);
|
||||||
|
*indice+=2;
|
||||||
|
|
||||||
|
return adresse;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Procédure d'affichage de la payload reçue
|
||||||
|
//À partir de l'indice de début de la uniquement
|
||||||
|
void afficherPayload(uint8_t indiceDebut, uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
M5.Lcd.printf("Payload : ");
|
||||||
|
Serial.printf("Payload : ");
|
||||||
|
for(int i=indiceDebut; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Condition pour déclencher le premier envoi
|
||||||
|
int test_envoi=0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
//Démarage M5
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("====Emetteur sprint 2====");
|
||||||
|
M5.Lcd.println("====Emetteur sprint 2====");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
//Demarage wino
|
||||||
|
wino.init();
|
||||||
|
//Adresse cluster
|
||||||
|
wino.set(NODE_PANID, ADRESSE_CLUSTER);
|
||||||
|
//Adresse noeud
|
||||||
|
wino.set(NODE_SHORT_ADDRESS, ADRESSE_NOEUD);
|
||||||
|
//Fréquence de travail
|
||||||
|
wino.set(NODE_CHANNEL, CANAL);
|
||||||
|
|
||||||
|
//Générateur de payload aléatoire
|
||||||
|
randomSeed(analogRead(30));
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wino.process();
|
||||||
|
|
||||||
|
if(test_envoi==0){
|
||||||
|
M5.Lcd.println("====Envoi Paquet====");
|
||||||
|
Serial.println("====Envoi Paquet====");
|
||||||
|
formaterPaquet(&packetLenTX, txbuf);
|
||||||
|
afficherPaquet(packetLenTX, txbuf);
|
||||||
|
wino.send(0xFFFF, txbuf, packetLenTX);
|
||||||
|
test_envoi+=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Test Reception
|
||||||
|
if(wino.recv(&adresseSource, rxbuf, &packetLenRX) && (adresseSource!=3)){
|
||||||
|
M5.Lcd.println("=====Reception=====");
|
||||||
|
Serial.println("=====Reception=====");
|
||||||
|
M5.Lcd.printf("Noeud Source : %X \n", adresseSource);
|
||||||
|
Serial.printf("Noeud Source : %X \n", adresseSource);
|
||||||
|
adresseMulticast=extraireMulticast(&indicePaquetRX, rxbuf);
|
||||||
|
M5.Lcd.printf("Adresse Multicast : %X \n", adresseMulticast);
|
||||||
|
Serial.printf("Adresse Multicast : %X \n", adresseMulticast);
|
||||||
|
afficherPayload(indicePaquetRX, packetLenRX, rxbuf);
|
||||||
|
|
||||||
|
//Test même adresse multicast
|
||||||
|
if(adresseMulticast==ADRESSE_MULTICAST){
|
||||||
|
M5.Lcd.println("=====Réemission Paquet=====");
|
||||||
|
Serial.println("=====Réemission Paquet=====");
|
||||||
|
wino.send(0xFFFF, rxbuf, packetLenRX);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
94
Codes_source/Couche_3/Sprint2/noeudsRelais/noeudsRelais.ino
Normal file
94
Codes_source/Couche_3/Sprint2/noeudsRelais/noeudsRelais.ino
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include "SimpleWiNo.h"
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Objet Wino
|
||||||
|
SimpleWiNo wino;
|
||||||
|
|
||||||
|
//Constantes de configuration des noeuds
|
||||||
|
#define ADRESSE_CLUSTER 0x4A89
|
||||||
|
#define ADRESSE_NOEUD 0x0003
|
||||||
|
#define CANAL 7
|
||||||
|
|
||||||
|
//Variables pour le paquet
|
||||||
|
uint8_t rxbuf[40]; //Buffer de reception
|
||||||
|
uint8_t packetLen; //Longueur du paquet reçu
|
||||||
|
uint8_t indicePaquet; //Indice pour le traitement du paquet reçu
|
||||||
|
uint16_t adresseSource; //Adresse du noeud source
|
||||||
|
uint16_t adresseMulticast; //Adresse multicast reçue
|
||||||
|
|
||||||
|
//Constantes de indices de champs du paquet
|
||||||
|
#define ADRESSE_MULTICAST 0x7878
|
||||||
|
|
||||||
|
//Procédure d'affichage de la payload reçue
|
||||||
|
//À partir de l'indice de début de payload uniquement
|
||||||
|
void afficherPayload(uint8_t indiceDebut, uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
M5.Lcd.printf("Payload : ");
|
||||||
|
Serial.printf("Payload : ");
|
||||||
|
for(int i=indiceDebut; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Fonction permettant d'extraire l'adresse multicast reçu en gérant
|
||||||
|
//L'indexation du paquet
|
||||||
|
uint16_t extraireMulticast(uint8_t* indice, uint8_t donnees[]){
|
||||||
|
|
||||||
|
uint16_t adresse;
|
||||||
|
*indice=0;
|
||||||
|
|
||||||
|
adresse=wino.decodeUi16(&donnees[*indice]);
|
||||||
|
*indice+=2;
|
||||||
|
|
||||||
|
return adresse;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
//Démarage M5
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("==Relais sprint 2==");
|
||||||
|
M5.Lcd.println("==Relais sprint 2===");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
//Demarage wino
|
||||||
|
wino.init();
|
||||||
|
|
||||||
|
//Adresse cluster
|
||||||
|
wino.set(NODE_PANID, ADRESSE_CLUSTER);
|
||||||
|
//Adresse noeud
|
||||||
|
wino.set(NODE_SHORT_ADDRESS, ADRESSE_NOEUD);
|
||||||
|
//Fréquence de travail
|
||||||
|
wino.set(NODE_CHANNEL, CANAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wino.process();
|
||||||
|
|
||||||
|
//Test Reception
|
||||||
|
if(wino.recv(&adresseSource, rxbuf, &packetLen) && (adresseSource!=1)){
|
||||||
|
//Affichage des éléments du paquet reçu
|
||||||
|
M5.Lcd.println("=====Reception=====");
|
||||||
|
Serial.println("=====Reception=====");
|
||||||
|
M5.Lcd.printf("Noeud Source : %X \n", adresseSource);
|
||||||
|
Serial.printf("Noeud Source : %X \n", adresseSource);
|
||||||
|
adresseMulticast=extraireMulticast(&indicePaquet, rxbuf);
|
||||||
|
M5.Lcd.printf("Adresse Multicast : %X \n", adresseMulticast);
|
||||||
|
Serial.printf("Adresse Multicast : %X \n", adresseMulticast);
|
||||||
|
afficherPayload(indicePaquet, packetLen, rxbuf);
|
||||||
|
|
||||||
|
//Test même adresse multicast
|
||||||
|
if(adresseMulticast==ADRESSE_MULTICAST){
|
||||||
|
M5.Lcd.println("=====Réemission Paquet=====");
|
||||||
|
Serial.println("=====Réemission Paquet=====");
|
||||||
|
wino.send(0xFFFF, rxbuf, packetLen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
147
Codes_source/Couche_3/Sprint3/NoeudEmetteur/NoeudEmetteur.ino
Normal file
147
Codes_source/Couche_3/Sprint3/NoeudEmetteur/NoeudEmetteur.ino
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include "SimpleWiNo.h"
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Objet Wino
|
||||||
|
SimpleWiNo wino;
|
||||||
|
|
||||||
|
//Constantes de configuration des noeuds
|
||||||
|
#define ADRESSE_CLUSTER 0x4A89
|
||||||
|
#define ADRESSE_NOEUD 0x0001
|
||||||
|
#define CANAL 7
|
||||||
|
|
||||||
|
//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 adresseMulticast; //Adresse multicast reçue
|
||||||
|
|
||||||
|
|
||||||
|
//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 7 //Time To Live avant expiration
|
||||||
|
|
||||||
|
//Indices des champs du paquet
|
||||||
|
#define CHAMP_ADRESSE 0 //position du champ d'adressage
|
||||||
|
#define CHAMP_TTL 2 //Position du TTL dans le paquet
|
||||||
|
#define CHAMP_MIN_PAYLOAD 3 //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[]){
|
||||||
|
|
||||||
|
*longueur=0;
|
||||||
|
|
||||||
|
//Ajout En-tete
|
||||||
|
wino.encodeUi16(ADRESSE_MULTICAST, &donnees[CHAMP_ADRESSE]);
|
||||||
|
*longueur +=2;
|
||||||
|
|
||||||
|
//Ajout du TTL
|
||||||
|
donnees[CHAMP_TTL]=0;
|
||||||
|
|
||||||
|
*longueur+=1;
|
||||||
|
|
||||||
|
//Ajout de la payload
|
||||||
|
for(int i=0; i<NB_PAYLOAD; i++){
|
||||||
|
donnees[*longueur]=random(0,256);
|
||||||
|
*longueur+=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Affichage du paquet à émettre
|
||||||
|
void afficherPaquet(uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
for(int i=0; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Procédure d'affichage de la payload reçue
|
||||||
|
//À partir de l'indice de début de la uniquement
|
||||||
|
void afficherPayload(uint8_t indiceDebut, uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
M5.Lcd.printf("Payload : ");
|
||||||
|
Serial.printf("Payload : ");
|
||||||
|
for(int i=indiceDebut; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Condition pour déclencher le premier envoi
|
||||||
|
int test_envoi=0;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
//Démarage M5
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("====Emetteur sprint 3====");
|
||||||
|
M5.Lcd.println("====Emetteur sprint 3====");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
//Demarage wino
|
||||||
|
wino.init();
|
||||||
|
//Adresse cluster
|
||||||
|
wino.set(NODE_PANID, ADRESSE_CLUSTER);
|
||||||
|
//Adresse noeud
|
||||||
|
wino.set(NODE_SHORT_ADDRESS, ADRESSE_NOEUD);
|
||||||
|
//Fréquence de travail
|
||||||
|
wino.set(NODE_CHANNEL, CANAL);
|
||||||
|
|
||||||
|
//Générateur de payload aléatoire
|
||||||
|
randomSeed(analogRead(30));
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wino.process();
|
||||||
|
|
||||||
|
if(test_envoi==0){
|
||||||
|
M5.Lcd.println("====Envoi Paquet====");
|
||||||
|
Serial.println("====Envoi Paquet====");
|
||||||
|
formaterPaquet(&packetLenTX, txbuf);
|
||||||
|
afficherPaquet(packetLenTX, txbuf);
|
||||||
|
wino.send(0xFFFF, txbuf, packetLenTX);
|
||||||
|
test_envoi+=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//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
|
||||||
|
M5.Lcd.printf("Noeud Source : %X \n", adresseSource);
|
||||||
|
Serial.printf("Noeud Source : %X \n", adresseSource);
|
||||||
|
//Affichage Adresse Multicast
|
||||||
|
adresseMulticast=wino.decodeUi16(&rxbuf[CHAMP_ADRESSE]);
|
||||||
|
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 Payload
|
||||||
|
afficherPayload(CHAMP_MIN_PAYLOAD, packetLenRX, rxbuf);
|
||||||
|
|
||||||
|
//Test pour la réemission
|
||||||
|
//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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
97
Codes_source/Couche_3/Sprint3/NoeudRelais/NoeudRelais.ino
Normal file
97
Codes_source/Couche_3/Sprint3/NoeudRelais/NoeudRelais.ino
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include "SimpleWiNo.h"
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Objet Wino
|
||||||
|
SimpleWiNo wino;
|
||||||
|
|
||||||
|
//Constantes de configuration des noeuds
|
||||||
|
#define ADRESSE_CLUSTER 0x4A89
|
||||||
|
#define ADRESSE_NOEUD 0x0003
|
||||||
|
#define CANAL 7
|
||||||
|
|
||||||
|
//Variables pour le paquet
|
||||||
|
uint8_t rxbuf[40]; //Buffer de reception
|
||||||
|
uint8_t packetLen; //Longueur du paquet reçu
|
||||||
|
uint16_t adresseSource; //Adresse du noeud source
|
||||||
|
uint16_t adresseMulticast; //Adresse multicast reçue
|
||||||
|
|
||||||
|
//Propriétés du paquet
|
||||||
|
#define ADRESSE_MULTICAST 0x7878
|
||||||
|
#define TTL_MAX 7 //Time To Live avant expiration
|
||||||
|
|
||||||
|
//Indices des champs du paquet
|
||||||
|
#define CHAMP_ADRESSE 0 //position du champ d'adressage
|
||||||
|
#define CHAMP_TTL 2 //Position du TTL dans le paquet
|
||||||
|
#define CHAMP_MIN_PAYLOAD 3 //Position du premier octet de la payload
|
||||||
|
|
||||||
|
|
||||||
|
//Procédure d'affichage de la payload reçue
|
||||||
|
//À partir de l'indice de début de payload uniquement
|
||||||
|
void afficherPayload(uint8_t indiceDebut, uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
M5.Lcd.printf("Payload : ");
|
||||||
|
Serial.printf("Payload : ");
|
||||||
|
for(int i=indiceDebut; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
//Démarage M5
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("==Relais sprint 3==");
|
||||||
|
M5.Lcd.println("==Relais sprint 3===");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
//Demarage wino
|
||||||
|
wino.init();
|
||||||
|
|
||||||
|
//Adresse cluster
|
||||||
|
wino.set(NODE_PANID, ADRESSE_CLUSTER);
|
||||||
|
//Adresse noeud
|
||||||
|
wino.set(NODE_SHORT_ADDRESS, ADRESSE_NOEUD);
|
||||||
|
//Fréquence de travail
|
||||||
|
wino.set(NODE_CHANNEL, CANAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wino.process();
|
||||||
|
|
||||||
|
//Test Reception
|
||||||
|
if(wino.recv(&adresseSource, rxbuf, &packetLen) && (adresseSource!=1)){
|
||||||
|
//Affichage des éléments du paquet reçu
|
||||||
|
M5.Lcd.println("=====Reception=====");
|
||||||
|
Serial.println("=====Reception=====");
|
||||||
|
//Affichage du noeud source
|
||||||
|
M5.Lcd.printf("Noeud Source : %X \n", adresseSource);
|
||||||
|
Serial.printf("Noeud Source : %X \n", adresseSource);
|
||||||
|
//Affichage Adresse Multicast
|
||||||
|
adresseMulticast=wino.decodeUi16(&rxbuf[CHAMP_ADRESSE]);
|
||||||
|
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 Payload
|
||||||
|
afficherPayload(CHAMP_MIN_PAYLOAD, packetLen, rxbuf);
|
||||||
|
|
||||||
|
//Test pour la réemission
|
||||||
|
//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, packetLen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
175
Codes_source/Couche_3/Sprint4/NoeudEmetteur/NoeudEmetteur.ino
Normal file
175
Codes_source/Couche_3/Sprint4/NoeudEmetteur/NoeudEmetteur.ino
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include "SimpleWiNo.h"
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//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<NB_PAYLOAD; i++){
|
||||||
|
donnees[*longueur]=random(0,256);
|
||||||
|
*longueur+=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Affichage du paquet à émettre
|
||||||
|
void afficherPaquet(uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
for(int i=0; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Procédure d'affichage de la payload reçue
|
||||||
|
//À partir de l'indice de début de la uniquement
|
||||||
|
void afficherPayload(uint8_t indiceDebut, uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
M5.Lcd.printf("Payload : ");
|
||||||
|
Serial.printf("Payload : ");
|
||||||
|
for(int i=indiceDebut; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Condition pour déclencher un envoi toute les 20 secondes
|
||||||
|
uint32_t attente = millis()+DELAI_ENVOI;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
//Démarage M5
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("====Emetteur sprint 4====");
|
||||||
|
M5.Lcd.println("====Emetteur sprint 4====");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
//Demarage wino
|
||||||
|
wino.init();
|
||||||
|
//Adresse cluster
|
||||||
|
wino.set(NODE_PANID, ADRESSE_CLUSTER);
|
||||||
|
//Adresse noeud
|
||||||
|
wino.set(NODE_SHORT_ADDRESS, ADRESSE_NOEUD);
|
||||||
|
//Fréquence de travail
|
||||||
|
wino.set(NODE_CHANNEL, CANAL);
|
||||||
|
|
||||||
|
//Générateur de payload aléatoire
|
||||||
|
randomSeed(analogRead(30));
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wino.process();
|
||||||
|
|
||||||
|
//Envoi d'un paquet toutes les x secondes
|
||||||
|
if(millis() > 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 ===");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
111
Codes_source/Couche_3/Sprint4/NoeudRelais/NoeudRelais.ino
Normal file
111
Codes_source/Couche_3/Sprint4/NoeudRelais/NoeudRelais.ino
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include "SimpleWiNo.h"
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Objet Wino
|
||||||
|
SimpleWiNo wino;
|
||||||
|
|
||||||
|
//Constantes de configuration des noeuds
|
||||||
|
#define ADRESSE_CLUSTER 0x4A89
|
||||||
|
#define ADRESSE_NOEUD 0x0002
|
||||||
|
#define CANAL 7
|
||||||
|
|
||||||
|
//Variables pour le paquet
|
||||||
|
uint8_t rxbuf[40]; //Buffer de reception
|
||||||
|
uint8_t packetLen; //Longueur du paquet reçu
|
||||||
|
uint16_t adresseSource; //Adresse du noeud source
|
||||||
|
uint16_t adresseMulticast; //Adresse multicast reçue
|
||||||
|
|
||||||
|
//Propriétés du paquet
|
||||||
|
#define ADRESSE_MULTICAST 0x7878
|
||||||
|
#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 d'affichage de la payload reçue
|
||||||
|
//À partir de l'indice de début de payload uniquement
|
||||||
|
void afficherPayload(uint8_t indiceDebut, uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
M5.Lcd.printf("Payload : ");
|
||||||
|
Serial.printf("Payload : ");
|
||||||
|
for(int i=indiceDebut; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
//Démarage M5
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("==Relais sprint 4==");
|
||||||
|
M5.Lcd.println("==Relais sprint 4===");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
//Demarage wino
|
||||||
|
wino.init();
|
||||||
|
|
||||||
|
//Adresse cluster
|
||||||
|
wino.set(NODE_PANID, ADRESSE_CLUSTER);
|
||||||
|
//Adresse noeud
|
||||||
|
wino.set(NODE_SHORT_ADDRESS, ADRESSE_NOEUD);
|
||||||
|
//Fréquence de travail
|
||||||
|
wino.set(NODE_CHANNEL, CANAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wino.process();
|
||||||
|
|
||||||
|
//Test Reception
|
||||||
|
if(wino.recv(&adresseSource, rxbuf, &packetLen) /*&& (adresseSource!=1)*/){
|
||||||
|
//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, packetLen, 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=====");
|
||||||
|
M5.Lcd.println("=====Réemission Paquet=====");
|
||||||
|
wino.send(0xFFFF, rxbuf, packetLen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
M5.Lcd.println("=== Paquet emis par le noeud ===");
|
||||||
|
Serial.println("=== Paquet emis par le noeud ===");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
194
Codes_source/Couche_3/Sprint5/NoeudEmetteur/NoeudEmetteur.ino
Normal file
194
Codes_source/Couche_3/Sprint5/NoeudEmetteur/NoeudEmetteur.ino
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include "SimpleWiNo.h"
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//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; //Numéro de séquence incrémenté pour l'envoi
|
||||||
|
|
||||||
|
|
||||||
|
//Variables de mémorisation de l'adresse
|
||||||
|
//et du numéro de séquence précédent
|
||||||
|
uint16_t adressePrec=0xFFFF; //Adresse reçue précédement
|
||||||
|
uint8_t numSeqPrec=255; //Numéro de séquence reçu précédement
|
||||||
|
|
||||||
|
|
||||||
|
//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 7 //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<NB_PAYLOAD; i++){
|
||||||
|
donnees[*longueur]=random(0,256);
|
||||||
|
*longueur+=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Affichage du paquet à émettre
|
||||||
|
void afficherPaquet(uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
for(int i=0; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//Procédure d'affichage de la payload reçue
|
||||||
|
//À partir de l'indice de début de la uniquement
|
||||||
|
void afficherPayload(uint8_t indiceDebut, uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
M5.Lcd.printf("Payload : ");
|
||||||
|
Serial.printf("Payload : ");
|
||||||
|
for(int i=indiceDebut; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Condition pour déclencher un envoi toute les 20 secondes
|
||||||
|
uint32_t attente = millis()+DELAI_ENVOI;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
//Démarage M5
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("====Emetteur sprint 5====");
|
||||||
|
M5.Lcd.println("====Emetteur sprint 5====");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
//Demarage wino
|
||||||
|
wino.init();
|
||||||
|
//Adresse cluster
|
||||||
|
wino.set(NODE_PANID, ADRESSE_CLUSTER);
|
||||||
|
//Adresse noeud
|
||||||
|
wino.set(NODE_SHORT_ADDRESS, ADRESSE_NOEUD);
|
||||||
|
//Fréquence de travail
|
||||||
|
wino.set(NODE_CHANNEL, CANAL);
|
||||||
|
|
||||||
|
//Générateur de payload aléatoire
|
||||||
|
randomSeed(analogRead(30));
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wino.process();
|
||||||
|
|
||||||
|
//Envoi d'un paquet toutes les DELAI_ENVOI secondes
|
||||||
|
if(millis() > attente){
|
||||||
|
M5.Lcd.println("====Envoi Paquet====");
|
||||||
|
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
|
||||||
|
//Le paquet n'a pas été émis par le noeud lui-même
|
||||||
|
if(adresseSource!=ADRESSE_NOEUD){
|
||||||
|
//Même adresse multicast et TTL inférieur au max
|
||||||
|
if((adresseMulticast==ADRESSE_MULTICAST) && (rxbuf[CHAMP_TTL]<=TTL_MAX)){
|
||||||
|
//Test si le paquet n'a pas été déjà reçu
|
||||||
|
if((adressePrec!=adresseSource) || (numSeqPrec!=rxbuf[CHAMP_NUM_SEQ])){
|
||||||
|
M5.Lcd.println("=====Réemission Paquet=====");
|
||||||
|
Serial.println("=====Réemission Paquet=====");
|
||||||
|
adressePrec=adresseSource;
|
||||||
|
numSeqPrec=rxbuf[CHAMP_NUM_SEQ];
|
||||||
|
wino.send(0xFFFF, rxbuf, packetLenRX);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
M5.Lcd.println("===Déjà Reçu===");
|
||||||
|
Serial.println("===Déjà Reçu===");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
M5.Lcd.println("Adresse multicast incorecte ou TTL dépassé");
|
||||||
|
Serial.println("Adresse multicast incorecte ou TTL dépassé");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
M5.Lcd.println("===Paquet émis par le noeud===");
|
||||||
|
Serial.println("===Paquet émis par le noeud===");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
128
Codes_source/Couche_3/Sprint5/NoeudRelais/NoeudRelais.ino
Normal file
128
Codes_source/Couche_3/Sprint5/NoeudRelais/NoeudRelais.ino
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include "SimpleWiNo.h"
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Objet Wino
|
||||||
|
SimpleWiNo wino;
|
||||||
|
|
||||||
|
//Constantes de configuration des noeuds
|
||||||
|
#define ADRESSE_CLUSTER 0x4A89
|
||||||
|
#define ADRESSE_NOEUD 0x0002
|
||||||
|
#define CANAL 7
|
||||||
|
|
||||||
|
//Variables pour le paquet
|
||||||
|
uint8_t rxbuf[40]; //Buffer de reception
|
||||||
|
uint8_t packetLenRX; //Longueur du paquet reçu
|
||||||
|
uint16_t adresseSource; //Adresse du noeud source
|
||||||
|
uint16_t adresseMulticast; //Adresse multicast reçue
|
||||||
|
|
||||||
|
//Variables de mémorisation de l'adresse
|
||||||
|
//et du numéro de séquence précédent
|
||||||
|
uint16_t adressePrec=0xFFFF; //Adresse reçue précédement
|
||||||
|
uint8_t numSeqPrec=255; //Numéro de séquence reçu précédement
|
||||||
|
|
||||||
|
//Propriétés du paquet
|
||||||
|
#define ADRESSE_MULTICAST 0x7878
|
||||||
|
#define TTL_MAX 7 //Time To Live avant expiration
|
||||||
|
|
||||||
|
//Indices des champs du paquet (format 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 d'affichage de la payload reçue
|
||||||
|
//À partir de l'indice de début de payload uniquement
|
||||||
|
void afficherPayload(uint8_t indiceDebut, uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
M5.Lcd.printf("Payload : ");
|
||||||
|
Serial.printf("Payload : ");
|
||||||
|
for(int i=indiceDebut; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
//Démarage M5
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("==Relais sprint 5==");
|
||||||
|
M5.Lcd.println("==Relais sprint 5===");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
//Demarage wino
|
||||||
|
wino.init();
|
||||||
|
|
||||||
|
//Adresse cluster
|
||||||
|
wino.set(NODE_PANID, ADRESSE_CLUSTER);
|
||||||
|
//Adresse noeud
|
||||||
|
wino.set(NODE_SHORT_ADDRESS, ADRESSE_NOEUD);
|
||||||
|
//Fréquence de travail
|
||||||
|
wino.set(NODE_CHANNEL, CANAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wino.process();
|
||||||
|
|
||||||
|
//Test Reception
|
||||||
|
if(wino.recv(&adresseSource, rxbuf, &packetLenRX) /*&& (adresseSource!=1)*/){
|
||||||
|
//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
|
||||||
|
//Le paquet n'a pas été émis par le noeud lui-même
|
||||||
|
if(adresseSource!=ADRESSE_NOEUD){
|
||||||
|
//Même adresse multicast et TTL inférieur au max
|
||||||
|
if((adresseMulticast==ADRESSE_MULTICAST) && (rxbuf[CHAMP_TTL]<=TTL_MAX)){
|
||||||
|
//Test si le paquet n'a pas été déjà reçu
|
||||||
|
if((adressePrec!=adresseSource) || (numSeqPrec!=rxbuf[CHAMP_NUM_SEQ])){
|
||||||
|
M5.Lcd.println("=====Réemission Paquet=====");
|
||||||
|
Serial.println("=====Réemission Paquet=====");
|
||||||
|
adressePrec=adresseSource;
|
||||||
|
numSeqPrec=rxbuf[CHAMP_NUM_SEQ];
|
||||||
|
wino.send(0xFFFF, rxbuf, packetLenRX);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
M5.Lcd.println("===Déjà Reçu===");
|
||||||
|
Serial.println("===Déjà Reçu===");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
M5.Lcd.println("Adresse multicast incorecte ou TTL dépassé");
|
||||||
|
Serial.println("Adresse multicast incorecte ou TTL dépassé");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
M5.Lcd.println("===Paquet émis par le noeud===");
|
||||||
|
Serial.println("===Paquet émis par le noeud===");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
264
Codes_source/Couche_3/Sprint6/NoeudEmetteur/NoeudEmetteur.ino
Normal file
264
Codes_source/Couche_3/Sprint6/NoeudEmetteur/NoeudEmetteur.ino
Normal file
@ -0,0 +1,264 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include "SimpleWiNo.h"
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//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 adresseMacSource; //Adresse de couche 2 du noeud source
|
||||||
|
uint16_t adresseIpSource; //Adresse de couche 3 du noeud source
|
||||||
|
uint16_t adresseDestination; //Adresse du noeud source
|
||||||
|
uint16_t adresseMulticast; //Adresse multicast reçue
|
||||||
|
uint8_t numSeq=0; //Numéro de séquence incrémenté pour l'envoi
|
||||||
|
|
||||||
|
//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 7 //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
|
||||||
|
|
||||||
|
//Mémorisation des paquets
|
||||||
|
|
||||||
|
//Nombre de paquets maximums mémorisables
|
||||||
|
#define NB_PAQUET_MEM 10
|
||||||
|
|
||||||
|
//Structure pour l'identification
|
||||||
|
struct identifiant{
|
||||||
|
uint16_t srcAddr;
|
||||||
|
uint8_t sqn;
|
||||||
|
};
|
||||||
|
typedef struct identifiant IDENTIFIANT;
|
||||||
|
|
||||||
|
uint8_t indiceMemId=0; //Indice pour la mise à jour dans le tableau
|
||||||
|
IDENTIFIANT idRecu; //Identifiant courant du paquet reçu
|
||||||
|
IDENTIFIANT tabId[NB_PAQUET_MEM]; //Tableau d'identifiants
|
||||||
|
|
||||||
|
//Procédures pour la mémorisation
|
||||||
|
|
||||||
|
//Initialisation du tableau d'identifiants
|
||||||
|
void initTabId(IDENTIFIANT tab[]){
|
||||||
|
for(int i=0; i<NB_PAQUET_MEM; i++){
|
||||||
|
tab[i].srcAddr=0xFFFF;
|
||||||
|
tab[i].sqn=255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Affichage des id du tableau
|
||||||
|
void AfficheId(IDENTIFIANT tab[]){
|
||||||
|
|
||||||
|
for(int i=0; i<NB_PAQUET_MEM; i++){
|
||||||
|
M5.Lcd.printf("{%02X, %02X}", tab[i].srcAddr, tab[i].sqn);
|
||||||
|
Serial.printf("{%02X, %02X}", tab[i].srcAddr, tab[i].sqn);
|
||||||
|
}
|
||||||
|
M5.Lcd.println();
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Ajout d'un nouvel identifiant dans le tableau
|
||||||
|
//L'indice du tableau suit un modulo pour reboucler dans les mises à jour
|
||||||
|
//Afin de ne garder que les derniers NB_PAQUET_MEM paquets
|
||||||
|
void ajoutTabId(IDENTIFIANT id, IDENTIFIANT tab[], uint8_t* indice){
|
||||||
|
tab[*indice]=id;
|
||||||
|
*indice=(*indice+1)%NB_PAQUET_MEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Fonction vérifiant si l'id du paquet arrivé a déjà été routé
|
||||||
|
//Si c'est le cas la fonction renvoi 1 (VRAI)
|
||||||
|
//Sinon, elle renvoi 0 (FAUX)
|
||||||
|
int PaquetDejaRoute(IDENTIFIANT id, IDENTIFIANT tab[]){
|
||||||
|
|
||||||
|
for(int i=0; i<NB_PAQUET_MEM; i++){
|
||||||
|
//Un élément du tableau correspond
|
||||||
|
if((tab[i].srcAddr==id.srcAddr) && (tab[i].sqn==id.sqn)){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Procédures pour l'envoi
|
||||||
|
|
||||||
|
//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<NB_PAYLOAD; i++){
|
||||||
|
donnees[*longueur]=random(0,256);
|
||||||
|
*longueur+=1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Affichage du paquet à émettre
|
||||||
|
void afficherPaquet(uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
for(int i=0; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Procédures pour la réception
|
||||||
|
|
||||||
|
//Procédure d'affichage de la payload reçue
|
||||||
|
//À partir de l'indice de début de la uniquement
|
||||||
|
void afficherPayload(uint8_t indiceDebut, uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
M5.Lcd.printf("Payload : ");
|
||||||
|
Serial.printf("Payload : ");
|
||||||
|
for(int i=indiceDebut; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Condition pour déclencher un envoi toute les 20 secondes
|
||||||
|
uint32_t attente = millis()+DELAI_ENVOI;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
//Démarage M5
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("====Emetteur sprint 5====");
|
||||||
|
M5.Lcd.println("====Emetteur sprint 5====");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
//Demarage wino
|
||||||
|
wino.init();
|
||||||
|
//Adresse cluster
|
||||||
|
wino.set(NODE_PANID, ADRESSE_CLUSTER);
|
||||||
|
//Adresse noeud
|
||||||
|
wino.set(NODE_SHORT_ADDRESS, ADRESSE_NOEUD);
|
||||||
|
//Fréquence de travail
|
||||||
|
wino.set(NODE_CHANNEL, CANAL);
|
||||||
|
|
||||||
|
//Générateur de payload aléatoire
|
||||||
|
randomSeed(analogRead(30));
|
||||||
|
|
||||||
|
//Initialisation du tableau de mémoire des identifiants
|
||||||
|
initTabId(tabId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wino.process();
|
||||||
|
|
||||||
|
//Envoi d'un paquet toutes les DELAI_ENVOI secondes
|
||||||
|
if(millis() > attente){
|
||||||
|
M5.Lcd.println("====Envoi Paquet====");
|
||||||
|
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(&adresseMacSource, rxbuf, &packetLenRX) && (adresseMacSource!=3)){
|
||||||
|
//Affichage des éléments du paquet reçu
|
||||||
|
M5.Lcd.println("=====Reception=====");
|
||||||
|
Serial.println("=====Reception=====");
|
||||||
|
//Affichage du noeud source
|
||||||
|
adresseIpSource=wino.decodeUi16(&rxbuf[CHAMP_ADRESSE_SRC]);
|
||||||
|
M5.Lcd.printf("MAC SRC : %X | ", adresseMacSource);
|
||||||
|
Serial.printf("MAC SRC : %X | ", adresseMacSource);
|
||||||
|
M5.Lcd.printf("IP SRC : %X \n", adresseIpSource);
|
||||||
|
Serial.printf("IP SRC : %X \n", adresseIpSource);
|
||||||
|
//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
|
||||||
|
//Le paquet n'a pas été émis par le noeud lui-même
|
||||||
|
if(adresseIpSource!=ADRESSE_NOEUD){
|
||||||
|
//Même adresse multicast et TTL inférieur au max
|
||||||
|
if((adresseMulticast==ADRESSE_MULTICAST) && (rxbuf[CHAMP_TTL]<=TTL_MAX)){
|
||||||
|
|
||||||
|
//Récupération de l'identifiant du paquet recu
|
||||||
|
idRecu.srcAddr=adresseIpSource;
|
||||||
|
idRecu.sqn=rxbuf[CHAMP_NUM_SEQ];
|
||||||
|
|
||||||
|
//Test si le paquet n'a pas déjà été reçu
|
||||||
|
if(!PaquetDejaRoute(idRecu, tabId)){
|
||||||
|
M5.Lcd.println("=====Reemission Paquet=====");
|
||||||
|
Serial.println("=====Reemission Paquet=====");
|
||||||
|
//Ajout du nouvel id dans le tableau
|
||||||
|
ajoutTabId(idRecu, tabId, &indiceMemId);
|
||||||
|
//Réemission du paquet
|
||||||
|
wino.send(0xFFFF, rxbuf, packetLenRX);
|
||||||
|
|
||||||
|
//Affichage des id mémorisés
|
||||||
|
AfficheId(tabId);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
M5.Lcd.println("===Deja Recu===");
|
||||||
|
Serial.println("===Deja Recu===");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
M5.Lcd.println("Adresse multicast incorecte ou TTL depasse");
|
||||||
|
Serial.println("Adresse multicast incorecte ou TTL depasse");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
M5.Lcd.println("===Paquet emis par le noeud===");
|
||||||
|
Serial.println("===Paquet emis par le noeud===");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
197
Codes_source/Couche_3/Sprint6/NoeudRelais/NoeudRelais.ino
Normal file
197
Codes_source/Couche_3/Sprint6/NoeudRelais/NoeudRelais.ino
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include "SimpleWiNo.h"
|
||||||
|
#include <M5Stack.h>
|
||||||
|
|
||||||
|
//Objet Wino
|
||||||
|
SimpleWiNo wino;
|
||||||
|
|
||||||
|
//Constantes de configuration des noeuds
|
||||||
|
#define ADRESSE_CLUSTER 0x4A89
|
||||||
|
#define ADRESSE_NOEUD 0x0002
|
||||||
|
#define CANAL 7
|
||||||
|
|
||||||
|
//Variables pour le paquet
|
||||||
|
uint8_t rxbuf[40]; //Buffer de reception
|
||||||
|
uint8_t packetLenRX; //Longueur du paquet reçu
|
||||||
|
uint16_t adresseMacSource; //Adresse de couche 2 du noeud source
|
||||||
|
uint16_t adresseIpSource; //Adresse de couche 3 du noeud source
|
||||||
|
uint16_t adresseMulticast; //Adresse multicast reçue
|
||||||
|
|
||||||
|
|
||||||
|
//Propriétés du paquet
|
||||||
|
#define ADRESSE_MULTICAST 0x7878
|
||||||
|
#define TTL_MAX 7 //Time To Live avant expiration
|
||||||
|
|
||||||
|
//Indices des champs du paquet (format 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
|
||||||
|
|
||||||
|
//Mémorisation des paquets
|
||||||
|
|
||||||
|
//Nombre de paquets maximums mémorisables
|
||||||
|
#define NB_PAQUET_MEM 10
|
||||||
|
|
||||||
|
//Structure pour l'identification
|
||||||
|
struct identifiant{
|
||||||
|
uint16_t srcAddr;
|
||||||
|
uint8_t sqn;
|
||||||
|
};
|
||||||
|
typedef struct identifiant IDENTIFIANT;
|
||||||
|
|
||||||
|
uint8_t indiceMemId=0; //Indice pour la mise à jour dans le tableau
|
||||||
|
IDENTIFIANT idRecu; //Identifiant courant du paquet reçu
|
||||||
|
IDENTIFIANT tabId[NB_PAQUET_MEM]; //Tableau d'identifiants
|
||||||
|
|
||||||
|
//Procédures pour la mémorisation
|
||||||
|
|
||||||
|
//Initialisation du tableau d'identifiants
|
||||||
|
void initTabId(IDENTIFIANT tab[]){
|
||||||
|
for(int i=0; i<NB_PAQUET_MEM; i++){
|
||||||
|
tab[i].srcAddr=0xFFFF;
|
||||||
|
tab[i].sqn=255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Affichage des id du tableau
|
||||||
|
void AfficheId(IDENTIFIANT tab[]){
|
||||||
|
|
||||||
|
for(int i=0; i<NB_PAQUET_MEM; i++){
|
||||||
|
M5.Lcd.printf("{%02X, %02X}", tab[i].srcAddr, tab[i].sqn);
|
||||||
|
Serial.printf("{%02X, %02X}", tab[i].srcAddr, tab[i].sqn);
|
||||||
|
}
|
||||||
|
M5.Lcd.println();
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Ajout d'un nouvel identifiant dans le tableau
|
||||||
|
//L'indice du tableau suit un modulo pour reboucler dans les mises à jour
|
||||||
|
//Afin de ne garder que les derniers NB_PAQUET_MEM paquets
|
||||||
|
void ajoutTabId(IDENTIFIANT id, IDENTIFIANT tab[], uint8_t* indice){
|
||||||
|
tab[*indice]=id;
|
||||||
|
*indice=(*indice+1)%NB_PAQUET_MEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Fonction vérifiant si l'id du paquet arrivé a déjà été routé
|
||||||
|
//Si c'est le cas la fonction renvoi 1 (VRAI)
|
||||||
|
//Sinon, elle renvoi 0 (FAUX)
|
||||||
|
int PaquetDejaRoute(IDENTIFIANT id, IDENTIFIANT tab[]){
|
||||||
|
|
||||||
|
for(int i=0; i<NB_PAQUET_MEM; i++){
|
||||||
|
//Un élément du tableau correspond
|
||||||
|
if((tab[i].srcAddr==id.srcAddr) && (tab[i].sqn==id.sqn)){
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Procédure d'affichage de la payload reçue
|
||||||
|
//À partir de l'indice de début de payload uniquement
|
||||||
|
void afficherPayload(uint8_t indiceDebut, uint8_t longueur, uint8_t donnees[]){
|
||||||
|
|
||||||
|
M5.Lcd.printf("Payload : ");
|
||||||
|
Serial.printf("Payload : ");
|
||||||
|
for(int i=indiceDebut; i<longueur; i++){
|
||||||
|
M5.Lcd.printf("|%02X", donnees[i]);
|
||||||
|
Serial.printf("|%02X", donnees[i]);
|
||||||
|
}
|
||||||
|
M5.Lcd.println("|");
|
||||||
|
Serial.println("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
//Démarage M5
|
||||||
|
M5.begin();
|
||||||
|
M5.Power.begin();
|
||||||
|
Serial.println("==Relais sprint 5==");
|
||||||
|
M5.Lcd.println("==Relais sprint 5===");
|
||||||
|
|
||||||
|
delay(3000);
|
||||||
|
|
||||||
|
//Demarage wino
|
||||||
|
wino.init();
|
||||||
|
|
||||||
|
//Adresse cluster
|
||||||
|
wino.set(NODE_PANID, ADRESSE_CLUSTER);
|
||||||
|
//Adresse noeud
|
||||||
|
wino.set(NODE_SHORT_ADDRESS, ADRESSE_NOEUD);
|
||||||
|
//Fréquence de travail
|
||||||
|
wino.set(NODE_CHANNEL, CANAL);
|
||||||
|
|
||||||
|
//Initialisation du tableau de mémoire des identifiants
|
||||||
|
initTabId(tabId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
wino.process();
|
||||||
|
|
||||||
|
//Test Reception
|
||||||
|
if(wino.recv(&adresseMacSource, rxbuf, &packetLenRX) /*&& (adresseMacSource!=1)*/){
|
||||||
|
//Affichage des éléments du paquet reçu
|
||||||
|
M5.Lcd.println("=====Reception=====");
|
||||||
|
Serial.println("=====Reception=====");
|
||||||
|
//Affichage du noeud source
|
||||||
|
adresseIpSource=wino.decodeUi16(&rxbuf[CHAMP_ADRESSE_SRC]);
|
||||||
|
M5.Lcd.printf("MAC SRC : %X | ", adresseMacSource);
|
||||||
|
Serial.printf("MAC SRC : %X | ", adresseMacSource);
|
||||||
|
M5.Lcd.printf("IP SRC : %X \n", adresseIpSource);
|
||||||
|
Serial.printf("IP SRC : %X \n", adresseIpSource);
|
||||||
|
//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
|
||||||
|
//Le paquet n'a pas été émis par le noeud lui-même
|
||||||
|
if(adresseIpSource!=ADRESSE_NOEUD){
|
||||||
|
//Même adresse multicast et TTL inférieur au max
|
||||||
|
if((adresseMulticast==ADRESSE_MULTICAST) && (rxbuf[CHAMP_TTL]<=TTL_MAX)){
|
||||||
|
|
||||||
|
//Récupération de l'identifiant du paquet recu
|
||||||
|
idRecu.srcAddr=adresseIpSource;
|
||||||
|
idRecu.sqn=rxbuf[CHAMP_NUM_SEQ];
|
||||||
|
|
||||||
|
//Test si le paquet n'a pas déjà été reçu
|
||||||
|
if(!PaquetDejaRoute(idRecu, tabId)){
|
||||||
|
M5.Lcd.println("=====Reemission Paquet=====");
|
||||||
|
Serial.println("=====Reemission Paquet=====");
|
||||||
|
//Ajout du nouvel id dans le tableau
|
||||||
|
ajoutTabId(idRecu, tabId, &indiceMemId);
|
||||||
|
//Réemission du paquet
|
||||||
|
wino.send(0xFFFF, rxbuf, packetLenRX);
|
||||||
|
|
||||||
|
//Affichage des id mémorisés
|
||||||
|
AfficheId(tabId);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
M5.Lcd.println("===Deja Recu===");
|
||||||
|
Serial.println("===Deja Recu===");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
M5.Lcd.println("Adresse multicast incorecte ou TTL depasse");
|
||||||
|
Serial.println("Adresse multicast incorecte ou TTL depasse");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
M5.Lcd.println("===Paquet emis par le noeud===");
|
||||||
|
Serial.println("===Paquet emis par le noeud===");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
Documentation_SAE32_AZE_TEVANE_THOMAS_LEVEIL.pdf
Normal file
BIN
Documentation_SAE32_AZE_TEVANE_THOMAS_LEVEIL.pdf
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user