MQTTでIoT通信(3)受け取ったのデータのファイル保存 プログラムをサービスとして起動する

MQTTでIoT通信(4)受け取ったのデータのファイル保存に挑戦。

sudo apt install python3-paho-mqtt

で Pythonの paho-mqtt ライブラリをインストール

logger.pyとして

import paho.mqtt.client as mqtt
import os

# --- 設定 ---
BROKER = "localhost"
TOPIC = "sensor/#"     # 受信したいトピック
#LOG_FILE = "mqtt_data.csv" # 保存ファイル名
LOG_FILE_pre = "/tmp/mqtt-data-" # 保存ファイル名の接頭部分

# メッセージ受信時の処理
def on_message(client, userdata, msg):
    # 届いた内容を文字列に変換
    payload = msg.payload.decode("utf-8")

    #トピックスのデータの処理 sensor/マシン名
    myTOPIC = msg.topic.split('/')     #myTOPIC[0]がsensorで[1]がマシン名
    #ペイロードのデータの処理
    mydata = payload.split(':')        # mydata[0] = tmp  mydata[1]が温度になるはず 

    LOG_FILE = LOG_FILE_pre +myTOPIC[1] + '-' + mydata[0] + ".txt"   #logファイルの指定 /tmp/に接頭語 マシン[>
    
    # ファイルに上書き保存(自動で閉じる仕組み) データの値だけ格納、温度だと24.45みたいな
    with open(LOG_FILE, "w", encoding="utf-8") as f:
        f.write( mydata[1] + "\n")
    
    print(f"Saved: {msg.topic} -> {payload}")

# --- メイン処理 ---
#クライアントのインスタンスを作成
client = mqtt.Client()

#「イベント」と「実行する関数」を紐付ける
client.on_message = on_message

client.connect(BROKER, 1883)
client.subscribe(TOPIC)

#受信待ちの無限ループに入る
print(f"Running... Saving to...")
client.loop_forever()

を作る。

作ったファイルを /usr/local/bin/ にコピーする

mqtt-logger.service を作る

[Unit]
#概要
Description=MQTT Data Logger Service
# ネットワークが繋がり、Mosquittoが起動した後にこのスクリプトを動かすという指定
After=network.target mosquitto.service

[Service]
# あなたのユーザー名(通常は pi ですが、確認したディレクトリの所有者に合わせてください)
User=[ユーザー名]  #piとか
# スラッシュから始まる「絶対パス」で指定してください
WorkingDirectory=/home/pi/mqtt_project
ExecStart=/usr/bin/python3 /usr/local/bin/logger.py
Restart=always

[Install]
# 複数のユーザーが使える状態(通常の起動状態)になったら有効にする
WantedBy=multi-user.target


このとき大文字小文字に注意 WantedBy を wantedBy にしていて30分くらいエラー探しをしていた。

/etc/systemd/system/ に移動する。以下のコマンドで登録して、自動起動にして再起動する

sudo systemctl daemon-reload
sudo systemctl enable mqtt-logger.service
sudo systemctl start mqtt-logger.service

 

コメント

このブログの人気の投稿

ImDisk Toolkitが開発終了していた。AIM Toolkitに乗り換え

Windows 10 デフォルトゲートウェイに0.0.0.0が追加される

iOS VLC でSMB共有できなかった点について