前々からネットワーク接続機能を持ったマイコンボード類はNodeRedにMQTT接続して「よろしく」やっておったのです。しかし、ネットワークに接続できないものどもは蚊帳の外。でもね中にはシリアルでホストと接続してホスト上のスクリプトを介してMQTTしたケースもありでした。今回はPCを介して接続するための準備であります。
※「ブロックを積みながら」投稿順 index はこちら
※動作確認にはRaspberry Pi 3 model B+のRaspberry Pi OS(32bit)上にインストールした以下を使用しています。
-
- Node-RED v2.0.5
別シリーズの以下記事では、無線LANやEthernetインタフェースの無いマイコンのシリアルインタフェースを使いホスト上のPythonスクリプトと通信、PythonスクリプトでMQTTブローカへ中継するという方法をとってました。
IoT何をいまさら(72) micro:bit発ラズパイ経由Node-REDダッシュボード
まどろっこしい方法ですが、これでNoredREDダッシュボード上に状態を表示したり、指令を受けたりできます。ただし上記はMQTTブローカが走っているRaspberry Pi 3機にシリアル通信していました。でもね、最近はPCホストで練習しているマイコンボードが多いです。PCとシリアル通信できるのでPC上に「中継」スクリプトを載せて置きたいです。ハード的には以下の形デス。
マイコンボード<-シリアルー>PC<-LANー>Raspberry Pi3
とりあえずの今回はPCとRaspberry Pi3の間でMQTTのやり取りのみ確認。以前に作成済のスクリプトのチョイ変。
パソコン上のスクリプト
PythonからのMQTT接続にはpaho-mqttを使わせていただいておりますが、パソコンにはインストールしてなかったのでそのインストールからです。PyPiのpaho-mqttのページが以下に。
基本、フツーにpipすればインストールは即です。PIPしている様子が以下に。
過去Raspberry Pi3機上で走らせていたスクリプトを取ってきてテスト用に不要部分を毟ったものが以下に。
#! /usr/bin/python3 import paho.mqtt.client as mqtt import time def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) client.subscribe("PC/TEST0") 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.connect("your host address...", 1883, 60) client.loop_start() client.publish("PC/Status", "Running") def main(): global client counter = 0 try: while True: client.publish("PC/Count", str(counter)) counter += 1 time.sleep(5) except KeyboardInterrupt: print("Terminated by KBD interrupt.") client.publish("PC/Status", "STOP") client.loop_stop() if __name__ == '__main__': main()
NodeRed上での「受け入れ」準備
PC経由の接続に備え、仮のタブを作りました。フローはこんな感じ。
サブスクライブするのは、PC/StatusとPC/Countの2つのトピック、いずれも受け取ったメッセージをテキストとしてDashboardに表示するのみ。一方、パブリッシュするのはPC/TEST0というトピック。スイッチのON・OFFを真偽値として発行するだけのもの。
実機動作確認
上記フローをデプロイ後、PC上でスクリプトを動作させるとこんな感じ。まずDashboardの様子。
PC側と「握れる」とStatusはRunningとなり、Countフィールドに5秒に1回カウント値が送られてくるようになります。末尾のスイッチをON/OFFするとPC側のスクリプトに伝わるのが分かります。PCのコンソールの様子はこんな感じ。
スクリプトを停めるときは、キーボード割り込みっす。CTRL+Cすると以下のように。
スクリプトが終了すると、NodeRedダッシュボードではStatusが変更されました。こんな感じ。
まあ、PCからMQTT経由NodeREDまでは動いた。当たり前か。後はチマチマしたマイコンの皆さんをNoredRED接続していくところだな。メンドクセー。