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)

​

相关推荐
hhhjhl4 小时前
Protobuf.js 跨端三方库仓颉适配全流程
javascript·网络·udp
ITxiaobing20236 小时前
中国公司海外广告投放的 IP 地址库选型:从“查归属”到“验真实”的工程视角
网络·网络协议·tcp/ip
KKKlucifer6 小时前
运营商非结构化文档安全管控体系建设实践
大数据·网络·安全
网络小江8 小时前
组网第35课:静态路由——下一跳、出接口、默认路由、浮动静态与黑洞路由
服务器·网络·默认路由·黑洞路由·浮动静态路由
acrel78 小时前
医院用电隐患治理与节能降耗及智慧能源平台应用
网络·数据库
Escalating_xu9 小时前
【Linux 网络编程】应用层协议 HTTP(下):Header、连接管理与 C++ HTTP 服务器
linux·服务器·网络
明天也要努力学习11 小时前
TCP 协议的相关特性
网络·网络协议·tcp/ip
SHENGWEI胜为11 小时前
局域网出现 IP 地址冲突怎么办?如何从 ARP 表定位故障设备
网络协议·tcp/ip·php
qq_4017004111 小时前
100 个 IoT 小项目,给 ESP32 入门补上实操
前端·网络·stm32