récupération données sur un server et modifier valeurs

bonjour tout le monde,
j’avais trouvé un truc, mais évidemment pas mis en favoris :frowning:

j’ai en tête un petit projet pour mon jardin et des luminaires pour noel :grin: .
un arduino+shield ethernet+ carte wifi+carte sd+solaire dans chaque lampe
sur un de mes servers chez moi, une page avec une carte google, les lampes dessus et le tout avec une bdd sql
via une interface, je change
le temps d’éclairage, la couleur ou la routine a utiliser (clignotement, etc…)

maintenant, le truc est qu’au lieu d’accéder à chaque arduino en webserver, je voudrais faire l’inverse.
chaque arduino va aller interroger toutes les heures mon server,
faire un wget d’un fichier php,
récupérer les données dans la bdd sql le concernant via sa mac
inscrire dans la carte sd (sécurité en cas de panne de batterie) les données (temps, routine, couleur, etc…) les données,
puis le moment venu, l’arduino va allumer les lampes en lisant les données de la carte SD et faire son boulot.

merci d’avance

bon je viens de faire une belle avancée, le code est un peu pourrit :grin: mais bon.
par contre, je n’arrive pas a virer l’entete de la réponse de mon server et ne récupérer que les données sur une seule ligne afin de parser par la suite les chiffres dans un tableau.

autre petite question, vu que je n’ai pas d’ip fixe, j’aurais aimer mettre le ndd au lieu de l’ip de mon server, mais la ca coince (toto.toto.fr au lieu de 192.168.1.2)
j’ai modifié volontairement, l’ip public par l’ip interne :wink:

voici le code de mon script

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 3 };
byte server[] = { 192,168,1,2 }; // zoomkat

Client client(server, 80);
File myFile;

void setup()
{
    pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
   Serial.println("initialization done.");
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  Serial.println("starting simple arduino client test");
  Serial.println();

  delay(1000);

  Serial.println("connecting...");

  if (client.connect()) {
    Serial.println("connected");
    client.println("GET /~pilote/index.php HTTP/1.0\n");
    client.println();
  } else {
    Serial.println("connection failed");
  }
}

void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
    
    myFile = SD.open("test.txt", FILE_WRITE);
    if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println(c);
	// close the file:
    myFile.close();
    Serial.println("done.");
    }
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    Serial.println("==================================");
    Serial.println("");
    client.stop();
    for(;;);
  }
}

et voila ce que j’ai dans mon fichier sur la SD, je l’ais raccourcit pour être plus digeste

H

T

T

P

/

1

.

1

 

2

0

0

 

O

K







D

a

t

e

:

 

M

o

n



1

;

2

;

3

;

4

;

5

;

6

;

7

;

8

;

9

;

1

0

je me réponds à moi même, il suffit de retirer

HTTP/1.0

je récupère donc bien les données du fichier sur mon server. mais toujours caractères par caractères. je voudrais avoir la ligne complète "1;2;3;4;5;6;7;8;9;10" au lieu de

1
;
2
;
3
etc......

EDIT, trouvé :grin: en fait au lieu de mettre

    myFile.println(c);

il suffit de mettre

    myFile.print(c);

reste à mettre ca dans un tableau pour modifier les valeurs de mes allumages et intensités de lumières. encore quelques heures a me prendre la tête, à moins que quelqu'un ait une solution ;)

voila, le truc est terminé :slight_smile:
récupération des données sur la carte sd et passage en variables.
il doit y avoir plus simple surement, mais bon, pour ceux que ca intéresse, voici le bout de code :wink:

int ar_strlen(const char *s)
{
  const char *p = s;

  while (*p != '\0')
    p++;
  return (size_t)(p - s);
}

char *ar_strchr(const char *s, int c)
{
  while (*s != '\0' && *s != (char)c)
    s++;
  return ( (*s == c) ? (char *) s : NULL );
}

char *ar_strstr(const char *haystack, const char *needle)
{
  size_t needlelen;

  if (*needle == '\0')
    return (char *) haystack;
  needlelen = ar_strlen(needle);
  for (; (haystack = ar_strchr(haystack, *needle)) != NULL; haystack++)
    if (ar_strncmp(haystack, needle, needlelen) == 0)
      return (char *) haystack;
  return NULL;
}

int ar_strncmp(const char *s1, const char *s2, size_t n)
{
  unsigned char uc1, uc2;

  if (n == 0)
    return 0;
  while (n-- > 0 && *s1 == *s2) {
    if (n == 0 || *s1 == '\0')
      return 0;
    s1++;
    s2++;
  }
  uc1 = (*(unsigned char *) s1);
  uc2 = (*(unsigned char *) s2);
  return ((uc1 < uc2) ? -1 : (uc1 > uc2));
}

int getNbr(char *line)
{
  int nbr;

  nbr = 0;
  while (*line >= '0' && *line <= '9') {
    nbr *= 10;
    nbr += *line - '0';
    line++;
  }
  return (nbr);
}

int getConf(char *val)
{

  File myFile;
  char line[100];
  char i;

  i = 0;
  myFile = SD.open("test.txt");
  if (myFile > 0) {
    while ((line[i] = myFile.read()) > 0) {
      if (line[i] == '\n') {
        line[i] = '\0';
        i = 0;
        if (ar_strstr(line, val) && line[ar_strlen(val)] == '=') {
          myFile.close();
          return (getNbr(line + ar_strlen(val) + 1));
        }
      }
      else {
        ++i;
      }
    }
  }

  return 0;
}

void recup()
{
  Serial.print("Valeur temps : ");
  Serial.print(getConf("temps"));
  Serial.println("\n--------");
  Serial.print("Valeur lumiere : ");
  Serial.print(getConf("lumiere"));
  Serial.println("\n--------");
  Serial.print("Valeur red : ");
  Serial.print(getConf("red"));
  Serial.println("\n--------");
  Serial.print("Valeur green : ");
  Serial.print(getConf("green"));
  Serial.println("\n--------");
  Serial.print("Valeur bleu : ");
  Serial.print(getConf("bleu"));
  Serial.println("\n--------");
  i=10;
}

petite question à laquelle je ne trouve pas de réponse.

comment faire pour mettre un dyndns à la place de l'ip dans byte server[] = {xxxxxx};

car sans ip fixe, ca risque de poser problème

merci d'avance

Je ne suis pas sûr que ce soit possible.

DynDNS nécessite une requête HTTP puis login et mot de passe.

Il faut donc préalablement : créer un client web Arduino faire un http post sur l'IP fixe de DynDNS car Arduino n'a pas de résolution de nom analyser le dialogue pour pouvoir envoyer le login et le password puis récupérer l'IP de votre serveur.

Je ne crois pas que ce soit si facile.

Bon travail.

merci mais c'est pas ce que je veux faire.

je veux interroger un serveur, donc, login et mdp, pas besoin. je voudrais remplacer

byte server[] = {168.256.21.199} (ip au hasard ;) ) par byte server[] = {monserver.com}

mais s'il n'y a pas de résolution de ndd, ca risque d'être mal partit :(

infobarquee: merci mais c'est pas ce que je veux faire.

je veux interroger un serveur, donc, login et mdp, pas besoin. je voudrais remplacer

byte server[] = {168.256.21.199} (ip au hasard ;) ) par byte server[] = {monserver.com}

mais s'il n'y a pas de résolution de ndd, ca risque d'être mal partit :(

bonjour peut être regarder ici du coté DNS ? http://gkaindl.com/software/arduino-ethernet

merci pour le lien, c'est ce que je recherche en effet. je viens de tester les exemples et pas concluant du tout ou j'ai zappé un truc. avec les dns de google, aucune réponse, avec ceux d'opendns ca me renvoie toujours la meme ip chaque fois que je rentre google.com toto.fr ou tout autre ndd.

Bonjour à tous, La solution quand on veut associer une adresse ip dynamiquement allouée avec un nom de domaine est de passer par dyndns toutefois le nom de la machine sera toto.dyndns.org. Pour pouvoir faire cette association il faut un compte dyndns donc login password. Si vous regardez la config d'une livebox (exemple au hasard) c'est comme ça que ça se passe. à intervalle régulier le client dyndns contacte le serveur en lui transmettant son ip, si celle ci a changé dyndns fait la màj dans sa base. Mais le client a bien besoin d'un login et d'un password pour accéder au serveur dyndns. Je ne pense pas qu'il y ait d'autre solution.

Bon travail à tous.

En effet c'est ton routeur qui gère le client DynDns (s'il en est capable mais bon au jours d'aujoud'hui ...), niveau config arduino il suffit de spécifié son adresse locale dans ton réseau le routeur ce chargera de faire la redirection suivant le port donné (80 par défaut pour http).

je pense que l'on se comprend mal. j'ai cité dyndns comme exemple à la volée, mais ca peut être un .com .fr .org .net etc...

ce que je veux en fait c'est que l'arduino sur un site X à tataouine trifouillis les oies interroge mes servers sur le site Y à pequin des canards :) . le problème est que le site Y n'a pas une ip fixe, il dispose d'un ndd déjà en .fr et ma lb est aussi configurée avec un dyndns en plus pour un autre server (5 servers à la maison pour mon taf)

donc il me faut une résolution d'ip sur le ndd pour accéder au site Y, puisque l'arduino ne peut pas accéder à un site via son ndd, mais que par son ip. j'ai donc un vhost pour que l'arduino accède à la conf qu'il doit DL sur sa SD. tant que l'ip ne change pas, ca va, mais ca ne dure pas éternellement.

et prendre un de mes dédiés avec une ip fixe juste pour ca, c'est embétant.

avec la solution donnée plus haut pour résoudre un ndd, ca me donne toujours la même ip qui n'a rien a voir avec mes servers ou google.

infobarquee: avec la solution donnée plus haut pour résoudre un ndd, ca me donne toujours la même ip qui n'a rien a voir avec mes servers ou google.

bonjour Vous avez essayé en mettant l'adresse IP de votre box comme IP de serveur DNS. j'avais eu (pas avec arduino) un probleme en mettant les adresses des serveur DNS d'orange et ça plantait. en mettant (dans mon cas) l'adresse IP de ma box 192.168.1.1 ça passait.

j'ai voulu tester le lien fourni, mais ça plante à la compil. dezippé dans C:\arduino\libraries

testé C:\arduino\libraries\ArduinoEthernet\EthernetDNS\examples\PollingDNS\PollingDNS.pde

EthernetDNS was not declared in this scope

Ah oki c'est le problème inverse. Note pour plus tard: lire le topic avant de répondre c'est pas plus mal =( :grin:.

testé C:\arduino\libraries\ArduinoEthernet\EthernetDNS\examples\PollingDNS\PollingDNS.pde

 EthernetDNS was not declared in this scope

pour résoudre le pb que j'ai eu aussi, il suffit de remonter les rep directement dans la lbrairies ;) ca roule tout seul après.

 C:\arduino\libraries\EthernetDNS\examples\PollingDNS\PollingDNS.pde

oui, j'ai tout essayé 192.168.1.1, 8.8.4.4,8.8.8.8,208.67.220.220.208.67.222.222 (en mettant des virgules au lieu des points)

pas de blem osaka :) on est vendredi, donc normal MDR note : lire le calendrier avant de répondre

infobarquee: ``` testé C:\arduino\libraries\ArduinoEthernet\EthernetDNS\examples\PollingDNS\PollingDNS.pde

EthernetDNS was not declared in this scope



pour résoudre le pb que j'ai eu aussi, il suffit de remonter les rep directement dans la lbrairies ;) ca roule tout seul après.


C:\arduino\libraries\EthernetDNS\examples\PollingDNS\PollingDNS.pde ```

ok fait et ça roule serveur DNS en 192.168.1.1

IP arduino 192.168.1.67

Enter a host name via the Arduino Serial Monitor to have it resolved. Resolving www.darty.com...... The IP address is 195.59.55.154. Resolving www.fnac.fr...... The IP address is 217.174.207.108. Resolving www.ldlc.fr....... The IP address is 91.211.165.65.

complement testé avec IP DNS orange 80.10.246.1 Enter a host name via the Arduino Serial Monitor to have it resolved. Resolving www.fnac.fr.... The IP address is 217.174.207.108. Resolving www.darty.fr.... The IP address is 195.59.44.19. Resolving www.ldlc.fr.... The IP address is 91.211.165.65.

tu me trou le .......... ip arduino 192.168.1.3 dns 192.168.1.1

Enter a host name via the Arduino Serial Monitor to have it resolved.

Resolving www.darty.com

......

Does not exist.

Resolving fnac.fr

......

Does not exist.

Resolving www.fnac.fr

......

Does not exist.

ip arduino 192.168.1.3 dns 80.10.246.1

Resolving www.fnac.fr

......

Does not exist.

Resolving www.darty.fr

......

Does not exist.

ip arduino 192.168.1.3 dns 208.67.222.222

Resolving www.darty.fr

.......

The IP address is 67.215.65.132.

Resolving www.fnac.fr

......

The IP address is 67.215.65.132.

infobarquee: ip arduino 192.168.1.3 dns 208.67.222.222

testé à l'instant avec 208.67.222.222

Enter a host name via the Arduino Serial Monitor to have it resolved. Resolving www.arduino.cc..... The IP address is 64.131.82.241. Resolving snootlab.com....... The IP address is 87.98.186.220. Resolving www.lextronic.fr...... The IP address is 213.246.42.104.