Stap 4: Node.js Server
Hier zijn de belangrijkste taken van de server:
- Initialiseren van de seriële poort en opstarten van de Arduino
- Een HTTP-server starten
- Dienen de index.html pagina (en alle statische pagina's van "/")
- Reageren op de AJAX POST te "/ start" door het leveren van de gegevens aan de Arduino via de seriële poort-object
- Registreer een callback om te luisteren naar de Arduino voor voltooiing
- Ontvangen en het pakket van de gegevens van de Arduino in een JSON-object en stuur het naar de client via socket.io
Dit alles gebeurt in een honderdtal coderegels dankzij bestaande npm modules. De server accepteert een bevel-lijn parameter, de naam van de seriële poort (/ dev/tty * op mac/unix, en COM * op Vensters).
[Waarschuwing: dit is mijn eerste keer met behulp van de serialPort -pakket. Ik had geen problemen, maar ik heb dat gevoel van echt te begrijpen het nog, dat maakt me ongemakkelijk. De debug console heeft soms rare tekens in wanneer de laarzen van de Arduino. Dit kan worden veroorzaakt door de TTY niet wordt leeggemaakt, of dit kan worden veroorzaakt door iets wat die ik niet begrijp over de timing van de seriële poort. Laat het me weten als je problemen hebt.]
Voordat server.js de HTTP-service met de Express app luisteraar begint, initialiseert het de seriële poort, geleverd door het eerste argument in de opdrachtregel. Er moet een timeout van de drie seconden wachten voor het apparaat te starten. Ik voegde aanvullende preventieve maatregelen om te wachten op de "geïnitialiseerde" tekenreeks van de Arduino voordat de gebruiker gegevens kan verzenden.
Client Server Communication
Er zijn slechts twee eindpunten blootgesteld door de server, POST naar "/ start" en krijgen van "/".
De Client Server gesprek via AJAX wordt afgehandeld door een formidabele formulierobject. Het eindpunt van de app Express "localhost8080 / start" vangt de POST transmissie via het form-object, die Native JSON tekstobject komt. Ik hoef echt niet een object, ik kon een tekenreeks gebruikt hebben, maar verliet ik enige flexibiliteit. Ik niet zelfs het registreren van een retouraanroep van de .on() met de POST-object, ik gewoon verwijzen naar de parameter "velden" tijdens het gesprek parse() .
De index.html -pagina wordt geserveerd met behulp van de Express statische pagina server module. Alles in de public / map kan worden geserveerd op die manier, met inbegrip van de CSS- en JS-modules.
Server de mededeling van de Arduino
Aangezien de client reeds de opdrachtreeks opgemaakt, de server gewoon schrijft u deze naar de seriële poort als- serialport.write() via het analyzer -object wordt gebruikt.
Arduino aan communicatie met de Server
De reactie van de Arduino gaat op de seriële poort .on('data') terugbellen in het analyzer -object
Server aan communicatie met de klant
De terugbeloproep van de gegevens beheert ook de verpakking van de gegevens in een JSON-object en het afvuren van het terug naar de client via een socket.io push. (Dit is allemaal heel spannend en verfrissende t.o.v. doen web duw terug in de late 1990 's!)
Ik heb toegevoegd sommige opdrachten logboek zodat ik de gegevensstromen van zowel de client als de Arduino kijken kan. Ik ook gebruik maken van de morgan -pakket te traceren van de HTTP-verzoeken.