Node.jsで動くMQTTブローカーモジュールのAedesを試す
最近、MQTTのプロトコルを使いイントラネット下においてIoT機器と通信してデータを取得し、electronを使って可視化を行うということをしました。
その時に、MQTTブローカーをelectronの使ってるNode.js上で立てれたら楽だな思ったので、Node.jsのモジュールを探し、moscaというMQTTブローカーモジュールを見つけました。
しかし、このmosca
は2018年以降メンテナンスされておらず、require('mosca')
をするとmosca
の関連モジュールに起因するエラーが出る状態でした。
そこで、他に使えるモジュールがあるか調べていくとmoscaのgithubレポジトリのREADMEにしれっとPlease move to Aedes
と書いてあったので、このAedes
というモジュールを使うと無事にMQTTブローカーが立って通信できたので、今回そのAedesについて紹介していこうと思います。
MQTTの概用
おそらく、このページにたどりついてる方はMQTTについてよくご存知だとは思いますが、一応概用だけ説明させていただきます。
MQTTとはMessage Queue Telemetry Transport
の略で、Publish/Subscribe型の軽量でシンプルなメッセージプロトコルです。
1対多や多対多で通信することができ、通信時における消費電力が少なく、スループットが高い点において、HTTPなどのプロトコルより優れています。そのため、IoTやM2Mの分野でよくMQTTが使用されています。
MQTTではPublisher
とSubscriber
とBroker
という3つの登場人物が存在します。
Publisher
がメッセージを生成しBroker
に対して送信します。Broker
はそのメッセージを受け取りSubscriber
に対して送信して仲介の役割を果たします。Subscriber
はそのメッセージを受け取り、通信完了です。この時Subscriberは複数存在することが可能です。
その他のMQTTについての機能などに関してはこちらの記事がわかりやすかったので載せておきます。
Aedesについて
AedesはBroker
を立てるためのNode.jsのモジュールです。
以下のコマンドでイントールします。(※ Node.jsをあらかじめインストールしてください)
> npm install aedes
AedesでのMQTTブローカーの実装例
Aedesを組み込み実行するコードは以下の通りです。これだけでとても簡単にMQTTブローカーを立てることができます。
// モジュールの読み込み const aedes = require('aedes')() const server = require('net').createServer(aedes.handle) const port = 1883 server.listen(port, function () { console.log('server started and listening on port ', port) })
TSLを使って暗号化通信をしたい場合はこちらです。
const fs = require('fs') const aedes = require('aedes')() const port = 8883 const options = { key: fs.readFileSync('YOUR_PRIVATE_KEY_FILE.pem'), cert: fs.readFileSync('YOUR_PUBLIC_CERT_FILE.pem') } const server = require('tls').createServer(options, aedes.handle) server.listen(port, function () { console.log('server started and listening on port ', port)
WebブラウザなどTCPではなくover WebSocketで通信したい場合は以下の実装で実現できます。
onst aedes = require('aedes')() const httpServer = require('http').createServer() const ws = require('websocket-stream') const port = 8888 ws.createServer({ server: httpServer }, aedes.handle) httpServer.listen(port, function () { console.log('websocket server listening on port ', port) })
クラスター機能
Aedesにはクラスター
機能があり、subscriptionのステータスを複数のブローカーで共有・同期することで、複数のブローカーを論理的には1つのブローカーとして機能させることを可能にしています。
このクラスター機能はRedisやMongoDBを使うことによって実現しており、追加で以下のライブラリを使用することによってクラスター機能を実現することができます。
終わりに
今回はNode.jsのブローカーモジュールであるAedesについて紹介しました。Aedesを使えば簡単に自分のPCでMQTTブローカーを立てることができます。
Publisher
やSubscriber
などのクライアントはAedes
ではなくMQTT.js
を使って実装します。そちらに関しては記事がたくさんあるので探してみてください。
今後もIoTに関しては市場が広がっていくと思うし、MQTTもまだまだ発展していく技術だと思うので注目していきたいですね。