Pages: [1]   Go Down
Author Topic: Aduino Ethernet Qt application  (Read 811 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ;-)
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Si le but c'est de faire un système client/serveur il suffit de chercher sur google, ça ne manque pas smiley-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.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-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 !!!)
Code:
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
Code:
.
.
.
    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... ?§?

Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@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 smiley-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 smiley-mr-green
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quand j'avais écrit :
Quote
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".

Quote
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.

Quote
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 :
Quote
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):
Code:
0x00 0x0A 0x00 0x00 0x00 0x08 0x00 0x74 0x00 0x6F 0x00 0x74 0x00 0x6F
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 108
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: