Skip to content

Node.js で MQTT.js SDK を使用してデプロイメントに接続する

本記事では、Node.js プロジェクトで MQTT を使用し、クライアントと MQTT ブローカー間の接続、サブスクライブ、サブスクライブ解除、メッセージの送受信機能を実現する方法を主に紹介します。

前提条件

Node.js クライアントを使用して EMQX Cloud に接続する前に、以下の前提条件を満たしていることを確認してください。

  • MQTT ブローカーのデプロイ
  • Node.js のバージョン確認

MQTT ブローカーのデプロイ

アプリケーションをEMQX Cloudに接続するには、デプロイメントを作成して設定する必要があります。

サーバレスデプロイメント

  1. EMQX Cloudコンソールでサーバレスデプロイメントを作成します。

  2. デプロイメントが作成されて稼働したら、デプロイメントの概要ページに移動し、以下を含むMQTT接続情報を確認します。

    • ブローカーアドレス

    • ポート番号(サーバレスではTLSポートのみ対応)

  3. サーバレスデプロイメントはTLS接続が必須です。概要ページからCA証明書をダウンロードし、TLS用のポート8883を使用してください。

  4. デプロイメントのアクセス制御 -> クライアント認証で、デフォルト認証(ユーザー名/パスワード)を設定します。

詳細はサーバレスポートガイドを参照してください。

Dedicated Flex または BYOC デプロイメント

  1. EMQX CloudコンソールでDedicated FlexまたはBYOCのデプロイメントを作成できます。

  2. 作成後、デプロイメントの概要ページに移動し、以下を含むMQTT接続情報を取得します。

    • ブローカーアドレス

    • MQTTおよびWebSocket用のTCPおよびTLSポート番号(TCPおよびTLS接続の両方に対応)

  3. デプロイメントのアクセス制御 -> クライアント認証で、デフォルト認証(ユーザー名/パスワード)を設定します。

詳細なポート設定については、Dedicated & BYOCポートガイドをご覧ください。

Node.js バージョンの確認

本プロジェクトでは開発およびテストに Node.js v16.19.1 を使用しています。以下のコマンドで Node.js のバージョンを確認できます。

shell
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 はユニークである必要があります。

js
const clientId = 'emqx_nodejs_' + Math.random().toString(16).substring(2, 8)
const username = 'emqx_test'
const password = 'emqx_test'

以下のコードでクライアントと MQTT ブローカー間の接続を確立します。

js
const client = mqtt.connect('mqtt://broker.emqx.io:1883', {
  clientId,
  username,
  password,
  // ...その他のオプション
})

TCP セキュアポートで接続する

TLS/SSL 暗号化が有効な場合、接続のパラメーターオプションは TCP ポートでの接続と同様です。プロトコルを mqtts に変更し、正しいポート番号を指定する点に注意してください。

以下のコードでクライアントと MQTT ブローカー間の接続を確立します。

js
const client = mqtt.connect('mqtts://broker.emqx.io:8883', {
  clientId,
  username,
  password,
  // ...その他のオプション
})

WebSocket ポートで接続する

MQTT の WebSocket 接続では、接続パスとして /path を指定する必要があり、EMQX ブローカーでは /mqtt がパスとして使用されます。

そのため、WebSocket 接続を使用する場合は、ポート番号の変更とプロトコルを ws に切り替えるだけでなく、/mqtt パスも追加する必要があります。

以下のコードでクライアントと MQTT ブローカー間の接続を確立します。

js
const client = mqtt.connect('ws://broker.emqx.io:8083/mqtt', {
  clientId,
  username,
  password,
  // ...その他のオプション
})

WebSocket セキュアポートで接続する

TLS/SSL 暗号化が有効な場合、接続のパラメーターオプションは WebSocket ポートでの接続と同様です。プロトコルを wss に変更し、正しいポート番号を指定する点に注意してください。

以下のコードでクライアントと MQTT ブローカー間の接続を確立します。

js
const client = mqtt.connect('wss://broker.emqx.io:8084/mqtt', {
  clientId,
  username,
  password,
  // ...その他のオプション
})

サブスクライブとパブリッシュ

トピックのサブスクライブ

サブスクライブするトピックと対応する QoS(サービス品質)レベルを指定します。

javascript
const topic = '/nodejs/mqtt'
const qos = 0

client.subscribe(topic, { qos }, (error) => {
  if (error) {
    console.log('subscribe error:', error)
    return
  }
  console.log(`トピック '${topic}' をサブスクライブしました`)
})

トピックのサブスクライブ解除

以下のコードでトピックと対応する QoS レベルを指定してサブスクライブ解除できます。

javascript
const topic = '/nodejs/mqtt'
const qos = 0
client.unsubscribe(topic, { qos }, (error) => {
  if (error) {
    console.log('unsubscribe error:', error)
    return
  }
  console.log(`トピック '${topic}' のサブスクライブを解除しました`)
})

メッセージのパブリッシュ

メッセージをパブリッシュする際は、MQTT ブローカーに対象のトピックとメッセージ内容を提供する必要があります。

javascript
const topic = '/nodejs/mqtt'
const payload = 'nodejs mqtt test'
const qos = 0

client.publish(topic, payload, { qos }, (error) => {
  if (error) {
    console.error(error)
  }
})

メッセージの受信

以下のコードはメッセージイベントを監視し、メッセージを受信した際に受信したトピックとメッセージをコンソールに出力します。

javascript
client.on('message', (topic, payload) => {
  console.log('受信したメッセージ:', topic, payload.toString())
})

MQTT ブローカーからの切断

クライアントをブローカーから切断するには、以下のコードを使用します。

javascript
if (client.connected) {
  try {
    client.end(false, () => {
      console.log('正常に切断されました')
    })
  } catch (error) {
    console.log('切断エラー:', error)
  }
}

上記は主要なコードスニペットのみを示しています。完全なプロジェクトコードは MQTT-Client-Node.js をご参照ください。ダウンロードして実際に試すことができます。

接続のテスト

package.json ファイルの scripts フィールドに起動スクリプトを1行追加します。

json
"scripts": {
  "start": "node index.js"
}

その後、npm start コマンドで簡単にプロジェクトを実行できます。

shell
npm start

実行後、コンソールに以下のような出力情報が表示されます。

NodeJS MQTT Start

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

MQTT 5.0 Client Tool - MQTTX

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

MQTT messages

まとめ

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