Probleme adresse mac

Salut à tous,

j'ai un soucis de transfert d'adresse Mac.
Je m'explique:

Appareil A doit envoyer Mac A à appareil b. (qui l'utilisera en tant qu'adresse Mac d'envoi)

Adresse Mac B est une adresse constante, donc pas de soucis.

Impossible de mettre une adresse Mac A constante, sinon je ne posterai pas ce message bien évidemment.

Donc j'en suis entretemps à récupérer mes 6 macs envoyer de A vers B.
Jusue la nickel, mais comment implémenter met 6 macs dans par exemple

uint8_t broadcastAddress[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};

afin donc de pouvoir modifier sur l'appareil B cette adresse Mac automatiquement.

merci a vous pour vos conseils et infos

Tu les récupères sous quelle forme?
Parce qu'il suffit de récupérer les 6 octets et de les écrire dans le tableau broadcastAddress

quel moyen de transport entre A et B ?

en fait tout est envoyé via esp_now.
je suis ouvert à toute proposition

un truc du genre non ?

  uint8_t macA = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
  esp_err_t result = esp_now_send(macB, macA, sizeof(macA));

Bonsoir

il me semble (simple impression, je n'utilise pas) que le protocole ESPNow d'ESpressif établt des liaisons entre ESP définis par leurs adresses MAC connues et constantes, adresses qui servent à identifier les 'partenaires'

Je recois en b
int mac0=mac[0], dec
int mac1=mac[1], dec
int mac2=mac[2], dec
int mac3=mac[3], dec
int mac4=mac[4], dec
int mac5=mac[5], dec

Et de la je voudrais que ca se complete automatiquement dans
uint8_t broadcastAddress = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
Du style

uint8_t broadcastAddress = {mac0, mac1, mac2, mac3, mac4, mac5};

Bonjour @stevatrans

un simple petit coup de moteur de recherche avec 'ESPNow broadcast' renvoie ça ,
source d'inspiration dans OnDataSent() et OnDataRecv() ?

https://gist.github.com/Daniel-dk/0a31ca66240e076f270d2d65bb4ea7f1

Et bien il suffit de faire

for (i = 0; i<6; i++) broadcastAddress[i] = mac[i];

Postez le code de réception. On parle dans le vide là car on ne sait pas ce que vous faites

Le callback appelé lors d’un message espNow vous donne déjà un tableau et sa taille pour le payload - il suffit de faire un memcpy() dans votre tableau destination

voici une partie du code, le reste n'a rien a voir avec le problème.
Donc le but est que l'adresse Mac reçue de l'autre appareil (via mac0-mac5) soit utilisée automatiquement pour remplacer la broadcastaddress.


uint8_t broadcastAddress[] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};

typedef struct struct_message {
    int a; 
    int b;
    int c;
    int d;
    int e;
    int f;
    int g;
    int h;
    int i;
    int j;
    int k;
    int l;
    int m;
    int n;
    int o;
    int p;
} struct_message;

// a envoyer
struct_message afstandsbediening;

// recues
struct_message pool;

esp_now_peer_info_t peerInfo;

void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("\r\nLast Packet Send Status:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
  if (status ==0){
    success = "Delivery Success :)";
  }
  else{
    success = "Delivery Fail :(";
  }
}

void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
  char macStr[18];
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
  mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  Serial.print("Last Packet Recv from: "); Serial.println(macStr);
  Serial.print("Last Packet Recv Data: "); Serial.println(*incomingData);
  Serial.println("");
  lucht = pool.a;
  water = pool.b;
  ph = pool.c;
  rx = pool.d;
  error = pool.e;
  modus = pool.f;
  leds = pool.g;
  rolluik = pool.h;
  solar = pool.i;
  snelheid = pool.j;
  mac0=mac[0];
  mac1=mac[1];
  mac2=mac[2];
  mac3=mac[3];
  mac4=mac[4];
  mac5=mac[5];
}

void setup() {
WiFi.mode(WIFI_STA);
Serial.begin(115200);
esp_wifi_set_mac(WIFI_IF_STA, &newMACAddress[0]);
if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }
  esp_now_register_send_cb(OnDataSent);
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;  
  peerInfo.encrypt = false;   
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Failed to add peer");
    return;
  }
    esp_now_register_recv_cb(OnDataRecv);


void loop() {

afstandsbediening.a = modus;
afstandsbediening.b = leds;
afstandsbediening.j = snelheid;
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &afstandsbediening, sizeof(afstandsbediening));
if (result == ESP_OK) {
Serial.println("Sent with success");
}
else {
Serial.println("Error sending the data");
}
}

Dans l'absolu - en supposant que le code que vous avez fonctionne et que vous recevez bien un appel à OnDataRecv() , il vous suffit de remplacer

par

memcpy(broadcastAddress,  mac, sizeof broadcastAddress); // corrected

ça va copier les octets qui sont dans le buffer reçu (mac) en mémoire vers broadcastAddress.

c'est quoi tout ces champs avec un nom ridicule dans la structure du message?

Si a c'est lucht et b c'est water (etc), pourquoi ne pas les appeler ainsi

voici donc ce qui revient en modifiant le code

void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
  memcpy(&pool, incomingData, sizeof(pool));
  Serial.print("Bytes received: ");
  Serial.println(len);
  lucht = pool.a;
  water = pool.b;
  ph = pool.c;
  rx = pool.d;
  error = pool.e;
  modus = pool.f;
  leds = pool.g;
  rolluik = pool.h;
  solar = pool.i;
  snelheid = pool.j;
  mac0 = pool.k;
  mac1 = pool.l;
  mac2 = pool.m;
  mac3 = pool.n;
  mac4 = pool.o;
  mac5 = pool.p;
  mac[0]=mac0, HEX;
  mac[1]=mac1, HEX;
  mac[2]=mac2, HEX;
  mac[3]=mac3, HEX;
  mac[4]=mac4, HEX;
  mac[5]=mac5, HEX;
  Serial.print(mac0);
  Serial.print(":");
  Serial.print(mac1);
  Serial.print(":");
  Serial.print(mac2);
  Serial.print(":");
  Serial.print(mac3);
  Serial.print(":");
  Serial.print(mac4);
  Serial.print(":");
  Serial.print(mac5);
  Serial.println(":");
  }

La réponse est bel et bien mon adresse Mac demandée mais en décimale, mas en hexagone.

En insérant la ligne

memcpy(mac, broadcastAddress, sizeof broadcastAddress);

dans le loop (dans le ondatarecv ca me donne une erreur), la connexion ne se fait pas.

C’est pas ce que j’ai écrit….mais vous avez raison c’est d’abord la destination et ensuite la source

memcpy ( void * destination, const void * source, size_t num );

Mais si vous voulez que ça aille dans broadcastAddress, pourquoi mettre pool?

memcpy(broadcastAddress, mac, sizeof broadcastAddress); // corrected

Que le nombre s'affiche en décimal, en héxadécimal ou en binaire cela reste le même nombre c'est juste une représentation à l'affichage. En interne le CPU ne gère de toutes les façons que du binaire.

Si tu veux afficher les valeurs en hexadécimal, remplace

par

Serial.print(mac0, HEX);

Bon à savoir pour Le binaire.

Concernant Le reste je regarde cet après midi. Merci

ca n'a pas l'air de fonctionner comme il se doit.
il reste m'afficher l'adresse Mac de départ 11 22 33 44 55 66

J'ai donc ceci

uint8_t broadcastAddress[] = {0x11, 0X22, 0x33, 0x44, 0x55, 0x66};
uint8_t Mac[] = {0x11, 0X22, 0x33, 0x44, 0x55, 0x66};

Mac0] = pool.k;
Mac[1] = pool.l;
Mac[2] = pool.m;
Mac[3] = pool.n;
Mac[4] = pool.o;
Mac[5] = pool.p;

et dans le loop:
memcpy(broadcastAddress, Mac, sizeof broadcastAddress);

Perso je ne comprends rien à vos variables.

Ou dans la loop? Ça doit être fait quand on reçoit l’adresse, pas à chaque tour de loop

Postez le source su master et des slave par exemple qu’on comprenne le scénario de partage des données

selon moi il suffirait de rentrer 6 int dans
uint8_t broadcastAddress = {0x11, 0X22, 0x33, 0x44, 0x55, 0x66};

afin d'éviter de devoir les entrer en manuel et surtout de devoir les changer a chaque appareil.
du style
int a;
int b;
int c;
int d;
int e;
int f;
uint8_t broadcastAddress = {a, b, c, d, e, f};

:roll_eyes: :astonished: :thinking: