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