Serveur d'impression

Un simple serveur Internet dans un Arduino … mais pas un serveur Web – art5simpsrv – Serveur d’impression

Le 7 août 2019 - 56 minutes de lecture


Un simple serveur Internet dans un Arduino … mais pas un serveur Web – art5simpsrv


<! – Utilisez si CSS a finalement décollé, d’autres pages, grâce aux encouragements de Phil Anscombe et à l’aide de www.w3.org/MarkUp/Guide/Style. Nouvelle feuille de style mise en place pour le "cours Arduino", dérivée de celle du 13 octobre 2008.

Permis:

 ->






MAISON GLOBALE Autre matériel pour les programmeurs, non spécifique à Arduino
ARDUINO: Page d'accueil Branche "A": Cours Arduino Branch "B": Arduino "Comment faire" et projets
ArduServer / ArduSimpSrv: Les Arduinos font TCP / IP
Recommander à StumbleUpon

Avec entrée et sortie

Localement ... ou sur Internet

Au fait, cette page est conviviale. Rendez la fenêtre de votre navigateur moins large que l’ensemble de votre écran et vous trouverez les colonnes plus étroites beaucoup plus faciles à lire. Pour plus de conseils, consultez mes astuces de navigation avancée.

Que fait ArduSimpSrv ??

ArduSimpSrv est un serveur.

Vous venez d'utiliser un "serveur". Lorsque vous récupérez la page que vous lisez, votre navigateur, un client Web (Firefox? Safari? Quelque soit le logiciel client) connecté au serveur à partir duquel le code HTML de ce que vous regardez peut être collecté par n'importe quel client Web. Il vous a envoyé le code HTML, et quoi que vous lisiez (le matériel du client) l'a rendu disponible sous une forme conviviale (vos yeux).

ArduSimpSrv est un simple simulateur

Je vous ai montré ailleurs comment créer un le web serveur avec un Arduino, mon ArduServer. Cela a ses utilisations. C'est le pour et le contre. ArduSimpSrv est un périphérique plus simple, il ne fonctionnera donc pas comme un serveur ArduServer, mais comme les frais généraux liés au service HTML ont été évités, l’Arduino dispose de plus d’espace, ce qui lui permet de faire davantage dans d’autres directions. Le "prix" pour cela? Vous ne pourrez pas accéder à un ArduSimpSrv avec un navigateur Web. Les ordinateurs clients devront exécuter un logiciel client écrit pour ArduSimpSrv. Vous ne pouvez même pas y accéder avec telnet. Pardon. C'est la "mauvaise nouvelle". La bonne nouvelle est qu'un programme client simple et gratuit pour interagir avec un ArduSimpSrv est disponible, ne craignez pas! Plus sur cela dans un instant.

Si vous souhaitez une liste de serveurs "live" et de serveurs ArduSimpSi vous souhaitez accéder à un ArduSimpSrv, ce lien est "pour vous!". Rappelez-vous simplement que pour accéder à un ArduSimpSrv, vous devez récupérer le logiciel client (gratuit) sur mesure! Ce lien vous mènera à une page traitant de mes démos ArduServer et ArduSimpSrv. Vous êtes peut-être venu sur cette page à partir de cette page. (Le lien s'ouvre dans un nouvel onglet ou une nouvelle fenêtre, ce qui vous permet de revenir facilement ici.) Un lien vous permet de télécharger le logiciel client gratuit ArduSimpSrv. (Si vous commencez tout juste avec ces choses-là, utilisez simplement "Arduserver". Vous pouvez y accéder avec un navigateur ordinaire.)


Marchons pour le moment ... on courra plus tard

(Si vous voulez essayer de courir avant de marcher, vous pouvez "passer directement à la réponse", le code source ArduSimpSrv. Cela s'ouvrira dans un onglet ou une fenêtre, pour qu'il soit facile de revenir ici.)

Hou la la! Périphériques visibles sur Internet! Les clients parlent aux serveurs! Tous assez grand!

Avez-vous peur que ce soit trop grand pour vous en ce moment? Ne sois pas! Les parties les plus difficiles peuvent toutes être surmontées avec rien de plus qu'un PC, un Arduino avec un bouclier Ethernet et un réseau local.

(Un côté, pour le bénéfice des débutants client / serveur: nous ne le ferons pas ici, vous pouvez même travailler client / serveur sur un seul ordinateur. Personne n'a dit que le logiciel client et le logiciel serveur devaient être insérés différents ordinateurs, ont-ils?)

Nous commencerons par faire en sorte que votre PC communique avec votre ArduSimpSrv par l’intermédiaire des fils de votre réseau local. Une fois que cela a fonctionné, il n'est plus nécessaire de permettre aux "étrangers" d'entrer, de se connecter à votre ArduSimpSrv au monde entier via la connexion de votre réseau local à Internet. (Votre ArduSimpSrv "dialogue" avec le routeur de votre réseau local. L'origine des demandes du routeur à l'ArduSimpSrv et l'emplacement des services du serveur une fois qu'ils ont été envoyés au routeur préoccupent peu ArduSimpSrv.

De quoi aurez-vous besoin pour créer un ArduSimpSrv

Un grand PC sera impliqué dans la programmation de l'Arduino, mais il ne sera pas impliqué dans la diffusion de la page Web. Il peut être débranché, éteint, etc., une fois l’Arduino programmé.

Vous aurez besoin d'une connexion Internet "toujours active", par exemple. "large bande" ou DSL ou ADSL. Vous ne pas besoin d'une "adresse IP statique", si cela vous inquiète. (Nous reviendrons sur cette question). Vous aurez besoin d'un routeur, mais vous en avez probablement déjà un, si vous avez satisfait à la première exigence ci-dessus. Vous aurez besoin d’un moyen de connecter votre Arduino à votre réseau local, c’est-à-dire une interface Ethernet.

Vous devrez faire attention à la manière dont vous compromettez la sécurité de votre système. Vous devez "ouvrir une porte" pour permettre aux clients d'entrer. Essayez d'éviter d'ouvrir toutes les portes de votre système.

Puce d'interface Ethernet: Wiznet W5100? ENC28J60?
Et crédit si dû ...

Je dois mentionner que le logiciel présenté ici nécessite un Wiznet W5100. Les boucliers moins coûteux utilisant les interfaces Microchip ENC28J60 peuvent probablement être programmés pour faire exactement ce que le logiciel fait ici. (Si vous faites cela, j'aimerais poster votre code, ou au moins un lien vers celui-ci.)

(Cette page a été créée en 2011. Veuillez consulter ma page "Mise à jour de mars 2015 ENC28J60" avant d'acheter ou d'utiliser l'un d'entre eux! (Cette page s'ouvrira dans un nouvel onglet. Fermez-la pour revenir ici.)

Il m'est arrivé d'utiliser un "Ethernet Pro" de Sparkfun, fourni (très rapidement!) Au Royaume-Uni par Hobbytronics.co.uk pour créer le ArduSimpSrv. Tout Arduino avec une interface Ethernet basée sur W5100 devrait faire l'affaire. Peu importe que l'interface Ethernet se trouve sur la carte Arduino ou sur un circuit imprimé séparé.

En fait, il serait plus juste de dire que PCSensor.com et Fungus, du forum Arduino, ont créé ArduSimpSrv! Le premier m'a donné une idée de la simplicité des choses et le dernier a écrit le code que j'ai spécifié. Mais sans documentation appropriée, tout projet est perdu. J'espère que je fournis cet ingrédient essentiel.

Un bout de bonne nouvelle pour vous remonter le moral: vous n’avez pas besoin de bibliothèques tierces pour ce travail. Les bibliothèques tierces ont leur place, mais c'est toujours agréable quand il n'y a pas de YAC (Yet Another Another Complication), n'est-ce pas?

<! - Quelque part, parlez des signaux utilisés par Ethernet i / f, que ce soit sur un bouclier ou ailleurs ... DRAFT .. de NuElect branchement info ...
  • 5v
  • 0v (terre)
  • Réinitialiser
  • D10
  • D11
  • D12
  • D13
  • D2

Voilà pour le matériel dont vous avez besoin et comment le brancher!

aller dans les problèmes de réinitialisation, les problèmes SPI partagés (celui-ci de deux notes sur le sujet ... autre signalé 2 sur 2 ->

Qu'est-ce qu'il peut faire ... et ce qu'il ne peut pas ...

Vous pouvez avoir l’impression que le ArduSimpSrv ne faire beaucoup. Dans l’affirmative, rappelez-vous: c’est simplement une démonstration de certains concepts de base. Il vous fournit un shell que vous pouvez développer pour faire beaucoup de choses .... peu importe vous veux le faire! Par tous les moyens, contactez-nous, si vous vous demandez "cela peut-il faire ...?". (Veuillez dire que vous venez de "art5SimpSrv.htm")

ArduSimpSrv surveille les commandes entrantes. Il pouvez servir plus d'un client "simultanément" ... bien que cet aspect n'ait pas été testé de manière aussi approfondie que je le souhaiterais. Je ne suis qu'un "roi borgne" en ce qui concerne TCP / IP. J'essaie d'aider les "aveugles". Si un roi à deux yeux avait des commentaires, ils seraient considérés avec enthousiasme. Je suis particulièrement curieux de savoir si je devrais appeler le "c.stop" qui est actuellement corrigé, et de savoir si plusieurs clients accédant simultanément au serveur vont provoquer des larmes. (J'ai au moins une connaissance suffisante du matériel et des logiciels d'Arduinos et de leurs clones.)

Le ArduSimpSrv final, comme décrit ici, peut faire ce qui suit.

Il peut répondre aux commandes "allumer le voyant" / "éteindre le voyant" ... le voyant étant connecté à ArduSimpSrv. Il peut donner aux clients la lecture actuelle de son capteur de lumière. Il peut indiquer à un client combien de demandes entrantes ont été traitées depuis le dernier redémarrage. Il "répond" toujours à la commande $ BB $ 82 ... mais c'est une chute laissée par le chemin du développement. La réponse n'a pas de sens ... mais cohérente! (Nous commençons par faire en sorte que cette commande réponde à cette commande, pour des raisons qui ne vous inquiètent pas!) (Si je finis cette page Web, j'espère ajouter un petit "frill" qui fera en sorte que ArduSimpSrv émette une minuscule "bip" chaque fois que quelqu'un y accède, histoire de me prévenir que quelqu'un l'essaie.)

De nouvelles fonctionnalités s’ajoutent assez facilement au code Arduino qui exécute le serveur.

Il n’est pas si facile d’apporter les modifications complémentaires pertinentes dans le logiciel client, mais il n’est pas plus sorcier d’agrandir le shell qui vous est fourni.

Quelques détails...

Ce qui suit va programmer un Arduino avec Ethernet comme serveur sur 192.168.0.242, desservant le port 5202. Ces numéros apparaissent ... une fois ... dans le code ci-dessous. Modifiez-les si vous avez besoin de votre ArduSimpSrv ailleurs. (L’adresse MAC de l’appareil figure également dans le code, même si vous auriez TRÈS malchance de constater que vous deviez changer cela ... sauf si vous utilisez plusieurs dérivés de cette démo. (Tous les appareils d’un même réseau local doivent avoir un code MAC différent. adresses.)

STOP PRESS: Il semble qu’il existe peut-être un élément de mauvais conseil dans certaines des pages auxquelles il est relié.

Il mai Il peut être déconseillé d’utiliser l’un des éléments suivants en même temps qu’un bouclier basé sur W5100. Je travaille sur une liste similaire pour les interfaces ENC28J60 ... il semble que ce soit la même chose que la liste ci-dessous, moins D4, An0 et An1 ... mais votre travail pourrait tout aussi bien être convivial pour le W5100, n'est-ce pas? pense?

  • D2
  • D4
  • D10
  • D11
  • D12
  • An0
  • An1

... et D13, mais ce dernier uniquement si vous "tenez-vous" au bouclier, il passe à une LED, et de là à travers une résistance à la terre. (Ceci ne fait que mettre en parallèle la même chose sur de nombreuses cartes Arduino et clones ... MAIS, pour vous écarter de la digression, sachez que le logiciel derrière les impulsions "setup ()" et "loop ()" est brièvement D13 avant d'exécuter ce que vous avez spécifié dans "setup ()".)

Bien sûr, J'ai involontairement utilisé certaines de ces lignes dans mes créations. Les dessins semblent fonctionner, mais ce serait une bonne idée de prendre ce que j'ai mis sur ces lignes et de les déplacer ailleurs. Je vais progressivement réviser mes dessins comme suit ....

  • Les utilisateurs de LED peuvent contrôler: Sera sur D8. (Est déjà, dans de nombreux cas)
  • "Bip": sera sur D7. (Déjà, dans de nombreux cas. Pas toujours écrit.)
  • Phototransistor "observant" LED: passera de An1 à An3
  • Deuxième capteur "surveillant" la lumière ambiante dans ArduServer2: de An0 à An2

Dans tous les cas, il est facile de modifier le logiciel ... mais vous devrez regarder attentivement pour savoir si ce qui est actuellement en ligne a été modifié ou non.

Pour changer la ligne utilisée par exemple pour le phototransistor qui regarde la LED dans, par exemple, ArduServer2, la ligne ....

client.print ("
L'entrée analogique 0 lit: "); client.print (analogRead (0));

... doit être changé pour ...

client.print ("
L'entrée analogique 1 lit: "); client.print (analogRead (1));

... et vous avez terminé! (Vous devrez également déplacer un fil sur votre planche à pain, si vous l'avez branché pour la conception d'origine.)

(Digression: rien n’est facile - Dans 99,0% de mon code, un tel changement aurait simplement consisté à changer quelque chose comme l’octet constant bLEDpin = 8; "au début du programme. Mais dans ce cas, éviter de se battre avec ... pas difficile ... obtenir l'invite pour identifier le canal, j'ai pris un raccourci et spécifié le canal explicitement au lieu d'une variable globale.

Pardon! J'aurais pu m'en passer aussi! Quand le site officiel Arduino disposera-t-il d'une documentation appropriée sur le bouclier Ethernet et la bibliothèque? Je travaille sur la conversion de toutes mes pages au "nouveau standard" ... en attendant, vous devrez rester vigilant!

Le code ci-dessous ne répond qu'à la commande $ BB $ 82. Ce n'est qu'un premier pas dans notre cheminement. Le code ArduSimpSrv plus performant apparaît plus tard dans ce didacticiel.

//
// TCP004: Un serveur simple ... pas un serveur Web ... pour Arduino
// Version basique. Une commande, une réponse (statique).
// Voir TCP005 pour la version développée "utile".
// Le logiciel client utilisé est TCP002 (voir ci-dessous)

// Ver: 04 oct 2011

// Nécessite un logiciel client conçu à cet effet.
// TCP002.exe dans ....
// http://sheepdogguides.com/zips/TCP001.zip
//    ... est adapté.
// Si vous connaissez ou avez écrit Linux
// équivalents, veuillez contacter http://sheepdogguides.com/
//
// Voir http://sheepdogguides.com/arduino/art5simpsrv.htm
// pour un guide sur TCP004
//
// Ce code est dans le domaine public.
//
// Il nécessite une interface Ethernet basée sur W5100, bien que la conversion
// le logiciel à exécuter avec une microchip ENC28J60 ne devrait pas être difficile.

#comprendre 
#comprendre 

// Ce qui suit détermine l'adresse MAC et l'adresse IP
// ce sera dans le bouclier Ethernet sur votre Arduino.
// Les deux doivent être uniques sur votre réseau local

uint8_t mac[] = 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE;
uint8_t ip[] = 192,168,0,242;

// Ce qui suit détermine le port sur lequel le serveur va écouter.
int iSPort = 5202;

Serveur serveur (iSPort);


// TKB: écrivez les problèmes liés à Ethernet Pro: sur la page Sparkfun, REPONSEZ le% v / 3.3v? question, soulignant qu'Ethernet Pro
   // décrit comme "bouclier Ethernet sur un Arduino Pro" et vendu à la fois en pros 3v3 et 5v!

   // Discutez également du problème de BUB / Optiboot et dites aux gens de regarder la page ModernDevice, où les choses ont été bien expliquées pour nous !!

   // Aussi: BUB 3v3 // Ethernet Pro Gnd .... Le 3v3 de BUB n'est pas connecté dans certains cas.

   // ARGHHH!

   // Demandez / discutez de c.stop .....

void setup() 

  // Initialise la puce Ethernet W5100
  Ethernet.begin (mac, ip);

  // Démarrer la bibliothèque série (pour la sortie de débogage)
  // Le moniteur série n'est pas requis pour le fonctionnement du serveur.
  Serial.begin (9600);

  // Démarrer le serveur TCP
  Serial.print ("Ouverture du serveur ...  n");
  server.begin ();


boucle vide ()

  Client c = server.available ();
  if (c.connected ()) 
    Serial.print ("Connexion entrante!  N");
    // Lire deux octets du client
    uint8_t b1 = c.read ();
    uint8_t b2 = c.read ();
    // Débogage: montre-moi ce que le client a envoyé
    Serial.print ("Le client a dit 0x");
    Serial.print (b1, HEX);
    Serial.print ("0x");
    Serial.print (b2, HEX);
    Serial.print (" n");
    // gérer la connexion
    if ((b1 == 0xBB) et (b2 == 0x82)) 
      // N.B .. La taille maximale de la réponse est de 68 octets (suffisant pour 32 capteurs)
      uint8_t réponse[68];
      // Créer une réponse
      uint8_t * r = réponse;
      * r ++ = 0xBB;
      * r ++ = 0x82;
      * r ++ = 0x01;
      * r ++ = 0x01;
      * r ++ = 0xFF;
      * r ++ = 0xFF;
      // Envoie-le

      c.écrire (réponse, r-réponse);
    ;
    // Fermer la connexion ... TKB: fermer la connexion ou arrêter le serveur? Ne veux pas ce dernier!
    // TKB REMMED OUT, CONNEXION RÉPÉTÉE CLOSED ...
    //c.stop ();
    // semble fonctionner! (Est-ce que le serveur c.stop ... n'a pas (correctement) été arrêté?
  ; // fin de boucle ()


Ce code répondra à une simple requête et enverra une réponse simple. Nous élargirons le répertoire pour en faire des choses plus utiles ... mais cette partie est facile ... vous pouvez probablement "voler" avec vos propres idées, en dehors des fondements fournis ci-dessus. La demande et la réponse étaient Je ne travaillais pas sur un projet maintenant disparu ... n'essayez pas de comprendre pourquoi vous feriez la demande en question, ni en quoi la réponse est bonne pour ... une part d'être un simple exemple d'interaction client / serveur!)

La requête à laquelle il répond est la séquence de deux octets ...

$ BB 82 $

Cette "demande" est envoyée du client au serveur. C'est tout à fait comme lorsque vous envoyez quelque chose à votre imprimante. Votre ordinateur (le "client" de l'imprimante) envoie quelque chose. Pour cette raison, l'imprimante (le "serveur") fait quelque chose. L'analogie se décompose ici, car ce que l'imprimante fait n'est pas, dans un sens simple, "vu" par le "client" ... mais si l'analogie l'a aidé, tant mieux. Si ce n'est pas le cas

La réponse, la chose que le serveur renvoie au client est ...

$ BB $ 82 $ 01 $ 01 $ 01 $ FF $ FF

J'écrirai beaucoup plus à ce sujet ... plus tard!

Aucune promesse ... mais vous pouvez trouver la mienne en ligne à ...

http://mon7nc.dyndns.org:5202

(Cette URL héberge également d'autres éléments intéressants. Utilisez simplement "http://mon7nc.dyndns.org", avec un navigateur, par exemple Firefox, pour voir mon système de surveillance des locaux / météo distant de FarWatch en action. Remplacez le: 5202 avec: 81, n’utilisant toujours qu’un navigateur, pour voir mon ArduServer ... service Web avec entrée et sortie sur Internet, avec juste un navigateur suffisant en tant que client (supprimer le client "sur mesure" dont ArduSimpSrv a besoin pourrait sembler C'est une bonne idée, mais cela limite le potentiel du système, mais si un simple ArduServer répond à vos besoins, c'est une option.)

Voilà pour le serveur. Qu'en est-il d'un client? Je peux vous donner un client ArduSimpSrv pour Windows, TCP006. (C'est un fichier .zip contenant le fichier .exe terminé. Le fichier .exe n'est pas un programme de type "setup".) Si quelqu'un souhaite créer des clients pour les utilisateurs Linux et Mac, il me fera plaisir de mettre des liens vers eux. d'ici.

Si vous voulez écrire votre propre client, qu'il soit meilleur pour Windows ou pour un autre système d'exploitation, vous pouvez télécharger le fichier zip avec le code source de mon tutoriel sur la programmation TCP / IP avec Delphi. Vous y trouverez des applications compilées. . Comme dans le cas de TCP006, il s’agit des programmes finis .exe, et non des programmes de type "setup". Celui dont vous avez besoin est TCP002.

Si vous avez configuré votre propre ArduSimpSrv, à l'adresse 192.168.0.242 (vous pouvez modifier l'adresse IP) sur votre réseau local ou si ma démonstration est en cours d'exécution à l'adresse mon7nc.dyndns.org, téléchargez TCP006 ou TCP002. Exécuter. Mettez 5202 dans "port", 192.168.0.242 ou mon7nc.dyndns.org dans "serveur", puis cliquez sur "Envoyer" (ou "Cmd BB: Réponse statique"). Si le serveur est en cours d'exécution, vous devriez obtenir "G: 01 +031.93". (C’est ce que TCP002 et TCP006 "traduisent" le "$ BB $ 82 $ 01 $ 01 $ 01 $ FF $ FF" dans lequel il a été reçu.)

TCP002 est un peu fragile. Arrêtez-le et redémarrez-le si vous souhaitez modifier les paramètres. Apportez les modifications avant de cliquer sur "Envoyer". Soit dit en passant, TCP002 crée un fichier .ini quelque part sur votre disque. Dans votre répertoire Windows, je pense. Pardon. Je crois qu’il utilise au moins un nom raisonnable, "TCP002 ... quelque chose".

TCP006 est plus sophistiqué, mais pas open source.

Nouveau, amélioré!

Une fois que cela fonctionne, de nouvelles idées vont surgir. Ré-enregistrez TCP004 en tant que TCP005, modifiez le nom du programme dans les rems en haut du programme. Nous allons faire faire à TCP005 des choses plus sophistiquées que TCP004. Les nouvelles fonctionnalités sont relativement simples et ne révèlent aucun nouveau secret du travail client / serveur ... mais elles transforment le programme en quelque chose de plus intéressant que TCP004!

(Rappelez-vous que si cela vous convient mieux, vous pouvez simplement télécharger le code ArduSimpSrv terminé, TCP005.)

Le bit suivant, une utilisation précoce d'une LED, peut être survolé ... mais les bits suivants seront transférés dans le "final" TCP005.

Lors de la conversion de TCP004 en TCP005, la première chose que j’ai faite a été d’ajouter une DEL (avec une résistance) à la ligne numérique 5. (Je ne promets pas de le conserver ici ... mais la LED connectée est définie par une seule ligne dans le programme, "uint8_t bLEDpin = 5;" ... ou un autre nombre au lieu de 5. Ne modifiez pas le "8" dans "uint8"! (PS: Depuis que j'ai écrit ce tutoriel, je l'ai revisité, pour déplacer entre autres choses la LED dont nous parlons. M. Murphy regardait ... J'ai déplacé la LED sur la ligne de ligne numérique 8, alors maintenant "8" est dans la version correcte de la ligne de réglage bLED, mais je vous fais confiance pour garder vos 8 droits. "8" est un chiffre chanceux pour beaucoup, beaucoup de gens, après tout! <^_^>)

Avant de connecter votre LED, vous devez savoir que vous souhaitez le faire briller sur le capteur de lumière que nous ajouterons dans une minute. J'ai câblé la DEL de la ligne numérique à la masse (à travers la résistance habituelle), car je trouve moins déroutant de laisser la ligne de réglage haute ("allumée") allumer la DEL. (La DEL de la ligne 13 de mon Ethernet Pro semblait poser un problème ... cela ne fonctionnait pas correctement pour une raison quelconque. De toute façon ... il aurait été difficile de faire "regarder" le capteur de lumière. )

Vous pouvez faire avancer les choses bien en ...

Créez un booléen global appelé boLEDOn. Créez deux sous-routines: LEDOn () et LEDOff (). Ils ... pas trop surprenant, j'espère, allumer et éteindre la LED .... et ils font l'état de boLEDOn quoi qu'il puisse être. Dans Setup (), configurez la broche pour la sortie et appelez le sous-programme LEDOn ().

Juste avant....

c.écrire (réponse, r-réponse);

... ajouter...

if (boLEDOn) LEDOff (); else LEDOn ();;

Hé hop! Désormais, quiconque regarde le ArduSimpSrv réel peut voir chaque fois qu'une commande $ BB $ 82 est émise.

(Cette petite escapade était juste un moyen rapide de s'assurer que le matériel de la LED fonctionnait correctement et de vérifier que les routines LEDOn () et LEDOff () étaient correctement construites. Le changement de l'état des LED à chaque fois qu'une commande $ BB $ 82 est exécutée en est ne pas inclus dans la version de TCP005 indiquée ci-dessous.)

Ensuite, ajoutez un capteur de lumière sur l’entrée analogique 1. (Par exemple, le second, celui après "AnalogIn0".) Comme pour la LED, vous pouvez placer le capteur sur le port analogique de votre choix. Le code ci-dessous suppose qu'il est sur Analog1.

Maintenant nous devons ...

  • Établir une syntaxe globale pour les commandes et les réponses
  • Décidez quelles commandes allumer et éteindre la LED,
  • Décidez quelle commande lira le capteur de niveau de lumière
    ... et alors...
  • Implémentez les commandes dans notre code.

Le document, moutonsdogguides.com/arduino/art5SimpSrv.htm, est la documentation définitive pour le protocole client / serveur ArduSimpSrv.

J'ai décidé des règles suivantes pour mes commandes ....

Les commandes seront composées de deux octets.

Le deuxième octet sera l'inverse du premier. Cela fournira une "vérification de contrôle" grossière, comme une vérification de la validité d'une commande ... mais pas que, pour le moment, le programme effectue une gestion ou un rapport intelligent des erreurs. Il regarde ce qu'il a. Si c'est une commande valide, il la traite. Sinon, il l'ignore.

Les "commandes" $ 00- $ 0F sont réservées à un usage interne du logiciel client et ne doivent jamais être envoyées au serveur.

Je regroupe mes commandes comme suit ....

  • a) Ceux qui ne nécessitent aucun paramètre et ne renvoient aucune donnée autre qu'un accusé de réception.
  • b) Ceux qui nécessitent des paramètres mais ne renvoient toujours aucune donnée autre qu'un accusé de réception.
  • c) Ceux qui ne nécessitent aucun paramètre mais renvoient des données.
  • d) Ceux qui nécessitent tous deux des paramètres et renvoient des données.

Toutes les réponses, y compris l'accusé de réception d'une commande "responseless", commenceront par le premier octet de commande. (Cela facilitera l'analyse des réponses ... si vous savez à quelle commande vous souhaitez répondre, il est plus facile de savoir quel format doit avoir la réponse!)

(Je vais "parler" dans l'hex, tout au long de ....)

Le premier quartet des commandes des catégories a-d ci-dessus sera respectivement compris entre 5 et 8. En d’autres termes, pour prendre un exemple, on peut s’attendre à ce que la commande $ 58 soit quelque chose qui n’exige aucun paramètre et ne renvoie rien de plus qu’un accusé de réception.

"Turn LED off" est un bon exemple. Pour cela, j'attribue la commande $ 50.

"Allumer le voyant" sera attribué à 51 $.

"Capteur de lumière lu" sera attribué à 71 $, car le capteur est sur le canal 1. (Finalement, il sera probablement plus logique d'utiliser une commande $ 8x et d'envoyer la donnée "quel canal" comme paramètre ... mais pour l'instant nous allons garder les choses simples.

(Bien entendu, il n'est pas nécessaire que le capteur de lumière soit connecté à l'entrée analogique, mais je vais continuer à parler de capteurs de lumière pour que l'exemple soit concret.)

J'ai dit que les commandes seraient composées de deux octets. Avec le "total de contrôle" deuxième octet, nos commandes sont .... en plus de l'héritage $ BB $ 82, qui est maintenant plutôt redondant et inutile, nous avons ...

  • $ 50 $ AF: éteindre la LED
  • $ 51 $ AE: Allumer le voyant
  • 71 $ 8 $: Capteur de lumière en lecture
  • $ 7E $ 81: Rapport de la version du serveur (voir ci-dessous)
  • 7F $ 80 $: (Voir ci-dessous)

Nous allons reconnaître toutes les commandes $ 5x avec trois octets comme suit: Le premier octet sera simplement la commande elle-même ", a déclaré" de nouveau au client. Le deuxième octet sera l'octet de commande original ET avec 01010101 binaire. Le troisième octet sera l'octet de commande original XOR avec 01010101 binaire. Ce schéma simple ne sera pas difficile à programmer et nous donnera une indication, chez le client, la commande que nous avons envoyée a été reçue par le serveur. (Ce n'est peut-être pas mon plus grand projet, mais il sera utile de poser un "marqueur" pour quelque chose qui pourrait être amélioré un jour!) (Ainsi: 50 $ seront crédités de 50 $ 00 $ 05 $; 51 $ seront reconnus de 51 $ 00 $ 04 $)

La commande "Capteur de lumière en lecture" reviendra ...
la commande, répétée en arrière ($ 71),
l'octet de commande d'origine AND'd avec le binaire 01010101,
suivi de deux autres octets, donnant la valeur vue sur l'entrée analogique, MSB en premier.
Cela sera suivi du OU exclusif des deux octets, encore une somme de contrôle de base.

Donc: Une commande de 71 $, quand Analog1 verra que 1234 $ retournera 71 $, 51 $, 12 $, 34 $ et 26 $.

Alors! Code pour tout ça!

... Je vais vous montrer plus loin cette page !!! (ArduSimpSrv en ligne exécute le code le plus sophistiqué, qui répond à toutes les commandes décrites ici. Le démonstrateur en ligne ArduSimpSrv est connecté à la DEL et au capteur de lumière promis.

Une petite diversion: ArduSimpSrv émet également un petit "bip" chaque fois qu'il traite une demande client. Tout le code pertinent est assez simple. Recherchez les lignes contenant "Beep". Et maintenant, retour au travail ...

Avant de traiter ce code, je vais implémenter une autre commande: $ 7F. Lorsqu'un $ 7F est émis, il sera envoyé avec son inverse ($ 80) et fera retourner ArduSimpSrv: L'octet de commande ($ 7F) ET avec le binaire 01010101: $ 55, suivi d'un nombre à deux octets, MSB d’abord, en indiquant le nombre de fois où il a traité une paire d’octets du client depuis son démarrage, suivis de ces deux nombres XOR. Ainsi, si 1233 $ de commandes ont été traitées et que l’ArduSimpSrv reçoit une somme de 7F $ 80 (l’octet de contrôle de 7F est de 80 $), l’ArduSimpSrv répondra avec: 7F $ 55 $ 12 $ 34 $ 26 $. (Il répond avec 1234 $, car il compte la commande qui vient d'être reçue avant de répondre.)

Premièrement, nous allons créer une variable globale pour cela, que nous appellerons iCommandsAccepted. Nous allons initialiser cela à zéro dans Setup (). Nous allons l'incrémenter de un juste après les lignes ...

uint8_t b1 = c.read ();
uint8_t b2 = c.read ();

Même sans implémenter la commande $ 7F, nous pouvons voir que cela fonctionne, simplement en ajoutant ....

Serial.print ("");
Serial.print (iCommandsAccepted);

... juste avant la ligne de débogage ...

Serial.print (" n");

... et en regardant ensuite iCommandsAccepted aller 1, 2, 3, 4 ... en utilisant le moniteur série. Comme nous savons que cela fonctionne, nous allons ensuite implémenter $ 7F pour que le client puisse voir le nombre de commandes traitées. Toutefois, cela nécessitera non seulement des modifications du code dans ArduSimpSrv, mais également du logiciel client. Ainsi soit-il! Mais les changements d'ArduSimpSrv en premier ...

Vous ne verrez plus rien de ce vilain hideux dans le dernier TCP005 ... mais juste pour illustrer ce que vous pouvez faire ...

Pendant que je développais TCP005 et que j'en étais si loin, j'ai utilisé le gestionnaire $ BB $ 82 pour voir si j'allais pouvoir renvoyer iCommandsAccepted au client. Je viens de changer ...

      
      * r ++ = 0xBB;
      * r ++ = 0x82;
      * r ++ = 0x01;
      * r ++ = 0x01;
      * r ++ = 0xFF;
      * r ++ = 0xFF;

... à....

      
      * r ++ = 0xBB;
      * r ++ = 0x82;
      * r ++ = 1;
      * r ++ = 01+ (iCommandsAccepted >> 8); // 1 + MSB de iCommandsAccepted
      * r ++ = iCommandsAccepted & 0xFF; // LSB de iCommandsAccepted
      * r ++ = 0xFF;

... assez longtemps pour voir si j'étais sur la bonne voie, puis remettre le code, et installer un gestionnaire "correct" à 7 $. C’est un problème salissant, compliqué par divers facteurs liés à ce que fait le logiciel client avec les deux octets que nous avons foirés, le fait que des problèmes se posent si l’un ou l’autre est égal à zéro, etc., etc. vous apprendre à éviter la tentation d'essayer quelque chose de rapide et de sale, je va redoubler d'efforts dans la même direction valable.

La commande $ 7E: J'ai créé une commande $ 7E ... mais je ne l'ai pas encore testée! Le travail de la commande $ 7E consiste à renvoyer une chaîne au client pour indiquer au client la version de ArduSimpSrv qu’il traite.

La commande $ 7E entraînera le renvoi par ArduSimpSrv: L'octet de commande ($ 7E) AND'd avec le binaire 01010100: $ 54, suivi du nombre de trois octets, MSB en premier, indiquant la version du logiciel, telle que définie dans le bVerMostSB, bVerMidSB. et bVerLSB octets, suivis des deux derniers nombres XOR'd. Ainsi, si la version est $ 00 $ 01 $ 02, et l’ArduSimpSrv reçoit un montant de 7E $ 81 (l’octet de contrôle de 7E est de 81 $), l’ArduSimpSrv répondra avec: 7E $ 54 $ 00 $ 01 $ 02 $ 02 $ 03.

Notre premier serveur de réponses multiples correctement codé

Dans TCP004, il y a une section qui ressemble à ceci ....

    
    // gérer la connexion
    if ((b1 == 0xBB) et (b2 == 0x82)) {
      // N.B .. La taille maximale de la réponse est de 68 octets (suffisant pour 32 capteurs)
      uint8_t réponse[68];
      // Créer une réponse
      uint8_t * r = réponse;
      * r ++ = 0xBB;
      * r ++ = 0x82;
      * r ++ = 0x01;
      * r ++ = 0x01;
      * r ++ = 0xFF;
      * r ++ = 0xFF;

      // Envoyer une réponse
      c.écrire (réponse, r-réponse);

Nous allons créer des sous-programmes qui traiteront les différentes commandes. Ils s'appelleront "ProcessBB82", "Process7F80", etc. Nous y viendrons dans un instant. Pour l'instant, nous allons réviser ce qui précède, en le rendant plus clair ....

    
    // Traite la commande
    if ((b1 == 0xBB) et (b2 == 0x82)) ProcessBB82;
    if ((b1 == 0x7F) et (b2 == 0x80)) Process7F80;

      // Envoyer une réponse
      c.écrire (réponse, r-réponse);

... et non, bien sûr, cela ne fonctionnera pas tant que nous n'aurons pas pris en charge d'autres tâches.

Tout d'abord, le c.write (réponse, r-resonse) était à l'intérieur du bloc traité uniquement si la condition du "si" était remplie. Pour éviter d'avoir besoin de plusieurs instances de c.write (..., j'ai introduit une nouvelle variable booléenne globale, boValidCommand. Dans chaque sous-programme de traitement de commande, il est défini sur true. Il est donc utilisé ...

    
    // Traite la commande ..
    boValidCommand = false; // set true dans les processeurs de commande
    if ((b1 == 0xBB) et (b2 == 0x82)) ProcessBB82;
    if ((b1 == 0x7F) et (b2 == 0x80)) Process7F80;

    // Puis, si la commande est vue, envoie une réponse ...
      if (boValidCommand) c.write (réponse, r-réponse);

Malheureusement, ma compréhension des pointeurs est imparfaite et j'ai dû "déconner" la façon dont la chaîne d'octets auxquels accédait c.write était définie. En voici assez du code de travail, à ce stade, pour vous montrer comment je suis sorti du coin dans lequel je m'étais peint ...

(couper...)
uint8_t réponse[68];
// N.B. Taille de la réponse limitée par ce que vous avez mis dans la ligne précédente.
// Attention à ne pas saturer le tampon.
uint8_t bRespLen;

booléen boValidCommand;

(couper...)

void ProcessBB82 () 
      uint8_t * r = réponse;
      * r ++ = 0xBB;
      * r ++ = 0x82;
      * r ++ = 0x01;
      * r ++ = 0x01;
      * r ++ = 0xFF;
      * r ++ = 0xFF;
      bRespLen = 6;
      boValidCommand = true;


void Process7F80 () 

(similaire)

      boValidCommand = true;


(couper...)

boucle vide () {
  Client c = server.available ();
  if (c.connected ()) 
    Serial.print ("Connexion entrante!  N");
    // Lire deux octets du client
    uint8_t b1 = c.read ();
    uint8_t b2 = c.read ();
    ++ iCommandsAccepted;

(snip les lignes de débogage ...)

// Traite la commande ...
    boValidCommand = false; // Définir la valeur true dans un processeur de commandes, le cas échéant
    if ((b1 == 0xBB) et (b2 == 0x82)) ProcessBB82 ();
    if ((b1 == 0x7F) et (b2 == 0x80)) Process7F80 ();

    // Envoyer une réponse
    if (boValidCommand) c.write (réponse, bRespLen);

    ; // Fin du bloc if c.connected (then ...)

(coupez les lignes finales)

À partir de ce qui précède, vous pouvez voir l’essence de tout ce qui reste pour atteindre les objectifs que nous nous sommes fixés au départ. Les détails peuvent être trouvés dans le code suivant. TCP002 peut interagir avec ArduSimpSrv, qui utilise plusieurs commandes améliorées, mais il n'enverra que la commande plutôt ennuyeuse $ BB $ 82 et recevra l'ordre plutôt ennuyeux: $ BB $ 82 $ 01 $ 01 $ FF $ FF, que TCP002 traduira en "G: 01 + 031.93 "... mais cela fonctionnera" avec TCP002 en tant que client.

Pour voir les autres commandes servies, vous devez utiliser TCP006. Assurez-vous d'avoir une version postérieure au 6 octobre 2011. L'ID de version est la date indiquée dans la barre de titre de la fenêtre. (Certaines versions préliminaires ont été publiées, qui ne proposaient pas toutes les fonctionnalités disponibles actuellement.) Vous pouvez allumer et éteindre le voyant connecté au démonstrateur en ligne ArduSimpSrv. You can see readings from the phototransistor connected to one of its analog inputs. (You'll get about 00004 when the LED is off, something a little over 00100 when it is on.) You can see the number of times the server has responded to a request since it was last booted. It still can send the rather pointless "BB" command... It sends a $BB€82 command, which gives rise to a fixed response that is "translated" into "G:01 +031.93" if all is well. The command and the response are scraps of where this project began, and do not represent anything meaningful at the moment!)

Vous pouvez tell the software to read the device repeatedly. If you turn this on, please do not set the read frequency to more than once a minute, if you want to leave it running for a while. In fact, probably best not to leave it running for extended periods, unless you are really, really keen. For short tests, feel free to read at the maximum once per second... but remember that others out there may want to play, and if too many people are reading at once per second, you may "break" the ArduSimpSrv. It is easier to bring down with a denial of service attack than, say, eBay.

There's lots of work to be done on TCP006 still, to make it robust and user friendly... but you can already see what is possible! I hope you like it... it took hours and hours to create! I'm sorry to say that the sourcecode for TCP006 will not be released. The basics behind it are explained here. The "frills" are my "trade secret", for a commercial app I am working towards.

Your Global Audience

If you have actually done all of the above, so far you have a ArduSimpSrv which can be accessed with client software running on any PC on your LAN.

To make your ArduSimpSrv "visible" to the world, you "only" need do xxx the same things done to make either of my ArduServers visible to the world. Eventually, I hope to split that information off into its own page. For now I fear I must ask you to read through the tutorial on ArduServer2, where the information Est-ce que reside. I apologize for making you dig through the ArduServer2 stuff to find the bits you need. There's not "a lot"... when you know how. You need a domain name, i.e. something like my mon7nc.dyndns.org (although it can be simpler, if you like!). You need a way to keep the DNS appraised of the current IP address of your domain. You need to configure your firewall and anti-malware software to allow requests from clients into your LAN. That's "all". <^_^>

I've done a separate guide to why you need, how to set up dyndns service.

<!-- Should this go into arduserver.com/a2intro.htm?

A little aside. Don't worry too much about it, if it doesn't make sense to you. Your router can probably be told to restrict the local IP addresses it issues via DCHP to a subset of a band. You could, for instance, tell it to use only 192.168.0.100 to 192.168.0.199 for DCHP issued IP addresses. This is probably a good idea (a subset, not necessarily the one I gave as an example) for you, because your Arduino isn't clever enough to participate in DCHP, and will have a fixed (local) IP address. (This is a completely separate issue from the matter of your "external" IP address, the one that is probably "dynamic", and will probably need dyndns services to deal with.) By telling your router to issue local IP addresses from a subset of a band, you put yourself in the position of knowing other local IP addresses which can be used for things with fixed IP addresses... like the web page serving Arduino you will set up, if you go through what is described in this tutorial. Once you've done something like this once, all sorts of other things... for instance IP cameras... become much easier. (You may want to use a fixed address for one of them, too.) One "price" of going the "simpler" fixed local IP addresses route: You have to stay on top of which devices have been assigned which IP address. vous pouvez have a camera and an Arduino tous les deux with IP address 192.168.0.240.... but only if they are not on the same LAN. Put them both on the same LAN, and you must first change the IP address coded into one of them.

xxxxxxxxxxx

Making that available to the world! across the web isn't much harder. You've done the hard bits. We'll look at that next, after a little review....

So far...

(You might want to open the page again in a new window, and arrange to have both the text you are reading now and the big diagram near the top of the page visible at the same time.)

So far, I have, I hope, made clear to you how to set up your Arduino so that it will serve a simple "Hello World" page over your LAN to any PC on that LAN.

Start at the bottom of the big diagram. On a ne pas looked at inputs or outputs for the Arduino yet. The page the program above serves does ne pas have the "Light Level: 57" line, or the "On" or "Off" buttons, or a way to respond to them, once they are provided.

But we have talked about the Arduino, and made a good start on the programming required. We have talked about the Ethernet interface. (We're done talking about that now.) The Ethernet interface's connection to the router is in place... it is simply the Ethernet cable

Not shown on the diagram is a PC connected to the router. It could, in fact, be the PC being used for developing the Arduino's software. I left the arrow between it and the router out of the diagram in hopes of avoiding confusion. All of the devices on the same LAN as the Arduino will be connected together via the router.

We haven't talked about the USB interface between the Development PC and the Arduino, so I'll do that now. It is nothing more than whatever you normally use for programming your Arduino. Although it is more appropriate to a general discussion about Arduinos and clones, I will mention one thing you may not have come across: You can buy Arduinos with, and without, the USB interface circuitry incorporated on the Arduino. You can buy simple USB cables, which are nothing more than some connectors joined by wires, or "fancy" USB cables which at one end plug into a USB port and at the other end plug into an Arduino without USB circuitry, and which have, in the cable, the circuitry you need.

If you are only ever going to have one Arduino, it doesn't matter which route you choose, other than the fact that you've made a false start if you later decide you do want more than one Arduino.

Onward!....

Beyond the LAN...

The first thing you're going to have to deal with to make your Arduino webserver visible to le monde (!) is to either have a static IP address, which may be the case for some lucky readers.... but isn't probable to be the case for vous, mortal reader. I don't have one, and am jealous if you are one of the lucky ones!

Instead of using a static IP address, mortals make use of a service from DynDns.org, or a similar service from some other provider. The name derives from "dynamic omain name service. More on this in a moment.

I'll try to come back and say more about this later, but for now, after the next few paragraphs, just pop off to their website (link: above), and read what they tell you. You can use their service for free, if you don't mine a small nuisance, or, for not very much, you can pay to make the nuisance go away.

We normally use things like "http://bbc.co.uk" to go to a website. "bbc.co.uk" is a nom de domaine. However, behind the scenes, the internet uses numbers. Places you visit have numbers, and vous have a number, when you are using the internet. These numbers are "IP addresses". Part of why the internet is so easy to use is that there's a mechanism which looks up the numbers for us, from things like "Http://bbc.co.uk". The part of the internet that does this looking up is the DNS, the omain name service, which came up a moment ago. ("DNS" is also sometimes defined as "Domain Name System", and then you would talk about a "DNS service", provided by DNS servers".) It is a bit like a telephone directory... in a world where people's telephone numbers change more frequently than they do in this world. The BBC's webpage has been at bbc.co.uk for many years... but the IP address for that website has probably changed many times. But, thanks to DNS, I have no idea what the IP address has been doing. I only have to remember "bbc.co.uk".

The number for the internet connection you will be putting your ArduServer on probably changes from day to day, and "you" may not yet have a domain name, or a mechanism to keep the DNS records up to date. This would be a problem for people trying to visit your webserver without a service like that provided by DynDns.org. Le "dynamic" part of DynDns refers to the fact that the IP address associated with your domain, e.g. your "www- thingie", changes from time to time. The DynDns service takes care of this for you. (The also issue you with a domain name that is "yours".) But there's a gotcha for those of us who want to use an Arduino as a webserver. Something where you have your router must frequently check the IP address your system has been assigned. When that local updater finds a change, it passes a message to DynDns. THEY make sure that when people "call" you, i.e. your domain name, they are directed to the right IP address. (Sorry... I'll try to explain that better someday... if you write in and tell me it is not clear. (Eddress at bottom of page.))

IMPORTANT BIT: I said "Something where you have your router must frequently check the number your system has been assigned". In my case, I use a "big PC" (a Windows XP machine) to do this. It has to be on all the time to do the update checking, but I don't mind, because I have un autre webpage... indeed SET of webpages... served by it, so it needs to be on all the time anyway. But for some of you, gentle readers, part of the reason for trying to get an Arduino to do web page serving was to avoid having a big PC on all the time, wasn't it?

The Good News: Many routers have dyndns updater services built into them. I can't help with the individual details of all the different routers out there, but if you don't want to leave a PC running to inform DynDns (or another dyndns provider) of your current IP address each time it changes, and it will, then look in your router, and hope that you find an updater. They aren't unusual today. Another possible solution is any IP camera you may have on your system. They sometimes have dyndns updaters in them.

A word about "IP address". If you run the code above exactly as presented, 192.168.0.240 is the "IP address" assigned to the Arduino. (I said you might have to change that. But you won't change it very much, and you won't be able to "see" your Arduino from out on the 'net with that IP address.) 192.168.0.240 is one of a range of IP addresses set aside for "local" addressing. Part of your router's job is to present a "global" IP address to the outside world... this is the IP address to which DynDns will refer requests for your page. Then, within the router, messages for your Arduino web server are re-directed to 192.168.0.240. When answers are generated, they are sent back towards whoever asked for them. As the message travels, the router reverses the process, and sends the answer out as if it were from the global IP address on the "outside" of your router, and the local IP address remains hidden.

So... if you need to know more about dyndns services, now is the time to try Dyn.com's site (once known as DnsDns.org), one of the providers of such services.

I'm sorry... I've made that seem more complicated than it is. I'll try to re-work it one day. Bottom line: You need a URL, i.e. a "www- thingie" which will bring the world to your router. And getting one isn't so very terrible. In my case, for putting my Arduino on line as a server, my URL is mon7nc.dyndns.org. I get the use of that URL from DynDns.org. (What if you have a website, as I do (sheepdogguides.com)? Can you use that? No, not if you are asking the question. If you not only have a website, but are also portion the website, i.e. the computer holding the pages of your site are at where ever you are, then yes, probably you could use the URL. But most of us do ne pas serve our own pages. We upload them, across the net, to someone else, our "web host", and they take care of providing the server, the computer holding the files people fetch when they visit your site.)

If you want to explore dyndns, and serving webpages, etc, etc, further, you might like to look at my FarWatch information. FarWatch lets you monitor premises from afar, across the 'net. You won't need big parts of the FarWatch system for putting your Arduino online. (You won't need the "WAMP" stuff.) But FarWatch uses dyndns too, and maybe re-reading "the same" material, but from another perspective will help consolidate your understanding. Or just go to the DynDns.org site, sign up, and Just Use It, without worrying too much about "understanding"!

Firewall issues

In the following discussion of "your firewall", I am talking about the firewall which I hope you have in your router. Many of us have multiple firewalls... one in the router, one in each PC connected to it. Happily, you can leave the firewalls in the PCs alone.

This is a good point to remind you that setting up an Arduino connected to the internet mai create chinks in your armor. You may be introducing ways for Bad People to "get into" your system to snoop around or install malware. Your firewall, and the anti-virus (etc) software you faire (I trust) have in your PCs "should" protect you... but in order to connect your Arduino, you are opening up a potentiel channel for attacks. I don't know enough about the security issues to tell you exactly how much risk you are taking on. How much do you want to do this? I wanted to do it badly enough to take the chance that I was wrong about "firewall should protect me".

However... you will almost certainly have to tell your firewall that the Arduino's traffic is okay. If you just get annoyed, and simply turn the firewall completely off, I would guess you have a pretty good chance of having problems before long.

Inside your router, there is a marvelous mechanism called NAT. We've already discussed it, but didn't give it its name at the time.

NAT stands for "Network Address Translation". ("Network Address", for our purposes here, is the same as the "IP Address" we've spoken of previously.) Network address translation happens in the router. As I said before, your router "talks to" the "outside world" through one IP address. (That IP address may change from time to time, but it is one address, for the purposes of this section.) For the sake of this discussion, we'll say that your router is currently assigned 80.0.210.5

What if you have two computers on your LAN, and they are both "talking to" the internet?

Each computer will have a local IP address, one probably in the form of 192.168.0.xx (or 192.168.yy.xx). Your Arduino, for the purposes of this section, is just another computer on the LAN. (That's what it is, after all! Just not as expensive (or quite as capable of SOME things) as your "big" computer.

When computer "A", at, let's say, 192.168.0.100, asks for something from the internet, it communicates with the router via 192.168.0.100, but when the router passes the request on to the internet, the internet "sees" that request as coming from your router's external IP address, 80.0.210.5 in our scenario.

So far, so simple. The really clever bit is that at the same time as computer "A" has asked the internet for something, computer "B" (192.168.0.200) could also be asking for something. And the router will have sent that enquiry out, également "from" 80.0.210.5. When the answers come back, both are sent to 80.0.210.5. Then the router "magically" itinéraires "A's" answer to 192.168.0.100 on the LAN, and "B's" answer to 192.0.168.200! This really is very cool... and, happily, something you can (mostly) just leave to the router's silicon intelligence.

In "everyday" internet use, you send out a request for something, and let in the answer when it arrives. Which your firewall knows about, and is already allowing, if you are reading this in a web browser.

To make your Arduino a server, you need to tell your firewall that the contraire is okay. You are prepared to recevoir requests for the stuff your Arduino is serving, and you are willing for the Arduino to envoyer the responses.

Not only do you have to say that this is okay, but you have to tell your router, "When a request for something comes in, send it to the Arduino (192.168.0.240, if you were able to use that IP address. I also told you I told you how to change it if necessary. And how to determine si it is necessary!)"

Now, as I said in a different context, I can't tell you the exact details of making these settings in each of the various routers on the market. But here's what I had to do. I have a Netgear DG834G, and it was delightfully easy to set up... or I just got lucky!

I logged into the router's administration pages. (They are a little website in their own right. The router is a webpage server while you are changing its settings.)

I clicked on "Firewall Rules" in the menu.

I added an inbound service, using the pre-defined "HTTP/TCP" type of service, made it "Allow Always", and told the router "Send to LAN Server 192.168.240". (It isn't set up quite like that now. Don't worry if you've noticed.)

And I said "Allow any WAN users to use this inbound service". (WAN: Wide Area Network, i.e. "the internet".)

My system was already set up... in the router's firewall, anyway... to allow any outbound services, to anyone.

Don't forget that with many routers, you have to save your settings and re-boot the router after making changes before it will be operating according to the new rules.

And that was it... for the simple case of adding an Arduino as a server on a LAN which didn't already have a computer providing services to the internet.... which may well be the case you are dealing with. (If it isn't, you would know. Don't worry if you are, say, participating in the World Community Grid's distributed processing initiative... you don't have a "server" to do that. (Highly recommended, by the way, if you are an altruistic person. No cost to you, if you leave your computer on from time to time. The grid helps with various projects. Some pursue scientific developments, others support humanitarian causes, others help foster technological breakthroughs.)

"Tiny diversion": What is this "port 81" business?

Many of you won't need to worry in detail about the next thing I'm going to talk about, but at least skim this material.

"The standard" web page serving service operates over "port 80". You don't have to worry too much about "ports". They are another part of the designation of the channel though which "stuff" flows through your router going to, or coming from, the internet. For simple "webpage" type "stuff", the port is 80. You don't have to do anything with it, or about it, if your Arduino is the only server on your LAN.

However, if you déjà avoir un autre web page server on your LAN, and you don't want to kick that (hopefully) sleeping dog, ports are your salvation. And those of you with sharp eyes will have spotted something odd about my Arduino web server which arises from the fact that I did have such a server, which I did not want to disturb. It is shown on the big diagram as "Other Local Server". Il est local, as it is on the same LAN as the Arduino. It is not limited to portion locally, however. It serves up my FarWatch page to anyone, from any place in the world, who comes visiting. (And if anyone on the ISS is connected to the WWW, he or she can see the weather and some photos from my FarWatched premises from someplace au-delà the world.... but I won't worry if little of my traffic is extra-terrestrial.)

So- what did the sharp eyed among you see?

To access my Arduino, when it is online, you enter the following into your browser....

http://mon7nc.dyndns.org:81

The ":81" at the end is a little unusual, isn't it? It tells my router, when the request arrives, "Don't send this to the usual place for HTTP (port 80), send it to the local computer you've been told to use for HTTP requests over port 81".

If you can't get into my ArduServer like that, try...

http://mon7nc.dyndns.org

... which devrait take you to my FarWatch server. (If you get in, you'll see a graph, and if you scroll down, some CCTV images.)

If you faire get into FarWatch, but ne pas get into my ArduServer, it probably means that somewhere at your site, access to non-standard ports is blocked. If you don't get into either site, my connection to the internet may be down. Rare, but it happens.

Going back to "add :81".... that is all the "extra" stuff that users of pages served by my site need to know, to fetch pages from my ArduServer without getting instead stuff from my pre-existing autre web server on http://mon7nc.dyndns.org. What, as the server managers, do you and I have to do, so that the requests for the Arduino go to it?

First, you have to make two changes in the Arduino program listed above. You have to change the line...

#define myport 80

You make it say 81, if you want to use port 81. And you have to add ":81" (or whatever port you are using) to the line that says something like....

q-fix - -the "yoururl.dyndns.org" needs better explaining... all(?) avail so far is in the preface to the big code listing... I think more has been added now.- ->

static char baseurl[]="http://YourUrl.dyndns.org/";

... and make it...

static char baseurl[]="http://YourUrl.dyndns.org:81/";

(Of course, in your case that line will have something different in place of "YourUrl.dyndns.ord". Just follow the pattern, which I've tried to make clear.)

Recompile the code, re-upload it to your Arduino. Simples!

You may well find that you are already able to see your Arduino served pages via 192.168.0.240:81 if you try to access them across your LAN. (But even that simple exercise may be blocked by your PC's anti-malware settings. Try to access the page over your LAN... and look at your anti-malware settings (besides other things) if you don't succeed.)

However, for the outside world to "see" your pages across port 81, not only do they need to add the ":81" to the URL, but you need to give your router some instructions.

In my NetGear router, it was as simple as going to "Services", and adding a new "custom service". I called it "Ardu", made it of type "TCP", set the start port to 81 and the end port to 81.

I then went to the same "Firewall rules" as discussed previously, and added a new inbound service rule saying that service "Ardu" should always be allowed, and that its traffic should be sent to LAN server 192.168.0.240.

->


The Complete Sourcecode

The sourcecode for the finished ArduSimpSrv is hosted on its own page. You just copy and paste from that page to your Arduino compiler/ uploader.


I hope that was useful...

I hope that was useful. Let me know if there are areas which weren't adequately explained? Let me know what "Gotchas" got you?

(I also hope that not too many people read this page before the link to the complete sourcecode was inserted! Sorry!)


<!--PLTut footer, ver 23 June 2007 begins here.
Mostly from SS/plt1aa, but Freefind code replaced to be SG friendly

Include something like....

Or return to the index of Pascal tutorials for another one!

... just before footer.-->

Search for other things...

Please note that I have two other sites, and that the following search will not include them. They have their own search buttons.

My Sheepdog Guides site.

My Arunet site.

Site Map

What's New


Chercher

The search engine merely looks for the words you type, so....

*    Spell them properly.

*    Don't bother with "How do I get rich?" That will merely return pages with "how", "do", "I"....

Vous pouvez également search this site without using forms.


Ad from page's editor: Yes.. I do enjoy
compiling these things for you... hope they are helpful. However..
this doesn't pay my bills!!! If you find this stuff useful, (and you
run an MS-DOS or Windows PC) please visit my freeware and shareware
page, download something, and circulate it for me? Links on your page
to this page would also be appreciated!



Cliquez ici
to visit editor's freeware, shareware page.

Want a site hosted, or email? You can also help me if you sign up via this link to 1&1's services. (I wouldn't recommend them unless I was happy after several years as one of their customers, but yes, they do pay me if you use this link! As do the Google advertisers, about whom I know nothing, of course.)





Valid HTML 4.01 Transitional

Page tested for compliance with INDUSTRY (not MS-only) standards, using the free, publicly accessible validator at validator.w3.org

CSS behind the page checked, at least once upon a time!, with http://jigsaw.w3.org/css-validator/

Why does this page cause a script to run? Because of the Google panels, and the code for the search button. Also, I have some of my pages' traffic monitored for me by eXTReMe tracker. They offer a free tracker. If you want to try one, check out their site. Why do I mention the script? Be sure you know all you need to about spyware.


Editor's Main Homepage


How to email or write this page's editor, Tom Boyd

....... P a g e . . . E n d s .....

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.