Connexion Ethernet TCP avec Arduino

Connexion Ethernet TCP avec Arduino

Connexion Ethernet TCP avec Arduino

D'un point de vue logiciel, établir une connexion Ethernet avec Arduino c'est très simple. Pour ce faire, utilisez le Bibliothèque Ethernet. Cette bibliothèque est conçue pour un Bouclier Ethernet qui est basé sur l'intégration W5100, mais il existe d'autres cartes ou modules différents et/ou qui en utilisent d'autres intégrés, comme le ENC28J60. Pour simplifier son utilisation et augmenter la compatibilité, d'autres bibliothèques utilisent (presque) la même chose API que Bibliothèque Ethernet, vous n'aurez qu'à remplacer la bibliothèque alternative par celle d'origine ou à l'inclure (lorsque le nom est différent) à sa place même si des fonctions identiques (ou très similaires) sont utilisées dans le code. Dans mon cas, j'utilise le Bibliothèque UIP Ethernet de Norbert Truchsess en suivant le même processus que je vais décrire dans ce texte.

Module ENC28J60 à utiliser avec la bibliothèque UIPEthernet

1. Définir la connexion Ethernet

Si vous allez adopter le rôle de client tel que serveur, il faut tout d'abord définir la connexion avec la fonction commencer () qui ne peut être passé en paramètre que le Adresse MAC et j'attends un serveur DHCP sur le réseau, attribuez un Adresse IP et le reste de la configuration ou il est également possible d'indiquer (optionnellement) plus de paramètres jusqu'à ce que la configuration complète soit définie :

  1. Adresse MAC (ce qui a déjà été évoqué)
  2. Adresse IP du blindage ou du module
  3. Adresse IP du serveur DNS (un seul serveur)
  4. Adresse IP du passerelle
  5. Masque net

Il est conseillé d'indiquer tous les paramètres, sauf si leur déduction est habituelle, pour éviter que la configuration ne soit pas correcte (par exemple, que la passerelle ne soit pas la première adresse du réseau).

D'après ce qui précède, il semble clair que les données représentant les adresses IP doivent être utilisées assez souvent, c'est pourquoi la bibliothèque inclut la classe Adresse IP à partir duquel instancier les objets d’adresse IP. Les paramètres qui le définissent sont les quatre octets d'une adresse IPV4

La Adresse MAC Il est défini pour cette bibliothèque comme un tableau de 6 octets. L'adresse MAC est (censée être) un identifiant unique dans lequel les premiers octets indiquent le fabricant et le modèle et les derniers indiquent l'appareil spécifique. L'intégré ENC28J60 n'inclut pas d'adresse MAC, sauf si vous choisissez d'acheter également un Adresse MAC intégrée de Microchip (ou un bloc entier OUI d'adresses à IEEE si le nombre d'appareils est suffisamment important pour que cela en vaille la peine). Lorsque vous n'avez pas d'adresse MAC, vous pouvez en inventer une, en veillant à ce qu'elle n'entre pas en conflit avec d'autres sur le réseau où se trouve l'appareil.

Si la configuration est faite avec un serveur DHCP au lieu de "à la main", la fonction adresse IP locale() Il est utile de consulter l'adresse que le serveur a attribuée au module. Pour renouveler l'adresse attribuée (si le délai correspondant est expiré), le Bibliothèque Ethernet assure la fonction maintenir() qui informera également en renvoyant un code qui correspond à l'état du renouvellement :

  1. L'opération n'a eu aucun effet
  2. Erreur lors du renouvellement de l'adresse IP
    L'utilisation de l'adresse IP attribuée sur le même serveur n'a pas pu être étendue
  3. Adresse IP renouvelée avec succès
  4. Échec de la réassociation de l'adresse IP
    L'utilisation de l'adresse IP attribuée n'a pu être étendue sur aucun serveur
  5. Adresse IP réattribuée avec succès

Avec les informations vues jusqu'à présent, vous pouvez écrire un exemple de la façon dont une connexion Ethernet serait initiée en configurant l'adresse IP via un serveur DHCP sur le réseau. L'exemple de code suivant tente de renouveler l'adresse IP à intervalles réguliers et rapporte le résultat.

L'exemple ci-dessous attribue l'adresse IP et le reste de la configuration manuellement à l'aide d'objets Adresse IP pour le rendre plus confortable à lire et (dans le cas d'un code plus complexe) pour éviter les erreurs qui pourraient survenir si l'adresse était (mal) écrite à chaque utilisation.

2. Démarrez la connexion en mode client ou serveur

Lors de l'initiation d'une connexion en mode serveur, c'est le système microcontrôlé en cours de développement qui écoute les requêtes des autres systèmes. Pour démarrer la connexion en tant que serveur, utilisez ServeurEthernet() et le port sur lequel le serveur va écouter est indiqué en paramètre. ServeurEthernet() est le constructeur de la classe Server, qui prend en charge toutes les opérations Ethernet en tant que serveur. Bien que le plus orthodoxe soit d'appeler le constructeur ServeurEthernet(), il n'est pas rare de trouver quelques exemples utilisant directement la classe Server ou des bibliothèques alternatives pour la connexion Ethernet qui choisissent d'utiliser ce système d'instanciation.

La connexion en tant que client est celle qui fait des requêtes au système serveur, qui les attend et y répond en conséquence. Pour établir une connexion en tant que client, utilisez ClientEthernet() quel est le constructeur de la classe Client origine de toutes les opérations Ethernet en tant que client.

Contrairement à ce qui se passe avec le mode serveur, qui est supposé fonctionner à partir du moment où la classe est instanciée (même si elle ne répondra aux clients que si c'est réellement le cas), vous devez vérifier que la connexion client est prête avant de l'utiliser. L'objet client créé lors de l'établissement de la connexion peut être interrogé pour voir s'il est disponible. Par exemple, les opérations de requête peuvent être incluses dans une structure si (EthernetClient) pour les exécuter uniquement lorsque la connexion client est disponible.

3. Établissez une connexion en tant que client

Comme cela a été dit, une fois la connexion créée, c'est le client qui prend l'initiative de faire les requêtes. Le serveur attendra cette initiative et répondra en conséquence. C'est donc le client qui se connecte au serveur, pour cela on utilise relier () indiquant le serveur en paramètres (l'adresse IP ou le URL) Et l' puerto chez celui qui écoute.

En fonction du résultat de l'opération, la fonction renverra les valeurs

  1. (SUCCÈS) Connexion établie avec succès
  2. Établir la connexion
  3. (FIN DU TEMPS) Le délai d'attente est écoulé sans que la connexion soit établie
  4. (INVALID_SERVER) Le serveur n'a pas été trouvé ou ne répond pas correctement
  5. (TRONQUÉ) La connexion a été interrompue avant d'être complètement établie
  6. (INVALID_RESPONSE) La réponse du serveur est incorrecte

Avant de commencer à faire des requêtes, il faut vérifier que la connexion est opérationnelle avec la fonction connecté() ça reviendra oui s'il est déjà disponible ou non autrement.

L'exemple ci-dessous illustre la connexion en tant que client, vérifiant toutes les 10 secondes s'il y a une connexion au serveur (cela n'est pas destiné à être productif, juste pour montrer la syntaxe des fonctions), ce qui, d'ailleurs, un serveur Web de production n'aimerait pas grand-chose.

4. Envoyer des données

Comme d'autres classes plus connues, comme Port série, et avec une utilisation comparable, les classes Client y Server avoir les fonctions

  • écrire(fait) o écrire(tampon, longueur)

    Envoie des informations à l'aide de l'objet client ou serveur à partir duquel elles sont invoquées. Le paramètre "data" est un seul octet o carboniser tandis que "buffer" est un tableau de octet o carboniser dont un montant égal à "longueur" est envoyé. Cette fonction est celle utilisée pour les opérations binaires, par rapport aux deux suivantes qui sont habituellement réservées à l'envoi de texte.

  • impression(base de données)

    Envoie en client ou serveur (selon la classe à partir de laquelle il est utilisé) les informations correspondant aux "données" sous forme de texte. Si l'information n'est pas exprimée sous forme de texte (par exemple s'il s'agit d'un nombre entier), le paramètre facultatif "base" peut être utilisé pour choisir la conversion, qui pourrait être l'une des constantes BIN, OCT, DEC ou HEX qui indiquent respectivement. bases correspondant aux binaires (base 2), octales (base 8), décimales (base 10) et hexadécimales (base 16)

  • imprimer(base de données)

    Le fonctionnement est identique au précédent sauf l'envoi, après l'information expressément indiquée par le paramètre "data", d'un retour chariot (code 13 qui peut être représenté par \r) et d'une fin de ligne (code 10, qui peut être représenté par \n) Ces codes sont fréquemment désignés respectivement par l'acronyme CR (retour chariot) et LF (saut de ligne)

Les trois fonctions précédentes renvoient le nombre d'octets envoyés, tout comme les fonctions équivalentes de la classe Port série; Comme dit plus haut, le fonctionnement est comparable.

5. Recevoir des données

Comme dans le cas des opérations d'envoi de données, les opérations de réception sont comparables à celles des opérations largement utilisées. Port série. Le protocole de réception est également similaire : vérifiez s'il y a (suffisamment) de données disponibles (disponibles) et dans ce cas lisez-les


  • disponible ()

    Renvoie le nombre d'octets disponibles pour la lecture. Cette fonction est présente dans les deux classes Client comme Server; Dans le premier cas, il indique le nombre d'octets que le serveur a envoyés en réponse à une requête et qui sont disponibles pour que le client puisse les lire (lire), et dans le second cas le client (objet) qui a effectué une opération ou false s'il n'y en a pas.

  • lis()

    Il est utilisé pour lire les informations reçues. Cette fonctionnalité est uniquement disponible en classe Client. Si l'application en cours de développement remplit le rôle de serveur, pour lire les informations arrivées, il faut instancier un objet client avec la réponse de la fonction disponible () discuté dans la section précédente.

L'exemple suivant est un "serveur majuscules" qui écoute sur le port 2000 et répond aux requêtes avec tout ce qui a été envoyé en majuscules lorsque cela est possible. On peut le tester par exemple avec PuTTY ou simplement avec telnet 2000 Ce n'est certes pas très pratique, son but est uniquement de montrer comment obtenir depuis le serveur les données que lui envoie un client.

6. Terminez la connexion

Bien qu'il soit habituel qu'une application serveur fonctionne indéfiniment, les connexions client sont établies, établissent des connexions et se terminent, permettant aux ressources d'être récupérées et utilisées dans d'autres connexions ou dédiées à d'autres utilisations du programme. La fonction Arrêtez() de la classe Client Il est utilisé pour mettre fin à une connexion client et libérer toutes les ressources qu'il utilise.

Pour le serveur, le fait que le client termine la connexion lorsque l'objet informationnel de la requête a été envoyé ou reçu lui permet également de libérer des ressources pour les allouer à d'autres connexions ou à des fins différentes. Bref, même si cela semble mineur, il est conseillé de mettre fin à la connexion à la fin des opérations du client.

Une autre bonne pratique lors de la fin d'une connexion client consiste à vider le que la classe utilise. Pour ce faire, la fonction est disponible flush () doit être appelé après avoir terminé la connexion client avec Arrêtez()

Exemple de requête HTTP GET

Pour mieux clarifier tout ce qui précède, un exemple plus complet de demandes est inclus ci-dessous. TCP en utilisant les requêtes GET en utilisant le Protocole HTTP. Dans l'exemple, les valeurs obtenues par des capteurs analogiques connectés à une carte Arduino sont envoyées à un serveur web qui les stocke dans une base de données.

Poster un commentaire

Vous avez peut-être manqué