为什么带有自动运行script.py的mqtt无法稳定与代理的连接?

时间:2019-09-09 15:13:26

标签: python-3.x bash mqtt

我正在尝试自动在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/

1 个答案:

答案 0 :(得分:1)

如评论中所述,这纯粹是基于可用信息非常有限的猜测。

客户端保持连接/断开的通常原因是因为您有多个具有相同clientid的客户端。

您一次只能使用给定的clientid将一个客户端连接到代理,如果第二个客户端连接,则第一个客户端将启动。如果第一个客户端随后尝试重新连接,它将启动第二个客户端并再次开始该序列。

由于.profile在每个登录Shell中都运行,因此您可能会运行许多客户端实例。

您需要确保仅启动一个客户端副本,并且该副本具有唯一的客户端ID。