記事  TOPに戻る

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)

<神崎康宏>

連載 Pythonでmosquittoのブローカからデータを受ける

(1) Pythonのシステムのインストール

(2) paho(Paho-MQTT)とPythonでmosquittoのブローカと通信

(3) 受け取ったデータをMysqlのPython Connectorでデータベースに渡す