第4章:边缘计算与网关
好,咱们今天聊聊边缘计算和网关。说实话,这个概念在工业圈里被炒得挺热,但很多人其实没搞明白——边缘计算到底解决什么问题?我个人的理解很简单:数据别什么都往云端送,在靠近设备的地方就把活儿干了。
你想想看,一个工厂里几百个传感器,每秒都在产生数据。如果全扔到云端,带宽扛不住,延迟也受不了。更别说有些现场要求毫秒级响应,比如机械臂的急停信号,等数据绕一圈回来,设备早撞上了。
4.1 边缘计算的核心概念
边缘计算,说白了就是在数据源头附近做计算和决策。它和云计算不是替代关系,而是分工合作。
我习惯把工业物联网分成三层:
- 现场层:传感器、PLC、执行器,负责采集和控制
- 边缘层:网关、工控机、边缘服务器,负责数据预处理和实时响应
- 云端层:大数据分析、AI训练、远程监控
边缘层的作用,我总结为三个字:减、快、稳。
- 减:减少数据量,只上传有价值的信息
- 快:本地处理,毫秒级响应
- 稳:断网也能继续运行,不影响生产
关键认知:边缘计算不是把云端的活儿搬到本地,而是做云端做不了或者做不好的事。比如实时控制、数据清洗、协议转换,这些在边缘做最合适。
4.2 网关硬件选型
网关是边缘计算的物理载体。选型这件事,我踩过不少坑。曾经在一个项目里,为了省钱选了低配的ARM板子,结果现场数据量一上来,CPU直接跑满,数据丢包严重。后来换了工控机,问题才解决。
目前主流的网关硬件有三类,我列个表对比一下:
| 类型 | 代表产品 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 树莓派 | Raspberry Pi 4/5 | 价格低、生态好、社区资源丰富 | 性能有限、工业环境稳定性一般 | 原型验证、小规模部署、教学实验 |
| 工控机 | 研华、西门子、国产工控机 | 稳定可靠、接口丰富、支持宽温 | 价格高、体积大 | 工业现场、7x24小时运行 |
| 边缘服务器 | NVIDIA Jetson、华为Atlas | 算力强、支持AI推理 | 功耗高、成本高 | 视觉检测、AI应用 |
我个人建议:
- 做原型验证或学习,选树莓派,成本低,折腾坏了不心疼
- 真正上产线,老老实实用工控机。我曾经见过一个客户用树莓派跑了一个月,SD卡写坏了,数据全丢——教训深刻
- 如果需要跑AI模型,比如视觉检测,那就得上Jetson这类带GPU的板子
选型小技巧:先估算数据量。比如每秒采集100个传感器,每个传感器4字节,每秒就是400字节。看起来不大,但如果要做滤波、去重、协议转换,CPU负载会翻好几倍。我一般按峰值负载的2倍预留算力。
4.3 边缘侧数据预处理
数据到了网关,不能直接转发。为什么?因为原始数据太脏了。我在一个振动监测项目里遇到过,传感器偶尔会跳出一个异常值,振幅直接飙到正常值的10倍。如果不处理,云端会误判为设备故障。
边缘侧预处理,我主要做三件事:
4.3.1 滤波
滤波的目的是去除噪声和异常值。常用的方法:
- 限幅滤波:设定一个合理范围,超出范围的直接丢弃。比如温度传感器正常范围0-100℃,突然冒出来个500℃,明显是干扰
- 中值滤波:取连续N个采样值的中位数。对脉冲噪声特别有效
- 滑动平均滤波:取最近N个值的平均值。平滑效果好,但会有延迟
我一般这样组合使用:先限幅滤波去掉明显异常值,再用滑动平均做平滑处理。效果不错。
4.3.2 去重
去重是个容易被忽略的问题。有些传感器会重复发送相同的数据,尤其是Modbus RTU这种轮询协议。如果不做去重,云端会收到大量冗余数据,浪费带宽和存储。
去重的逻辑很简单:比较当前值和上一个值,如果相同就丢弃。但要注意,有些场景下重复值是有意义的,比如设备状态信号。所以去重要根据业务场景来配置。
4.3.3 数据压缩与聚合
除了滤波和去重,我还会做数据压缩和聚合:
- 压缩:用差值编码或游程编码,减少数据体积
- 聚合:计算一段时间内的平均值、最大值、最小值,只上传统计结果
注意:聚合会丢失细节。比如设备振动信号,如果只上传平均值,可能漏掉瞬间的冲击信号。所以关键数据要保留原始值,非关键数据做聚合。这个取舍,需要根据业务需求来定。
4.4 实战:在树莓派上部署数据采集脚本
好,理论说完了,咱们动手干一个。我选树莓派做演示,因为大家都能拿到,成本也低。工控机的部署逻辑是一样的,只是硬件接口不同。
这个实战的目标:在树莓派上采集模拟传感器数据,做滤波和去重,然后通过MQTT上传到云端。
4.4.1 硬件准备
- 树莓派4B(或5)一台
- 温湿度传感器DHT22一个(模拟真实传感器)
- 面包板、杜邦线若干
4.4.2 安装依赖
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装Python库
pip3 install paho-mqtt adafruit-circuitpython-dht
# 安装系统依赖
sudo apt install libgpiod2
4.4.3 数据采集脚本
下面这个脚本,我加了限幅滤波和去重逻辑。嗯,代码不长,但核心功能都有了。
import time
import board
import adafruit_dht
import paho.mqtt.client as mqtt
# 传感器初始化
dht_device = adafruit_dht.DHT22(board.D4)
# MQTT配置
MQTT_BROKER = "你的MQTT服务器地址"
MQTT_TOPIC = "factory/sensor/temperature"
# 滤波参数
TEMP_MIN = 0
TEMP_MAX = 50
last_temp = None
def filter_temperature(temp):
"""限幅滤波"""
if temp < TEMP_MIN or temp > TEMP_MAX:
return None
return temp
def is_duplicate(temp):
"""去重判断"""
global last_temp
if last_temp is not None and abs(temp - last_temp) < 0.1:
return True
last_temp = temp
return False
def on_connect(client, userdata, flags, rc):
print(f"MQTT连接成功,返回码:{rc}")
client = mqtt.Client()
client.on_connect = on_connect
client.connect(MQTT_BROKER, 1883, 60)
print("开始采集数据...")
while True:
try:
temp = dht_device.temperature
humidity = dht_device.humidity
# 滤波
temp = filter_temperature(temp)
if temp is None:
print(f"异常值被过滤:{dht_device.temperature}")
time.sleep(2)
continue
# 去重
if is_duplicate(temp):
print(f"重复值被丢弃:{temp}")
time.sleep(2)
continue
# 发布到MQTT
payload = f'{{"temperature": {temp:.1f}, "humidity": {humidity:.1f}}}'
client.publish(MQTT_TOPIC, payload)
print(f"已发送:{payload}")
except RuntimeError as e:
print(f"读取错误:{e}")
time.sleep(2)
4.4.4 部署与运行
# 将脚本保存为 edge_collector.py
# 运行脚本
python3 edge_collector.py
运行后,你会看到类似这样的输出:
开始采集数据...
已发送:{"temperature": 25.3, "humidity": 60.1}
重复值被丢弃:25.3
已发送:{"temperature": 25.4, "humidity": 60.2}
异常值被过滤:127.8
部署小贴士:
- 建议用systemd把脚本注册为服务,这样开机自启,断网重连
- 日志要写到文件,别只打印到终端。我曾经因为没写日志,排查问题花了半天
- 树莓派的SD卡容易坏,建议用工业级SD卡或者外接SSD
4.5 本章小结
边缘计算不是玄学,它就是在靠近设备的地方做该做的事。选对硬件、做好数据预处理,你的工业物联网系统才能稳定运行。
下一章,咱们聊聊数据上云的那些事——协议怎么选、安全怎么搞、断网续传怎么做。都是实战干货,别错过。