1. 边缘设备资源监控与上报

任务说明

开发一个运行在边缘节点(Linux 环境)的资源监控程序,周期性采集 CPU 使用率、内存使用率和磁盘使用率,并通过 MQTT 协议将数据上报至云端 Broker。程序需支持通过命令行参数配置 MQTT 连接信息与采集周期,并在本地输出日志便于排查。

环境依赖

  • Python 3.8+
  • 安装依赖:pip install psutil paho-mqtt
  • MQTT Broker(如 Mosquitto)地址与端口,用于接收上报数据

完整实现代码

import argparse
import json
import time
import psutil
import paho.mqtt.client as mqtt

def collect_metrics():
    """采集CPU、内存、磁盘使用率"""
    cpu_percent = psutil.cpu_percent(interval=1)
    mem_percent = psutil.virtual_memory().percent
    disk_percent = psutil.disk_usage('/').percent
    return {
        'cpu_percent': cpu_percent,
        'mem_percent': mem_percent,
        'disk_percent': disk_percent
    }

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print(f"[MQTT] 已连接至 {userdata['broker']}:{userdata['port']}")
    else:
        print(f"[MQTT] 连接失败,返回码: {rc}")

def main():
    parser = argparse.ArgumentParser(description='边缘节点资源监控与MQTT上报')
    parser.add_argument('--broker', required=True, help='MQTT Broker地址')
    parser.add_argument('--port', type=int, default=1883, help='MQTT端口,默认1883')
    parser.add_argument('--topic', default='edge/node/metrics', help='上报主题')
    parser.add_argument('--interval', type=int, default=10, help='采集周期(秒),默认10')
    parser.add_argument('--client-id', default='edge-monitor-001', help='MQTT客户端ID')
    args = parser.parse_args()

    client = mqtt.Client(client_id=args.client_id, userdata={
        'broker': args.broker,
        'port': args.port
    })
    client.on_connect = on_connect

    try:
        client.connect(args.broker, args.port, keepalive=60)
        client.loop_start()
    except Exception as e:
        print(f"[ERROR] 无法连接MQTT Broker: {e}")
        return

    print(f"[INFO] 开始监控,采集周期 {args.interval}s,上报主题: {args.topic}")
    try:
        while True:
            metrics = collect_metrics()
            payload = json.dumps(metrics)
            result = client.publish(args.topic, payload, qos=1)
            if result.rc == mqtt.MQTT_ERR_SUCCESS:
                print(f"[上报] {payload}")
            else:
                print(f"[失败] 消息发送失败,返回码: {result.rc}")
            time.sleep(args.interval)
    except KeyboardInterrupt:
        print("\n[INFO] 用户中断,正在退出...")
    finally:
        client.loop_stop()
        client.disconnect()

if __name__ == '__main__':
    main()

运行方式

# 假设MQTT Broker运行在192.168.1.100,端口1883
python edge_monitor.py --broker 192.168.1.100 --interval 5

# 若需指定主题与客户端ID
python edge_monitor.py --broker 192.168.1.100 --topic edge/room1/metrics --client-id room1-node

验证方法

  1. 本地日志验证:程序启动后,每间隔指定秒数会打印一条 [上报] {...} 日志,其中包含 cpu_percent、mem_percent、disk_percent 三个字段,数值均在 0~100 范围内。
  2. 云端接收验证:在另一终端订阅同一主题,执行 mosquitto_sub -h 192.168.1.100 -t 'edge/node/metrics',能持续收到与本地日志一致的 JSON 消息即表示上报链路正常。
  3. 异常场景验证:将 --broker 指向一个不存在的地址,程序应打印连接失败信息并退出,不会抛出未捕获异常。

常见问题

  • CPU 使用率首次采集为 0:psutil.cpu_percent(interval=1) 首次调用会阻塞 1 秒用于采样计算,后续调用返回的是自上次调用以来的平均值,属正常行为。
  • MQTT 连接频繁断开:检查 Broker 是否启用了客户端认证,若需要用户名密码,需在代码中补充 client.username_pw_set() 调用。
  • 磁盘监控路径:当前固定监控根分区 /,如需监控其他挂载点,修改 psutil.disk_usage('/') 中的路径参数即可。