ブロックを積みながら(136) Node-RED、PCをMQTT接続、マイコン接続の準備ね

Joseph Halfmoon

前々からネットワーク接続機能を持ったマイコンボード類は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のページが以下に。

paho-mqtt

基本、フツーにpipすればインストールは即です。PIPしている様子が以下に。InstallPahoMQTT

過去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経由の接続に備え、仮のタブを作りました。フローはこんな感じ。NodeRedFlowForPC

サブスクライブするのは、PC/StatusとPC/Countの2つのトピック、いずれも受け取ったメッセージをテキストとしてDashboardに表示するのみ。一方、パブリッシュするのはPC/TEST0というトピック。スイッチのON・OFFを真偽値として発行するだけのもの。

実機動作確認

上記フローをデプロイ後、PC上でスクリプトを動作させるとこんな感じ。まずDashboardの様子。DashBoardForPC

PC側と「握れる」とStatusはRunningとなり、Countフィールドに5秒に1回カウント値が送られてくるようになります。末尾のスイッチをON/OFFするとPC側のスクリプトに伝わるのが分かります。PCのコンソールの様子はこんな感じ。PythonRunnging

 

スクリプトを停めるときは、キーボード割り込みっす。CTRL+Cすると以下のように。KBDinterrupt

スクリプトが終了すると、NodeRedダッシュボードではStatusが変更されました。こんな感じ。STOP

まあ、PCからMQTT経由NodeREDまでは動いた。当たり前か。後はチマチマしたマイコンの皆さんをNoredRED接続していくところだな。メンドクセー。

ブロックを積みながら(135) Node-RED、SHA-256ハッシュを計算 へ戻る

ブロックを積みながら(137) Scilab/XCOSの復活、まずは積分でリハビリ へ進む