Node.js で MQTT.js SDK を使用してデプロイメントに接続する
本記事では、Node.js プロジェクトで MQTT を使用し、クライアントと MQTT ブローカー間の接続、サブスクライブ、サブスクライブ解除、メッセージの送受信機能を実現する方法を主に紹介します。
前提条件
Node.js クライアントを使用して EMQX Cloud に接続する前に、以下の前提条件を満たしていることを確認してください。
- MQTT ブローカーのデプロイ
- Node.js のバージョン確認
MQTT ブローカーのデプロイ
アプリケーションをEMQX Cloudに接続するには、デプロイメントを作成して設定する必要があります。
サーバレスデプロイメント
EMQX Cloudコンソールでサーバレスデプロイメントを作成します。
デプロイメントが作成されて稼働したら、デプロイメントの概要ページに移動し、以下を含むMQTT接続情報を確認します。
ブローカーアドレス
ポート番号(サーバレスではTLSポートのみ対応)
サーバレスデプロイメントはTLS接続が必須です。概要ページからCA証明書をダウンロードし、TLS用のポート
8883を使用してください。デプロイメントのアクセス制御 -> クライアント認証で、デフォルト認証(ユーザー名/パスワード)を設定します。
詳細はサーバレスポートガイドを参照してください。
Dedicated Flex または BYOC デプロイメント
EMQX CloudコンソールでDedicated FlexまたはBYOCのデプロイメントを作成できます。
作成後、デプロイメントの概要ページに移動し、以下を含むMQTT接続情報を取得します。
ブローカーアドレス
MQTTおよびWebSocket用のTCPおよびTLSポート番号(TCPおよびTLS接続の両方に対応)
デプロイメントのアクセス制御 -> クライアント認証で、デフォルト認証(ユーザー名/パスワード)を設定します。
詳細なポート設定については、Dedicated & BYOCポートガイドをご覧ください。
Node.js バージョンの確認
本プロジェクトでは開発およびテストに Node.js v16.19.1 を使用しています。以下のコマンドで Node.js のバージョンを確認できます。
node --version
v16.19.1依存関係のインストール
MQTT.js は、JavaScript で書かれた MQTT プロトコル用の完全オープンソースのクライアントライブラリで、Node.js とブラウザで利用可能です。MQTT.js の詳細や使い方については、MQTT.js GitHub をご参照ください。
MQTT.js は NPM または Yarn でインストールでき、CDN や相対パスでのインポートも可能です。本例では Yarn コマンドを使って MQTT.js をインストールします。
NPM または Yarn を使用する場合:
MQTT.js をインストールします。
shell# NPM npm install mqtt # または Yarn yarn add mqtt
TCP ポートで接続する
以下のコードでクライアント ID、ユーザー名、パスワードを設定できます。クライアント ID はユニークである必要があります。
const clientId = 'emqx_nodejs_' + Math.random().toString(16).substring(2, 8)
const username = 'emqx_test'
const password = 'emqx_test'以下のコードでクライアントと MQTT ブローカー間の接続を確立します。
const client = mqtt.connect('mqtt://broker.emqx.io:1883', {
clientId,
username,
password,
// ...その他のオプション
})TCP セキュアポートで接続する
TLS/SSL 暗号化が有効な場合、接続のパラメーターオプションは TCP ポートでの接続と同様です。プロトコルを mqtts に変更し、正しいポート番号を指定する点に注意してください。
以下のコードでクライアントと MQTT ブローカー間の接続を確立します。
const client = mqtt.connect('mqtts://broker.emqx.io:8883', {
clientId,
username,
password,
// ...その他のオプション
})WebSocket ポートで接続する
MQTT の WebSocket 接続では、接続パスとして /path を指定する必要があり、EMQX ブローカーでは /mqtt がパスとして使用されます。
そのため、WebSocket 接続を使用する場合は、ポート番号の変更とプロトコルを ws に切り替えるだけでなく、/mqtt パスも追加する必要があります。
以下のコードでクライアントと MQTT ブローカー間の接続を確立します。
const client = mqtt.connect('ws://broker.emqx.io:8083/mqtt', {
clientId,
username,
password,
// ...その他のオプション
})WebSocket セキュアポートで接続する
TLS/SSL 暗号化が有効な場合、接続のパラメーターオプションは WebSocket ポートでの接続と同様です。プロトコルを wss に変更し、正しいポート番号を指定する点に注意してください。
以下のコードでクライアントと MQTT ブローカー間の接続を確立します。
const client = mqtt.connect('wss://broker.emqx.io:8084/mqtt', {
clientId,
username,
password,
// ...その他のオプション
})サブスクライブとパブリッシュ
トピックのサブスクライブ
サブスクライブするトピックと対応する QoS(サービス品質)レベルを指定します。
const topic = '/nodejs/mqtt'
const qos = 0
client.subscribe(topic, { qos }, (error) => {
if (error) {
console.log('subscribe error:', error)
return
}
console.log(`トピック '${topic}' をサブスクライブしました`)
})トピックのサブスクライブ解除
以下のコードでトピックと対応する QoS レベルを指定してサブスクライブ解除できます。
const topic = '/nodejs/mqtt'
const qos = 0
client.unsubscribe(topic, { qos }, (error) => {
if (error) {
console.log('unsubscribe error:', error)
return
}
console.log(`トピック '${topic}' のサブスクライブを解除しました`)
})メッセージのパブリッシュ
メッセージをパブリッシュする際は、MQTT ブローカーに対象のトピックとメッセージ内容を提供する必要があります。
const topic = '/nodejs/mqtt'
const payload = 'nodejs mqtt test'
const qos = 0
client.publish(topic, payload, { qos }, (error) => {
if (error) {
console.error(error)
}
})メッセージの受信
以下のコードはメッセージイベントを監視し、メッセージを受信した際に受信したトピックとメッセージをコンソールに出力します。
client.on('message', (topic, payload) => {
console.log('受信したメッセージ:', topic, payload.toString())
})MQTT ブローカーからの切断
クライアントをブローカーから切断するには、以下のコードを使用します。
if (client.connected) {
try {
client.end(false, () => {
console.log('正常に切断されました')
})
} catch (error) {
console.log('切断エラー:', error)
}
}上記は主要なコードスニペットのみを示しています。完全なプロジェクトコードは MQTT-Client-Node.js をご参照ください。ダウンロードして実際に試すことができます。
接続のテスト
package.json ファイルの scripts フィールドに起動スクリプトを1行追加します。
"scripts": {
"start": "node index.js"
}その後、npm start コマンドで簡単にプロジェクトを実行できます。
npm start実行後、コンソールに以下のような出力情報が表示されます。

クライアントが正常に MQTT ブローカー に接続し、トピックをサブスクライブし、メッセージの受信とパブリッシュに成功していることが確認できます。この時点で、別のクライアントとして MQTT 5.0 クライアントツール - MQTTX を使用し、メッセージのパブリッシュと受信のテストを行います。

MQTTX から送信されたメッセージがコンソールに表示されていることが確認できます。

まとめ
以上で、Node.js プロジェクトにおける MQTT 接続の作成と、クライアントと MQTT サーバー間のサブスクライブ、メッセージのパブリッシュ、サブスクライブ解除、切断のシナリオを実装しました。完全なサンプルソースコードは MQTT-Client-Node.js ページ からダウンロード可能です。また、他言語のデモ例も MQTT クライアント例ページ で多数公開していますので、ぜひご覧ください。