ブログ

Armadillo-G3L:MQTTブローカーを構築してみた。

at_yukari.hara
2020年2月5日 13時41分

Armadillo-IoT G3Lを使って、MQTTブローカーを構築しました。
動作確認の為に、Publishとしてpythonで送ったメッセージを、ブラウザで確認しました。
※コードはこちらのサイトを参考にさせていただいました。

環境

・Armadillo-IoT G3L
・MQTTブローカー:Mosquitto
・サーバー:apache2
・通信プロトコル:MQTT over WebSocket

手順

1.環境の構築

python3の環境をインストールします。

[armadillo ~]# apt install python3
[armadillo ~]# apt install python3-pip

Mosquittoをインストールします。

[armadillo ~]# apt install mosquitto
[armadillo ~]# apt install mosquitto-clients

2.WEBサーバーのインストール

apache2をインストールします。

[armadillo ~]# apt install apache2

以下のURLで正常にapache2が動作していることを確認します。
「Apache2 Debian Default Page」というページが表示されていれば動作しています。

http://[ArmadilloのIPアドレス]/

3.MQTTブローカーの設定を変更

WebブラウザでMQTTを直接受信することが出来ないため、
WebSocketの通信ができるように,MQTTブローカーの設定を変更します。

[armadillo ~]# vi /etc/mosquitto/mosquitto.conf

ファイルの先頭に,以下の3行を追加します

listener 1883 #MQTTを1883番ポートで受信する
listener 15675 #WebSocketを15675番ポートで受信する
protocol websockets

設定を反映させるためにmosquittoを再起動します。

[armadillo ~]# sudo systemctl restart mosquitto

4.htmlをダウンロードする

こちらから「echo.html」と「mqttws31.js」をダウンロードします。

[armadillo ~]# cd /var/www/html
[armadillo:/var/www/html]# wget https://raw.githubusercontent.com/rabbitmq/rabbitmq-web-mqtt-examples/master/priv/echo.html
[armadillo:/var/www/html]# wget https://raw.githubusercontent.com/rabbitmq/rabbitmq-web-mqtt-examples/master/priv/mqttws31.js

5.echo.htmlを編集します

MQTTで送信する際のトピックを変更します

[armadillo:/var/www/html]# vi echo.html

以下の箇所を変更してください

*86行目
変更前 :message.destinationName = "test";
変更後 :message.destinationName = "Armadillo/001";
*113行目
変更前 :client.subscribe('test', {qos: 1});
変更後 :client.subscribe('Armadillo/#', {qos: 1});

6.ライブラリのインストール

[armadillo ~]# pip3 install paho-mqtt

7.クライアントの作成

publish.pyというファイル名で、以下の内容のファイルを作成してください。

#!usr/bin/env python
# -*- coding: utf-8 -*-
 
import paho.mqtt.client as mqtt     # MQTTのライブラリをインポート
from time import sleep              # 3秒間のウェイトのために使う
 
# ブローカーに接続できたときの処理
def on_connect(client, userdata, flag, rc):
  print("Connected with result code " + str(rc))
 
# ブローカーが切断したときの処理
def on_disconnect(client, userdata, flag, rc):
  if rc != 0:
     print("Unexpected disconnection.")
 
# publishが完了したときの処理
def on_publish(client, userdata, mid):
  print("publish: {0}".format(mid))
 
# メイン関数   この関数は末尾のif文から呼び出される
def main():
  client = mqtt.Client()                 # クラスのインスタンス(実体)の作成
  client.on_connect = on_connect         # 接続時のコールバック関数を登録
  client.on_disconnect = on_disconnect   # 切断時のコールバックを登録
  client.on_publish = on_publish         # メッセージ送信時のコールバック
 
  client.connect("localhost", 1883, 60)  # 接続先は自分自身
 
  # 通信処理スタート
  client.loop_start()    # subはloop_forever()だが,pubはloop_start()で起動だけさせる
 
  # 永久に繰り返す
  while True:
    client.publish("Armadillo/001","Hello, Armadillo!")    # トピック名とメッセージを決めて送信
    sleep(3)   # 3秒待つ
 
if __name__ == '__main__':          # importされないときだけmain()を呼ぶ
  main()    # メイン関数を呼び出す

8.実行

以下のコマンドでpublish.pyを実行してください。

[armadillo ~]# python3 publish.py

9.確認

以下のURLにアクセスしてください。

http://[ArmadilloのURL]/echo.html

TAG index