
1. 项目背景与需求分析1.1 为什么要把 CAN 总线数据送上云做工业现场或者车载设备开发的朋友对 CAN 总线一定不陌生。哪怕没做过完整项目也大概率调试过某个带 CAN 接口的传感器、电机驱动器或者 PLC 模块。CANController Area Network从 1986 年由 Bosch 提出到现在凭借两根差分信号线就能在恶劣电磁环境下稳定传输数据这手绝活硬是在汽车、工厂自动化、医疗设备、工程机械这些领域扎根了三十多年。但 CAN 毕竟是为短距离、分布式控制设计的它天生就不是给“上云”用的。想要让 CAN 数据远程可见常规做法有几种要么用 USB-CAN 分析仪接电脑做本地监控要么用串口转以太网的模块做局域网透传。可一旦设备放在野外基站、高速公路配电箱、或者无人值守的污水处理站这两种办法就都不好使了——现场根本没有电脑也没有稳定的局域网环境给你接。这就轮到边缘计算网关登场了。这次要讲的 EC312 边缘计算网关就是把 CAN 总线数据接入 AWS IoT 的核心中转站。EC312 这类设备说白了就是一台加固过的迷你工业计算机有 CAN 口、串口、网口能跑 Linux 系统支持在边缘侧做数据解析和协议转换再把处理后的数据通过 MQTT 推到云端。相比直接拿工控机去做网关的体积、功耗、稳定性都更适合现场长期运行这也是为什么近几年“边缘网关 云平台”的组合在工业物联网项目里越来越常见。1.2 这个项目要解决的核心问题回到这次项目本身需求其实很明确现场有一批通过 CAN 总线组网的设备这里是某个非标自动化产线上的驱动器和传感器需要把运行状态数据实时上传到 AWS IoT Core让云端能远程监控设备健康度同时为后续的预测性维护积累数据。拆开看有三个核心问题绕不开CAN 侧的数据怎么稳定采上来。CAN 总线上报文是广播式的波特率、帧格式、报文 ID、数据位定义都得摸清楚否则解析出来全是乱码。边缘侧怎么处理和转发。EC312 上跑什么程序来读 CAN 接口数据格式怎么组织断网了怎么办这些都得在设计阶段想清楚。云端侧怎么安全接入。AWS IoT Core 的设备认证、策略配置、消息流转每一层都有坑尤其是设备证书和权限策略的搭配搞错了设备根本连不上。这三层链路每一层都有值得展开讲的细节。下面我会按实际项目推进的顺序把从 CAN 配置到云端收到第一条报文的完整过程拆开讲包括中间踩过的坑和调通的思路。2. 整体方案设计与硬件选型2.1 EC312 网关在系统里扮演什么角色先放一张整个数据链路的简化描述方便后面理解CAN 设备节点 → CAN 总线 → EC312 网关CAN 接口接收→ 边缘程序解析/缓存 → MQTT over TLS → AWS IoT Core → 规则引擎 → 下游服务EC312 在这条链路里处于“承上启下”的位置。承上它要能稳定接收 CAN 总线上的报文处理波特率波动、总线负载、错误帧这些底层问题启下它要把解析后的数据封装成云平台能识别的 JSON 消息通过 MQTT 协议发到 AWS IoT 的消息代理。选择 EC312 而不是其他方案主要是基于以下几个考量第一是接口齐全。EC312 自带 CAN 接口不需要额外挂 USB-CAN 模块这在工业现场非常重要——USB 转 CAN 的小盒子长期运行容易松动、发热而且驱动在嵌入式 Linux 环境下适配也麻烦。EC312 的 CAN 接口是直接集成在主板上的稳定性和可靠性高一个量级。第二是计算能力足够。EC312 内部是一颗 ARM 架构的处理器跑精简 Linux 系统能直接运行 Python 或者 C 编写的采集程序。对于 CAN 报文解析和 MQTT 转发这种轻量级任务CPU 和内存绰绰有余而且功耗只有几瓦现场可以用 PoE 或者 24V 直流供电。第三是体积和维护性。这类网关通常支持 DIN 导轨安装直接挂在配电柜里就行不像工控机那样需要额外的安装空间和保护外壳。远程还能通过 SSH 登录维护方便改配置、看日志。2.2 为什么选了 AWS IoT Core 而不是自建 MQTT Broker这里要顺便聊一下云平台选型的问题。很多项目会纠结到底用 AWS IoT、阿里云 IoT 还是自己搭一个 EMQX。我的判断标准很简单如果团队已经有云上业务跑在某个平台就优先用那个平台的 IoT 服务如果是从零开始AWS IoT Core 的托管程度高、规则引擎实用、免费额度也够开发测试用。AWS IoT Core 这个服务的核心是一个托管在云端的 MQTT Broker设备通过 MQTT 协议默认 8883 端口TLS 加密连接上来。它能做到设备认证。每个设备有独立的 X.509 证书连接时必须携带证书和服务端做 TLS 双向认证比单纯的用户名密码安全得多。设备影子Device Shadow。云端保存设备的期望状态和实际状态就算设备离线云端业务也能读到最新的影子数据等设备恢复上线后再同步。规则引擎Rules Engine。可以把收到的 MQTT 消息直接转发到 DynamoDB、S3、Lambda、Kinesis 等后端服务不需要自己写消息消费程序。用自建 Broker 的话这些能力全部要自己开发而且还要考虑 Broker 的高可用、负载均衡、证书管理工程量非常大。在边缘网关这类设备数量可能从几十到几千的项目里用托管服务省下的运维成本是非常可观的。提示如果有同事说“我们自己搭一个 MQTT Broker 不就行了”别急着反驳先问一句你敢保证这个 Broker 在凌晨三点设备批量上线的时候不宕机吗如果弄丢消息怎么办谁来负责补数据——托管 IoT 平台最大的价值不是省钱而是省心。3. CAN 数据采集与协议解析3.1 摸清 CAN 总线上的报文规律接手任何一个 CAN 项目第一步永远不是急着写代码而是“听总线”。所谓听总线就是把 CAN 分析仪或者网关自己的 CAN 接口接到总线上把报文全部抓下来然后一条一条地分析。EC312 网关本身就可以承担这个角色。先用网关照默认配置把 CAN 接口的波特率设成和现场总线一致的速率常见的有 125K、250K、500K、1M然后用candump这类工具抓取原始报文看能不能稳定收到数据。我们在现场遇到的第一步问题就是“接收超时”——总线上挂着的设备明明在发数据但 EC312 就是收不到。排查后发现EC312 出厂默认的 CAN 控制器采样点配置和现场设备不匹配。这里涉及到 CAN 总线的一个关键概念采样点。CAN 总线在发送每一位数据时接收方需要在位的某个时间点去采样电平这个时间点在整个位时间中的位置就是采样点。如果发送方和接收方的时钟存在误差采样点位置不对就会导致采样到错误的电平表现为报文接收失败或者错误帧频繁。常规解决方法是调整波特率分频和位时序参数。以 EC312 上常见的 MCP2515 或内部 CAN 控制器为例通常要配置同步跳转宽度SJW、传播时间段PROP、相位缓冲段 1PS1、相位缓冲段 2PS2这几个参数。按 ISO 11898 标准采样点一般建议设置在 80% 左右。EC312 的配置工具里可以直接看到采样点的计算值现场把它调成跟总线对手方接近的值报文就正常了。在分析报文内容时要注意 CAN 总线上通常会有多帧不同类型的数据常见的是周期报文和事件报文混合。建议先用 Wireshark配合 CAN 接口或者candump -L记录一段时间再按 ID 分组统计确认每个 ID 的发送周期和数据长度。有了这个底表解析代码才有依据。3.2 节点配置与波特率匹配的实操细节现场最怕遇到“不同节点的波特率明明标称一样但就是通信不正常”的情况。这个十有八九是时钟误差导致的。CAN 协议在物理层用的是 NRZ 编码为了时钟同步协议里定义了一个“位填充”机制如果连续发 5 个相同电平的位第 6 位必须插入一个反向电平这样接收方就能靠这些边沿做硬同步和重同步。但即便有同步机制如果各个节点的晶振误差太大也会突破同步能力上限导致总线错误。在 CANopenCAN 的上层应用协议之一配置里波特率标称 500K实际允许的时钟误差范围通常是 ±0.5% 左右。听起来很宽裕但工控现场经常有人用一个山寨的 CAN 分析仪去测总线那个设备晶振误差可能到 ±1%连上去就会把整条总线的错误帧带起来。EC312 因为走的是 Linux 的 SocketCAN 驱动只要内核支持它的位时序和时钟校准是自动管理的反而比很多杂牌分析仪靠谱。实际配置时在 EC312 上可以用ip link set can0 up type can bitrate 500000快速设置波特率。如果现场总线不是标准波特率还可以用ip link set can0 up type can tq 83 prop-seg 5 phase-seg1 6 phase-seg2 5 sjw 1这类更细的参数去匹配。调这些参数的时候最好的验证方式是把总线上的对手设备断开只让 EC312 发数据然后看它自己能不能收到自己的回环报文——能收到说明物理层基本没问题。3.3 CAN 报文解析的工程化思路报文解析这件事看起来就是把十六进制的数据按位拆出来换算成物理量但工程上要处理好几个问题。第一个是字节序。CAN 报文的整型数据Intel 格式小端和 Motorola 格式大端在业界都常见。老工程师会直接告诉你“看 DBC 文件”但很多非车载领域根本没人维护 DBC只能自己从报文样本里推断。判断方法很简单找一个已知变化的数据区间看它的高低字节是怎么排列的——如果数值在低字节递增那就是小端如果高字节先变那就是大端。第二个是符号位和缩放系数。一些报文里的数据是补码表示的有符号数十六进制转出来的值要判断正负还有温度、压力这类物理量一般带缩放系数比如实际值 原始值 × 0.1 偏移。这些信息最好集中写在一个配置文件里不要散落在代码里方便后期增加新设备时快速扩展。第三个是报文丢失和重复。CAN 总线上偶尔会有突发错误导致个别报文被丢弃。解析程序收到一帧帧数据时需要做一个“本周期超时”的判断如果某个周期性报文超过预定时间没收到就要在日志里记录下来并向上层报一个设备通信异常的状态而不是默默地继续等。在 EC312 上用 Python 实现一个简单的 CAN 解析线程思路大概是用python-can库绑定 SocketCAN 接口回调函数收到原始帧按配置解析成物理量然后统一放入一个 Python dict 里。后续无论是写本地 SQLite 缓存还是发 MQTT都从这个 dict 取值。这里要提醒一下Python 的解析速度在 CAN 总线满载比如 1M 波特率、接近 100% 负载的情况下可能会吃紧这时候建议关键解析用 C 写一个共享库Python 通过 ctypes 调用或者干脆用can-utils的candump 管道方式做预处理。我们这次项目报文负载不高每条总线十几帧/秒Python 直接跑完全没有问题。4. AWS IoT 接入与数据上云4.1 AWS IoT Core 侧的前置准备要接入 AWS IoT Core得先在亚马逊云控制台上完成几件事。这里默认读者已经有一个 AWS 账号如果是从零开始去控制台搜 IoT Core进入服务主页后按下面的流程操作就行。第一步是创建 IoT 策略Policy。策略定义了设备允许执行的操作比如连接、订阅、发布。AWS IoT 的权限模型和 IAM 类似甚至有朋友会拿自己的 IAM 角色直接授权但对于设备侧最佳实践是单独定义 IoT Policy。一个最小可用的设备策略模板如下{ Version: 2012-10-17, Statement: [ { Effect: Allow, Action: [ iot:Connect, iot:Publish, iot:Receive, iot:Subscribe ], Resource: [ arn:aws:iot:us-east-1:123456789012:topic/ec312/devices//data, arn:aws:iot:us-east-1:123456789012:topicfilter/ec312/devices//data ] } ] }注意这里的Resource要替换成你自己的账号 ID 和区域。策略里的topic/和topicfilter/是针对具体 MQTT 主题授权用的设备只能往约定的主题上发消息不能乱发。第二步是创建事物Thing。在 IoT Core 控制台里“管理 → 事物”页面点击创建输入一个名字比如EC312-GW-01然后为该事物生成证书。AWS 会给你三个东西设备证书、私钥、Amazon Root CA 证书。这三个文件要妥善保存证书和私钥后续要放到 EC312 网关上AWS 不会帮你保存私钥弄丢了只能重新生成。第三步是把策略附加到证书上。很多新手在这个环节掉坑证书生成了、设备侧也装了证书但就是连不上 AWS IoT报connection refused或者unable to connect。原因通常就是忘了把 IoT Policy 附加到证书——AWS IoT 的认证链路是“设备证书策略事物”四者绑定少一步都不行。提示生成证书的时候控制台会让你下载一个start.sh或connect_device_package之类的连接包里面有示例脚本和证书文件。这个包里的connect脚本可以先用电脑跑一遍确保证书和策略没问题再部署到网关能省去大量定位时间。4.2 EC312 上安装客户端并配置连接EC312 网关默认环境是精简版 Linux通常是 Yocto 或者 Buildroot 构建的系统可能没有预装 MQTT 客户端。在联网环境下可以用包管理器装mosquitto-clients提供mosquitto_pub和mosquitto_sub或者aws-cli。但如果现场网关侧无法直接访问外网、只能走 MQTT 协议连 AWS那就需要在开发机上把依赖交叉编译成静态二进制再传到网关上。EC312 的 SDK 一般会配套交叉编译工具链这里不展开但建议项目开始前先确认好交叉编译流程不然后期调试会非常被动。连接 AWS IoT Core 时MQTT 客户端需要做 TLS 双向认证。用mosquitto_pub做连通性测试的命令长这样mosquitto_pub \ --cafile root-CA.crt \ --cert device.pem.crt \ --key private.pem.key \ -h your-prefix.iot.us-east-1.amazonaws.com \ -p 8883 \ -t ec312/devices/gw01/data \ -m {temperature: 25.5} \ -d-d参数会打印详细交互日志连不上时一定要看它的输出——它能告诉你是在 TLS 握手阶段失败还是在 MQTT CONNECT 阶段被拒绝。TLS 阶段失败检查证书文件和域名端口MQTT 阶段失败多半是策略没配好或者证书被禁用。在正式项目里不推荐直接用命令行工具发数据而是应该在网关上运行一个守护进程负责 CAN 采集和 MQTT 上报。用 Python 的aws-iot-device-sdk-python或者通用paho-mqtt都可以。个人建议用paho-mqtt逻辑更透明也方便调试。核心代码结构如下import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): if rc 0: print(connected to AWS IoT) else: print(fconnection failed, rc{rc}) client mqtt.Client(client_idEC312-GW-01) client.tls_set(ca_certsroot-CA.crt, certfiledevice.pem.crt, keyfileprivate.pem.key) client.on_connect on_connect client.connect(your-prefix.iot.us-east-1.amazonaws.com, 8883, 60) client.loop_start() # 主循环读 CAN → 解析 → 发布消息 while True: msg build_can_batch_payload() # 从 CAN 解析线程取数据 client.publish(ec312/devices/gw01/data, json.dumps(msg), qos1) time.sleep(5)这里qos1是比较稳妥的选择AWS IoT Core 支持 QoS 0 和 QoS 1QoS 1 能保证消息至少送达一次但可能会重复在工业监控场景里丢数据比重复数据更可怕所以优先保证送达。4.3 消息格式设计与规则引擎配置上云的报文格式建议设计成一个统一的 JSON 结构方便后端处理。我们这次用的消息模板大致是{ deviceId: EC312-GW-01, timestamp: 1690000000, dataType: can, payload: { battery_voltage: 24.5, motor_current: 3.2, motor_speed: 1500, drive_temp: 45.1 } }deviceId用于标识网关或设备组timestamp用 Unix 时间戳统一时间基准payload里放解析后的工程值。这样的好处是AWS 规则引擎里可以用timestamp做时序判断deviceId做数据路由后端 Lambda 解析payload时不用关心报文原始格式。AWS 规则引擎可以这样配置创建一条规则用 SQL 语句SELECT * FROM ec312/devices//data匹配所有网关上行的消息然后把这个规则绑定到一个动作上。我们项目选的是“Republish a message to an AWS IoT Topic”加上“Insert a message into a DynamoDB table”两个动作一条规则把原始数据重新发布到另一个内部主题供流式计算使用另一条规则把数据写入 DynamoDB时间序列表用于在线查询和图表展示。如果你想要更复杂的处理比如数据清洗、字段过滤可以在规则 SQL 里直接做SELECT deviceId, timestamp, payload.battery_voltage AS voltage, payload.motor_current AS current FROM ec312/devices//data WHERE payload.motor_speed 1000这样下游拿到的就是经过筛选的干净数据但要注意规则引擎的 SQL 执行是有代价的消息量大时会产生相应的费用。初期量小无所谓量大后要优化消息内容和服务端计算分工。5. 边缘侧缓存与断网重传设计5.1 边缘缓存方案选型工业现场最怕的不是设备坏而是网络断。工厂车间、工地、隧道这些场景WAN 链路飘忽不定是常态。如果 EC312 断网期间采集的 CAN 数据全部丢失后面云端做数据分析就会出现空洞预测性维护的准确率直接受影响。所以边缘侧必须有一个本地缓存机制。可选方案有几种文本日志把原始报文逐行写入旋转日志文件断网后由另一个线程扫描日志补发。实现简单但查询和排序不方便。SQLite用一个小型关系数据库存数据断网期间写入恢复后扫描发送。胜在查询灵活且 EC312 这类网关本身有存储能力。时间序列数据库如 InfluxDB但内存和存储开销较大不适合存储资源有限的嵌入式环境。综合考虑我们选了 SQLite。原因很简单EC312 上跑 Python内置sqlite3模块零额外依赖建一张can_data表字段包括id、device_id、timestamp、payload_json、sent_flag。断网时数据只入表不发送网络恢复后发送线程从表中捞sent_flag 0的记录逐条发布 MQTT成功后把sent_flag更新成 1。SQLite 在嵌入式环境里要注意写入并发。如果采集线程每秒钟写入多条记录发送线程同时在读可能会碰到数据库锁。建议写入操作尽量开一个事务批量提交避免一条一条写。参考做法# 批量插入 with sqlite3.connect(/data/can_cache.db) as conn: conn.executemany( INSERT INTO can_data(device_id, timestamp, payload_json, sent_flag) VALUES(?,?,?,0), data_batch )另外 SQLite 数据库文件建议放在断电不易丢失的存储介质上。EC312 如果支持 SD 卡和 eMMC 双存储数据库就放在 eMMC 上别放 SD 卡——工业 SD 卡在频繁写入下寿命堪忧。5.2 断网检测和重传策略断网检测不能只靠 TCP 的超时判断因为 MQTT 的长连接可能处于“半开”状态——物理链路断了但客户端还没察觉到。我们用的办法是叠加两层检测MQTT 层的心跳Keep Alive机制。paho-mqtt里设置keepalive30如果超过 30 秒没有和 Broker 交换报文客户端就认为连接断开on_disconnect回调会被触发。业务层的周期确认。每 10 秒用client.publish到专用主题发一个带序列号的探活消息AWS 规则引擎把探活响应转发回来如果连续 2 次没收到就触发“离线”状态。重传策略上要防止两类问题重传风暴网络刚恢复时积压了十几万条消息全部以最高速度重发可能把 Broker 或后端打挂。顺序错乱断网期间产生了多条相同设备的数据重传时不按时间顺序发下游按时间做增量分析就会出错。解决办法是重传时加上限速和按时间排序。限速可以控制在每秒最多发送 50 条消息每条消息之间睡 20ms。顺序则按timestamp字段升序发送。这样 AWS 端收到数据即使有延迟时间线也是对的。如果断网时间特别长比如连续断了好几天SQLite 里的数据可能积累几十万条。此时要评估是否有重传必要——如果业务只需要实时监控历史数据可以从设备本地导入不必全部往云端灌。我们现场定的策略是断网超过 12 小时只保留每 5 分钟的均值数据降采样不再逐条补发。这个阈值根据自己的业务需求调整就好。6. 系统联调与问题排查实录6.1 端到端联调的关键步骤系统联调阶段建议分三步走不要一上来就把全套链路都跑起来否则出了问题根本定位不到是 CAN 侧还是云端侧。第一步是 CAN 侧闭环。先在 EC312 上用candump抓总线数据确认能连续收到报文 5 分钟无错误帧。同时接一个便携示波器看波形确认总线电平正常、终端电阻120Ω匹配。这步过了说明物理层没问题。第二步是本地解析验证。把 CAN 采集程序跑起来在网关的本地日志里看解析后的工程值是否合理。比如电机转速 1500 RPM、电压 24V 这类数据对比现场仪表读数应该是吻合的。这步过了说明应用层解析正确。第三步是云端连通。用一个测试主题把固定 JSON 消息发到 AWS IoT在控制台“测试”页面订阅这个主题看能不能收到。能收到说明证书、策略、网络都没问题。然后把发布源切换到 CAN 采集线程完成端到端联调。联调过程中我们遇到一个典型的 “能收到但发不出去” 的问题EC312 能正常订阅 AWS IoT 的消息从云端到设备方向但设备向云端发消息时规则引擎始终没有触发。查了半天发现 AWS IoT 策略里只授权了iot:Subscribe和iot:Receive漏掉了iot:Publish。加回去后消息流正常了。这种对称权限问题非常隐蔽排查时一定要把策略的四个动作全部带上并仔细核对。6.2 常见异常与解决速查在实际部署运行中我整理了一个问题速查表基本涵盖了这个链路里 90% 以上的坑现象可能原因解决方法CAN 接口 up 后无数据波特率不匹配 / 采样点错误用ip -details link show can0查看波特率参数调整位时序后重启接口总线上频繁出现错误帧终端电阻缺失或并联了多个120Ω在总线两端各接一个 120Ω 终端电阻用万用表量总线差分电阻约为 60ΩMQTT 连接 TLS 握手失败根 CA 证书不对或证书链不完整从 AWS 官方下载 Amazon Root CA 1不要用浏览器导出的证书MQTT 连接认证被拒证书未附加策略或证书被注销在 AWS IoT 控制台“安全 → 证书”中检查状态确认策略已附加能订阅不能发布IoT Policy 缺少 Publish/Receive 权限在策略里补上iot:Publish和iot:Receive部署后重启客户端数据发送成功但规则引擎无动作规则 SQL 匹配主题写错了检查规则里FROM的主题通配符是否覆盖实际发布主题断网重连后重复发送历史数据重传逻辑没有标记 sent_flag发送成功后立即更新数据库中的sent_flag 1网关长时间运行后 CAN 收不到数据SocketCAN 接口进入 BUSOFF 状态捕获ERROR帧脚本自动重启can0接口并重新配置云端时间与现场不一致网关没有配置 NTP 同步在 EC312 上安装配置 NTP 客户端或在内核启动参数中指定 NTP 服务器这个表格里BUSOFF那条值得专门说一下。CAN 控制器如果检测到发送错误太多比如总线上某个节点失效、把我们这边的错误计数器打满会自动进入 BUSOFF 状态被动断开总线。这时候接口看起来还是 up 的但收发全部无效。解决办法是在应用层监控内核日志里的bus-off事件一旦出现就执行ip link set can0 down ip link set can0 up type can bitrate 500000恢复前最好先检查总线对手方是不是出了问题否则重启接口也只是治标不治本。6.3 让调试过程更顺畅的三个工具性技巧最后再分享几个在联调中我用着顺手的经验技巧。技巧一用candump转成 Wireshark 可读的格式。candump可以用-l参数直接把报文写入一个二进制文件再用 Wireshark 的“导入”功能打开结合时间戳看报文间隔和周期非常直观比对着十六进制看强太多。如果需要分析总线负载率Wireshark 的can统计功能也能直接算出来。技巧二在 AWS IoT 控制台“测试”页面订阅上行主题。这个页面相当于一个简易 MQTT 客户端用网页就能订阅#通配符查看所有设备上行消息。联调时不用自己在电脑上再装 MQTT 客户端省事不少。技巧三在 EC312 上写一个自动诊断脚本。把 CAN 接口状态、MQTT 连接状态、SQLite 积压量、最近一条云端消息确认时间这几个指标汇总成一个 JSON每 30 秒拼成一个心跳消息发到云端。云端仪表盘上能直接看到每个网关的健康度远程排查问题时不用再 SSH 到设备上一项项翻。7. 回看整个项目的经验教训这个项目从开始摸底到云端收到第一条完整报文前后大概用了一周时间。中间大部分时间不是花在 AWS 配置上而是花在 CAN 物理层匹配和报文解析上。这也印证了我在工业物联网项目里一贯的判断真正难的不是云而是现场那条又老又稳定的现场总线。EC312 这类边缘网关最大的价值是把“上云”这件事的复杂度集中在设备侧解决了——CAN 协议转换、本地缓存、断网重传、安全连接这些都是网关的责任。云端要做的只是接收和存储。这种边界清晰的架构让项目的推进效率高了很多。如果你也在做类似的项目一个建议是先把现场的 CAN 报文摸清楚再动 AWS 配置。不要一上来就在控制台里折腾证书和策略因为只要 CAN 侧没有数据流云端配得再漂亮都是空转。反过来一旦 CAN 侧数据能稳定稳定地“跑起来”了云端接入的教程一抓一大把照着做就行。最后再提一点EC312 网关的串口和调试网口建议在项目后期都配上密码保护并修改默认端口。边缘网关一旦部署到现场物理接触的人可能比你想象的要多设备安全这事不能只看云端的 TLS设备本身的门也要关好。