Requêtes HTTP (GET / POST) impossibles ? (Ethernet)

Bonjour,

Voila la première partie :

#include <string.h>
#include <stdio.h>
#include <Streaming.h>       /* Super pratique !! */
#include <avr/pgmspace.h>

#include <UIPEthernet.h>

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

#include <Wire.h>
#include <DS3231.h>
DS3231 clock;
RTCDateTime dt;

#define VCC_PIN 5 // source 5V up to 40mA
#define GND_PIN 2 // ground up to 40mA
#define DATA_PIN 3 // data 433 In
#define SIREN_PIN A1 // Relay of 12V sirens
#define GARAGE_PIN A2 // Relay of Garage trigger
#define THIRD_RELAY_PIN A3 // Relay of... nothing yet

#define Remote_Cmd 5529424
#define Door_Cuisine 1392005
#define Win_Bureau 1197077
#define Door_Chaufferie 1397855
#define Win_Abri_Bois 1797842
#define PIR_Garage A0
#define PIR_Abri_Bois A1

#define CA_Cuisine 0x0001        /* Code alarme */
#define CA_WBureau 0x0002
#define CA_Chaufferie 0x0004
#define CA_Garage 0x0100
#define CA_AbrisBois 0x0200

/* Pour économiser la RAM, on met toutes ces chaînes en mémoire
 * programme
 * ???????? A vous de mettre les bonnes valeurs ????????? */
 
P(PIdDoorCuisine) = "v*/*/*/*/*/*//*//*/";
P(PIdWinBureau) = "v*/*/*/*/*/*//*//*/";
P(PIdDoorChaufferie) = "v*/*/*/*/*/*//*//*/";
P(PIdWinAbriBois) = "v*/*/*/*/*/*//*//*/";
P(PIdPIRGarage) = "v*/*/*/*/*/*//*//*/";

static byte mymac[] = {0x24,0x99,0x42,0xAD,0x30,0x32};  
// Be sure this address is unique in your network

#define DEBUG true  /* Switch de compilation, à commenter
                      * dans la version définitive */

/* Le client pour la pushingbox */
EthernetClient clientPB;

/* La requête à envoyer :
 *
 * GET /pushingbox?devid=<Id> HTTP/1.1
 * Host: api.pushingbox.com
 * Connection: close
 * <ligne vide>
 *
 * La ligne 1 est la plus longue.
 * Pour économiser la mémoire, on va la ligne 1 puis les autres
 * ensemble.
 * On va dimensionner la ligne à 72, à voir en fonction de la
 * longueur de vos identifiants  ??? à vérifier ???
 *
 * On range tous les éléments de ligne en mémoire programme
 * pour économiser la RAM.
 */

P(PLi_1a) = "GET /pushingbox?devid=";
P(PLi_1b) = " HTTP/1.1\r\n";
P(PL2a) =  "Host: ";
P(PWebSite) = "api.pushingbox.com";
P(PL2b) =  "\r\nConnection: close\r\n\r\n";

#define CLgLine 72

/*************************** Routines *********************************/
void SentPBRqt(uint16_t MAlarm)
  {
  char Line[CLgLine];
  
  /* Préparation ligne 1 */
  strcpy_P(Line, PLi_1a);
  
  /* Selon valeur du masque d'alarme, ajout de l'identifiant */
  switch (MAlarm)
    {
    case CA_Cuisine:
      strcat_P(Line, PIdDoorCuisine);
      break;

    case CA_WBureau:
      strcat_P(Line, PIdWinBureau);
      break;

    case CA_Chaufferie:
      strcat_P(Line, PIdDoorChaufferie);
      break;
      
    case CA_Garage:
      strcat_P(Line, PIdPIRGarage);
      break;

    case CA_AbrisBois:
      strcat_P(Line, PIdWinAbriBois);
      break;
    
    default:
      break;  /* Sécurité, on ne fait rien */
    }

  strcat_P(Line, PL1b);  /* Fin de la ligne 1 */

  #ifdef DEBUG
  Serial << F("Ligne 1 = ") << Line << endl;  /* Vérification */
  #endif
  
  clientPB.write(Line, strlen(Line));
  
  /* Lignes suivantes */
  strcpy_P(Line, PL2a);
  strcat_P(Line, PWebSite);
  strcat_P(Line, PL2b);
  
  #ifdef DEBUG
  Serial << F("Ligne 2 = ") << Line << endl;  /* Vérification */
  #endif
  
  clientPB.write(Line, strlen(Line));

  }

void GetPBReply()
  {  /* Réponse du serveur sur le port série pour débug */
  char c;
  
  #ifdefDEBUG
  Serial << endl;
  #endif
          
  if (clientPB.available())
    {
    c = clientPB.read();
    #ifdef DEBUG
    Serial << c ;
    #endif
    }

  #ifdefDEBUG
  Serial << endl;
  #endif
  }


/****************************** Setup *********************************/
void setup()
{
  Serial.begin(9600);
 
  pinMode(SIREN_PIN, OUTPUT);
  pinMode(GARAGE_PIN, OUTPUT);
  pinMode(THIRD_RELAY_PIN, OUTPUT);
  digitalWrite(SIREN_PIN, HIGH);
  digitalWrite(GARAGE_PIN, HIGH);
  digitalWrite(THIRD_RELAY_PIN, HIGH);

  pinMode(DATA_PIN, INPUT);
  pinMode(GND_PIN, OUTPUT);
  pinMode(VCC_PIN, OUTPUT);
  digitalWrite(GND_PIN, LOW);
  digitalWrite(VCC_PIN, HIGH);
  

  /* Etablissement connexion Ethernet */ 
  while (Ethernet.begin(mymac) == 0)
    {  /* Echec de connexion Ethernet */
    #ifdef DEBUG
    Serial << F("Echec connexion Ethernet") << endl;
    #endif
    delay(5000);  /* Attend 5s et ré-essaie jusqu'à ce que la 
                   * connexion s'établisse */
    }
  

  mySwitch.enableReceive(1);  // Receiver on interrupt 1 => that is pin D3


  }

/***************************** Loop ***********************************/
void loop()
  {
  uint16_t Alarm = 0;
  uint16_t m = 1;     /* Masque pour explorer les alarmes */
  uint16_t r,         /* Résultat de l'exploration */
  uint8_t i;
  boolean Transmit = false;
  char Site[20];  /* Tampon pour le site - ajuster si nécessaire */
 
  if (mySwitch.available())
    {
    switch (mySwitch.getReceivedValue())
      {
      case Door_Cuisine:
        Alarm = CA_Cuisine;
        break;
      
      case Win_Bureau:
        Alarm = CA_WBureau;
        break;

      case Door_Chaufferie:
        Alarm = CA_Chaufferie;
        break;
    
      default:
        break;
      }
    
    mySwitch.resetAvailable();
    }

  if ( analogRead(A0) > 500 ) /* Je ne comprends pas bien pourquoi
                               * vous utilisez une entrée analogique */
    {
    Alarm |= CA_Garage;  /* On rajoute cette alarme si nécessaire */
    }

  if ( analogRead(A1) > 500 )
    {
    Alarm |= CA_AbrisBois;
    }
    
  if (Alarm)
    {  /* Il y a au moins une alarme */
    
    /* Connexion au serveur PB */
    strcpy_P(Site, WebSite);
    while (!Transmit)
      {
      if (clientPB.connect(Site, 80))
        {
        Transmit = true;
        #ifdef DEBUG
        Serial << F("Connecté à la PB") << endl;
        #endif
        }
        else
        {
        #ifdef DEBUG
        Serial << F("Erreur connexion PB") << endl;   
        #endif
        delay(5000);  /* On attend 5s avant de recommencer */
        }
      }
      
    }  /* Fin if alarme */
    
  if (Transmit)
    {   /* La connexion est établie, on peut transmettre */
    for (i = 0; i < 15 ; i++)  /* On explore le masque des alarmes
                                  * et on transmet à la PB */
      {
      r = Alarm & m;
      if (r)
        { /* Il y a une alarme sur ce canal */
        SentPBRqt(r) ;
        /* Réception de la réponse */

        GetPBReply();  /* Récupère la réponse de la PB */
                
        delay(1000);  /* ???? A ajuster ????*/
        }
        
      m = m << 1;   /* Canal d'alarme suivant */
      }
      
    /* Déconnexion */
    clientPB.stop();   
      
    }    /* Fin if transmit */
  }      /* Fin loop */

/***************************** Fin ************************************/

Comme vous êtes sur un Uno, j'ai un peu optimisé en utilisant la mémoire PROGMEM à chaque fois que possible. Il vous reste aussi à rajouter vos identifiants. S'ils sont longs, il faudra augmenter en conséquence la taille de la ligne avec la constante CLgLine.

J'utilise aussi la classe Streaming qui est super pratique pour le debug. Vous la trouverez sur le site Arduino (et en PJ). Vous dézippez et copiez le répertoire Streaming et ce qu'il contient dans le votre répertoire "libraries" (où vous avez déjà placé les autres bibliothèques).

Comme je n'ai pas compilé le code, il y a sans doute des erreurs. Si vous n'y arrivez pas, je vous aiderai.

Enfin, le code n'est pas prêt pour une utilisation opérationnelle : s'il n'arrive pas à établir la connexion, il réessaye jusqu'à ce qu'il y arrive, mais il ne fait rien d'autre en attendant. Comme je vous l'ai dit, il s'agit dans cette étape de voir si ça marche. On verra ensuite pour le rendre plus opérationnel.

Bonne bidouille et tenez moi au courant,

MicroQuettas.

Streaming.zip (2.29 KB)