Eclipse Mosquitto と AWS Amplify を活用した MQTT メッセージング

Eclipse Mosquitto と AWS Amplify を活用した MQTT メッセージング

岩佐 孝浩
岩佐 孝浩
4 min read
Amplify Angular

はじめに

AWS Amplify ユーザーは Eclipse Mosquitto を MQTT メッセージブローカーとしてローカル環境に統合できます。これにより、外部サブスクライバーにメッセージをパブリッシュすることなく、アプリケーションの動作をシミュレーションしてテストできます。本投稿では、Angular アプリケーションの作成、Mosquitto の設定、およびテスト手順を解説します。

前提条件

以下のソフトウェアバージョンをインストールしてください。

ソフトウェアバージョン
Node.js12.13.1
Angular9.0.7
aws-amplify3.0.9
aws-amplify-angular5.0.9
mqtt3.0.0

Angular アプリケーションの設定

ディレクトリ構造

プロジェクトは以下の構造になります。

/
|-- docker/
|   |-- mosquitto/
|   |   `-- mosquitto.conf
|   `-- docker-compose.yml
|-- src/
|   |-- app/
|   |   |-- app.component.html
|   |   |-- app.component.ts
|   |   `-- ...
|   `-- ...
|-- package.json
`-- ...

Angular プロジェクトの作成

以下のコマンドを実行して新しい Angular アプリケーションを作成し、必要な依存関係をインストールします。

ng new angular-mosquitto-sample
npm i --save aws-amplify@3.0.9 aws-amplify-angular@5.0.9 mqtt@3.0.0

Eclipse Mosquitto の設定

Mosquitto コンテナの作成

docker/docker-compose.yml ファイルを以下の内容で作成してください。

version: '3.4'

services:
  mosquitto:
    image: eclipse-mosquitto:1.6.9
    ports:
      - 1883:1883 # MQTT
      - 9001:9001 # WebSocket
    volumes:
      - ./mosquitto:/mosquitto/config

docker/mosquitto/mosquitto.conf ファイルを以下の内容で作成してください。

listener 1883
listener 9001
protocol websockets

Mosquitto コンテナを起動します。

docker-compose up -d

Angular コードの記述

Polyfills の変更

src/polyfills.ts を更新してください。

/**
 * ...
 */

/***************************************************************************************************
 * APPLICATION IMPORTS
 */

// 以下を追加してください。
(window as any).global = window;

コンポーネントの更新

src/app/app.component.html を編集します。

<h1>Received messages</h1>
<hr/>
<div *ngFor="let message of messages">
  {{ message }}
</div>

src/app/app.component.ts を編集します。

import { Component, OnInit } from '@angular/core';
import { PubSub } from 'aws-amplify';
import { MqttOverWSProvider } from '@aws-amplify/pubsub/lib/Providers';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
  messages = [];

  ngOnInit() {
    PubSub.addPluggable(new MqttOverWSProvider({
      aws_pubsub_endpoint: 'ws://localhost:9001/',
      // Do not use SSL
      aws_appsync_dangerously_connect_to_http_endpoint_for_testing: true,
    }));

    PubSub.subscribe('test-topic').subscribe(payload => {
      console.log(payload);
      this.messages.push(payload.value.message);
    });
  }
}

アプリケーションのテスト

ローカルの Mosquitto ブローカーに MQTT メッセージをパブリッシュしてテストします。

mqtt pub -t 'test-topic' -h localhost -p 1883 -m '{"message": "Hello World"}'

Angular アプリケーションはリアルタイムで受信したメッセージを表示するはずです。

Angular アプリでの受信メッセージ表示

まとめ

Eclipse Mosquitto をローカル MQTT ブローカーとして使用することで、AWS Amplify と Angular を活用したアプリケーションのテストとデバッグが容易になります。このセットアップにより、効率的なローカル開発が可能となり、AWS IoT Core に接続する前にアプリケーションが期待通りに動作することを確認できます。

Happy Coding! 🚀

岩佐 孝浩

岩佐 孝浩

Software Developer at KAKEHASHI Inc.
AWS を活用したクラウドネイティブ・アプリケーションの要件定義・設計・開発に従事。 株式会社カケハシで、処方箋データ収集の新たな基盤の構築に携わっています。 Japan AWS Top Engineers 2020-2023