JavaScript - node + express(MQTT・定時処理)- MQTT


 クラウディア


1. 概要
2. インストール
3. 自己疎通
4. 複数のトピックを待ち受ける
5. SSH
6. 参考サイト

1. 概要

 稼働中の「node + express」に、「MQTT」の処理を組み込みたかったのです。

2. インストール

 プロジェクトの管理者権限で、プロジェクトのドキュメントルートで。

npm install mqtt

3. 自己疎通

 自装置内で、「mosquitto」を実行している状態で。  下記の「server.js」を記述します。  (シングルコーテーションとアポストロフィを間違えないように)

const express = require('express');
const mqtt = require('mqtt');

const app = express();
const port = 3000;

// MQTT ブローカーに接続
const client = mqtt.connect('mqtt://localhost');

client.on('connect', () => {
  console.log('MQTT connected');
  client.subscribe('my/topic', (err) => {
    if (!err) console.log('Subscribed to my/topic');
  });
});

// メッセージ受信
client.on('message', (topic, message) => {
  console.log('Received message on ${topic}: ${message.toString()}');
});

app.listen(port, () => {
  console.log('Express app listening at http://localhost:${port}/');
});

// Express ルートから MQTT 発行
app.get('/publish', (req, res) => {
  const msg = req.query.msg || 'Hello MQTT';
  client.publish('my/topic', msg);
  res.send('Published message: ${msg}');
});
 コンソールから。

node server.js
 すると、コンソールに下記が表示されます。

Express app listening at http://localhost:3000/
MQTT connected
Subscribed to my/topic
 ブラウザから下記の「URL」にアクセスすると。

http://hogehoge_server:3000/publish?msg=Hello
 ブラウザに下記が表示され。

 コンソール上に下記が表示されます。


Received message on my/topic: Hello

4. 複数のトピックを待ち受ける

 前項で、複数のトピックを待ち受けるには。

const topics = ['topic/one', 'topic/two', 'topic/three'];

client.subscribe(topics, (err, granted) => {
  if (err) {
    console.error('Subscribe error:', err);
  } else {
    console.log('Subscribed to topics:', granted.map(g => g.topic).join(', '));
  }
});
 と書けば、「topic/one」「topic/two」「topic/three」を一度に待ち受けることができます。  下記ならば、「topic/」以下の単階層をすべて待ち受けます。

client.subscribe('topic/+', (err) => {
  if (!err) console.log('Subscribed to topic/+');
});
 下記ならば、「topic/」以下の全階層を待ち受けます。

client.subscribe('topic/#', (err) => {
  if (!err) console.log('Subscribed to topic/#');
});

5. SSH

 「mosquitto」が、「SSH」で証明書を必要とする場合。  クライアント鍵、クライアント「CSR」、認証局鍵がそれぞれ。

/path/to/client.key
/path/to/client.crt
/path/to/ca.crt
 に置いてあって、パーミッションを適切に設定していれば、接続時に。

const fs = require('fs');
const mqtt = require('mqtt');

const client = mqtt.connect('mqtts://localhost:8883', {
  key: fs.readFileSync('/path/to/client.key'),
  cert: fs.readFileSync('/path/to/client.crt'),
  ca: fs.readFileSync('/path/to/ca.crt'),
});
 と記述することで、うまく接続できます。

6. 参考サイト

 本ページは、「ChatGPT」軍曹を参考にさせていただきました。

EaseUS
AbemaTV 無料体験