Pythonでmosquittoのブローカからデータを受ける(2)paho(Paho-MQTT)とPythonでmosquittoのブローカと通信
前回、Python3.8.3のインストールとPythonでMQTT通信を行うためのライブラリ pahoの導入を行いました。今回は、
「MQTTを利用して電子工作でIOTを実現する(1)準備と動作確認」
で動作させたmosquitto_subのコマンドで行ったデータ受信の処理を、Pythonとpahoのプログラミングで置き換えます。
送信されるデータは、
「ESP32活用① ESP32とブラウザでお話しする(8)MQTTで通信」
で動かした、ESP32-DevKitCのボードから発信されているデータを受信します。
●Pythonとpahoでサブスクライブ
プログラムの作成にはPythonのIDLEを利用します。スタート・メニューのリストのPython3.8のフォルダからIDLE(Python3.8 64-bit)を選択します。次の画面が表示されます。
この画面はPythonのプログラムをステップごとに実行できるPythonのシェル・ウィンドウです。三つの矢印>>>はPython独特のプロンプトで、このプロンプトを見るとPython のシェルであることがわかります。IDLEでなくスタート・メニューでPython3.8(64-bit)を起動すると同様なシェルのウィドウが表示されますが、IDLEの用意されているメニュー・バーがありません。
●テキスト・エディタの起動
メニューのFileを選択すると、次に示すように新規作成(New File Ctrl+N)、開く(Open Ctrl+O)などの選択ができます。新規作成なので、New Fileを選択します。併せてCtrl+N(コントロール・キーと合わせてNキー)を押しても、同じ結果となります。
表示されたリストの各ショートカット・キーを覚えておけば、一回の操作で目的を達することもできます。
●新規のファイルを作成
メニュー・バーのFile>New FileまたはCtrl+Nのショートカット・キーで、次の新規のファイル作成画面になります。
●サンプル・プログラムからテスト・プログラムを作る
Pahoのサイトには、いろいろなサンプル・プログラムが用意されています。今回のテスト・プログラムは、次のページのGetting Startedの項目にある、非常にシンプルなサブスクライブ処理のサンプルもとにして一部修正してあります。
eclipse paho
プログラムの作成の資料として、次のページの記事を参考にしました。
Eclipse Paho MQTT Python Client
サンプル・プログラムをコピーしたものを次に示します。このサンプルで、トピックの"$SYS/#"とホストの"mqtt.eclipse.org"をテスト環境に合わせて変更します。
日本語に説明を変更し、
"$SYS/#" を “ESP32/01/temp” "mqtt.eclipse.org" を “localhost” on_connectの引数としてflagsを追加 |
に変更したものを次に示します。
import paho.mqtt.client as mqtt # MQTTのライブラリをimportする # クライアントが接続されサーバ接続を示すCONNACKを受信したときの処理 def on_connect(client, userdata, flags,rc): print("Connected with result code "+str(rc)) client.subscribe("ESP32/01/temp") # サーバからパブリッシュ・データを受信したときの処理 def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.payload)) #topic と受信データを表示する client = mqtt.Client() # cliant のクラスのインスタンスを作成する client.on_connect = on_connect # サーバ接続時のコールバック関数の設定 client.on_message = on_message # メッセージ受信時のコールバック関数の設定 client.connect("localhost", 1884, 60) # Localhost のサーバに接続する client.loop_forever() # 限りなくサーバからのメッセージを待つ |
はじめはデフォルトの1883のポートを使用していましたが、エラーが出るようになりまだ未解決なので、ポートを1884に替えてテストしています。
●IDLEのエディタで修正した結果
プログラムを修正したIDLEのエディタの様子を次に示します。
●RUNまたはF5キーで実行
メニュー・バーのRun>Run ModuleまたはF5キーで、作成したプログラムを実行します。実行の様子は、次に示すようにIDLEのシェルの画面に示されます。最初に接続の処理が行われます。その結果がConnected with result code 0と接続されたことを示すコード0を受け取り、接続されましたとのメッセージが表示されます。
その後、ESP32のマイコン・ボードからの温度と日付けのメッセージを受信していることが表示されます。
次に、mosquittoのブローカでログを表示するオプション、ポートに1884を指定して次のコマンドで起動した結果です。
パブリッシャとサブスクライバのやり取りが記録されています。
mosquitto -v -p 1884
●mosquitoのサブスクライブ
Windowsのコマンドラインでmosquitoのサブクライブのコマンドを入力し、ESP32のマイコン・ボードからのデータを受信します。
mosquito_sub t ESP32/01/temp -p 1884
Python で記述しても、 mosquito_subと同じことができることが確認できました。次回は、受信したデータをMysqlのデータベースのテーブルに追加する方法を検討します。Mysql communityのConnector/Pythonをインストールして利用します。
(2020/6/8 V1.0)
<神崎康宏>