Télémétrie sur véhicule, problème de transmission sans fil (déconnexion serveur)

Bonjour,

Merci d'avance à tous ceux qui pourront m'aider à résoudre ce problème.

Contexte du projet :

Le projet consiste en la création d’un module permettant de réaliser de la télémétrie en temps réels sur un véhicule en mouvement (jusqu’à 50km/h). Une visualisation en temps réels est nécessaire au stand qui peut se trouver jusqu’à 2km du véhicule.

Matériel utilisé :

Arduino Mega

Shield GSM/GPRS 2 Arduino

Shield GPS

Travail réalisé :

Une carte déjà créée permet de récupérer les données du véhicule et les envoie à notre module grâce à une liaison série. Un shield GPS est ajouté en plus pour obtenir des données de localisation. Toutes ces données sont donc récupérées et doivent être envoyées à un serveur. Nous utilisons des requêtes http pour envoyer nos données grâce à dweet.io et nous les affichons grâce au site freeboard.io. Ce site permet d’afficher les données envoyées grâce à des requêtes dweet.io. Nous avons déjà réussis à envoyer des données aléatoires pour essayer.

Problèmes rencontrés :

Nous avons quelques problèmes pour répondre à notre problématique de départ qui est de pouvoir visualiser toutes les données du véhicule en temps réels à une longue distance.

Le code sera fourni plus bas dans ce message.

Nous avons réussis à envoyer une requête mais nous avons besoin d’envoyer des requêtes toutes les x secondes (toutes les 100ms si possible). Or lors de l’envoi d’une requête nous sommes déconnectés et nous devons alors nous reconnecter pour en envoyer une nouvelle.

 void initGSM()
{
  Serial.println("---- Initialisation du GSM ----");
  // connection state
  boolean notConnected = true;

  // After starting the modem with GSM.begin()
  // attach the shield to the GPRS network with the APN, login and password
  while (notConnected) {
    Serial.println("Connexion au réseau GSM");
    if (gsmAccess.begin(PINNUMBER) == GSM_READY)
    {
      Serial.println("Connecté au réseau GSM");
      Serial.println("Connexion au réseau GPRS");
      if (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) == GPRS_READY)
      {
        Serial.println("Connecté au réseau GPRS");
        notConnected = false;
      }
      else
      {
        Serial.println("Problème de connexion GPRS");
      }
    }
    else
    {
      Serial.println("Problème de connexion GSM");
      delay(1000);
    }
  }
}

int connexionServeur(char s[], int p)
{
  if (client.connect(s, p))
  {
    Serial.println("GSM : Connecté au serveur");
    return 0;
  }
  else
  {
    Serial.println("GSM : Connexion au serveur échouée");
    return -1;
  }
}

//void envoieDonneesGSM(String donnees)
//{
//  // Make a HTTP request:
//  client.print("GET " + path + imei + donnees);
//  client.println(" HTTP/1.1");
//
//  client.print("Host: dweet.io");
//  //client.println(server);
//  //client.println("Connection: close");
//  client.println("");
//  delay(100);
//  if (client.available())
//  {
//    Serial.print(client.read());
//  }
//  Serial.println("");
//
//}
//



}

Le code est normalement dé-commenter bien sur :slight_smile: De plus, nous avons essayer de mettre en commentaire la ligne comprenant le connexion : close sans aucun succès

Merci d'avance, dans l'attente de vos réponses

le principe général de HTTP c'est d'envoyer une requête, récupérer la réponse et terminer la connexion.
c'est votreclient.println("Connection: close");qui dit cela aussi

Si vous voulez rester connecté il faut regarder du côté de keep-alive mais c'est du non standard et comme vous ne maîtrisez pas le serveur à mon avis ce n'est pas jouable....

--> il me semble que vous avez besoin d'un mode connecté et de contrôler le serveur vous même - ou au moins un serveur intermédiaire qui écoute tout ce qui est dit et remet en forme pour envoyer ça vers freeboard.io si vous ne voulez pas gérer vous même la couche de présentation des données

HTTP pourquoi pas, mais vous pouvez aussi faire directement un flux UDP vers votre serveur central

bonjour,
protection contre le flood, donc normal.
fail2ban entre en action en plus d'un firewall pour éviter les DDOS.
comme indiqué, il faut un server perso pour ca en paramétrant apache2, le nb de connexion max, etc...

De plus, une connexion par gsm prend plus d'une seconde entre la connexion au server, la réponse et l'envoi des données.

Merci beaucoup pour vos réponses.

Nous ne voulons pas faire notre propre serveur pour éviter l'affichage graphique qui nous prendrait trop de temps.

Voici ce que j'ai trouver sur le site dweet.io

Real-time Streams
You can also create a real-time subscription to dweets using a "chunked" HTTP response.
Just make a call to
https://dweet.io/listen/for/dweets/from/my-thing-name
(Note, this won't work in a standard browser)

From a unix command line you can run the following command to see it working:
curl -i https://dweet.io/listen/for/dweets/from/my-thing-name

The server will keep the connection alive and send you dweets as they arrive, like:
{"thing":"my-thing-name","created":"2014-02-17T01:10:21.901Z","content":{"foo":"bar"}}
If you don't know what a chunked HTTP response is, it might be easier to use one of our client libraries below.

Il semble donc que l'on puisse rester connecter au serveur. Le keep-alive est donc peut être jouable.

Voici un projet sur le même principe.