Aduino Ethernet Qt application

Bonjour à tous,

Après avoir passé quelque temps à chercher sur la toile en vain, je me suis dis que j'allais vous embêter un peu.

J'ai l'intention de réaliser une appli C++/Qt qui communique avec un Arduino via un Ethernet shield, une structure Client/Serveur où l'appli serait un client et l'aduino le serveur.

Je voulais savoir si quelqu'un avait déjà réaliser un projet de ce style et si il pouvait y avoir quelques exemples quelque par.

Merci d'avance à la communauté.
Romain

Bonjour,

Je ne vois pas trop l’intérêt de passer par une appli C++.
L'idéal pour les systèmes équipés d'interface webserver c'est de les piloter simplement à partir d'un navigateur ! Non ?

P.S : je crois qu'on se connait :wink:

Bonjour,

Si le but c'est de faire un système client/serveur il suffit de chercher sur google, ça ne manque pas :wink:
(peut être pas avec Qt + QtNetwork mais avec du python, VB.net, ... ça pas de problème)

Pour la partie communication arduino <-> QtNetwork regarde dans la partie "tutoriel et cours" du forum, Barbudor a réalisé un excellent tutoriel sur les protocoles de communications et leur design/implémentation.

Bonjour à tous,

@LouisR : il est vrai que la mis en oeuvre d'un solution de pilotage par navigateur est simple avec ce type de système ! Je ne pourrais malheureusement pas vous expliquer ici le pourquoi. Le fait est que ça m'est imposé (ce n'est pas pour me déplaire car c'était un peu mon idée à la base ^^).

PS : Je pense aussi vous connaître :wink:

@skywodd : je vais regarder ce que tu recommandes. Après j'ai pas mal avancé sur la question et j'arrive à me connecter et à recevoir un message (côté serveur). Le seul hic, c'est que ce message est "formaté" par le protocole (je peux me tromper... ça ne serait pas la première dois Oo)

Un exemple pour comprendre :

Code arduino (directement issu du blog formidable de Skywodd !!!)

void loop()
{
  // Attente de la connexion d'un client
  EthernetClient client = server.available();
  if (client && client.connected()) 
  {
    // si le client nous envoie quelque chose
    if (client.available() > 0) 
    {
      char c = client.read();
      Serial.println(c, DEC);
    }
  }
}

et le code cpp

.
.
.
    QByteArray paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);
    QString messageAEnvoyer = message->text();

    out << (quint16) 0;
    out << messageAEnvoyer;
    out.device()->seek(0);
    out << (quint16) (paquet.size() - sizeof(quint16));

    socket->write(paquet);
.
.
.

et j'obtiens en envoyant : "toto"
----> "0 12 0 0 0 8 0 116 0 111 0 116 111"

alors en observant un peu les choses, on s’aperçoit que ça marche plutôt bien ... par contre ... d'où viennent ces 0... ?§?

rhum187:
@skywodd : je vais regarder ce que tu recommandes. Après j'ai pas mal avancé sur la question et j'arrive à me connecter et à recevoir un message (côté serveur). Le seul hic, c'est que ce message est "formaté" par le protocole (je peux me tromper... ça ne serait pas la première dois Oo)
(...)
et j'obtiens en envoyant : "toto"
----> "0 12 0 0 0 8 0 116 0 111 0 116 111"

alors en observant un peu les choses, on s’aperçoit que ça marche plutôt bien ... par contre ... d'où viennent ces 0... ?§?

Si on avait le contenu de "messageAEnvoyer" et le résultat coté arduino ce serait plus simple :wink:
Ne pas oublier que tu transmet en binaire mais que tu affiches en décimal côté arduino.

Dans ton cas tu envois des quint16 = 2 octets avec l'endianness dépendant de ton ordinateur.
Travaille en ASCII ou en binaire (mais sans DataStream Qt, avec un bon vieux buffer de "unsigned char" pour gérer tout même l'endianness) mais pas les deux :grin:

Quand j'avais écrit :

et j'obtiens en envoyant : "toto"
----> "0 12 0 0 0 8 0 116 0 111 0 116 111"

je voulais dire que la chaîne de caractère "toto" était directement rentrée dans le champs ayant pour nom "message", donc récupérée par la méthode text() et mémorisée dans la variable "messageAEnvoyer".

Dans ton cas tu envois des quint16 = 2 octets avec l'endianness...

Pas seulement, j'envoie un flux de donnée comprenant un entier non signé sur 16 bits (soit de 0 à 65535), indicateur de la taille de la chaîne de caractère qui suit.

avec l'endianness dépendant de ton ordinateur

Pas vraiment, on fait ce que l'on veut avec l'objet QDataStream : extrait de la doc :

enum ByteOrder { BigEndian, LittleEndian }

Pour ce qui est du résultat c'est juste un affichage, j'aurais du écrire en hexa (car les petits carrés... je comprends pas):

0x00 0x0A 0x00 0x00 0x00 0x08 0x00 0x74 0x00 0x6F 0x00 0x74 0x00 0x6F

J'ai résolu mon problème en ne passant qu'un octet à la fois ! Merci