继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

边缘计算和云计算相结合

2026-03-09 09:28:291635浏览

良许

1实战 · 398手记
TA的实战

大家好,我是良许。

最近在做一个智能监控项目时,我遇到了一个有趣的问题:摄像头采集的视频数据如果全部上传到云端处理,网络带宽根本扛不住,延迟也高得离谱。

但如果完全在本地处理,设备的算力又不够。

这让我深刻体会到,边缘计算和云计算并不是非此即彼的关系,而是需要巧妙结合才能发挥最大价值。

今天就和大家聊聊这个话题。

1. 边缘计算与云计算的本质区别

1.1 云计算:集中式的算力中心

云计算大家都不陌生,简单来说就是把数据和计算任务都扔到远程的数据中心去处理。

就像我们用的百度网盘、阿里云服务器,数据存储和处理都在云端完成。

云计算的优势很明显:算力强大、存储容量几乎无限、可以随时扩展资源。

但问题也很突出。

我之前做过一个工业设备监控系统,传感器每秒产生几百KB的数据,如果全部实时上传到云端,光网络费用一个月就要好几千块。

更要命的是,从设备采集数据到云端处理再返回结果,整个过程可能需要几百毫秒甚至更长,对于需要实时响应的场景根本不适用。

1.2 边缘计算:就近处理的智能节点

边缘计算则是把计算能力下沉到数据产生的地方,也就是网络的"边缘"。

比如在工厂车间部署一台边缘服务器,或者在智能摄像头里集成AI芯片,数据产生后立即在本地处理,只把必要的结果上传到云端。

我在做汽车电子项目时,车载系统就是典型的边缘计算场景。

车辆行驶过程中,各种传感器每秒产生海量数据,如果都传到云端处理,等云端返回指令时车可能已经撞上去了。

所以像自动驾驶、紧急制动这些功能,必须在车载ECU(电子控制单元)上实时完成计算和决策。

1.3 两者的互补关系

云计算和边缘计算就像大脑和神经系统的关系。

大脑负责复杂的思考和决策,神经系统负责快速的反射动作。

有些任务需要强大的算力和海量数据支持,适合在云端处理;有些任务需要毫秒级响应,必须在边缘完成。

两者结合才能构建一个高效的计算体系。

2. 边缘计算与云计算结合的典型架构

2.1 三层架构模型

在实际项目中,我们通常采用三层架构来实现边云协同:

2.1.1 设备层(终端层)

这是最底层,包括各种传感器、摄像头、工控设备等。

这些设备负责数据采集,有些智能设备还能做简单的预处理。

比如我用STM32做的一个温湿度监控节点,就在设备层完成了数据采集和初步过滤:

// STM32 HAL库实现的传感器数据采集
typedef struct {
    float temperature;
    float humidity;
    uint32_t timestamp;
    uint8_t status;
} SensorData_t;

// 数据采集和预处理
HAL_StatusTypeDef CollectSensorData(SensorData_t *data)
{
    float temp_raw, humi_raw;
    
    // 读取DHT22传感器数据
    if (DHT22_Read(&temp_raw, &humi_raw) != HAL_OK) {
        return HAL_ERROR;
    }
    
    // 边缘端预处理:数据有效性检查
    if (temp_raw < -40.0f || temp_raw > 80.0f) {
        data->status = STATUS_INVALID;
        return HAL_ERROR;
    }
    
    // 边缘端预处理:数据平滑滤波
    static float temp_buffer[5] = {0};
    static uint8_t buffer_index = 0;
    
    temp_buffer[buffer_index] = temp_raw;
    buffer_index = (buffer_index + 1) % 5;
    
    // 计算移动平均值
    float temp_sum = 0;
    for (int i = 0; i < 5; i++) {
        temp_sum += temp_buffer[i];
    }
    
    data->temperature = temp_sum / 5.0f;
    data->humidity = humi_raw;
    data->timestamp = HAL_GetTick();
    data->status = STATUS_VALID;
    
    return HAL_OK;
}

这段代码展示了在设备层做数据预处理的思路。

通过在MCU上完成数据有效性检查和滤波,可以大大减少需要上传的无效数据量。

2.1.2 边缘层(边缘服务器/网关)

边缘层是整个架构的关键。

它通常是一台具备一定算力的服务器或者工业网关,部署在靠近数据源的位置。

我在工厂项目中用的是一台搭载ARM处理器的边缘服务器,运行嵌入式Linux系统。

边缘层的主要职责包括:

  • 数据聚合:收集多个设备的数据
  • 实时分析:对数据进行实时处理和分析
  • 本地决策:根据预设规则做出快速响应
  • 数据筛选:决定哪些数据需要上传云端

举个例子,在智能工厂场景中,边缘服务器可以实时监控设备运行状态,一旦发现异常立即触发报警,而不需要等待云端响应。

同时,它会把设备的运行数据定期汇总上传到云端,用于长期分析和优化。

// 边缘服务器的数据处理逻辑示例(Linux C)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <time.h>

#define MAX_DEVICES 100
#define ALERT_THRESHOLD 75.0

typedef struct {
    int device_id;
    float value;
    time_t timestamp;
    int need_upload;  // 是否需要上传云端
} EdgeData_t;

// 边缘计算:实时数据分析
void* edge_processing_thread(void *arg)
{
    EdgeData_t *data = (EdgeData_t *)arg;
    
    // 本地实时判断
    if (data->value > ALERT_THRESHOLD) {
        // 触发本地报警,无需等待云端
        printf("[Edge Alert] Device %d: Value %.2f exceeds threshold!\n", 
               data->device_id, data->value);
        
        // 立即执行本地控制逻辑
        local_emergency_control(data->device_id);
        
        // 标记需要上传云端记录
        data->need_upload = 1;
    } else {
        // 正常数据,每10条上传一次
        static int counter = 0;
        counter++;
        data->need_upload = (counter % 10 == 0) ? 1 : 0;
    }
    
    return NULL;
}

// 数据上传决策
int should_upload_to_cloud(EdgeData_t *data)
{
    // 边缘智能:只上传有价值的数据
    if (data->need_upload) {
        return 1;
    }
    
    // 定时上传统计数据
    static time_t last_upload = 0;
    time_t now = time(NULL);
    if (now - last_upload > 300) {  // 每5分钟上传一次
        last_upload = now;
        return 1;
    }
    
    return 0;
}

这段代码展示了边缘层的智能决策能力。

通过在边缘端进行实时分析和判断,可以实现毫秒级的响应速度,同时大幅减少需要上传云端的数据量。

2.1.3 云层(云端数据中心)

云端负责那些需要强大算力和海量数据支持的任务,比如:

  • 大数据分析:分析历史数据,发现规律和趋势
  • 机器学习训练:训练AI模型,然后下发到边缘端使用
  • 全局优化:基于所有设备的数据进行全局调度和优化
  • 长期存储:存储历史数据,用于审计和追溯

2.2 数据流动机制

在边云协同架构中,数据的流动是双向的:

2.2.1 上行数据流(边缘到云端)

边缘端会根据策略选择性地上传数据。

比如在我做的视频监控项目中,边缘端的AI芯片会实时分析视频流,只有检测到异常事件时才上传关键帧到云端,平时只上传一些统计信息。

这样可以把带宽占用降低到原来的1/100。

2.2.2 下行数据流(云端到边缘)

云端会把训练好的AI模型、更新的配置参数、优化的控制策略下发到边缘端。

比如云端通过分析大量历史数据,发现某个设备在特定工况下容易出故障,就会更新边缘端的预警阈值,让边缘端能更准确地预判故障。

3. 边云协同的实际应用场景

3.1 智能制造

在智能工厂中,边云协同发挥着巨大作用。

我参与过一个数控机床监控项目,就是典型的边云结合案例。

边缘端部署在车间的工控机上,实时采集机床的振动、温度、电流等数据,通过预装的算法模型实时判断机床运行状态。

一旦检测到异常振动或者刀具磨损,立即触发报警并自动调整加工参数,整个过程不超过50毫秒。

同时,边缘端会把机床的运行数据定期上传到云端。

云端基于所有机床的历史数据进行深度学习,不断优化预测模型,然后把更新的模型下发到边缘端。

这样整个系统就形成了一个自我进化的闭环。

3.2 智慧交通

自动驾驶是边云协同的另一个典型场景。

车载系统作为边缘节点,需要实时处理摄像头、激光雷达、毫米波雷达等传感器的数据,做出驾驶决策,这些都必须在车上完成,延迟要求在毫秒级。

但是,高精地图更新、路况信息共享、车辆调度优化这些任务,则需要云端的强大算力和全局视角。

比如云端可以汇总所有车辆上报的路况信息,实时生成最优路线推荐给每辆车。

我之前在汽车电子公司工作时,参与开发过车载网关系统。

车载网关就是一个边缘计算节点,它连接车内的各个ECU,实时处理CAN总线上的数据,同时通过4G/5G模块与云端通信。

// 车载网关的数据处理示例
#include <linux/can.h>
#include <linux/can/raw.h>

#define CAN_FRAME_BUFFER_SIZE 1000

typedef struct {
    uint32_t can_id;
    uint8_t data[8];
    uint8_t len;
    uint32_t timestamp;
} CANFrame_t;

// 边缘端实时处理CAN数据
void process_can_data_on_edge(CANFrame_t *frame)
{
    // 实时安全检查(必须在边缘完成)
    if (frame->can_id == 0x123) {  // 制动系统CAN ID
        uint16_t brake_pressure = (frame->data[0] << 8) | frame->data[1];
        
        if (brake_pressure > 5000) {
            // 紧急情况,立即本地处理
            trigger_emergency_brake_assist();
            log_emergency_event(frame);
        }
    }
    
    // 数据聚合(定期上传云端)
    static CANFrame_t upload_buffer[CAN_FRAME_BUFFER_SIZE];
    static int buffer_count = 0;
    
    // 选择性缓存数据
    if (is_important_frame(frame)) {
        upload_buffer[buffer_count++] = *frame;
        
        if (buffer_count >= CAN_FRAME_BUFFER_SIZE) {
            // 批量上传到云端进行深度分析
            upload_to_cloud(upload_buffer, buffer_count);
            buffer_count = 0;
        }
    }
}

// 云端下发的优化参数
void apply_cloud_optimization(void)
{
    // 从云端获取最新的驾驶策略
    DrivingStrategy_t strategy;
    if (fetch_strategy_from_cloud(&strategy) == 0) {
        // 更新边缘端的控制参数
        update_local_control_params(&strategy);
        printf("Applied new strategy from cloud\n");
    }
}

3.3 智能家居

智能家居也是边云协同的好例子。像智能音箱,唤醒词识别必须在本地完成,不然每次说话都要传到云端,延迟太高体验很差。

但是复杂的语义理解和对话生成,则需要云端的强大AI能力。

我自己家里用的智能家居系统,就是这样设计的。

每个房间有一个基于树莓派的边缘控制器,负责控制灯光、空调等设备,响应速度很快。

同时这些边缘控制器会把用户的使用习惯数据上传到云端,云端分析后生成个性化的自动化场景,再下发到边缘端执行。

3.4 工业物联网

在工业物联网场景中,边云协同更是不可或缺。

我做过一个油田设备监控项目,油井分布在野外,网络条件很差。

如果完全依赖云端,网络一断就瞎了。

所以我们在每个油井旁边部署了一个边缘网关,运行嵌入式Linux系统。

边缘网关实时采集油井的压力、流量、温度等数据,在本地完成异常检测和报警。

即使网络中断,边缘网关也能独立运行,保证油井的安全。

当网络恢复时,边缘网关会把缓存的数据上传到云端。

云端基于所有油井的数据进行大数据分析,优化开采策略,然后下发到各个边缘网关执行。

4. 边云协同的技术挑战与解决方案

4.1 数据同步与一致性

边缘端和云端的数据同步是个大问题。

网络不稳定时,可能导致数据丢失或者不一致。

我的解决方案是在边缘端实现一个本地数据库,采用消息队列机制。

// 边缘端数据缓存与同步机制
#include <sqlite3.h>
#include <pthread.h>

typedef struct {
    int id;
    char data[256];
    int uploaded;
    time_t timestamp;
} DataRecord_t;

// 本地数据库缓存
sqlite3 *local_db;

// 数据上传线程
void* data_sync_thread(void *arg)
{
    while (1) {
        // 查询未上传的数据
        sqlite3_stmt *stmt;
        const char *sql = "SELECT * FROM sensor_data WHERE uploaded = 0 ORDER BY timestamp LIMIT 100";
        
        if (sqlite3_prepare_v2(local_db, sql, -1&stmt, NULL) == SQLITE_OK) {
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                DataRecord_t record;
                record.id = sqlite3_column_int(stmt, 0);
                strcpy(record.data, (const char*)sqlite3_column_text(stmt, 1));
                
                // 尝试上传到云端
                if (upload_to_cloud_with_retry(&record) == 0) {
                    // 上传成功,标记为已上传
                    mark_as_uploaded(record.id);
                } else {
                    // 上传失败,保留在本地,下次重试
                    break;
                }
            }
            sqlite3_finalize(stmt);
        }
        
        sleep(10);  // 每10秒尝试一次同步
    }
    
    return NULL;
}

这种机制保证了即使网络中断,数据也不会丢失,网络恢复后会自动同步到云端。

4.2 边缘设备的资源限制

边缘设备的计算能力、存储空间、功耗都有限制。

我们需要在边缘端部署轻量级的算法模型。

比如在做图像识别时,云端训练一个大型的深度学习模型,然后通过模型压缩、量化等技术,生成一个轻量级版本部署到边缘端。

我在STM32H7上部署过一个简单的神经网络模型,用于识别设备的运行模式。

虽然精度比云端的完整模型低一些,但是速度快,功耗低,完全满足边缘端的实时性要求。

4.3 安全性问题

边缘设备通常部署在物理安全性较差的环境中,容易被攻击。

我们需要在边缘端实现数据加密、身份认证、安全启动等机制。

同时,边缘端和云端的通信也需要加密。

我在项目中使用TLS/SSL协议加密通信,使用证书进行双向认证,确保数据传输的安全性。

4.4 模型更新与版本管理

云端训练的模型需要定期下发到边缘端更新。

这就涉及到版本管理、灰度发布、回滚等问题。

我的做法是在边缘端实现一个OTA(Over-The-Air)升级机制,支持增量更新和断点续传。

// 边缘端模型更新机制
typedef struct {
    char model_version[32];
    uint32_t model_size;
    uint32_t model_crc;
    char download_url[256];
} ModelUpdateInfo_t;

int update_edge_model(ModelUpdateInfo_t *info)
{
    char current_version[32];
    get_current_model_version(current_version);
    
    // 检查版本
    if (strcmp(current_version, info->model_version) == 0) {
        printf("Model is already up to date\n");
        return 0;
    }
    
    // 下载新模型
    printf("Downloading new model version %s...\n", info->model_version);
    if (download_model_from_cloud(info->download_url, "/tmp/new_model.dat") != 0) {
        printf("Failed to download model\n");
        return -1;
    }
    
    // 校验完整性
    uint32_t crc = calculate_crc("/tmp/new_model.dat");
    if (crc != info->model_crc) {
        printf("Model CRC check failed\n");
        return -1;
    }
    
    // 备份旧模型
    system("cp /opt/model/current.dat /opt/model/backup.dat");
    
    // 安装新模型
    system("mv /tmp/new_model.dat /opt/model/current.dat");
    
    // 重启推理引擎
    restart_inference_engine();
    
    printf("Model updated successfully to version %s\n", info->model_version);
    return 0;
}

5. 边云协同的未来发展趋势

5.1 5G网络的推动作用

5G网络的大带宽、低延迟特性,会让边云协同更加高效。

我最近在关注5G+边缘计算的应用,比如在5G基站侧部署边缘服务器,可以实现超低延迟的应用场景,像远程手术、工业控制等。

5.2 边缘AI的普及

随着AI芯片的发展,越来越多的边缘设备具备了AI推理能力。

像英伟达的Jetson系列、谷歌的Coral系列,都是专门为边缘AI设计的。

未来会有更多的AI任务下沉到边缘端,云端主要负责模型训练和全局优化。

5.3 云边端一体化

未来的趋势是云边端一体化,形成一个统一的计算架构。

开发者不需要关心任务是在云端还是边缘端执行,系统会根据任务特点、网络状况、设备能力自动调度。

这需要一个强大的编排系统,像Kubernetes已经开始支持边缘节点的管理。

5.4 边缘计算的标准化

目前边缘计算还缺乏统一的标准,各家厂商的方案都不一样。

未来随着边缘计算联盟(ECC)、工业互联网联盟(IIC)等组织的推动,会逐步形成统一的标准和规范,让边云协同更加容易实现。

6. 总结

边缘计算和云计算的结合,不是简单的技术叠加,而是一种架构上的创新。

通过合理的任务划分和数据流动机制,可以同时获得边缘计算的实时性和云计算的强大能力。

从我多年的嵌入式开发经验来看,边云协同是未来物联网、工业互联网、智能制造等领域的必然选择。

作为嵌入式工程师,我们需要掌握从底层硬件到云端应用的全栈技术,才能更好地设计和实现边云协同系统。

在实际项目中,我们要根据具体场景选择合适的架构。

对于实时性要求高的任务,尽量在边缘端完成;对于需要大量计算和存储的任务,交给云端处理。

同时要考虑网络状况、设备能力、成本等因素,找到最优的平衡点。

边云协同不是终点,而是一个持续演进的过程。

随着技术的发展,会有更多创新的应用场景出现。

我们要保持学习和探索的态度,不断提升自己的技术能力,才能在这个快速变化的时代保持竞争力。

更多编程学习资源

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP