MQTTでIoT通信(3)受け取ったのデータのファイル保存 プログラムをサービスとして起動する
MQTTでIoT通信(4)受け取ったのデータのファイル保存に挑戦。
sudo apt install python3-paho-mqtt
で Pythonの paho-mqtt ライブラリをインストール
logger.pyとして
import paho.mqtt.client as mqttimport 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_messageclient.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_projectExecStart=/usr/bin/python3 /usr/local/bin/logger.pyRestart=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
コメント
コメントを投稿