Recevoir données OSC sur esp32. RESOLU. voir dernier post

Bonjour,

J'aimerai envoyer des données via le WIFI de mon ordinateur depuis le serial monitor et les recevoir sur l'ESP 32.
Mais je rencontre cette erreur

Compilation error: 'class WiFiUDP' has no member named 'localPort'

Merci pour votre aide

Pour lancer le programme il faut commenter la ligne 73
Ce programme à l'avenir devra me permettre d'envoyer et recevoir des messages osc depuis l'ESP32

// ESP32 UDP client sending datagrams to a UDP server

//  from https://github.com/evothings/evothings-examples/blob/master/examples/arduino-led-onoff-tcp/arduinowifi/arduinowifi/arduinowifi.ino

#include <WiFi.h>
#include <WiFiUdp.h>
#include <OSCMessage.h>

WiFiUDP Udp; 

const unsigned int outPort = 8000;          // remote port to receive OSC
const unsigned int localPort = 8001;        // local port to listen for OSC packets (actually not used for sending)

// network SSID (network name). and network password.
//char ssid[] = "****";
//char pass[] = "****";

//char ssid[] = "SFR-d078"; // your network SSID (name)
//char pass[] = "DEDW3VPARYGZ";  // your network password

char ssid[] = "Iphone de ben"; // your network SSID (name)
char pass[] = "cacaprout";  // your network password

// network key Index number (needed only for WEP).
int keyIndex = 0;

// UDP information
//local broadcast address..
IPAddress udpServer(192, 168, 0, 255);
IPAddress outIp(127, 0, 0, 1); //127.0.0.1
#define UDP_PORT 8002
WiFiUDP udp;

// UDP Datagram
struct __attribute__((packed)) UDPDatagram {
  uint16_t seq;                          // sequence number
  int16_t sdata;                         // 16 bit integer data
  int32_t idata;                         // 32 bit integer data
  float fdata;                           // float data
  uint16_t crc;                          // crc check
} udpDatagram = { 0, 10, 10, 3.14, 0 };  // initial values

void setup() {
  Serial.begin(115200);
  // Wait for serial port to connect. Needed for Leonardo only
  while (!Serial)
    ;
  delay(1000);
  Serial.println();
  Serial.println("ESP32 WiFi UDP client - send UDP datagrams to server");
  WiFi.mode(WIFI_STA);  // Connect to Wifi network.
  WiFi.begin(ssid, pass);
  Serial.println("");
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.print("\nserver IP address: ");
  Serial.println(udpServer);
  udp.begin(UDP_PORT);
  Serial.print("server udp port ");
  Serial.println(UDP_PORT);

  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  Serial.println("Starting UDP");
  Udp.begin(localPort);
  Serial.print("Local port: ");
  
 // Serial.println(Udp.localPort(localPort)); // bug
}

void loop() {
  // generate crc check - in this case a simple checksum
  udpDatagram.crc = 0;
  Serial.println("Datagram data ");
  for (int i = 0; i < sizeof(udpDatagram) - 2; i++) {
    Serial.print((uint8_t)((uint8_t *)&udpDatagram)[i], HEX);
    Serial.print(' ');
    udpDatagram.crc += ((uint8_t *)&udpDatagram)[i];
  }

    OSCMessage msg("/pongo");
  msg.add(65);
 // msg.add("hello");
 // msg.add(fnum);
  Udp.beginPacket(outIp, outPort);
  msg.send(Udp);
  Udp.endPacket();
  msg.empty();

  // Send Packet to UDP server
  udp.beginPacket(udpServer.toString().c_str(), UDP_PORT);
  int len = udp.write((const uint8_t *)&udpDatagram, sizeof(udpDatagram));
  udp.endPacket();
  /*
  Serial.print("\nudp datagram transmitted length ");
  Serial.print(len);
  Serial.print(" seq ");
  Serial.print(udpDatagram.seq++);
  Serial.print(" sdata ");
  Serial.print(udpDatagram.sdata);
  Serial.print(" idata ");
  Serial.print(udpDatagram.idata);
  Serial.print(" fdata ");
  Serial.print(udpDatagram.fdata);
  Serial.print(" crc = ");
  Serial.println(udpDatagram.crc);
  udpDatagram.crc = 0;  // update data values for tests
  udpDatagram.sdata += 10;
  udpDatagram.idata += 25;
  udpDatagram.fdata += 5.0f;
  delay(10000);
  */
}

Il faudrait peut-être tester ce que retourne Udp.begin()

merci pour votre aide

dans le setup j'ai mis
Serial.print(Udp.begin());

et j'ai ce message d'erreur

/Users/oslive/Documents/Arduino/hardware/WiFi_Kit_series/oscTest_copy_/oscTest_copy_.ino: In function 'void setup()':
/Users/oslive/Documents/Arduino/hardware/WiFi_Kit_series/oscTest_copy_/oscTest_copy_.ino:65:26: error: no matching function for call to 'WiFiUDP::begin()'
   Serial.print(Udp.begin());
                          ^
In file included from /Users/oslive/Library/Arduino15/packages/esp32/hardware/esp32/2.0.11/libraries/WiFi/src/WiFi.h:39,
                 from /Users/oslive/Documents/Arduino/hardware/WiFi_Kit_series/oscTest_copy_/oscTest_copy_.ino:4:
/Users/oslive/Library/Arduino15/packages/esp32/hardware/esp32/2.0.11/libraries/WiFi/src/WiFiUdp.h:55:11: note: candidate: 'uint8_t WiFiUDP::begin(IPAddress, uint16_t)'
   uint8_t begin(IPAddress a, uint16_t p);
           ^~~~~
/Users/oslive/Library/Arduino15/packages/esp32/hardware/esp32/2.0.11/libraries/WiFi/src/WiFiUdp.h:55:11: note:   candidate expects 2 arguments, 0 provided
/Users/oslive/Library/Arduino15/packages/esp32/hardware/esp32/2.0.11/libraries/WiFi/src/WiFiUdp.h:56:11: note: candidate: 'virtual uint8_t WiFiUDP::begin(uint16_t)'
   uint8_t begin(uint16_t p);
           ^~~~~
/Users/oslive/Library/Arduino15/packages/esp32/hardware/esp32/2.0.11/libraries/WiFi/src/WiFiUdp.h:56:11: note:   candidate expects 1 argument, 0 provided

exit status 1

Compilation error: no matching function for call to 'WiFiUDP::begin()'

L'instance de ton objet ne nomme "upd" et pas "Udp", je pense que ton problème vient de là.

Le compilateur t'indique que la classe Udp, n'a pas de fonction de classe begin.

Il y a 2 instances, voir ligne 9 et 32

effectivement, j'ai été beaucoup trop vite.

l'erreur indique qu'il n'existe pas de fonction sans paramètre.

Oui, c'est normal begin() attend au moins un argument
Il faudrait faire

int connect = Udp.begin(localPort);
Serial.println(connect, DEC);

Udp.begin(localPort); retourne 0 s'il y a eu une erreur et 1 si c'est OK.

Pour en voir plus il faudrait, je crois, mettre en tête du programme
#define CONFIG_ARDUHAL_LOG_DEFAULT_LEVEL ARDUHAL_LOG_LEVEL_ERROR
Qui devrait faire afficher des messages d'erreur un peu plus détaillés pendant l'exécution.

voilà ce que le monitor m'indique.

Je pense qu'il serait bien que j'arrive au moins à faire clignoter la led built-in en wifi à partir du serial monitor pour commencer, non?

ELF file SHA256: ed6338e038be95f6
00:35:35.079 -> 
00:35:35.079 -> E (236) esp_core_dump_flash: Core dump flash config is corrupted! CRC=0x7bd5c66f instead of 0x0
00:35:35.111 -> Rebooting...
00:35:35.111 -> ���ESP-ROM:esp32s3-20210327
00:35:35.111 -> Build:Mar 27 2021
00:35:35.111 -> rst:0xc (RTC_SW_CPU_RST),boot:0x8 (SPI_FAST_FLASH_BOOT)
00:35:35.111 -> Saved PC:0x40376d84
00:35:35.111 -> SPIWP:0xee
00:35:35.111 -> mode:DIO, clock div:1
00:35:35.111 -> load:0x3fce3808,len:0x44c
00:35:35.111 -> load:0x403c9700,len:0xbe4
00:35:35.111 -> load:0x403cc700,len:0x2a68
00:35:35.111 -> entry 0x403c98d4
00:35:35.243 -> 
00:35:35.309 -> assert failed: tcpip_send_msg_wait_sem IDF/components/lwip/lwip/src/api/tcpip.c:455 (Invalid mbox)
00:35:35.309 -> 
00:35:35.309 -> 
00:35:35.309 -> Backtrace: 0x40377176:0x3fceb030 0x4037c889:0x3fceb050 0x403825a1:0x3fceb070 0x420190f1:0x3fceb1a0 0x42027cd1:0x3fceb1d0 0x42027d22:0x3fceb1f0 0x42018965:0x3fceb240 0x42003e15:0x3fceb260 0x42003ea1:0x3fceb2a0 0x42002959:0x3fceb2d0 0x4200e1ba:0x3fceb2f0 0x40376ae7:0x3fceb320 0x403cd823:0x3fceb350 0x403cdae2:0x3fceb380 0x403c9929:0x3fceb4b0 0x40045c01:0x3fceb570 |<-CORRUPTED
00:35:35.340 -> 

J'étais passé à coté de quelque chose hier soir.
Pour en revenir à l'erreur du départ,

Le compilateur te disait qu'l n'y avait pas de méthode .localPort() dans la classe WifiUDP.
Tu connais déjà le n° du port local puisque c'est toi qui le fixe à l'appel de .begin(). Si tu veux le faire afficher il suffit de faire
Serial.println(localPort);

le moniteur indique 8001.
Est ce je dois mettre un autre argument ?

Bonjour,
J'ai repris une programme de base. Avec ce dernier on voit la led buit-in s'allumer et s'éteindre de plus en plus longtemps.
Si je " reset " ESP32 mais que le reseau wifi n'est pas fonctionnel la led ne clignote.
Et si je reset et que le wifi fonctionne la led clignote.
Donc c bien.

J'envoie une OSC avec le port wifi interne de mon ordi ("localhost", je crois) et j'aimerais avec
moduler le clignotement avec cette dernière.
Quelqu'un a t'il réussi en utilisant la libraire #include <OSCMessage.h>?
je pense me tromper quelques part en combinant les sketch de base

Je mets aussi le sketch qui reçoit l'OSC

Merci pour votre lumière electro magnétique !

// ESP32 UDP client sending datagrams to a UDP server

//  from https://github.com/evothings/evothings-examples/blob/master/examples/arduino-led-onoff-tcp/arduinowifi/arduinowifi/arduinowifi.ino

#include <WiFi.h>
#include <WiFiUdp.h>

WiFiUDP Udp; 

char ssid[] = "Iphone de ben"; // your network SSID (name)
char pass[] = "cacaprout";  // your network password

// network key Index number (needed only for WEP).
int keyIndex = 0;

// UDP information
//local broadcast address..
IPAddress udpServer(192, 168, 0, 255);
//IPAddress outIp(127, 0, 0, 1); //127.0.0.1
#define UDP_PORT 8002
WiFiUDP udp;

// UDP Datagram
struct __attribute__((packed)) UDPDatagram {
  uint16_t seq;                          // sequence number
  int16_t sdata;                         // 16 bit integer data
  int32_t idata;                         // 32 bit integer data
  float fdata;                           // float data
  uint16_t crc;                          // crc check
} udpDatagram = { 0, 10, 10, 3.14, 0 };  // initial values

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);
  // Wait for serial port to connect. Needed for Leonardo only
  while (!Serial)
    ;
  delay(1000);
  Serial.println();
  Serial.println("ESP32 WiFi UDP client - send UDP datagrams to server");
  WiFi.mode(WIFI_STA);  // Connect to Wifi network.
  WiFi.begin(ssid, pass);
  Serial.println("");
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.print("\nserver IP address: ");
  Serial.println(udpServer);
  udp.begin(UDP_PORT);
  Serial.print("server udp port ");
  Serial.println(UDP_PORT);
}

void loop() {
  // generate crc check - in this case a simple checksum
  udpDatagram.crc = 0;
  Serial.println("Datagram data ");
  for (int i = 0; i < sizeof(udpDatagram) - 2; i++) {
    Serial.print((uint8_t)((uint8_t *)&udpDatagram)[i], HEX);
    Serial.print(' ');
    udpDatagram.crc += ((uint8_t *)&udpDatagram)[i];
  }

  // Send Packet to UDP server
  udp.beginPacket(udpServer.toString().c_str(), UDP_PORT);
  int len = udp.write((const uint8_t *)&udpDatagram, sizeof(udpDatagram));
  udp.endPacket();
  
  Serial.print("\nudp datagram transmitted length ");
  Serial.print(len);
  Serial.print(" seq ");
  Serial.print(udpDatagram.seq++);
  Serial.print(" sdata ");
  Serial.print(udpDatagram.sdata);
  Serial.print(" idata ");
  Serial.print(udpDatagram.idata);
  Serial.print(" fdata ");
  Serial.print(udpDatagram.fdata);
  Serial.print(" crc = ");
  Serial.println(udpDatagram.crc);
  udpDatagram.crc = 0;  // update data values for tests
  udpDatagram.sdata += 10;
  udpDatagram.idata += 25;
  udpDatagram.fdata += 5.0f;

  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(udpDatagram.idata*2);                       // wait for a second
  
  digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW
  delay(udpDatagram.idata*2);                      // wait for a second
  
}

programme qui reçoit l'OSC


#include <Ethernet.h>
#include <EthernetUdp.h>
#include <SPI.h>    

#include <OSCBundle.h>
#include <OSCBoards.h>

/*
* UDPReceiveOSC
* Set a tone according to incoming OSC control
*                           Adrian Freed
*/

//UDP communication


EthernetUDP Udp;
byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // you can find this written on the board of some Arduino Ethernets or shields

//the Arduino's IP
IPAddress ip(128, 32, 122, 252);

//port numbers
const unsigned int inPort = 8888;

//converts the pin to an osc address
char * numToOSCAddress( int pin){
    static char s[10];
    int i = 9;
	
    s[i--]= '\0';
	do
    {
		s[i] = "0123456789"[pin % 10];
                --i;
                pin /= 10;
    }
    while(pin && i);
    s[i] = '/';
    return &s[i];
}

/**
 * TONE
 * 
 * square wave output "/tone"
 * 
 * format:
 * /tone/pin
 *   
 *   (digital value) (float value) = frequency in Hz
 *   (no value) disable tone
 * 
 **/

void routeTone(OSCMessage &msg, int addrOffset ){
  //iterate through all the analog pins
  for(byte pin = 0; pin < NUM_DIGITAL_PINS; pin++){
    //match against the pin number strings
    int pinMatched = msg.match(numToOSCAddress(pin), addrOffset);
    if(pinMatched){
      unsigned int frequency = 0;
      //if it has an int, then it's an integers frequency in Hz
      if (msg.isInt(0)){        
        frequency = msg.getInt(0);
      } //otherwise it's a floating point frequency in Hz
      else if(msg.isFloat(0)){
        frequency = msg.getFloat(0);
      }
      else
        noTone(pin);
      if(frequency>0)
      {
         if(msg.isInt(1))
           tone(pin, frequency, msg.getInt(1));
         else
           tone(pin, frequency);
      }
    }
  }
}

void setup() {
  //setup ethernet part
  Ethernet.begin(mac,ip);
  Udp.begin(inPort);

}
//reads and dispatches the incoming message
void loop(){ 
    OSCBundle bundleIN;
   int size;
 
   if( (size = Udp.parsePacket())>0)
   {
     while(size--)
       bundleIN.fill(Udp.read());

      if(!bundleIN.hasError())
        bundleIN.route("/tone", routeTone);
   }
}

En utilisant le deuxième programme de la libraire OSC on peut contrôler la led builtin de l'esp32

/*---------------------------------------------------------------------------------------------

  Open Sound Control (OSC) library for the ESP8266/ESP32

  Example for receiving open sound control (OSC) messages on the ESP8266/ESP32
  Send integers '0' or '1' to the address "/led" to turn on/off the built-in LED of the esp8266.

  This example code is in the public domain.

--------------------------------------------------------------------------------------------- */
#ifdef ESP8266
#include <ESP8266WiFi.h>
#else
#include <WiFi.h>
#endif
#include <WiFiUdp.h>
#include <OSCMessage.h>
#include <OSCBundle.h>
#include <OSCData.h>

char ssid[] = "Iphone de ben"; // your network SSID (name)
char pass[] = "cacaprout";  // your network password

// A UDP instance to let us send and receive packets over UDP
WiFiUDP Udp;
const IPAddress outIp(10,40,10,105);        // remote IP (not needed for receive)
const unsigned int outPort = 9999;          // remote port (not needed for receive)
const unsigned int localPort = 8000;        // local port to listen for UDP packets (here's where we send the packets)


OSCErrorCode error;
unsigned int ledState = LOW;              // LOW means led is *on*

#ifndef BUILTIN_LED
#ifdef LED_BUILTIN
#define BUILTIN_LED LED_BUILTIN
#else
#define BUILTIN_LED 13
#endif
#endif

void setup() {
  pinMode(BUILTIN_LED, OUTPUT);
  digitalWrite(BUILTIN_LED, ledState);    // turn *on* led

  Serial.begin(115200);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");

  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  Serial.println("Starting UDP");
  Udp.begin(localPort);
  Serial.print("Local port: ");
#ifdef ESP32
  Serial.println(localPort);
#else
  Serial.println(Udp.localPort());
#endif

}


void led(OSCMessage &msg) {
  ledState = msg.getFloat(0);
  digitalWrite(BUILTIN_LED, ledState);
  Serial.print("/led: ");
  Serial.println(ledState);
}

void loop() {
  OSCMessage msg;
  int size = Udp.parsePacket();

  if (size > 0) {
    while (size--) {
      msg.fill(Udp.read());
    }
    if (!msg.hasError()) {
      msg.dispatch("/led", led);
    } else {
      error = msg.getError();
      Serial.print("error: ");
      Serial.println(error);
    }
  }
}

Comme tout ceci est confus ...
Ton post #11 a été remanié 2 fois.

Version 1 : un simple commentaire
Version 2 : tu ajoutes un sketch ESP32 qui transmet des données, ce qui est en complète contradiction avec le but recherché, un ESP32 qui reçoit des données de la part d'un PC.
Version 3 : tu ajoutes un sketch ESP32 qui reçoit des données, enfin !

Et bouquet final, tu modifies le titre de ton sujet :
Recevoir données sur esp32. Problème avec 'class WiFiUDP'
devient
Recevoir données OSC sur esp32. RESOLU. voir dernier post

Alors que personne n'avait parlé d'OSC (Open Sound Control) jusqu'à présent.

Résultat : on ne sait toujours pas ce que tu veux faire exactement, transmettre des infos entre un PC et un ESP32 ou entre 2 ESP32.

Il serait bien qu'à l'avenir tu essaies d'être un peu moins brouillon dans tes demandes.

Bonsoir. Vous avez parfaitement raison, j’ai changé d’avis au cours de ma question. J’ai confondu deux manières d’envoyer des infos à l’esp32.
On m’avait que c’était compliqué d’envoyer des informations différentes à plusieurs esp32 à partir d’un ordinateur et de son routeur wifi. Par contre envoyer des donnés différentes avec un seul wifi et en utilisant plusieurs localPort comme il est possible avec les messages osc ne devrait pas porter de problème.
Quoi qu’il en soit, je vous prie de m’excuser. Bien à vous, Benjamin

Le problème n'est pas là. Corriger un post en profondeur ne peut qu'ajouter de la confusion surtout quand on a l'impression que le demandeur ne maîtrise pas du tout le sujet.
A la limite, corriger une faute d'orthographe, de grammaire, mais pas plus.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.