Raspberry Pi NodeJS Server Sensor Application
Raspberry Pi NodeJS Server Sensor Application
Server Side ( RPI ) :
$ node webserver.js
Client Side :
192.168.0.2:8080 in a web browser.
www/index.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>RPI Node Js Sensor App </title>
</head>
<body>
<!--=================================================================-->
<!-- DISPLAYS -->
<!--=================================================================-->
<script>
display_log=function(msg)
{
var logArea = 0;
if(!logArea)
{ logArea=document.getElementById("log"); }
if(msg==null)
{ logArea.textContent='';}
else { logArea.textContent+=msg+'\n'; }
};
</script>
<script src="gauge.js"></script>
<!--=================================================================-->
<!-- WEBSOCKET SCRIPT -->
<!--=================================================================-->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
<script type="text/javascript" charset="utf-8">
var socket=io();
socket = io.connect('http://' + document.domain + ':' + location.port);
<!----------------------------------------------------------------->
socket.on('connect', function() {
console.log('Websocket connected!');
});
<!----------------------------------------------------------------->
// listen to the event
socket.on('mess_from_server', function(msg) {
console.log(msg);
display_log("pressure = "+msg.pressure + " temperature = "+msg.temperature) ;
var gauge=new Gauge('gauge');
gauge.draw(msg.pressure);
});
<!----------------------------------------------------------------->
function start() {
console.log('start...');
nbr_meas = document.getElementById("nbr_meas");
socket.emit('create', {iterations: parseInt(nbr_meas.value)});
}
</script>
<!--=================================================================-->
<!-- AJAX REQUEST FOR LED CONTROL -->
<!--=================================================================-->
<script>
function do_onclick(led, label)
{
var xmlhttp=new XMLHttpRequest();
// register callback : function to be called when we receive the response
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
label.innerHTML=xmlhttp.responseText;
}
}
// send request and poll for asynchronous response
xmlhttp.open("GET","switch_led/?gpio4="+led.checked,true)
xmlhttp.send();
}
</script>
<!--=================================================================-->
<!-- INIT -->
<!--=================================================================-->
<script>
window.onload = function() {
var led=document.getElementById("tLed");
var label=document.getElementById("tLedLabel");
led.checked=false;
do_onclick(led, label);
};
</script>
<!--=================================================================-->
<!-- HTML -->
<!--=================================================================-->
<p>[<a href="/">home</a>]</p>
<hr> <!---------------------------------------------------------------->
<h2>Control GPIO4 LED</h2>
<table>
<tr>
<td >
<h3>Static Part :</h3>
Control GPIO4 led <input type="checkbox" id="tLed" onclick="do_onclick(this, document.getElementById('tLedLabel'))">
</td>
<td>
<span id="tLedLabel"> GPIO4 led turned off</span>
</td>
</tr>
</table>
<hr> <!---------------------------------------------------------------->
<h2>Get Measured Datas through Websocket</h2>
<table>
<tr>
<td >
<strong> Number of Measurements : </strong><br/>
<input type="text" id="nbr_meas"/> <br/>
<button onclick="start()">Start</button>
</td>
<td>
<h3> Pressure Measurement </h3>
<div >
<canvas id="gauge" width="170" height="170"></canvas>
</div>
</td>
</tr>
</table>
<p><b>Log:</b></p>
<p></p><pre id="log"></pre><p></p>
<hr> <!---------------------------------------------------------------->
</body>
</html>
<!--=================================================================-->
webserver.js
express = require('express');
var app = express();
var http = require('http').Server(app);
var fs = require('fs');
var io = require('socket.io')(http)
var Gpio = require('onoff').Gpio;
var LED = new Gpio(4, 'out');
var url = require('url');
const imu = require("node-sense-hat").Imu;
const IMU = new imu.IMU();
//======================================================================
app.set('views', __dirname + '/views')
app.set('view engine', 'jade')
app.use(express.static(__dirname + '/www'))
//======================================================================
http.listen(8080); //listen to port 8080
//======================================================================
// SERVE INDEX
//======================================================================
app.get("/", function(req, res) {
res.setHeader('Content-type', 'text/xml');
res.sendFile('index.html');
})
//======================================================================
app.get('/index.html', function (req, res) {
res.sendFile( __dirname + "/" + "index.html" );
})
//======================================================================
// SWITCH LED
//======================================================================
app.get("/switch_led/", function(req, res) {
var q = url.parse(req.url, true);
var query = q.query;
var ledS="OFF";
if( query.gpio4 == 'true' )
{
console.log("query true");
LED.writeSync(1);
ledS="ON";
}
else
{
LED.writeSync(0);
console.log("query false");
ledS="OFF";
}
var date = new Date();
res.setHeader('Content-type', 'text/xml');
res.render('ajax_led_response', {ledS: ledS, time: date});
})
//======================================================================
// Get Pressure and Temperature Measurements with Websocket
//======================================================================
io.sockets.on('connect', function (socket) {// WebSocket Connection
var it = 0;
socket.on('create', function(data) {
it =data['iterations'];
if (it) {
console.log(it);
var sleep = require('system-sleep');
for(var i=0 ; i < it ; i++)
{
IMU.getValue((err, data) => {
if (err !== null) {
console.error("Could not read sensor data: ", err);
return;
}
console.log("Accelleration is: ", JSON.stringify(data.accel, null, " "));
console.log("Gyroscope is: ", JSON.stringify(data.gyro, null, " "));
console.log("Compass is: ", JSON.stringify(data.compass, null, " "));
console.log("Fusion data is: ", JSON.stringify(data.fusionPose, null, " "));
console.log("Temp is: ", data.temperature);
console.log("Pressure is: ", data.pressure);
console.log("Humidity is: ", data.humidity);
socket.emit('mess_from_server', {'pressure': Number(data.pressure.toFixed(2)), 'temperature' : Number( data.temperature.toFixed(2))});
});
sleep(1000); // 1 second
}
}
});
});
//======================================================================
process.on('SIGINT', function () { //on ctrl+c
LED.writeSync(0); // Turn LED off
LED.unexport(); // Unexport LED GPIO to free resources
process.exit(); //exit completely
});
//======================================================================