Récemment, le complexe logiciel et matériel Arduino est devenu très populaire, conçu pour développer diverses conceptions électroniques intéressantes. Les conceptions sont faites en connectant la carte de base Arduino avec des modules supplémentaires requis. Sur la carte de base Arduino, il y a un microcontrôleur, dont le micrologiciel est écrit dans un environnement de développement spécial pour Arduino en utilisant, en règle générale, des bibliothèques prêtes à l'emploi pour l'un ou l'autre module.
L'un des modules - W5500 - est destiné à la fabrication de structures électroniques qui seront connectées à Internet. Dans ce cas, le plus souvent, cela implique un contrôle à distance de sa structure. Par exemple, il peut s'agir d'une «maison intelligente», d'un robot, etc. Le projet le plus trivial (sauf pour Hello world) est l'inclusion à distance de LED via un navigateur Web (Fig. 1). Si, au lieu de LED, des commutateurs à transistors et des relais sont connectés, des charges plus puissantes peuvent être commutées. Ainsi, en substance, le programme (firmware) de cette conception est un serveur Web qui traite les requêtes http d'un utilisateur distant.
Fig. 1. Gestion des LED via un navigateur.Le module W5500 est basé sur la puce W5500 elle-même avec son kit de carrosserie, ainsi qu'un connecteur BLS pour MK via SPI, un connecteur RJ-45 pour la connexion à un réseau informatique et un régulateur de tension linéaire pour 3,3 V (Fig.2).
Fig. 2. Le module W5500.La puce W5500 est un contrôleur à part entière avec un traitement intégré de toute une pile de protocoles réseau, d'Ethernet à TCP (Fig. 3). En mettant en œuvre une conception basée sur cette puce, le programmeur n'a pas besoin d'écrire le code de traitement du protocole TCP / IP, il suffit de mettre en œuvre uniquement le protocole de couche application, qui sera intégré dans TCP. Dans l'exemple ci-dessus (sur Arduino), http est utilisé comme protocole d'application.
Fig. 3. La structure de la puce W5500.Sans faire d'Arduino, j'ai décidé d'étudier la documentation de la puce W5500 en détail et de mettre en œuvre indépendamment le programme basé sur le microcontrôleur Atmega8. Ce programme n'inclura pas de gestionnaire http. Il est nécessaire de mettre en œuvre l'échange de données le plus simple (RAW) via le protocole TCP à l'aide d'un terminal distant. Il n'est pas tout à fait exact de parler du protocole Telnet, comme le dit le titre de cet article. Il possède ses propres spécificités basées sur l'échange d'informations complémentaires sur les paramètres des terminaux. Cependant, la plupart des clients Telnet prennent en charge RAW et ne nécessitent pas ce qui précède. Ainsi, le programme Atmega8 MK n'inclura pas de gestionnaire de protocole au niveau de l'application. Elle ne traitera que de l'initialisation du W5500, de la gestion des sockets, de la réception et de la transmission des données.
L'application principale de cette conception est la gestion des appareils via un terminal distant. Dans ce cas, la conception est connectée à l'appareil géré via l'interface UART (trois fils GND, TxD, RxD). La gestion via le terminal est une approche professionnelle classique dans un domaine particulier en l'absence d'une interface graphique. Par exemple, une ligne de commande Windows ou Linux, ou un moyen de configurer un routeur via un terminal à l'aide du protocole Telnet. Le dernier exemple est en fait équivalent à l'idée discutée dans cet article.
Lors du développement de tel ou tel appareil, le cas échéant, j'envisage de le contrôler avec des commandes texte via un terminal connecté via l'interface UART. Il peut s'agir d'une connexion à un PC standard au port COM RS-232 via la puce adaptateur MAX232, ou à l'USB (port COM virtuel) via la puce PL2303. Vous pouvez utiliser le programme HyperTerminal standard comme terminal. Avec la propagation des smartphones Android, il est devenu pratique de se connecter via Bluetooth: un module Bluetooth (par exemple, HC-06) est connecté à l'interface UART de l'appareil, et un smartphone est connecté sans fil au module. Il existe de nombreuses applications sur Internet qui implémentent le terminal via Bluetooth. Ainsi, vous pouvez contrôler l'appareil via le terminal à partir d'un téléphone mobile via Bluetooth dans une courte portée. La conception décrite dans cet article vous permet d'implémenter le contrôle via le terminal à l'aide d'Internet. Le terminal peut être l'HyperTerminal standard, fourni avec Windows XP, ou vous pouvez exécuter l'utilitaire telnet à partir de la ligne de commande Windows et y travailler. Si nous parlons d'un smartphone, vous pouvez choisir l'une des applications sur Android (il y en a aussi un grand nombre) (Fig.4).
Fig. 4. Applications pour "terminal TCP" sur Google Play.La puce W5500 dispose de 8 sockets indépendants, chacun ayant une mémoire pour recevoir et transmettre des informations sur 2 Ko. Total, la mémoire totale est de 16 Ko pour la réception et de 16 Ko pour la transmission d'informations. Ces paramètres sont utilisés par défaut, mais si nécessaire, au stade de l'initialisation de la puce, la mémoire peut être réallouée sur les sockets. L'application décrite ici utilisera les paramètres de mémoire par défaut et les 8 sockets sont impliqués. Chaque socket au stade de son initialisation se voit attribuer de nombreux paramètres dont les principaux sont son mode de fonctionnement et son port TCP. Le mode de fonctionnement des huit sockets dont nous avons besoin est le mode serveur TCP. Vous devez affecter différents ports à chaque socket. J'ai pris huit ports consécutifs, à partir, par exemple, de 4000. À l'étape d'initialisation du module W5500, il est affecté des paramètres réseau câblés dans le programme Atmega8 MK: adresse IP, masque de sous-réseau, adresse IP de la passerelle et même l'adresse MAC physique. Les paramètres réseau du W5500 doivent correspondre aux paramètres du réseau domestique auquel il se connecte. Lorsque vous vous connectez à distance à notre appareil décrit, les paramètres du terminal indiquent l'adresse d'hôte (adresse IP ou nom de domaine) et le port. L'adresse d'hôte fait référence au périphérique W5500 et le port fait référence au socket du périphérique. Une prise peut fonctionner avec une seule connexion. Par conséquent, il est possible d'établir huit connexions simultanées indépendantes. La figure 5 montre les paramètres de connexion dans le programme HyperTerminal standard au W5500 avec l'adresse IP 192.168.0.111 au socket 0 (port 4000). Pour vous connecter à Internet mondial (de l'extérieur), vous devez configurer correctement votre routeur domestique.

Fig. 5. Connexion via TCP / IP dans HyperTerminal.J'ai essayé de nombreuses applications de terminaux TCP différentes, chacune ayant ses propres avantages et inconvénients. Tout d'abord, par la méthode d'emballage d'un paquet TCP, deux cas peuvent être distingués. Dans le premier cas, un paquet TCP est généré et envoyé au serveur immédiatement lorsqu'un caractère est entré dans le terminal. Ainsi, le champ de données de chaque paquet prend 1 octet et contient le caractère entré par l'utilisateur. Le programme HyperTerminal fonctionne uniquement dans ce mode. Dans le deuxième cas, le jeu de caractères (commande) est entré dans un champ de texte séparé, et lorsque vous cliquez sur le bouton "Envoyer", un seul paquet avec un champ de données est formé, dont le contenu est un jeu de caractères entré par l'utilisateur. La taille du champ de données d'un tel paquet en octets coïncide avec le nombre de caractères saisis. Le deuxième cas est le plus préférable et le plus pratique, tout en étant économique en trafic. Notre conception fonctionne avec les deux cas, transférant à la sortie (TxD) de l'UART MK Atmega8 tous les caractères saisis par l'utilisateur distant depuis n'importe quelle prise.
Quant à l'organisation du transfert d'informations du serveur au client, elles ont ici aussi leurs propres caractéristiques. Il est possible de faire en sorte que le programme MK génère un paquet TCP à un octet également directement, à la réception d'un octet (caractère) sur le tronçon RxD UART MK. Vous pouvez créer un paquet TCP à partir d'un ensemble d'octets entrants vers le MK par la présence d'un signal supplémentaire spécial, qui n'est présent que lors de la transmission de la séquence depuis le périphérique connecté (signal d'empaquetage). Soit dit en passant, ce signal est utilisé pour commuter le MAX485 en transmission dans le cas de la conversion d'une interface RS-232 en interface RS-485 semi-duplex. Cependant, comme j'étais convaincu, il est plus pratique d'utiliser une minuterie, c'est-à-dire un petit délai pendant lequel la réception des caractères et la formation du paquet TCP seront effectuées. C'est la méthode que j'ai implémentée dans la construction décrite. Cela fonctionne comme suit. La minuterie (la durée est réglée environ 0,3 s) démarre lorsque le premier personnage arrive et est réinitialisée lorsque chaque personnage suivant arrive sur l'UART MK. Si aucun caractère n'est arrivé dans un délai spécifié, un paquet avec les caractères reçus est formé et envoyé au client, et le temporisateur s'arrête. Dans mon cas particulier, il existe un mailing de masse sur toutes les sockets auxquelles les clients sont connectés.
Maintenant, ce sera une question de confidentialité. Le terminal distant décrit n'est pas protégé contre l'écoute à l'aide d'analyseurs de trafic. Même le protocole Telnet lui-même ne fournit pas d'authentification et de chiffrement par mot de passe. Pour cela, il existe d'autres protocoles de terminaux distants modernes. Et dans le cas de Telnet, ainsi que dans le cas de RAW (sans protocole d'application), vous pouvez implémenter une méthode indirecte d'authentification par mot de passe, qui ne sera inefficace qu'avec une intervention intentionnelle intentionnelle. Cependant, cette méthode d'autorisation protégera contre le trafic "gauche" incontrôlé. Il peut provenir de logiciels espions qui, en triant la plage d'adresses IP de fournisseurs connus et la plage de ports, peuvent se connecter soudainement à notre appareil (s'il "écoute" les connexions Internet). Dans mon firmware, j'ai implémenté une page d'accueil client, si elle est connectée au serveur, c'est-à-dire à la conception basée sur le module W5500.
La page d'accueil contient des informations sur l'adresse IP du client, le numéro de socket (pour la surveillance) et une demande de saisie d'un mot de passe (Fig. 6).
Fig. 6. Page d'accueil du serveur W5500.Après la connexion à l'intérieur du programme MK, une minuterie démarre (pendant environ 18 secondes), pendant laquelle l'utilisateur doit avoir le temps d'entrer un mot de passe spécifique (le même sur toutes les sockets). Si le mot de passe n'est pas entré correctement, une fois la durée définie écoulée, l'utilisateur informe le message correspondant et le serveur se déconnecte (Fig. 7).
Fig. 7. Signaler un mot de passe incorrect.Dans le cas d'un mot de passe correctement entré, l'utilisateur reçoit également le message correspondant (Fig. 8). Après cela, un pont «transparent» est établi entre le terminal distant et l'interface UART du MK, auquel le module W5500 est connecté via SPI. Le fonctionnement d'un tel pont n'a été testé qu'au niveau des équipes d'utilisateurs. Un échange de données à grande vitesse à part entière peut ne pas être garanti si, dans certains cas, l'application client n'est pas un terminal utilisateur, mais un autre programme. Et plus encore, la conception décrite ne garantit pas (plus précisément, n'est pas prévue) l'échange de données en duplex intégral.
Fig. 8. Message sur le mot de passe correct.Lorsqu'un mot de passe est entré, l'utilisateur ne renvoie pas les caractères qu'il saisit au terminal, et aussi «Retour arrière» ne fonctionne pas (restauration avec un caractère entré incorrectement). La longueur du mot de passe est de 8 caractères. Le programme MK analyse les 8 premiers caractères reçus du client, quelle que soit leur distribution sur les paquets TCP. Mais tout paquet ne doit pas dépasser 10 octets. Soit dit en passant, la fonction «Envoyer un fichier texte» dans HyperTerminal fonctionne de manière très intéressante. Comme il a été vérifié à l'aide d'un analyseur de trafic, lorsque cette fonction est exécutée, deux paquets TCP sont formés: le premier paquet avec des données de 1 octet contient le premier caractère du fichier texte transmis, et le deuxième paquet contient le reste du contenu.
Le serveur fournit deux mots de passe différents. Un mot de passe est utilisé pour établir le pont TCP-UART (utilisation normale), comme décrit ci-dessus, et le deuxième mot de passe est utilisé pour contrôler le module W5500 ou d'autres paramètres de conception. Si ce mot de passe est entré, l'utilisateur affiche une autre page d'accueil et passe en mode de contrôle. J'ai intentionnellement prévu que ce mode n'était possible que sur l'une des sockets libres. Si un socket avec ce mode est occupé et qu'une tentative est effectuée pour se connecter à ce mode sur un autre socket, la connexion sera immédiatement déconnectée par le serveur. Avant la pause, un message sera affiché sur le numéro de socket qui fonctionne déjà (occupé) en mode de contrôle (Fig. 9).
Le mode de contrôle prévoit les commandes que j'ai définies, dont une liste peut être vue en entrant la commande d'aide. La commande doit se terminer par un caractère de nouvelle ligne (touche Entrée). De plus, si le mode de contrôle est actif, le serveur W5500 envoie des messages de service au terminal, par exemple, sur la connexion des clients à d'autres sockets avec leurs adresses IP ou sur un socket libre. La figure 10 illustre ce qui précède. La liste des équipes n'est pas encore complète, elle sera reconstituée au fil du temps.
Fig. 9. Un message sur une prise occupée lors de la saisie du mot de passe du mode de contrôle.Fig. 10. Mode de contrôle W5500.La commande echo désactive ou active le retour du caractère imprimé au terminal (auto-surveillance). Les deux commandes suivantes permettent de lire et d'écrire le registre d'adresses de la puce W5500. Les valeurs des registres pour les adresses sont indiquées dans la documentation de la puce W5500. J'ai introduit ces commandes universelles, principalement pour le débogage. La commande rl redémarre immédiatement le numéro de socket indiqué après. De même, la commande sr lit l'état du socket, en donnant sa valeur sous forme de numéro HEX. La commande "ens" donne un tableau des états pour chaque socket: état "0" - le socket est libre, en attente du client, état "1" - le socket en utilisation normale, état "2" - le socket en mode contrôle. Vous pouvez saisir un nombre beaucoup plus important de commandes. Il sera utile de modifier les paramètres qui correspondent à la puce au stade de l'initialisation lorsque l'appareil est allumé (par exemple, les paramètres réseau), en les stockant dans la mémoire non volatile du MK. Il peut également être utile d'entrer des commandes spéciales qui contrôleront des broches MK libres supplémentaires. Par exemple, «PC0 = 1», «PC2 = 0», etc. Assurez-vous d'avoir besoin de la commande de configuration UART interface MK.
Considérez les détails les plus subtils du travail du programme MK. En plus des minuteries susmentionnées, une minuterie est activée, grâce à laquelle, toutes les demi-minutes environ, ce que l'on appelle Paquets de contrôle TCP "keep-alive". Cela est nécessaire pour vérifier la connexion en l'absence d'échange de données utilisateur. Si, pour une raison quelconque, il n'y a pas de confirmation du client dans un certain délai défini à l'intérieur du W5500, le soi-disant timeout et le socket redémarrera. La connexion peut être soudainement perdue, par exemple, en raison d'une rupture de la liaison de données ou de la couche physique: ils ont débranché un câble Ethernet, déconnecté Internet ou perdu une connexion Wi-Fi, etc.
Sur la base de la documentation de la puce W5500 (fiche technique), les fonctions suivantes sont implémentées dans le code du programme. Premièrement, les fonctions de base de l'écriture et de la lecture des registres du W5500 aux adresses. Fonctions de haut niveau - réinitialisation matérielle, initialisation de la puce, initialisation du socket, ouverture d'un socket, écoute du socket, déconnexion et fermeture du socket, envoi de la commande «keep_alive», redémarrage du socket. La dernière fonction est une composition des fonctions ci-dessus: fermeture, ouverture, écoute. La plupart des fonctions renvoient une valeur d'état de socket après leur exécution. Enfin, les fonctions les plus élémentaires sont le traitement des informations reçues (lecture dans le tampon RX) et le traitement des informations envoyées (écriture dans le tampon TX). J'ai pris des recommandations sur la mise en œuvre de ces fonctions sur le site officiel du fabricant de puces W5500 (
lien ). La fonction de réception écrase les données reçues du tampon RX dans son propre tampon non-ring de 128 octets. Cette taille est suffisante pour des applications simples, et vous ne pouvez pas obtenir beaucoup du microcontrôleur Atmega8. Le tampon TX du W5500 transfère également les données du tampon intermédiaire, qui est également de petite taille. Et à son tour, les données du tampon en anneau UART y pénètrent. Ce dernier est implémenté automatiquement dans l'environnement de développement CVAVR à l'aide de l'utilitaire CodeWizardAVR au stade de la création du projet.
Le W5500 est connecté à l'interface MKI SPI (MOSI, MISO, SCK, SCLK). De plus, la broche RST (réinitialisation matérielle) est connectée à une sortie MK spécifique et la broche INT correspondante est connectée à l'entrée d'interruption externe INT0. Ce dernier est utilisé conformément à sa destination: lorsqu'un événement se produit dans le module W5500, il génère une impulsion au niveau de la broche INT, qui est traitée par le contrôleur dans le corps de l'interruption externe. MK apprend sur quels sockets l'événement s'est produit, puis réécrit les codes d'événement pour chaque socket dans un tableau spécifique. Un traitement supplémentaire de l'interruption se produit à l'intérieur de la boucle de programme principale. Au total, cinq événements ont été documentés: le client connecté, le client déconnecté (plus précisément, a déposé une demande de déconnexion), des données ont été reçues du client, un délai d'attente a fonctionné, les données ont été envoyées avec succès. Dans la boucle principale, tous les événements sauf le dernier sont traités. L'instruction switch-case est placée dans ce traitement. La plus grande partie du code C se trouve dans la section de traitement du troisième événement (réception des données). Dans celui-ci, après la fonction de traitement des informations reçues, l'opérateur de boîtier de commutation est également placé, mais dans ce cas, ce «commutateur» est associé à une variable responsable de l'état de la prise mentionnée ci-dessus (valeurs 0, 1, 2). La première section est responsable de la procédure de reconnaissance des mots de passe. Les caractères reçus sont remplacés dans un tampon de mot de passe séparé.
Dans certaines conditions, les fonctions de comparaison de la chaîne reçue avec des chaînes constantes contenant des mots de passe fonctionnent. En cas de coïncidence, l'état correspondant est attribué. La deuxième section est la plus simple - le contenu de son propre tampon d'informations reçues est redirigé vers l'UART du microcontrôleur. Il s'agit d'un mode d'utilisation normal. La troisième section (la plus grande) est responsable du traitement des commandes - mode de contrôle de périphérique.En plus de la poursuite du gestionnaire d'interruption, la boucle principale du programme contient des gestionnaires de temporisation virtuelle - un délai pour se déconnecter lorsque le mot de passe échoue, envoyer périodiquement "keep-alive" et envoyer un paquet formé par la temporisation TCP au client. La fonction de lecture de l'UART est également placée dans le corps de la boucle principale, à l'intérieur de laquelle les caractères reçus par le contrôleur sont transférés dans son propre tampon de transmission (intermédiaire) et le temporisateur est réinitialisé, qui est responsable de la formation du paquet TCP.Toutes les procédures de socket sont placées dans un cycle de 0 à 7, dont l'itérateur est lié au numéro de socket. Ainsi, le traitement séquentiel de toutes les sockets se produit. Au départ, je voulais dire que si vous attribuez le même numéro de port à chacune des huit sockets, vous pouvez connecter jusqu'à huit utilisateurs sur le même port. Cependant, cette configuration n'a pas fonctionné et ce problème a été reporté à l'avenir.Lors de la conception du circuit imprimé, j'ai fourni une horloge en temps réel (RTC) sur la puce DS1307. L'Atmega8 MK, quartz pour la fréquence 11.0592 MHz (fréquence sélectionnée pour la précision UART), un connecteur pour le module W5500, les connecteurs de port MK (y compris SPI pour le firmware, UART), RTC avec son propre quartz et le compartiment de la pile CR2032 sont situés sur une carte de circuit imprimé bilatérale , Régulateur linéaire 5 V (7805), connecteur d'alimentation et plus encore. L'esquisse de la carte de circuit imprimé dans le programme Sprint Layout est illustrée à la figure 11. Le seul élément affiché en rouge est soudé à l'arrière, mais je l'ai soudé à l'avant.Fig. 11. Croquis du circuit imprimé.Des photos de la construction terminée sont présentées à la figure 12. Une horloge de cette construction sera utilisée pour marquer l'heure pendant divers événements des prises W5500, et cette heure sera attribuée à l'utilisateur dans le terminal à côté du message si l'utilisateur est connecté en mode de contrôle. Et aussi, l'horloge sera utile pour l'avenir pour des expériences avec le protocole de temps NTP ou à toute autre fin.Fig. 12. Photos de la structure finie.En conclusion, il convient de noter que la conception interne justifie en grande partie des dispositifs de niveau industriel similaires. Le principal avantage est le prix. Il s'est avéré être beaucoup moins cher à fabriquer que le prix d'un appareil similaire fini. Et un inconvénient tel qu'une fonctionnalité limitée est inévitable. Dans ce cas, un contrôleur Atmega8 simplifié a été utilisé, car l'objectif simplifié correspondant a été défini.Fig. 13. Convertisseur industriel TCP / IP - RS-232.La figure 13 montre un exemple de convertisseur TCP / IP vers RS-232 industriel basé sur la puce W5100, très similaire au W5500. En plus de son interface de gestion flexible, il présente un avantage supplémentaire. En plus de travailler avec un terminal TCP / IP, il est possible d'utiliser un pilote spécial fourni avec le périphérique pour installer un port COM virtuel côté client. Grâce à lui, vous pouvez vous connecter en utilisant un terminal ordinaire qui n'a pas de mode de connexion TCP / IP. De plus, l'appareil peut prendre en charge l'échange de données RS-232 à part entière si un programme est connecté à la place du terminal via un port COM virtuel. Autrement dit, le dispositif illustré à la figure 13 est un pont RS-232 à part entière à travers l'infrastructure réseau.