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)

相关推荐
现代野蛮人8 小时前
【深度学习】 —— VGG-16 网络实现猫狗识别
网络·人工智能·python·深度学习·tensorflow
2301_780789669 小时前
“数字珍珠港”再现:西北能源基地DNS篡改事件深度复盘与防护升级
运维·服务器·网络·tcp/ip·网络安全·智能路由器·能源
S1998_1997111609•X9 小时前
针对犯罪集团etc/all,pid,IP的规划及量化逻辑原理
网络·安全·百度·缓存·量子计算
徐子元竟然被占了!!9 小时前
摄像头安全策略
网络
Zzzzmo_10 小时前
【网络编程】套接字
网络·套接字
国科安芯10 小时前
AS32S601 抗辐射 MCU 在星载高速光通信链路的集成设计与性能验证
网络·单片机·嵌入式硬件·risc-v·安全性测试
wangl_9211 小时前
Modbus RTU 与 Modbus TCP 深入指南-附录:快速参考表
网络·网络协议·tcp/ip·tcp·modbus·rtu
广州灵眸科技有限公司11 小时前
瑞芯微(EASY EAI)RV1126B openclaw部署接入飞书
linux·网络·人工智能·算法·yolo·飞书
idjoy12 小时前
网络原因导致gitee推送不上 提示没有权限或没有库
网络·gitee
骆驼102412 小时前
eNSP 与物理网络互通:从 ICS 到 Windows 路由转发的完整记录
网络·ensp·实验环境连通