我正在尝试自动在python中运行脚本。该脚本管理多个LED并通过MQTT进行通信。
如果我尝试通过外壳运行脚本(没有自动运行),我的连接工作将没有任何问题。
如果我尝试自动运行该脚本,它将正确启动,但与代理的连接将无限循环地向上,向下,向上,向下,向上...运行。无法建立连接。
自动运行脚本加载到/ etc / profile-> sudo python3 script / path.py
什么可能导致此问题?
回顾:
通过shell->一切正常,没问题
通过自动运行->开始正常,连接up-down-up-down -....
python中的脚本,连接到代理:
def Connect(client,broker,port,keepalive,run_forever=False):
#"""Attempts connection set delay to >1 to keep trying
#but at longer intervals """
connflag=False
delay=5
print('--------------------------------')
print("connecting " + client_id)
badcount=0 # counter for bad connection attempts
while not connflag:
logging.info("connecting to broker "+str(broker))
print("connecting to broker "+str(broker)+":"+str(port))
print("Attempts ",badcount)
try:
res=client.connect(broker,port,keepalive) #connect to broker
if res==0:
print('--------------------------------')
print("Connection established")
print('--------------------------------')
connflag=True
return 0
else:
logging.debug("connection failed.")
print('--------------------------------')
badcount += 1
if badcount>=3 and not run_forever:
raise SystemExit #give up
elif run_forever and badcount<3:
delay=5
else:
delay=3
[...........................................................]
[..................other stuff.................]
[...........................................................]
def on_connect(client, userdata, flags, rc):
print('--------------------------------')
logging.debug("Connected flags"+str(flags)+"result code " + str(rc) + "client RPi Giulio")
if rc == 0:
print("Connected OK. Returned code = ", rc)
print('--------------------------------')
client.connected_flag = True
client.publish(connected_topic,1,retain=True)
else:
print("Bad connection. Returned code = ", rc)
print('--------------------------------')
client.bad_connection_flag = True
代理实例显示:
RPiGiulio /连接/状态0
RPiGiulio /连接/状态1
RPiGiulio /连接/状态0
RPiGiulio /连接/状态1
RPiGiulio /连接/状态0
RPiGiulio /连接/状态1
[..............................]
自动运行脚本命令:
写@ sudo nano / etc / profile
sudo python3 /home/pi/..../main.py&
解决方案:CRONTAB https://www.dexterindustries.com/howto/auto-run-python-programs-on-the-raspberry-pi/
答案 0 :(得分:1)
如评论中所述,这纯粹是基于可用信息非常有限的猜测。
客户端保持连接/断开的通常原因是因为您有多个具有相同clientid的客户端。
您一次只能使用给定的clientid将一个客户端连接到代理,如果第二个客户端连接,则第一个客户端将启动。如果第一个客户端随后尝试重新连接,它将启动第二个客户端并再次开始该序列。
由于.profile
在每个登录Shell中都运行,因此您可能会运行许多客户端实例。
您需要确保仅启动一个客户端副本,并且该副本具有唯一的客户端ID。