株式会社インデペンデンスシステムズ横浜

システム開発エンジニアの西田五郎が運営しております。新規開発案件のご依頼をお待ちしております。

*

Raspberry PiでIoT(MQTTで遠隔操作編 その2)MQTT Brokerの構築とPythonでのpub/sub

      2017/05/24

Raspberry PiでIoT MQTTで遠隔操作編の2回目です。2台のRaspberry Piでインターネット経由でGPIOを操作するというテーマで書いています。前回はMQTTの基本的な内容とMosquittoでの簡単なやりとりについて書きました。

今回のシリーズ一覧です
RaspiでIoT(MQTTで遠隔操作編 その1)MQTTでの通信
RaspiでIoT(MQTTで遠隔操作編 その2)MQTT Brokerの構築とPythonでのpub/sub
RaspiでIoT(MQTTで遠隔操作編 その3)Raspberry PiのGPIOとHeroku連動Sub編
RaspiでIoT(MQTTで遠隔操作編 その4)Raspberry PiのGPIOとHeroku連動Pub編

今回は、クラウドプラットフォームのHerokuを使ってMQTTのBroker(CloudMQTT)を構築します。これでインターネット経由でMQTTでの通信が出来るようになりますのでRaspberry Pi上のPythonプログラムからpub/sub通信するところまで書きます。

Herokuについては以下に(英語ですが)説明があります。
Heroku What

今回、Herokuを選択した理由は簡単に無料バージョンのCloudMQTTが構築できたことです。他にもIoT関連のクラウド、プラットフォームはいろいろとあります。ページ最後の補足に書きました。実際の業務ではSSL/TLSが必須です。またパスワードの命名や管理も慎重過ぎるぐらいでいいです。(当然だろと言われそうですが、テスト用のアカウントを適当に作成してそのままにしておくのも危険です。)

以下の順番に書きます。
1.HerokuにCloudMQTTを構築する
2.構築したCloudMQTTをブラウザで試す
3.PythonプログラムでPub/Sub通信をする

1.HerokuにCloudMQTTを構築する
Herokuのアカウントを作成します。無料ですが、クレジットカードの登録をしないとCloudMQTTの構築が出来ませんでした。
Heroku Sign up

ログイン出来たら、Create New Appをクリックします。

任意のApp Nameを入力してCreatします。

作成したAppにアドオンを追加します。
Resourcesタブから、Add-onsの検索画面にCloudMQTTして候補を出します。そのCloudMQTTを選択します。

無料のCute Catプランを選択します。

CloudMQTT Consoleに切り替わり必要な情報が表示されました。次からの作業でここで作成された情報を使います。

2.構築したCloudMQTTをブラウザで試す
CloudMQTT ConsoleからWebsocket UIを選択します。MQTT over WebSocketsの仕組みを使うと、MQTTがブラウザから利用出来るようになります。そのテスト画面が提供されているようです。

適当にTopicとMessageに入力してSendボタンをクリックするとReceived messagesに表示されます。この画面を後でテストに利用します。

3.PythonプログラムでPub/Sub通信をする
Raspberry Pi上にpub/subのPythonプログラムを書いてみます。ここでは以下のPahoを使います。
Eclipse Paho

Raspberry Piからは、以下のようにインストール出来ます。
$ sudo pip install paho-mqtt
pipは以下でインストール出来ます。
$ sudo apt-get install python-pip

まずsub側からです。以下のプログラムを書きました。

import paho.mqtt.client as mqtt

def on_connect(client, userdata, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("isyjp/msg1st")

def on_message(client, userdata, msg):
     print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.tls_set("/etc/ssl/certs/ca-certificates.crt")

client.username_pw_set("cloudMQTTのユーザ名", "パスワード")
client.connect("cloudMQTTのURL", SSLポート番号)

client.loop_forever()

SSL/TLSを使っています。”/etc/ssl/certs/ca-certificates.crt”のパスですが、以下を参照しました。
https://www.cloudmqtt.com/docs-faq.html#TLS_SSL
接続情報は、HerokuのCloudMQTT Consoleから持ってきます。

このプログラムでは、”isyjp/msg1st”というTopicをsubscribeしています。このプログラムを実行して、前項のWebsocket UIからSendしてみます。

まず、ここでは、sub0.pyというファイル名で実行しています。待ちの状態になります。

Websocket UIからisyjp/msg1stにsendします。

subscribe出来ました。

次にpub側を以下のように書きました。

import paho.mqtt.client as mqtt

def on_connect(client, userdata, rc):
    print("Connected with result code "+str(rc))
    client.publish("isyjp/msg1st", "Hello MQTT.", 0)

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.tls_set("/etc/ssl/certs/ca-certificates.crt")

client.username_pw_set("cloudMQTTのユーザ名", "パスワード")
client.connect("cloudMQTTのURL", SSLポート番号)

client.loop_forever()

sub側とほぼ同じですが、こちらは接続が完了したタイミングで、”isyjp/msg1st”に向けてpublishしています。client.loop_forever()していますが、接続時の1回のみpublishしています。sub側を起動した状態でこのpub側を起動するとsub側で以下が確認出来ました。同様にWebsocket UIでのReceived messagesにも表示されました。

以上で簡単ではありますが、Pythonプログラムでpub/subが確認出来ました。

今回はここまでです。次回からはこのpub/subとRaspberry PiのGPIOを連動させてみます。




 - IoT, Raspberry Pi

AdSense

AdSense

  関連記事

Raspberry Piをモニターとキーボードなしで導入する(その3)コンソールを使う

(※2017/02/19 最新の情報は以下です。) Raspberry Pi 3 …

Raspberry PiでIoT(MQTTで遠隔操作編 その4)Raspberry PiのGPIOとHeroku連動Pub編

Raspberry PiでIoT MQTTで遠隔操作編の4回目です。2台のRas …

Raspberry Piでタッチアプリ開発(その4)ボタンとGPIOの連動

Raspberry Piでタッチアプリ開発の4回目です。前回作成したレイアウトと …

Raspberry PiでC言語版Lチカを試す(その2)レジスタを操作する

Raspberry PiでC言語を使ったLEDの点灯、消灯(いわいるLチカ)を試 …

Raspberry PiでIoT(温度・湿度・気圧データ編 その3)データ表示とグラフ表示

Raspberry PiでIoT 温度・湿度・気圧データ編の3回目です。前回まで …

温度センサADT7410(その3)Raspbery Piでの利用

温度センサADT7410の3回目です。前回までの内容は以下です。 温度センサAD …

Raspberry PiでAvahi を使ってホスト名でアクセスする

Raspberry PiでAvahiを使ってホスト名でのアクセスを可能にする方法 …

ASP.NET Web APIでデータ蓄積(その7)Raspbery Piからの温度データ蓄積

ASP.NET Web APIでデータ蓄積の7回目です。前回までで少なくとも温度 …

Raspberry PiでIoT(MQTTで遠隔操作編 その3)Raspberry PiのGPIOとHeroku連動Sub編

Raspberry PiでIoT MQTTで遠隔操作編の3回目です。2台のRas …

Raspberry Piでタッチアプリ開発(その1)ハードウェア構成・開発環境等

Raspberry Piで簡単なタッチアプリを開発する手順について書きます。もち …