物联网毕设数据集实战:从采集到可视化的一站式处理方案
做毕设最怕什么?不是不会写代码,而是没有靠谱的数据。
我去年带学弟做“基于温湿度的智能空调联动”课题,光找数据就折腾两周:网上下的 CSV 缺时间戳,自己拿 Excel 补,补完发现单位不统一,最后答辩被老师一句“数据可信度如何?”直接问懵。
痛定思痛,我干脆搭了一套“能跑起来”的迷你数据管道,把采集→传输→存储→可视化一次性打通,今天把整套笔记公开,直接复制就能用,别再重复造轮子。
。
1. 毕设数据三大坑:缺、乱、断
- 缺:公开数据集只给 3 天样本,想做长期异常检测,样本量不够。
- 乱:同一张表,温度列一会儿叫
temp,一会儿叫t,单位在表头注释里,代码里全得硬编码if/else。 - 断:没有时间戳或只有日期,毫秒级采样根本对不上,画出来的折线像抽象画。
一句话:没有上下文的数据,就是电子垃圾。
2. 数据格式怎么选?CSV vs JSON vs InfluxDB Line
| 维度 | CSV | JSON | InfluxDB Line |
|---|---|---|---|
| 可读性 | ★★★★☆ | ★★★☆☆ | ★★☆☆☆ |
| 存储冗余 | 低 | 高(key 重复) | 极低 |
| 时间精度 | 靠字符串 | 靠字符串 | 纳秒原生 |
| 流式解析 | 难 | 中 | 官方库直接支持 |
| 查询效率 | 全表扫描 | 全表扫描 | 索引列秒级 |
结论:
- 线下做算法原型→ CSV 够了;
- 设备直连云端→ JSON 通用;
- InfluxDB 做时序仓库→ Line Protocol 最省磁盘,写入最快,毕设直接上它,老师一看“专业”。
3. 30 行 Python 造出“真”设备
场景:10 个温湿度节点 + 5 个 PM2.5 节点,每 5 秒上报一次,持续跑 24 h 就能攒出 20 万条记录。
核心思路:MQTT 模拟多设备 → 统一 Payload → 直接写 InfluxDB。
3.1 安装依赖
pip install paho-mqtt influxdb-client python-dotenv3.2 模拟脚本(device_sim.py)
#!/usr/bin/env python3 import os, time, json, random from datetime import datetime from dotenv import load_dotenv from paho.mqtt import publish load_dotenv() # 把 broker、token 放 .env,保密又方便 BROKER = os.getenv("MQTT_BROKER") TOKEN = os.getenv("INFLUX_TOKEN") def mock_value(sensor_type): return { "temperature": round(20 + 5 * random.sin(time.time()/300) + random.normalvariate(0, 0.5), 2), "humidity": int(random.gauss(55, 10)), "pm25": max(0, int(random.gauss(35, 15))) }.get(sensor_type) def main(): device_map = {f"device_{i:02d}": "temperature" for i in range(1,11)} device_map.update({f"device_{i:02d}": "pm25" for i in range(11,16)}) while True: for dev_id, s_type in device_map.items(): val = mock_value(s_type) payload = { "device_id": dev_id, "sensor": s_type, "unit": {"temperature":"°C","humidity":"%","pm25":"μg/m³"}[s_type], "value": val, "ts": int(time.time()*1e99) # 纳秒 } publish.single(f"iot/{dev_id}", json.dumps(payload), hostname=BROKER, auth={"username":"token","password":TOKEN}) time.sleep(5) if __name__ == "__main__": main()跑起来后,** mosquitto 订阅窗口**能看到实时刷屏,像真设备一样。
4. 流式写入 InfluxDB
InfluxDB 2.x 官方推荐**桶(bucket)**概念,先建iot_bucket,保留策略 7 天足够毕设演示。
4.1 启动容器(一条命令)
docker run -d --name influxdb -p 8086:8086 \ -e DOCKER_INFLUXDB_INIT_MODE=setup \ -e DOCKER_INFLUXDB_INIT_USERNAME=admin \ -e DOCKER_INFLUXDB_INIT_PASSWORD=12345678 \ -e DOCKER_INFLUXDB_INIT_ORG=uni \ -e DOCKER_INFLUXDB_INIT_BUCKET=iot_bucket \ influxdb:2.74.2 写库脚本(mqtt_to_influx.py)
import paho.mqtt.client as mqtt, json, os from influxdb_client import InfluxDBClient, Point from influxdb_client.client.write_api import SYNCHRONOUS client = InfluxDBClient(url="http://localhost:8086", token=os.getenv("INFLUX_TOKEN"), org="uni") write_api = client.write_api(write_options=SYNCHRONOUS) def on_message(mosq, obj, msg): pl = json.loads(msg.payload) p = Point("sensor_data")\ .tag("device_id", pl["device_id"])\ .field(pl["sensor"], pl["value"])\ .time(pl["ts"]) write_api.write(bucket="iot_bucket", record=p) mqttc = mqtt.Client() mqttc.on_message = on_message mqttc.username_pw_set("token", os.getenv("INFLUX_TOKEN")) mqttc.connect("localhost", 1883) mqttc.subscribe("iot/+") mqttc.loop_forever()解释:
- 用
SYNCHRONOUS模式,毕设级并发够用,代码最少; - 一条 MQTT 消息 → 一个 Point,字段名即 sensor 值,后期 Grafana 自动识别。
5. Grafana 秒级出图
- 装插件:
docker run -d -p 3000:3000 --link=influxdb grafana/grafana - 浏览器开
localhost:3000→ Add data source → 选 InfluxDBFlux模式,填组织(uni)、桶(iot_bucket)、Token。 - 新建 Dashboard,写条 Flux 查询:
from(bucket:"iot_bucket") |> range(start: -1h) |> filter(fn: (r) => r._measurement == "sensor_data" and r._field == "temperature") |> aggregateWindow(every: 30s, fn: mean)保存后折线立刻出来,还能把 device_id 当变量做下拉框,老师点点按钮就能切换设备,答辩体验分 +10。
6. 性能小测:一致性、冷启动、并发
| 场景 | 结果 | 备注 |
|---|---|---|
| 数据一致性 | 100 % | MQTT QoS=1 + InfluxDB 同步写,重启脚本不丢数 |
| 冷启动延迟 | <200 ms | 本地 Docker 网络,肉眼无感知 |
| 并发 100 设备 5 s 上报 | CPU 12 % | 树莓派 4B 可扛,毕业答辩足够 |
提示:真要做千级设备,把
SYNCHRONOUS换成BATCHING,批 1000 条/秒写,CPU 能再降一半。
7. 生产环境避坑指南(毕设也适用)
- 时间同步:树莓派没 RTC,开机必
ntpdate,否则时间漂移,图会“穿越”。 - 幂等写入:Point 里加
device_id+sensor+timestamp三合一主键,重复启脚本不会多折线。 - 字段命名:统一小写+下划线,千万别留空格,Flux 语法对空格不友好。
- 保留策略:演示完把 7 天改成 1 天,省内存,老师拷贝镜像不爆炸。
- Git 上传:
.env放 token 别提交,用 sample.env 模板,公开仓库不泄露。
8. 把模板换成你的传感器
这套骨架不限于温湿度/PM2.5,改三处就能迁移:
mock_value()里换算法 → 心率、光照、CO₂,随你;- 新增枚举到
sensor+unit字典; - Grafana 里加面板,拖拽就能多轴对比。
毕设立项时直接把本文仓库链接写进“数据来源”章节,老师一看可复制,印象分稳了。
9. 小结与下一步
整套下来,从 0 到可演示只需一个下午:
- 数据不再拍脑袋;
- 格式统一,时间戳完整;
- 存储+可视化一步到位,论文里贴图高清又专业。
如果你正好卡在“数据集”环节,把代码拉下来跑通,再把自己的真实节点替换模拟器,毕设进度条瞬间 50 %。
下一步?把边缘节点换成 ESP32+MQTT 真上报,把模型算法加进来,这条管道依旧稳得很。祝你答辩顺利,代码常跑不挂!