Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre actif
    HttpListener : comment obtenir les données "brutes" envoyées par le client dans tous les cas ?
    Bonjour à tous

    j'utilise HttpListener pour simuler un serveur HTTP sur mon PC, en local.

    Cela me permet de déboguer un Arduino qui se comporte comme client HTTP

    Concrètement :
    - Le programme dans mon Arduino se connecte au serveur HTTP créé avec HttpListener (j'indique simplement l'adresse IP de mon PC sur le réseau local)
    - Puis le programme dans mon Arduino envoit une requête HTTP
    - Enfin, sur mon PC, mon programme utilise HttpListener pour recevoir la requête et envoyer une réponse (une petite page web)

    Mon programme affiche ce qu'il a reçu et ce qu'il envoit dans des zones de texte, cela me permet de vérifier que tout est OK

    Ca fonctionne

    J'ai optimisé mon code Arduino et j'ai un soucis de mise au point : la requête n'est plus valide mais je ne comprend pas pourquoi...

    J'ai besoin de "voir" exactement les données brutes reçues par HttpListener, ça me permettrais d'en avoir le cœur net

    Or la seule chose que j'arrive à faire avec HttpListener c'est :
    - obtenir les headers (la liste de toutes les values pour chacune des keys)
    - obtenir URLRequestClient

    C'est utile mais ce sont des données "retravaillées" par HttpListener

    Ce qui est emmerdant c'est que lorsque la requête n'est pas correcte, HttpListener répond à mon Arduino une réponse avec un code d'erreur HTTP mais mon programme sur le PC ne voit rien et n'affiche rien !

    J'ai vraiment besoin de voir exactement ce que mon client web Arduino a envoyé comme données au serveur même (et surtout) quand c'est pas bon, pour que je puisse comprendre où se trouve le bug.

    Comment faire ça avec HttpListener ?

    Faut-il utiliser autre chose de plus "bas niveau" ?

    Ou sinon, avec un logiciel de monitoring réseau qui me permet de "capturer" les requêtes et les réponses ?

    Merci

    A bientôt

  2. #2
    Expert éminent sénior
    tcplistener
    http est une norme utilisant le protocole tcp
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre expérimenté
    Bonjour,

    Oui il te suffit d'utiliser Wireshark pour voir ce qui entre et sort au niveau réseau (ou un autre logiciel mais il reste une référence, tout en étant gratuit). Tu pourras alors voir en claire tes requêtes et détecter ce qui coince.

    En ce qui concerne une technologie plus bas niveau, il y a bien TcpListener mais ça serait peut-être un overkill, il me semble que rester avec le protocole HTTP soit largement suffisant pour ce que tu cherches à faire. En plus avec les headers tu peux avoir un semblant de structure de données sans te prendre la tête de ce côté là.
    Keep calm and debug it

  4. #4
    Membre actif
    Bonjour,

    Très intéressant tout ça, je vais regarder...

    Les entêtes des requêtes et des réponses HTTP sont un peu lourdes.

    Dans le projet final, il y a plusieurs Arduino Clients qui communiquent avec un Arduino Serveur
    L'Arduino Server doit pouvoir communiquer en plus avec le navigateur d'un ordinateur, le navigateur d'un smartphone et un Raspberry Pi (configuré en lecteur MP3 avec Rune Audio) sur le réseau local

    Pour la communication entre les Arduinos Clients et l'Arduino Server, je vais peut être "simplifier" les échanges et échanger des données brutes sans entêtes ni code HTML.
    Que je puisse avec mon ordinateur analyser directement ce qu'il se passe au niveau TCP/IP rendra l'analyse de ces échanges "non conventionnels" possible.

    Merci

    A bientôt

  5. #5
    Membre actif
    Bonjour,

    Wireshark est pratique, il affiche beaucoup de choses mais le choix des couleurs et la présentation permet de s'y retrouver

    Le menu Capture -> Option propose la résolution de nom (on affiche le nom des machines au lieu de leur IP) ce qui rend les échanges plus lisibles

    J'ai pu comprendre ce qu'il se passe et résoudre mon problème.

    J'ai pu découvrir que mon Arduino Client envoie sa requête de façon étrange :
    - le début avec un paquet de longueur 16
    - tout le reste sous forme de paquets avec un seul octet (lettre par lettre)
    Et ça ne vient pas de mon code, j'envoie ma requête d'un seul coup sous forme de buffer avec la fonction client.print() de la bibliothèque.
    Le rendement est médiocre, car chaque trame mesure mesure 54 à 60 octets !

    Le serveur fait en VB.NET avec HttpListener envoie toutes les données d'un coup (réponse HTTP + page web)

    Je ne sais pas si c'est normal, en tout cas entre l’envoi de la requête et la réception du dernier octet de la page web envoyé par le serveur il ne se passe que 23 millisecondes, donc ce n'est pas gênant

    A bientôt

###raw>template_hook.ano_emploi###