RESTful API und JSON mit Node.js

Die Programmierung der App machte es aus meiner Sicht erforderlich eine Client-Server Kommunikation zwischen Smartphone und Raspberry Pi aufzubauen. Nach einiger Recherche bin ich auf das Thema RESTful API und JSON gestoßen. Damit findet zwischen Smartphone und Raspberry Pi eine Kommunikation über HTTP und den normalen Request Methoden GET / POST statt. Durch das Aufrufen einer URL ist es somit möglich als Antwort ein JSON-Paket vom Server zum Client zu senden. Wie das Ganze aussieht beschreibe ich im folgenden Blog-Post. Auch die Frage "Wie kann ich via HTTP Request ein Script auf dem Raspberry Pi ausführen?" werde ich in dem Artikel beantworten.

Was wir an dieser Stelle benötigen ist folgendes:

  1. Node.js
  2. Express

 1. Node.js


curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
sudo apt-get install -y nodejs npm
sudo apt-get install -y build-essential

 2. Express

 

An dieser Stelle werden wir uns erst einmal ein Verzeichnis erstellen, das später unser Working-Directory sein wird. Anschließend legen wir initial ein JSON package an (siehe "npm init"), damit beschäftigen wir uns allerdings an dieser Stelle nicht weiter. Wer weitere Informationen benötigt, kann hier nachschauen. Durch den Dialog, der dann erscheint, kann man einige Parameter angeben, oder einfach default-Parameter belassen. Abschließend installieren wir Express.


cd ~
sudo mkdir working/myapp
cd working/myapp

npm init

npm install express --save

So, Node.js und Express sind installiert und warten auf ihren Einsatz.

Bei mir sieht es in meinem Ordner wie in diesem Beispiel aus. Dort sind noch einige andere Ordner enthalten die ich nachher noch erklären werden.

Das Ganze funktioniert jetzt so, bzw. kommen wir an Ende des Blogs dorthin: 

Über einen URL-Aufruf vom Client aus über einen definierten Port, wird im Hintergrund auf dem Server ein Script ausgeführt und als Rückgabe erhalten wir ein JSON-Objekt, mit dem wir später arbeiten können.

Um genau zu dieser Ausgabe zu kommen, benötigen wir natürlich serverseitig die Möglichkeit Request entgegen zunehmen und Events auszuführen. Dies geschieht in "myserver.js".


#!/usr/bin/env node

var http = require('http');
var express = require('express');
var exec = require('child_process').exec;
var querystring = require("querystring");
var app = require('express')();
var server = require('http').createServer(app);

server.listen(3000);
console.log('Server listening on Port:3000');
app.use(express['static'](__dirname ));

app.get('/scripts/online', function(req, res, next) {
  var child = exec('bash /home/pi/working/myapp/scripts/online/onlinestatus.sh', function(err, stdout, stderr) {
      res.setHeader('Content-Type', 'application/json');
      if(err) return next(err);
      else res.status(200).send(JSON.stringify(stdout));
      console.log(stdout);
  });
});

// Express route for any other unrecognised incoming requests
app.get('*', function(req, res) {
  res.status(404).send('Unrecognised API call');
});

// Express route to handle errors
app.use(function(err, req, res, next) {
  if (req.xhr) {
    res.status(500).send('Oops, Something went wrong!');
  } else {
    next(err);
  }
});

Wie ihr sehen könnt, wird durch den URL-Aufruf ".../scripts/online" ein Script ausgeführt.


cd ~
cd working/myapp
sudo mkdir scripts/online

Anschließend erstellen wir uns noch das Bash-Script "onlinestatus.sh".

 

onlinestatus.sh


#!/bin/bash
# Program name: onlinestatus.sh

datum=$(date +"%d-%m-%Y %T")
IP="192.168.178.25"

echo '{"id":"'"$IP"'","Zeit":"'"$datum"'","Text":"'"Raspberry online"'"}'
echo '{"id":"'"$IP"'","Zeit":"'"$datum"'","Text":"'"Raspberry online"'"}' | python -m json.tool >> /home/pi/working/myapp/scripts/online/onlinestatus.json

So, das sollte es auch schon gewesen sein. Damit habt ihr jetzt die Möglichkeit über "curl" die erste Ausgabe zu testen, die dann so aussehen sollte, wie ich es euch am Anfang schon gezeigt habe. 

 

"myserver.js"  kann natürlich beliebig erweitert und angepasst werden. Ich schalte damit zum Beispiel BLE (Bluetooth Low Energy) Heizthermostate oder lese Flower Power - Pflanzendaten aus.

Ich empfehle euch noch das Verankern des REST Services im "crontab"  falls das Ganze einmal ausfällt, erneut gestartet wird.


@reboot cd ~ && cd working/myapp/ && sudo node myserver.js
* * * * * cd ~ && cd working/myapp/ && sudo node myserver.js

Kommentar schreiben

Kommentare: 1
  • #1

    Florian (Mittwoch, 21 November 2018 08:15)

    Wirklich sehr gut geschriebener Blog
    Gefällt mir :)
    Lg