【实战教程】映翰通 EC312 边缘计算机:CAN 总线数据采集并经 DSA 上传 AWS IoT 全流程
摘要
本文演示如何在 映翰通 EC312 边缘计算机上:
- 通过 Python + python-can 读取 CAN2 总线数据;
- 经 Device Supervisor(DSA)内部 MQTT Broker 写入 虚拟控制器 测点;
- 在 Web 管理界面配置 AWS IoT 云服务,将测点数据 发布到 AWS。
适合工业现场需要将车载/设备 CAN 数据上云、且网关已内置 DSA 的场景。
关键词:EC312、CAN 总线、python-can、Device Supervisor、DSA、虚拟控制器、南向消息总线、AWS IoT、边缘计算
目录
- 一、方案架构与数据流
- 二、环境与物料准备
- [三、阶段一:CANbus Reader(本地读 CAN)](#三、阶段一:CANbus Reader(本地读 CAN))
- 四、阶段二:创建虚拟控制器
- [五、阶段三:CAN 数据写入虚拟控制器(南向 MQTT)](#五、阶段三:CAN 数据写入虚拟控制器(南向 MQTT))
- [六、阶段四:DSA 连接 AWS IoT](#六、阶段四:DSA 连接 AWS IoT)
- [七、阶段五:发布到 AWS 并验证](#七、阶段五:发布到 AWS 并验证)
- 八、常见问题与排错
- 九、参考链接
一、方案架构与数据流
官方描述的整体数据流如下:
Python 应用接收 CAN 数据 → 发布到 内部 MQTT Broker → 数据写入 虚拟控制器(Virtual Controller) → 登录 EC312 Web,在 Device Supervisor(DSA) 中配置虚拟控制器与云服务 → 将数据 发布到 AWS。
1.1 架构示意

【图 1-1:CAN 数据到 AWS 整体数据流架构图】
二、环境与物料准备
| 项目 | 说明 |
|---|---|
| 硬件 | 映翰通 EC312 边缘计算机、PC、网线、CAN 总线设备及线缆 |
| 网络 | PC 接 EC312 以太网口 2(ETH2);设备需能访问外网(安装依赖、连接 AWS) |
| 软件 | SSH 终端(PuTTY / Windows Terminal / MobaXterm 等)、EC312 Web 管理账号 |
| 云端 | AWS IoT Core 账号;已创建 物品(Thing)、策略、证书(见第六节) |
| 文档 | DSA 用户手册、内部 MQTT、AWS IoT 说明 |
默认 SSH 信息(以官方博客为准,若设备已改密请以现场为准):
| 项 | 值 |
|---|---|
| 地址 | 192.168.4.100(ETH2 侧) |
| 用户 | edge |
| 密码 | security@edge |
| root | sudo -s,密码同上 |
EC 系列内部 MQTT Broker(DSA 手册):
| 项 | 值 |
|---|---|
| 地址 | 127.0.0.1 |
| 端口 | 9105 |
| 用户名 | inhand |
| 密码 | inhand |
三、阶段一:CANbus Reader(本地读 CAN)
本阶段在 EC312 上安装依赖、编写并运行 CAN 采集脚本,先在本地验证能读到 CAN 帧。
步骤 1:SSH 登录设备
- 用网线将 PC 连接到 EC312 的 ETH2。
- 在 PC 上打开终端,执行:
bash
ssh edge@192.168.4.100
- 按提示输入密码:
security@edge

【图 3-1:PC 连接 EC312 ETH2 与 SSH 登录终端】
步骤 2:切换 root 用户
bash
sudo -s
密码:security@edge

【图 3-2:sudo -s 切换 root 成功】
步骤 3:确认外网可达
bash
ping 8.8.8.8 -c 4
能通则说明可通过 apt/pip 安装软件包。

【图 3-3:ping 8.8.8.8 成功】
步骤 4:更新 APT 源
bash
apt-get update

【图 3-4:apt-get update 执行结果】
步骤 5:安装 pip
bash
apt-get install -y python3-pip

【图 3-5:python3-pip 安装完成】
步骤 6:安装 python-can
bash
pip3 install python-can
apt install -y python3-can

【图 3-6:python-can 安装成功】
步骤 7:编写 CAN 测试脚本
在设备上创建脚本(文件名与官方示例一致:can-ec312.py)。以下为 结构化示例(CAN 接口名、波特率、ID 过滤请按现场修改;原文 Step Seven 为配图示例,此处给出可编辑模板)。
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
EC312 CAN2 采集示例(阶段一:仅本地打印 CAN 帧)
发布到 DSA 内部 MQTT 的代码见第五阶段完整脚本。
"""
import can
# 按 EC312 实际 CAN 接口修改,常见为 can1 / can2
CAN_INTERFACE = "can2"
BITRATE = 500000 # 500k,按总线实际配置
def main():
bus = can.interface.Bus(
channel=CAN_INTERFACE,
bustype="socketcan",
bitrate=BITRATE,
)
print("Listening on %s ..." % CAN_INTERFACE)
try:
for msg in bus:
print(
"ID=0x%03X DLC=%d Data=%s"
% (msg.arbitration_id, msg.dlc, msg.data.hex())
)
except KeyboardInterrupt:
pass
finally:
bus.shutdown()
if __name__ == "__main__":
main()
若 CAN 接口未 UP,需先配置 SocketCAN,例如:
ip link set can2 type can bitrate 500000后ip link set can2 up(以设备实际网卡名为准)。
步骤 8:CAN2 接线并连接待测设备
- 将 CAN 设备接入 EC312 的 CAN2 端口(注意 CAN_H / CAN_L / GND,终端电阻按总线要求)。
- 确认总线波特率与脚本中
BITRATE一致。
步骤 9:运行 Python 脚本
bash
python3 ./can-ec312.py
终端应持续打印 CAN 帧;若无数据,检查接线、终端电阻、波特率及对端是否在发帧。

【图 3-9:python3 can-ec312.py 运行输出】
四、阶段二:创建虚拟控制器
虚拟控制器用于在 DSA 内"承接"二次开发应用(如本教程 Python 脚本)写入的测点数据,再供云服务上报 AWS。
步骤 1:Web 登录并创建虚拟控制器
- 浏览器访问 EC312 Web 管理地址(与 ETH 口 IP 规划一致)。
- 进入 Device Supervisor(设备监控 / 边缘计算) 插件。
- 在 测点监控 中 添加控制器 :
- 控制器协议 :选择 虚拟控制器
- 名称 :自定义且全局唯一,下文示例为
can_virtual
- 添加测点,官方示例测点名:
pressure(类型、读写权限按业务选择,建议 Read/Write)。 - 将测点加入用于上云的 分组 (如
default)。
详细界面说明见:DSA 知识库

【图 4-1:DSA 中添加虚拟控制器(协议选虚拟控制器)】

【图 4-3:添加测点 pressure 示例】

【图 4-4:测点加入分组 default】
步骤 2:记录 Service ID
创建控制器后,在 DSA 日志或控制器详情中查看该 虚拟控制器的 driver ServiceId(下文南向 MQTT 写值 Topic 需要用到)。
注意:ServiceId 不是固定值 ,与控制器启用顺序有关;必须以设备日志/界面显示为准 ,勿照搬示例数字。
【图 4-5:虚拟控制器 Service ID 查看位置截图】
记下:
- 控制器名称 :
can_virtual(示例) - 测点名称 :
pressure(示例) - ServiceId :
________(现场填写)
五、阶段三:CAN 数据写入虚拟控制器(南向 MQTT)
本阶段修改 Python:在读取 CAN 的同时,向 DSA 内部 MQTT 发布 南向写测点 消息,由驱动写入虚拟控制器。
5.1 南向写值 Topic 与 Payload(DSA 手册)
| 项目 | 内容 |
|---|---|
| Topic | ds2/eventbus/south/write/{requestServiceId} |
| requestServiceId | 第四节记下的虚拟控制器 ServiceId |
| Payload 示例 | 见下 |
json
{
"msg_id": 43461834341,
"timestamp": 1610335020088,
"payload": [
{
"name": "can_virtual",
"measures": [
{
"name": "pressure",
"value": 12
}
]
}
]
}
payload[].name:控制器名称measures[].name:测点名称measures[].value:要写入的数值(需由 CAN 帧解析得到)
更多说明:连接内部 MQTT Broker
步骤 1:安装 paho-mqtt 并改造脚本
bash
pip3 install paho-mqtt
完整示例脚本 can-ec312-dsa.py(请将占位常量改为现场值):
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import time
import uuid
import can
import paho.mqtt.client as mqtt
# ---------- 按现场修改 ----------
CAN_INTERFACE = "can2"
BITRATE = 500000
CONTROLLER_NAME = "can_virtual"
MEASURE_NAME = "pressure"
# 虚拟控制器的 ServiceId(第四节获取)
VIRTUAL_CONTROLLER_SERVICE_ID = 2000 # ← 替换为实际值
MQTT_HOST = "127.0.0.1"
MQTT_PORT = 9105
MQTT_USER = "inhand"
MQTT_PASS = "inhand"
WRITE_TOPIC = "ds2/eventbus/south/write/%d" % VIRTUAL_CONTROLLER_SERVICE_ID
# --------------------------------
def can_to_value(msg: can.Message) -> float:
"""示例:取首字节为压力值;请按 DBC/协议自行解析"""
if msg.dlc >= 1:
return float(msg.data[0])
return 0.0
def publish_measure(client: mqtt.Client, value: float):
body = {
"msg_id": int(uuid.uuid4().int % (10**12)),
"timestamp": int(time.time() * 1000),
"payload": [
{
"name": CONTROLLER_NAME,
"measures": [{"name": MEASURE_NAME, "value": value}],
}
],
}
client.publish(WRITE_TOPIC, json.dumps(body), qos=1)
def main():
client = mqtt.Client()
client.username_pw_set(MQTT_USER, MQTT_PASS)
client.connect(MQTT_HOST, MQTT_PORT, 60)
client.loop_start()
bus = can.interface.Bus(
channel=CAN_INTERFACE, bustype="socketcan", bitrate=BITRATE
)
print("CAN on %s, MQTT write topic: %s" % (CAN_INTERFACE, WRITE_TOPIC))
try:
for msg in bus:
val = can_to_value(msg)
publish_measure(client, val)
print("CAN ID=0x%03X -> %s=%s" % (msg.arbitration_id, MEASURE_NAME, val))
except KeyboardInterrupt:
pass
finally:
bus.shutdown()
client.loop_stop()
client.disconnect()
if __name__ == "__main__":
main()
运行:
bash
python3 ./can-ec312-dsa.py

【图 5-1:MQTT 发布相关代码】
步骤 2:在 Web 上确认虚拟控制器数值更新
- 打开 测点监控 ,选择虚拟控制器
can_virtual。 - 查看测点
pressure是否随 CAN 数据变化。
也可用 mosquitto 订阅写值响应(可选):
bash
# 需先 apt 安装 mosquitto-clients;ServiceId 替换为实际值
mosquitto_sub -h 127.0.0.1 -p 9105 -u inhand -P inhand \
-t "ds2/eventbus/south/write/<ServiceId>/response" -v
六、阶段四:DSA 连接 AWS IoT
6.1 AWS 控制台准备(若已完成可跳过)
参考:DSA --- AWS IoT Instructions

【图 6-1:AWS IoT Core 创建 Thing 与证书】

【图 6-2:AWS IoT 设置页 Endpoint 截图】
步骤 1:EC312 Web 配置 AWS IoT 云服务
路径:边缘计算 → 设备监控 → 云服务 → 添加/编辑
| 参数 | 说明 |
|---|---|
| 启用云服务 | 勾选 |
| 云平台类型 | AWS IoT |
| 终端节点 | AWS 控制台 Endpoint;使用 VeriSign G5 根 CA 时 删除地址中的 -ats 后缀(以 DSA 手册为准) |
| MQTT 客户端 ID | 全局唯一 |
| 物品证书 / 私有密钥 / CA 证书 | 导入 Thing 创建时下载的文件 |
| 端口 | 8883 |
![]() |
【图 6-3:DSA 配置 AWS IoT 界面】
保存后等待数秒,在云服务状态栏确认 连接成功。
七、阶段五:发布到 AWS 并验证
步骤 1:在 EC312 添加「发布消息」
路径:云服务 → 消息管理 → 添加发布
| 参数 | 建议值 |
|---|---|
| 名称 | 自定义,如 can_to_aws |
| 数据源类型 | 测点数据 |
| 分组/标签 | 虚拟控制器测点所在分组,如 default |
| Topic | 自定义,如 awsiot/can/pressure |
| QoS | 1 |
| 入口函数 | main |
函数代码示例 (使用 DSA 内置 awsiot_publish):
python
# 粘贴到「消息管理 → 发布消息 → 函数代码」
import json
from common.Logger import logger
from quickfaas.awsiot import awsiot_publish
def main(message):
# message 为 DSA 采集的测点分组数据,可按需过滤/组包
logger.debug(message)
awsiot_publish(__topic__, json.dumps(message), __qos__)
步骤 2:在 AWS 订阅同一 Topic
- 打开 AWS IoT → 测试 → MQTT 测试客户端。
- 在 订阅主题 中输入与网关一致的 Topic,例如:
awsiot/can/pressure。 - 当 CAN 侧有数据且虚拟控制器更新后,应能看到 JSON 测点上报。

【图 7-1:AWS 收到上报消息内容(三)】
八、常见问题与排错
| 现象 | 可能原因 | 处理建议 |
|---|---|---|
| SSH 连不上 | IP/网口错误、防火墙 | 确认接 ETH2 、192.168.4.100,PC 同网段 |
| pip/apt 失败 | 无外网 | 检查路由/NAT、DNS |
| CAN 无数据 | 接线/波特率/终端电阻 | 用 CAN 分析仪对比;检查 ip link 状态 |
| 虚拟控制器不更新 | ServiceId 或控制器/测点名错误 | 核对 Topic ds2/eventbus/south/write/{id} 与 JSON 中 name |
| MQTT 写失败 | 账号端口错误 | EC 系列:9105 / inhand:inhand |
| AWS 连接失败 | 证书/Endpoint/端口 | 8883、证书匹配 Thing、Endpoint 是否去掉 -ats |
| AWS 无消息 | 发布分组未含测点、Topic 不一致 | 检查分组、Topic、测点上传模式 |
九、参考链接
| 资料 | 链接 |
|---|---|
| 官方博客原文 | https://inhandgo.com/blogs/articles/can-data-to-aws-edge-computer-ec312 |
| DSA 知识库 | https://help.inhand.com/portal/en/kb/articles/dsa |
| 内部 MQTT Broker | https://help.inhand.com/portal/en/kb/articles/dsa#21_Connect_to_the_internal_MQTT_Broker |
| AWS IoT 配置 | https://help.inhand.com/portal/en/kb/articles/dsa#AWS_IoT_Instructions |
| python-can 文档 | https://python-can.readthedocs.io/ |
| InHand 支持 | support@inhandgo.com / +1 (703) 348-2988 |

