Amazon LightsailをMosquittoでMQTTブローカーとして利用する

Amazon LightsailにOSSのMQTTブローカー、Mosquittoをインストールして使ってみます。

LightsailインスタンスはOSのみのUbuntu 18.04 LTSを使います。

インスタンスが立ちあがったらSSHログインしてMosquittoをインストールします。
sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get install mosquitto mosquitto-clients
SSHセッションを複数開いて動作確認します。
# Subscriber側
$ mosquitto_sub -d -t topic1
Client mosq-7MfIECdvo8ZBiYdrrR sending CONNECT
Client mosq-7MfIECdvo8ZBiYdrrR received CONNACK (0)
Client mosq-7MfIECdvo8ZBiYdrrR sending SUBSCRIBE (Mid: 1, Topic: topic1, QoS: 0, Options: 0x00)
Client mosq-7MfIECdvo8ZBiYdrrR received SUBACKSubscribed (mid: 1): 0
Client mosq-7MfIECdvo8ZBiYdrrR received PUBLISH (d0, q0, r0, m0, 'topic1', ... (5 bytes))
hello

# Publisher側
$ mosquitto_pub -d -t topic1 -m "hello"
Client mosq-Ul4wJLBcCkTmTpSgfR sending CONNECT
Client mosq-Ul4wJLBcCkTmTpSgfR received CONNACK (0)
Client mosq-Ul4wJLBcCkTmTpSgfR sending PUBLISH (d0, q0, r0, m1, 'topic1', ... (5 bytes))
Client mosq-Ul4wJLBcCkTmTpSgfR sending DISCONNECT
ローカルのクライアントから接続してみます。

まずは、リッスンポートを確認します。
$ mosquitto -v
1594645661: mosquitto version 1.6.10 starting
1594645661: Using default config.
1594645661: Opening ipv4 listen socket on port 1883.
1594645661: Error: Address already in use
ネットワーキングのファイアウォールで1883のインバウンドポートを解放します。
ローカル端末にクライアントをダウンロードします。

https://mosquitto.org/download/

Windowsならインストーラーの指示に従ってインストールして、インストールフォルダへのPATHを通せば使えるようになります。

インスタンスに割り当てられたパブリックIPを指定します。
# Subscriber側
>mosquitto_sub -h [パブリックIP] -p 1883 -t topic1
hello

# Publisher側
>mosquitto_pub -h [パブリックIP] -p 1883 -d -t topic1 -m "hello"
Client mosq-V0acdvYAXSp49TEl9F sending CONNECT
Client mosq-V0acdvYAXSp49TEl9F received CONNACK (0)
Client mosq-V0acdvYAXSp49TEl9F sending PUBLISH (d0, q0, r0, m1, 'topic1', ... (5 bytes))
Client mosq-V0acdvYAXSp49TEl9F sending DISCONNECT

MQTT over WebSocketで接続

MosquittoはMQTT over WebSocketをサポートしているので、JavaScriptから接続してみます。

まずはWebSocketを使えるように設定ファイルを編集してポートを解放します。
$ sudo vi /etc/mosquitto/mosquitto.conf

$ tail -7 /etc/mosquitto/mosquitto.conf
include_dir /etc/mosquitto/conf.d

listener 1883

listener 8080
protocol websockets

sudo service mosquitto restart
HTMLファイルを用意し、ブラウザコンソールでやり取りの結果が確認できます。
<html>
<head>
</head>
<body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.js" type="text/javascript"></script>
    <script>
    var host = "[パブリックIP]";
    // MQTTクライアント
    var client = new Paho.MQTT.Client(
      host,
      8080,
      "/mqtt",
      "clientId");

    // 接続
    client.connect({
      onSuccess:onConnect, // 成功
      onFailure:doFail // 失敗
    });
  
    function onConnect() {
      console.log("onConnect");
      
      client.subscribe("topic1"); // 購読
      
      // 送信
      message = new Paho.MQTT.Message("Hello Mosquitto");
      message.destinationName = "topic2";
      client.send(message);
    }
    
    function doFail(e){
      console.log(e);
    }

    // コネクションの切断
    client.onConnectionLost = function onConnectionLost(responseObject) {
      if (responseObject.errorCode !== 0) {
        console.log("onConnectionLost:"+responseObject.errorMessage);
      }
    }

    // メッセージの受信
    client.onMessageArrived = function onMessageArrived(message) {
      console.log("onMessageArrived:"+message.payloadString);
    }
    </script>
</body>
</html>
IoT機器から集信した情報をブラウザで確認するといった用途に使えそうです。