2020年8月20日木曜日

【Node.js】webサーバを作る

どうもcaketetuです。
相変わらず家の自動化プロジェクトを進めております。今回はIoTで大活躍するNode.jsを
使ってRaspberry Pi上にWEBサーバーを作ります。テンプレートエンジンにEJS、フレームワークとしてExpressを使用しますが、ジェネレータは使用せずに作ります。

Node.jsの導入は省略。

Expressではファイルやデータの場所が決まっているようです。適当な場所にディレクトリを作り、以下のようにファイルを配置します。

Home---views---index.ejs     ←WEBページ(HTML)
          |
            ---app.js ←プログラム本体(javascript)

ディレクトリ内にいる状態で以下コマンドでExpressをインストールします。
$ npm init
$ npm install express --save

とりあえずWEBページを表示するプログラムは以下の通りです。

app.js
//モジュールオブジェクトの初期化
var express = require('express');       
var app = express();
var http = require('http').Server(app);

//サーバー実装の前に、エラーハンドリングを記載
process.on('uncaughtException', function(err) {
    console.log(err);
  });

//テンプレートエンジンの指定
app.set("view engine", "ejs");

//ルーティング
app.get('/', (req, res)=> { res.render('index'); });

//3000番ポートで待ち受けてサーバー開始
http.listen(3000, function () {
    console.log("Start server at port:3000...");
});
index.ejs
<!DOCTYPE html><html>
    <head>
        <title>Home Ctrl</title>
    </head>
    <body>
        <h1>My Home Automation</h1s>
    </body>
</html>

アプリの実行は以下コマンドです。
$ node app

http://IPアドレス:ポート でWEBブラウザからアクセスできます。


これだけではまだ何もできませんのでSocket.IOでブラウザ経由でRaspberry Piに指示を
出せるようにしてみます。
$ npm install socket.io --save

index.ejs
<!DOCTYPE html><html>
    <head>
        <title>Home Ctrl</title>
    </head>
    <body>
        <script src="/socket.io/socket.io.js"></script>
        <script type="text/javascript">
            var socket = io.connect('http://アドレス:3000');
            function send_msg(cmd) {
                socket.emit("light", cmd);
            }
        </script>
        <h1>My Home Automation</h1>
        <button type="button" onClick="send_msg('living')">Living</button>
        <button type="button" onClick="send_msg('entrance')">Entrance</button>
    </body>
</html>
app.js
//モジュールオブジェクトの初期化
var express = require('express');       
var app = express();
var http = require('http').Server(app);
const io = require('socket.io')(http);          //Socket.io

//サーバー実装の前に、エラーハンドリングを記載します。
process.on('uncaughtException', function(err) {
    console.log(err);
  });

//テンプレートエンジンの指定s
app.set("view engine", "ejs");

//ルーティング
app.get('/', (req, res)=> { res.render('index'); });

//3000番ポートで待ち受けてサーバー開始
http.listen(3000, function () {
    console.log("Start server at port:3000...");
});

//********************************************************** */
//    SocketIOリクエスト処理
//********************************************************** */
io.sockets.on("connection", function (socket) {
    //=====照明コントロール=====
    socket.on("light", function (msg) {
        console.log(msg);
    });
});

socket.emitでデータ送信socket.onでデータ受信します。これでボタンをブラウザの
ボタンを押してRaspberry pi に指示を出したり、Raspberry pi からセンサデータ
を受け取ったりできるようになります。



今回は以上です。ウェブブラウザベースで作ることでパソコンからもスマホからも同じようにアクセスできるようになります。



0 件のコメント:

コメントを投稿