[Ź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:
- apt update - aktualizacja
- apt install curl - narzędzie do przesyłania danych ze składnia URL
- curl -sL https://deb.nodesource.com/setup_10.x -o nodesource_setup.sh - pobranie pakietów źródłowych
- bash nodesource_setup.sh - uruchomienie skrypt, który pobierze potrzebne pakiety
- apt install nodejs - instalacja nodejs oraz npm
- Po instalacji można już sprawdzić wersję nodejs oraz npm:
- nodejs -v
- 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:
- var http = require ('http'); //Import biblioteki
- var PORT = 80; //Port
- //Stworzenie serwera, uruchomienie nasłuchiwania
- var server = http.createServer (function handler (request, response) {
- response.writeHead (200, {'Content-Type': 'text/plain'});
- response.end ('Hello World!');
- }).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:
- var http = require ('http');
- var fs = require ('fs');
- var index = fs.readFileSync (__dirname + '/index/index.html');
- var PORT = 8080;
- var server = http.createServer (function handler (request, response) {
- response.writeHead (200, {'Content-Type': 'text/html'});
- response.end (index);
- }).listen(PORT);
Dane wyświetlane na stronie umieszczone w pliku index.html:
- <!DOCTYPE html>
- <html>
- <head>
- </head>
- <body>
- <h1>Serwer Dziala</h1>
- </body>
- </html>
W przypadku nagłego wyłączenia programu można skorzystać z narzędzia netstat:
- apt-get install net-tools
Po zainstalowaniu należy wpisać:
- netstat -nlp | grep :<PORT>
Pozwoli to na wyświetlenie który proces blokuje port wykorzystywany przez przygotowany program testowy:
- tcp 0 0 0.0.0.0:<PORT> 0.0.0.0:* LISTEN 1073/node
Teraz w celu zabicia procesu należy wpisać:
- kill 1073
Jeśli podane polecenie nie zadziała to należy ustawić odpowiednią flagę (SIGKILL):
- 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:
- npm install socket.io
Po zainstalowaniu biblioteki można przejść do obsługi następującego przykładu.
Plik js:
- var http = require('http');
- var fs = require('fs');
- var index = fs.readFileSync(__dirname + '/index/index.html');
- var PORT = 8080;
- var counterVal = 0;
- var app = http.createServer(function(req, res) {
- res.writeHead(200, {'Content-Type': 'text/html'});
- res.end(index);
- });
- var io = require('socket.io').listen(app);
- function sendTime() {
- counterVal++;
- io.emit('time', { time: counterVal + ' - ' + new Date().toJSON()});
- }
- setInterval(sendTime, 1000);
- io.on('connection', function(socket) {
- socket.emit('welcome', { message: 'Welcome!', id: socket.id });
- socket.on('client', console.log);
- });
- app.listen(PORT, () => console.log('HTTP server with socket.io'));
- process.on('SIGTERM', () => {
- console.info('SIGTERM RECEIVED');
- console.log('Closing http server');
- server.close(() => {
- });
- });
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:
- <!DOCTYPE HTML>
- <html>
- <head>
- <script src='/socket.io/socket.io.js'></script>
- <script>
- var socket = io();
- socket.on('welcome', function(data) {
- addMessage(data.message);
- socket.emit('client', {data: 'Client', id: data.id});
- });
- socket.on('time', function(data) {
- addMessage(data.time);
- });
- socket.on('error', console.error.bind(console));
- socket.on('message', console.log.bind(console));
- function addMessage(message) {
- var text = document.createTextNode(message),
- el = document.createElement('li'),
- messages = document.getElementById('messages');
- el.appendChild(text);
- messages.appendChild(el);
- }
- </script>
- </head>
- <body>
- <ul id='messages'></ul>
- </body>
- </html>
W kolejnym przykładzie opiszę sposób przygotowania prostej aplikacji służącej jako serwer TCP:
- const net = require('net');
- var PORT = 1001;
- net.createServer(socket => {
- socket.on('data', function(data){
- console.log('Receive: %s', data.toString())
- socket.write(data.toString())
- })
- }).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:
- const net = require('net');
- const PORT = 1001;
- const server = net.createServer();
- var counter = 0;
- console.log('Server on Port: ' + PORT);
- process.on('uncaughtException', e => {
- if (e.code !== 'ECONNRESET') {
- console.log(e);
- }
- });
- server.on('listening', () => {
- console.log('Server listening');
- })
- server.on('connection', socket => {
- console.info('new client');
- socket.on('data', message => {
- const receivedData = message.toString('utf8');
- console.info(`receive ${message.length} bytes, [${receivedData}]`);
- if (receivedData === 'temp') {
- socket.write('temp:23.6;hum:56%');
- }
- else if (receivedData === 'time')
- {
- socket.write(new Date().toString());
- }
- else if (receivedData === 'counter')
- {
- counter++;
- socket.write(counter.toString());
- }
- else {
- socket.write('===>' + receivedData);
- }
- });
- socket.on('end', () => {
- console.info('disconnect from client');
- });
- socket.on('close', () => {
- console.info('socket close');
- });
- socket.on('timeout', () => {
- console.error('socket timeout');
- });
- socket.write(`Connected on port: ${PORT}, Socket_remote_add: ${socket.remoteA$
- });
- server.on('error', err => {
- console.error('Server error', err);
- });
- server.on('close', () => {
- console.log('Server shutdown');
- });
- server.listen(PORT);