środa, 26 lutego 2020

Som Labs - IMx6 ULL - Debian - Serwer HTTP, TCP NodeJs

W tym wpisie chciałbym opisać sposób przygotowania NodeJs.
Znalezione obrazy dla zapytania som labs 6ull
[Źródło: https://somlabs.com/product/visionsom-6ull/]

Instalacja


Tutaj polecam artykuł umieszczony na forum sunduino link. Autor wyjaśnia w nim jak w prosty sposób zainstalować najnowszą wersję NodeJs na modułach Som. O ile z samym NodeJs nie ma problemów jeśli chodzi o instalację oraz obsługę to instalator pakietów npm nie chce współpracować z najnowszą zainstalowaną wersją środowiska Node. Co oznacza, że instalacja pakietów jest niemożliwa.

Poniżej wklejam krótki opis komend do wprowadzenia w konsoli:

  1. apt update - aktualizacja
  2. apt install curl - narzędzie do przesyłania danych ze składnia URL
  3. curl -sL https://deb.nodesource.com/setup_10.x -o nodesource_setup.sh - pobranie pakietów źródłowych
  4. bash nodesource_setup.sh - uruchomienie skrypt, który pobierze potrzebne pakiety
  5. apt install nodejs - instalacja nodejs oraz npm
  6. Po instalacji można już sprawdzić wersję nodejs oraz npm:
  7. nodejs -v
  8. npm -v

Przykładowe aplikację:


Poniżej przykładowe aplikacje dla serwera HTTP. Są to lekko zmodyfikowane programy umieszczone na stronie mikrokontrolery.pl link.

Uruchomienie podstawowego serwera HTTP:

Podstawowy serwer http NodeJs:

  1. var http = require ('http');            //Import biblioteki
  2. var PORT = 80;                          //Port
  3. //Stworzenie serwera, uruchomienie nasłuchiwania
  4. var server = http.createServer (function handler (request, response) {
  5.   response.writeHead (200, {'Content-Type': 'text/plain'});
  6.   response.end ('Hello World!');
  7. }).listen (PORT);

Gdy zostanie podany numer portu jako 80 to w przeglądarce internetowej wystarczy wpisać adres IP urządzenia. Gdy natomiast zostanie podana inna wartość np. 3000. To należy ją wpisać podczas otwierania strony np. 192.168.2.10:3000.

Uruchomienie serwera HTTP z obsługą plików html:

  1. var http = require ('http');
  2. var fs = require ('fs');
  3. var index = fs.readFileSync (__dirname + '/index/index.html');
  4. var PORT = 8080;
  5. var server = http.createServer (function handler (request, response) {
  6.   response.writeHead (200, {'Content-Type': 'text/html'});
  7.   response.end (index);
  8. }).listen(PORT);

Dane wyświetlane na stronie umieszczone w pliku index.html:

  1. <!DOCTYPE html>
  2. <html>
  3.   <head>
  4.   </head>
  5.   <body>
  6.     <h1>Serwer Dziala</h1>
  7.   </body>
  8. </html>

W przypadku nagłego wyłączenia programu można skorzystać z narzędzia netstat:

  1. apt-get install net-tools

Po zainstalowaniu należy wpisać:

  1. netstat -nlp | grep :<PORT>

Pozwoli to na wyświetlenie który proces blokuje port wykorzystywany przez przygotowany program testowy:

  1. tcp  0  0 0.0.0.0:<PORT>  0.0.0.0:*  LISTEN  1073/node

Teraz w celu zabicia procesu należy wpisać:

  1. kill 1073

Jeśli podane polecenie nie zadziała to należy ustawić odpowiednią flagę (SIGKILL):

  1. kill -9 1073

Obsługa strony internetowej z wykorzystaniem biblioteki socket.io. Pozwala ona na przygotowanie strony, która zmienia się w czasie rzeczywistym bez konieczności przeładowania całości.

Instalacja biblioteki odbywa się po wprowadzeniu następującej komendy:

  1. npm install socket.io

Po zainstalowaniu biblioteki można przejść do obsługi następującego przykładu.

Plik js:

  1. var http = require('http');
  2. var fs = require('fs');
  3. var index = fs.readFileSync(__dirname + '/index/index.html');
  4. var PORT = 8080;
  5. var counterVal = 0;
  6. var app = http.createServer(function(req, res) {
  7.     res.writeHead(200, {'Content-Type': 'text/html'});
  8.     res.end(index);
  9. });
  10. var io = require('socket.io').listen(app);
  11. function sendTime() {
  12.     counterVal++;
  13.     io.emit('time', { time: counterVal + ' - ' +  new Date().toJSON()});
  14. }
  15. setInterval(sendTime, 1000);
  16. io.on('connection', function(socket) {
  17.     socket.emit('welcome', { message: 'Welcome!', id: socket.id });
  18.     socket.on('client', console.log);
  19. });
  20. app.listen(PORT, () => console.log('HTTP server with socket.io'));
  21. process.on('SIGTERM', () => {
  22.   console.info('SIGTERM RECEIVED');
  23.   console.log('Closing http server');
  24.   server.close(() => {
  25.   });
  26. });

W powyższym przykładzie tworzony jest server TCP wraz z przesyłaniem danych z aktualnym czasem oraz numerem przesłanej wiadomości w sesji.

Ostatnia część pozwala na wyłączenie serwera. Dzięki temu wykorzystywany port nie będzie blokowany.

Plik HTML:

  1. <!DOCTYPE HTML>
  2. <html>
  3.     <head>
  4.         <script src='/socket.io/socket.io.js'></script>
  5.         <script>
  6.             var socket = io();
  7.             socket.on('welcome', function(data) {
  8.                 addMessage(data.message);
  9.                 socket.emit('client', {data: 'Client', id: data.id});
  10.             });
  11.             socket.on('time', function(data) {
  12.                 addMessage(data.time);
  13.             });
  14.             socket.on('error', console.error.bind(console));
  15.             socket.on('message', console.log.bind(console));
  16.             function addMessage(message) {
  17.                 var text = document.createTextNode(message),
  18.                     el = document.createElement('li'),
  19.                     messages = document.getElementById('messages');
  20.                 el.appendChild(text);
  21.                 messages.appendChild(el);
  22.             }
  23.         </script>
  24.     </head>
  25.     <body>
  26.         <ul id='messages'></ul>
  27.     </body>
  28. </html>

W kolejnym przykładzie opiszę sposób przygotowania prostej aplikacji służącej jako serwer TCP:

  1. const net = require('net');
  2. var PORT = 1001;
  3. net.createServer(socket => {
  4.         socket.on('data', function(data){
  5.                 console.log('Receive: %s', data.toString())
  6.                 socket.write(data.toString())
  7.         })
  8. }).listen(PORT);

Sprawdzenie działania można wykonać np. za pomocą programu Herkules:


W terminalu wyświetlą się następujące komunikaty:


Poniżej bardziej rozbudowany przykład serwera TCP:

  1. const net = require('net');
  2. const PORT = 1001;
  3. const server = net.createServer();
  4. var counter = 0;
  5. console.log('Server on Port: ' + PORT);
  6. process.on('uncaughtException', e => {
  7.     if (e.code !== 'ECONNRESET') {
  8.         console.log(e);
  9.     }
  10. });
  11. server.on('listening', () => {
  12.   console.log('Server listening');
  13. })
  14. server.on('connection', socket => {
  15.   console.info('new client');
  16.   socket.on('data', message => {
  17.     const receivedData = message.toString('utf8');
  18.     console.info(`receive ${message.length} bytes, [${receivedData}]`);
  19.     if (receivedData === 'temp') {
  20.         socket.write('temp:23.6;hum:56%');
  21.     }
  22.     else if (receivedData === 'time')
  23.     {
  24.         socket.write(new Date().toString());
  25.     }
  26.     else if (receivedData === 'counter')
  27.     {
  28.         counter++;
  29.         socket.write(counter.toString());
  30.     }
  31.     else {
  32.         socket.write('===>' + receivedData);
  33.     }
  34.   });
  35.   socket.on('end', () => {
  36.     console.info('disconnect from client');
  37.   });
  38.   socket.on('close', () => {
  39.     console.info('socket close');
  40.   });
  41.   socket.on('timeout', () => {
  42.     console.error('socket timeout');
  43.   });
  44.   socket.write(`Connected on port: ${PORT}, Socket_remote_add: ${socket.remoteA$
  45. });
  46. server.on('error', err => {
  47.   console.error('Server error', err);
  48. });
  49. server.on('close', () => {
  50.   console.log('Server shutdown');
  51. });
  52. server.listen(PORT);