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について紹介していこうと思います。

github.com

MQTTの概用

おそらく、このページにたどりついてる方はMQTTについてよくご存知だとは思いますが、一応概用だけ説明させていただきます。
MQTTとはMessage Queue Telemetry Transportの略で、Publish/Subscribe型の軽量でシンプルなメッセージプロトコルです。
1対多や多対多で通信することができ、通信時における消費電力が少なく、スループットが高い点において、HTTPなどのプロトコルより優れています。そのため、IoTやM2Mの分野でよくMQTTが使用されています。 MQTTではPublisherSubscriberBrokerという3つの登場人物が存在します。
Publisherがメッセージを生成しBrokerに対して送信します。Brokerはそのメッセージを受け取りSubscriberに対して送信して仲介の役割を果たします。Subscriberはそのメッセージを受け取り、通信完了です。この時Subscriberは複数存在することが可能です。

その他のMQTTについての機能などに関してはこちらの記事がわかりやすかったので載せておきます。

iot-gym.com

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ブローカーを立てることができます。 PublisherSubscriberなどのクライアントはAedesではなくMQTT.jsを使って実装します。そちらに関しては記事がたくさんあるので探してみてください。 今後もIoTに関しては市場が広がっていくと思うし、MQTTもまだまだ発展していく技術だと思うので注目していきたいですね。