首页 > 解决方案 > MQTT - Dash 中的函数显示输出

问题描述

我试图在 Plotly Dash 上显示订阅特定主题的 MQTT 响应。不幸的是,on_message订阅该主题的函数不显示任何内容。我是 Python 和 Plotly dash 的新手,无法正常工作

import dash
import dash_html_components as html
import dash_core_components as dcc
import dash_bootstrap_components as dbc
import flask
from dash.dependencies import Input, Output, State
import json
import paho.mqtt.client as mqtt

external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

server = flask.Flask(__name__)
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
app.config.suppress_callback_exceptions = True

app.layout = html.Div([
                                         html.Div([
                                                    html.Button('Register', id='post-val', n_clicks=0)
                                                    
                                                ],style = {'marginTop': 50, 'margin-left' : '600px'}),
                                        
                                        html.Br(),
                                        
                                        html.Div(
                                            
                                            id='textarea-state-example-output', style={'whiteSpace': 'pre-line'}
                                            ),
                                        html.Div(
                                            
                                            id='textarea-state-example-output1', style={'whiteSpace': 'pre-line'}
                                            ),


                                 ],style={'width':'100%', 'margin': 20})
 
MQTT_HOST = "172.17.0.2"
#MQTT_HOST = 'localhost'
MQTT_PORT = 1883
MQTT_KEEPALIVE_INTERVAL = 45
MQTT_TOPIC_Registration = "gw/register"
MQTT_TOPIC_Registration_Response = "gw/registerresponse"
mqttc = mqtt.Client()
mqttc.connect(MQTT_HOST, MQTT_PORT, MQTT_KEEPALIVE_INTERVAL)

@app.callback(
    Output('textarea-state-example-output1', 'children'),
    [Input('post-val', 'n_clicks')]
    )


def display_Output(clicked):
    
    MQTT_HOST = "172.17.0.2"
    #MQTT_HOST = "localhost"
    MQTT_PORT = 1883
    MQTT_KEEPALIVE_INTERVAL = 45
    MQTT_TOPIC_Registration_Response = "gw/D4351D552DA8/registerresponse"
    if clicked:
        def on_connect(client, userdata, flags, rc):
            client.subscribe(MQTT_TOPIC_Registration_Response)
            
            
        def on_message(client, userdata, msg):
            data = json.loads(str(msg.payload.decode("utf-8","ignore")))
            return str(data)
        
        mqttc = mqtt.Client()
        mqttc.on_connect = on_connect
        mqttc.on_message = on_message
        
        mqttc.connect(MQTT_HOST, MQTT_PORT, MQTT_KEEPALIVE_INTERVAL)
        return 'Print' +str(mqttc.on_message)
        


@app.callback(
    Output('textarea-state-example-output', 'children'),
    [Input('post-val', 'n_clicks')])

def update_output(clicked):
    
    if clicked:

    MQTT_MSG=json.dumps({"gw_macid": "[32,74,2,255,255,144,255,203]",
                         "zigbee_mac_id": "60A423FFFE4292F1",
                         "gw_ip" : "192.168.0.105",
                         "gw_fw_version": "19.4.h-597",
                         "status_report_interval": 1,
                         "net_config": 2, 
                         "network_gateway_ip": 171986689,
                         "device_net_mask": 4294967040 });  
        
        mqttc.publish(MQTT_TOPIC_Registration, MQTT_MSG)
        
        res = mqttc.subscribe(MQTT_TOPIC_Registration_Response)
        if len(res)> 0:
            return "Gateway with MAC id" +gw_mac_id +"registered successfully"
        return "Gateway cannot be registered :("

if __name__ == '__main__':
    app.run_server(host='0.0.0.0',port=8050,debug=True)

运行应用程序时,它显示Print<function display_Output.<locals>.on_message at 0x7f3690143700>

函数的哪些更改display_Output将获取收到的响应?

提前致谢

标签: pythonpython-3.xmqttplotly-dashpaho

解决方案


on_message函数不返回任何内容,它在新消息到达时在 MQTT 客户端的网络线程上运行。

因此,尝试将其添加到页面的呈现方不会做任何有意义的事情


推荐阅读