EMQX MQTT 测试
from flask import Flask, render_template_string, request, jsonify
import paho.mqtt.client as mqtt
import threading
import time
app = Flask(name)
mqtt_client = None
mqtt_connected = False
recv_messages = []
recv_lock = threading.Lock()
HTML = """
MQTT Web Tool
MQTT Web Client
Broker Port ClientID Topic
Connect
Subscribe
Payload Publish
"""
def on_connect(client, userdata, flags, reason_code, properties=None):
global mqtt_connected
if reason_code == 0:
mqtt_connected = True
with recv_lock:
recv_messages.append("[INFO] MQTT connected")
else:
mqtt_connected = False
with recv_lock:
recv_messages.append(f"[ERROR] MQTT connect failed, code={reason_code}")
def on_disconnect(client, userdata, disconnect_flags, reason_code, properties=None):
global mqtt_connected
mqtt_connected = False
with recv_lock:
recv_messages.append(f"[INFO] MQTT disconnected, code={reason_code}")
def on_message(client, userdata, msg):
payload = msg.payload.decode(errors="ignore")
with recv_lock:
recv_messages.append(f"[RECV] {msg.topic} : {payload}")
@app.route("/")
def index():
return render_template_string(HTML)
@app.route("/connect", methods=["POST"])
def connect():
global mqtt_client, mqtt_connected
data = request.get_json(silent=True) or {}
host = data.get("host", "").strip()
port = data.get("port", 1883)
clientid = data.get("clientid", "").strip()
if not host:
return jsonify({"msg": "Host is empty"}), 400
if not clientid:
return jsonify({"msg": "ClientID is empty"}), 400
try:
port = int(port)
except Exception:
return jsonify({"msg": "Port invalid"}), 400
try:
if mqtt_client is not None:
try:
mqtt_client.loop_stop()
mqtt_client.disconnect()
except Exception:
pass
mqtt_connected = False
mqtt_client = mqtt.Client(
callback_api_version=mqtt.CallbackAPIVersion.VERSION2,
client_id=clientid
)
mqtt_client.on_connect = on_connect
mqtt_client.on_disconnect = on_disconnect
mqtt_client.on_message = on_message
mqtt_client.connect(host, port, 60)
mqtt_client.loop_start()
# 等待最多3秒确认连接结果
for _ in range(30):
if mqtt_connected:
return jsonify({"msg": f"Connected to {host}:{port}"})
time.sleep(0.1)
return jsonify({"msg": "Connect request sent, but not confirmed yet"}), 500
except Exception as e:
mqtt_client = None
mqtt_connected = False
return jsonify({"msg": f"Connect failed: {str(e)}"}), 500
@app.route("/subscribe", methods=["POST"])
def subscribe():
global mqtt_client, mqtt_connected
data = request.get_json(silent=True) or {}
topic = data.get("topic", "").strip()
if not topic:
return jsonify({"msg": "Topic is empty"}), 400
if mqtt_client is None or not mqtt_connected:
return jsonify({"msg": "MQTT not connected"}), 400
try:
mqtt_client.subscribe(topic)
return jsonify({"msg": f"Subscribed {topic}"})
except Exception as e:
return jsonify({"msg": f"Subscribe failed: {str(e)}"}), 500
@app.route("/publish", methods=["POST"])
def publish():
global mqtt_client, mqtt_connected
data = request.get_json(silent=True) or {}
topic = data.get("topic", "").strip()
payload = data.get("payload", "")
if not topic:
return jsonify({"msg": "Topic is empty"}), 400
if mqtt_client is None or not mqtt_connected:
return jsonify({"msg": "MQTT not connected"}), 400
try:
info = mqtt_client.publish(topic, payload)
if info.rc == mqtt.MQTT_ERR_SUCCESS:
return jsonify({"msg": f"Published: {payload}"})
else:
return jsonify({"msg": f"Publish failed, rc={info.rc}"}), 500
except Exception as e:
return jsonify({"msg": f"Publish failed: {str(e)}"}), 500
@app.route("/recv")
def recv():
global recv_messages
with recv_lock:
msgs = recv_messages[:]
recv_messages = []
return jsonify(msgs)
if name == "main ":
print("Web MQTT Tool running")
print("Open browser: http://树莓派IP:5000")
app.run(host="0.0.0.0", port=5000, debug=False)
