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
验证方法
- 本地日志验证:程序启动后,每间隔指定秒数会打印一条
[上报] {...}日志,其中包含cpu_percent、mem_percent、disk_percent三个字段,数值均在 0~100 范围内。 - 云端接收验证:在另一终端订阅同一主题,执行
mosquitto_sub -h 192.168.1.100 -t 'edge/node/metrics',能持续收到与本地日志一致的 JSON 消息即表示上报链路正常。 - 异常场景验证:将
--broker指向一个不存在的地址,程序应打印连接失败信息并退出,不会抛出未捕获异常。
常见问题
- CPU 使用率首次采集为 0:
psutil.cpu_percent(interval=1)首次调用会阻塞 1 秒用于采样计算,后续调用返回的是自上次调用以来的平均值,属正常行为。 - MQTT 连接频繁断开:检查 Broker 是否启用了客户端认证,若需要用户名密码,需在代码中补充
client.username_pw_set()调用。 - 磁盘监控路径:当前固定监控根分区
/,如需监控其他挂载点,修改psutil.disk_usage('/')中的路径参数即可。