##やろうとしていること
MQTT Messageを常時受信するSubscribeプログラムを作成し、systemdで常時稼働させています。
##困っていること
次のプログラムは、MQTTの受信(Subscribe)プログラムです。
常時受信待ちの状況にするため、このプログラムをバックグラウンドで稼働させておきたいです。
具体的には、次のコマンドを実行していたいです。
nohup python test.py
##今起きている問題
systemdで自動起動させていましたが、自動起動のたびに、client.connectするため、
同じclient_idで続けて再接続してしまいます。(MQTTの通信が受信できないことがあります。)
そのため、自動起動ではなく、バックグラウンドで起動状態にしたいのですが、
どんな方法があるのでしょうか。
##プログラム
python
1#!/usr/bin/python 2# coding: utf-8 3import time 4from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient 5import subprocess 6 7CLIENT_ID = "hoge" 8ENDPOINT = "hogehoge.amazonaws.com" # <random>.iot.<region>.amazonaws.com 9PORT = 8883 10ROOT_CA = "/home/pi/dev/aws/rootCA.pem" 11PRIVATE_KEY = "/home/pi/dev/aws/hogehoge.pem.key" 12CERTIFICATE = "/home/pi/dev/aws/hogehoge.pem.crt" 13 14#大文字・小文字の区別に注意 15#Publishで設定しているTopicと同じに設定 16TOPIC = "test" 17 18def main(): 19 # setting for MQTT 20 client = AWSIoTMQTTClient(CLIENT_ID) 21 client.configureEndpoint(ENDPOINT, PORT) 22 client.configureCredentials(ROOT_CA, PRIVATE_KEY, CERTIFICATE) 23 # AWSIoTMQTTClient connection configuration 24 client.configureAutoReconnectBackoffTime(1, 32, 20) 25 # -1:infinite 26 client.configureOfflinePublishQueueing(-1) 27 # Draining: 2 Hz 28 client.configureDrainingFrequency(2) 29 # 10 sec 30 client.configureConnectDisconnectTimeout(10) 31 # 5 sec 32 client.configureMQTTOperationTimeout(5) 33 # Connect to AWS IoT with default keepalive set to 600 seconds 34 # keepAliveIntervalSecond : Time in seconds for interval of sending MQTT ping request. Default set to 600 seconds. 35 client.connect() 36 # TOPICが起動したら呼ばれる関数を登録するQoS(Quality of Service)=1 37 # QoS=0:投げっぱなし,QoS=1:少なくとも1回は確実にBrokerにメッセージが届く 38 client.subscribe(TOPIC, 1, mycallback) 39# time.sleep(5) 40 #無限ループ 41 while True: 42 time.sleep(5) 43 44def mycallback(client, userdata, message): 45 print("Received message '" + str(message.payload) + "' on topic '" + message.topic + "' with QoS " + str(message.qos)) 46 if message.payload == "red": 47 print("red") 48 subprocess.check_call(['python','/home/pi/dev/RED.py']) 49 elif message.payload == "blue": 50 print("blue") 51 subprocess.check_call(['python','/home/pi/dev/BLUE.py']) 52 elif message.payload == "yellow": 53 print("yellow") 54 subprocess.check_call(['python','/home/pi/dev/YELLOW.py']) 55 elif message.payload == "green": 56 print("green") 57 subprocess.check_call(['python','/home/pi/dev/GREEN.py']) 58 else: 59 print("RYGB") 60 subprocess.check_call(['python','/home/pi/dev/RYGB.py']) 61 62 63if __name__ == "__main__": 64 main() 65
##Unitファイル
text
1[Unit] 2Description=Subscriber 3Wants=network.target 4 5[Service] 6WorkingDirectory=/home/pi/dev/plc 7ExecStart=/home/pi/dev/test.py 8Restart=on-failure 9RestartSec=5s 10User=pi 11Group=pi 12 13[Install] 14WantedBy=multi-user.target
回答1件
あなたの回答
tips
プレビュー