为什么pahopython客户端发布短消息而不是长消息

2024-05-14 04:26:52 发布

您现在位置:Python中文网/ 问答频道 /正文

这样做有效:

while True:
    print('')
    command_input = input()
    if command_input == 'q':
        break
    mcp = Mqtt_command_publisher
    mcp.publish_command(device_ids, command_input)

但这并不是:

class Mqtt_command_bl:
    def update_minutes_to_run_at(json):
        if not json['device_ids']:
            return 'Request must contain device ids'

        device_ids = json['device_ids']
        minutes_to_run_at = json['minutes_to_run_at']

        minutes_to_run_at_command_section = ''
        for i in minutes_to_run_at:
            m = '"{}",'.format(i)
            if i == minutes_to_run_at[len(minutes_to_run_at) - 1]:
                m = '"{}"'.format(i)
            minutes_to_run_at_command_section += m

        #command_input = 'jq \'.+{{minutes_to_run_at:[{}]}}\' /home/pi/hallmonitor_lite/config.json > /home/pi/hallmonitor_lite/tmp.json && mv /home/pi/hallmonitor_lite/tmp.json /home/pi/hallmonitor_lite/new_config.json'.format(minutes_to_run_at_command_section)
        command_input = 'mkdir /home/pi/hallmonitor_lite/hello_world'

        mcp = Mqtt_command_publisher
        mcp.publish_command(device_ids, command_input)

        return 'Success'

他们都称之为:

class Mqtt_command_publisher:
    def publish_command(device_ids, command_input):
        mqtt_msg = json.dumps({'device_ids':device_ids,'command':command_input})
        print('\n{}'.format(mqtt_msg))
        client = mqtt.Client()
        client.connect('********', ****, 30)
        client.publish('topic/commands', mqtt_msg)
        client.disconnect()

查看从Mqtt_命令\u publisher输出的print语句,输出可以完全相同,但是,只有其中一个将执行,我不明白为什么一个可以工作,另一个不能。你知道吗

我尝试了以下命令进行测试:mkdir /home/pi/hallmonitor_lite/hello_world

这是接收部分:

device_id = 0

with open('/home/pi/hallmonitor_lite/config.json') as json_data_file:
    data = json.load(json_data_file)

    device_id = data['device_id']

def on_connect(client, userdata, flags, rc):
    print("Connected with result code: " + str(rc))
    client.subscribe("topic/commands")

def on_message(client, userdata, msg):
    mqtt_message = msg.payload.decode()
    print(mqtt_message)
    ids_and_command = json.loads(mqtt_message)
    if str(device_id) in ids_and_command['device_ids'] or not ids_and_command['device_ids']:
        print(('Executing: {}').format(ids_and_command['command']))
        os.system(ids_and_command['command'])



client = mqtt.Client()
client.connect("********", ****, 30)

client.on_connect = on_connect
client.on_message = on_message

client.loop_forever()

有什么想法吗?你知道吗


Tags: torunclientjsonidshomeinputdevice
1条回答
网友
1楼 · 发布于 2024-05-14 04:26:52

这个问题很可能是因为第二组代码创建的消息比单个TCP数据包所能容纳的要大。你知道吗

这是一个问题,因为您没有运行客户端网络循环,因此client.publish命令只能发送一个数据包,其余的消息将由网络循环发送,但即使它正在运行,您也会在发布调用之后立即调用disconnect。你知道吗

客户机并不意味着为这样的单个消息而启动,而是意味着当您想要发送消息时,只需调用publish方法就可以启动然后继续运行。如果您不想这样做,或者由于某种原因不能这样做,那么paho-python包中有一个特定的helper类,它将完成启动客户机、发送消息然后很好地分解所有内容的所有繁重工作。单个发布的文档是here。你知道吗

import paho.mqtt.publish as publish

publish.single("paho/test/single", "payload", hostname="mqtt.eclipse.org")

相关问题 更多 >