第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 本章小结

边缘计算不是玄学,它就是在靠近设备的地方做该做的事。选对硬件、做好数据预处理,你的工业物联网系统才能稳定运行。

下一章,咱们聊聊数据上云的那些事——协议怎么选、安全怎么搞、断网续传怎么做。都是实战干货,别错过。