SIM7600 MQTT TCP UDP 等常用网络功能测试

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)

相关推荐
网络研究院6 小时前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智6 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
treesforest6 小时前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
shushangyun_6 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
2601_961845157 小时前
粉笔行测题库|系统班|刷题
网络·百度·微信·微信公众平台·facebook·新浪微博
程序猿阿伟7 小时前
《Chrome离线扩展安装的底层逻辑与场景落地指南》
服务器·网络·chrome
InHand云飞小白8 小时前
无人值守站点网络困境?工业级路由器IR315破解连接难题
网络·物联网·4g·工业路由器·4g路由器·iiot·蜂窝路由器
森G8 小时前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt
江华森9 小时前
TCP/IP 协议栈实战 — 7 个实验详解
网络·tcp/ip·智能路由器
酉鬼女又兒9 小时前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php