ReactでMQTT.js SDKを使ってデプロイメントに接続する方法
本記事では、Reactフレームワークで構築されたWebアプリケーションにおいて、MQTT.jsを使用し、クライアントとMQTTブローカー間の接続、サブスクライブ、メッセージ送受信、サブスクライブ解除などの機能を実装する方法を主に紹介します。
前提条件
Reactクライアントを使ってEMQX Cloudに接続する前に、以下の前提条件を満たしていることを確認してください。
- MQTTブローカーのデプロイ
- Reactアプリケーションの作成
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ポートガイドをご覧ください。
Reactアプリケーションの作成
参考リンク:https://reactjs.org/docs/getting-started.html
Create React Appを使った新規Reactアプリケーションの作成shellnpx create-react-app react-mqtt-testTypeScriptを使用する場合は、コマンドの末尾に
--template typescriptパラメータを追加してください。shellnpx create-react-app react-mqtt-test --template typescriptさらに、Reactプロジェクトに必要なTypeScript型ライブラリを追加します。
shellnpm install --save typescript @types/node @types/react @types/react-dom @types/jest # または yarn add typescript @types/node @types/react @types/react-dom @types/jestTypeScriptの利用は本記事の例の中心ではありませんが、使用したい場合は作成例や完全なコード例を参考にしてTypeScript機能を追加できます。
CDN経由でのインポート
html<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script> <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>
依存関係のインストール
MQTT.jsは、JavaScriptで書かれた完全オープンソースのMQTTプロトコル用クライアントライブラリで、Node.jsおよびブラウザで利用可能です。MQTT.jsの詳細や使い方はMQTT.js GitHubをご参照ください。
MQTT.jsはNPMやYarnでインストールできるほか、CDNや相対パス経由でのインポートも可能です。本例ではNPMコマンドでのインストール方法を示します。CDN経由でReactを使うプロジェクトには直接ファイルをインポートする方法が適しています。
コマンドラインからnpmまたはyarnコマンドでインストール(どちらか一方)
shellnpm install mqtt --save # または yarn add mqttCDN経由でのインポート
html<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>ローカルにダウンロードし、相対パスでインポート
html<script src="/your/path/to/mqtt.min.js"></script>
WebSocketポートでの接続
クライアントID、ユーザー名、パスワードは以下のコードで設定できます。クライアントIDは一意である必要があります。
const clientId = "emqx_react_" + Math.random().toString(16).substring(2, 8);
const username = "emqx_test";
const password = "emqx_test";以下のコードでクライアントと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 mqttSub = (subscription) => {
if (client) {
const { topic, qos } = subscription
client.subscribe(topic, { qos }, (error) => {
if (error) {
console.log('トピックのサブスクライブエラー', error)
return
}
console.log(`トピックをサブスクライブしました: ${topic}`)
setIsSub(true)
})
}
}トピックのサブスクライブ解除
以下のコードで、指定したトピックと対応するQoSレベルのサブスクライブを解除できます。
const mqttUnSub = (subscription) => {
if (client) {
const { topic, qos } = subscription
client.unsubscribe(topic, { qos }, (error) => {
if (error) {
console.log('サブスクライブ解除エラー', error)
return
}
console.log(`サブスクライブ解除したトピック: ${topic}`)
setIsSub(false)
})
}
}メッセージのパブリッシュ
メッセージをパブリッシュする際は、MQTTブローカーに対して対象のトピックとメッセージ内容を指定する必要があります。
const mqttPublish = (context) => {
if (client) {
const { topic, qos, payload } = context;
client.publish(topic, payload, { qos }, (error) => {
if (error) {
console.log("パブリッシュエラー: ", error);
}
});
}
};メッセージの受信
以下のコードはメッセージイベントを監視し、メッセージ受信時に受信したメッセージとトピックをコンソールに出力します。
client.on("message", (topic: string, message) => {
console.log(`受信したメッセージ: ${message} トピック: ${topic}`);
});MQTTブローカーからの切断
クライアントをブローカーから切断するには、以下のコードを使用します。
const mqttDisconnect = () => {
if (client.connected) {
try {
client.end(false, () => {
setConnectStatus('Connect')
console.log('正常に切断されました')
})
} catch (error) {
console.log('切断エラー:', error)
}
}
}上記は主要なコードスニペットのみを示しています。完全なプロジェクトコードはMQTT Client - Reactをご参照ください。ダウンロードして実際に試すことができます。
接続のテスト
Reactを使って作成した以下の簡単なブラウザアプリケーションでは、接続の作成、トピックのサブスクライブ、メッセージの送受信、サブスクライブ解除、切断が可能です。

別のクライアントとしてMQTT 5.0クライアントツール - MQTTXを使い、メッセージの送受信をテストできます。

MQTTXからブラウザ側に正常にメッセージが届くことが確認でき、MQTTXでトピックにメッセージを送信した際の様子が以下の画像です。

FAQ
自己署名証明書の使い方は?双方向TLS/SSL認証は使えますか?
ブラウザの制限により、現時点ではサポートされていません。詳細はMQTT.jsのIssueをご参照ください:ブラウザでTLS/SSL双方向認証接続を使う方法?およびNode.jsでは双方向認証が可能だがブラウザでは未対応。
まとめ
本記事では、ReactプロジェクトでMQTT接続を作成し、クライアントとMQTTサーバー間でのサブスクライブ、メッセージパブリッシュ、サブスクライブ解除、切断のシナリオをシミュレートしました。
React v18.2.0を使用しているため、例示コードはHookコンポーネントを用いていますが、必要に応じて完全な例のClassMqttコンポーネントを参照し、クラスコンポーネントでの構築も可能です。
完全なサンプルソースコードはMQTT Client - Reactページからダウンロードでき、他言語のデモ例もMQTT Client例ページでご覧いただけます。