【实战教程】映翰通 EC312 边缘计算机:CAN 总线数据采集并经 DSA 上传 AWS IoT 全流程

【实战教程】映翰通 EC312 边缘计算机:CAN 总线数据采集并经 DSA 上传 AWS IoT 全流程

摘要

本文演示如何在 映翰通 EC312 边缘计算机上:

  1. 通过 Python + python-can 读取 CAN2 总线数据;
  2. Device Supervisor(DSA)内部 MQTT Broker 写入 虚拟控制器 测点;
  3. 在 Web 管理界面配置 AWS IoT 云服务,将测点数据 发布到 AWS

适合工业现场需要将车载/设备 CAN 数据上云、且网关已内置 DSA 的场景。

关键词:EC312、CAN 总线、python-can、Device Supervisor、DSA、虚拟控制器、南向消息总线、AWS IoT、边缘计算


目录


一、方案架构与数据流

官方描述的整体数据流如下:

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 用户手册内部 MQTTAWS 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 登录设备

  1. 用网线将 PC 连接到 EC312 的 ETH2
  2. 在 PC 上打开终端,执行:
bash 复制代码
ssh edge@192.168.4.100
  1. 按提示输入密码: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 500000ip link set can2 up(以设备实际网卡名为准)。


步骤 8:CAN2 接线并连接待测设备

  1. 将 CAN 设备接入 EC312 的 CAN2 端口(注意 CAN_H / CAN_L / GND,终端电阻按总线要求)。
  2. 确认总线波特率与脚本中 BITRATE 一致。

步骤 9:运行 Python 脚本

bash 复制代码
python3 ./can-ec312.py

终端应持续打印 CAN 帧;若无数据,检查接线、终端电阻、波特率及对端是否在发帧。

【图 3-9:python3 can-ec312.py 运行输出】


四、阶段二:创建虚拟控制器

虚拟控制器用于在 DSA 内"承接"二次开发应用(如本教程 Python 脚本)写入的测点数据,再供云服务上报 AWS。


步骤 1:Web 登录并创建虚拟控制器

  1. 浏览器访问 EC312 Web 管理地址(与 ETH 口 IP 规划一致)。
  2. 进入 Device Supervisor(设备监控 / 边缘计算) 插件。
  3. 测点监控添加控制器
    • 控制器协议 :选择 虚拟控制器
    • 名称 :自定义且全局唯一,下文示例为 can_virtual
  4. 添加测点,官方示例测点名:pressure (类型、读写权限按业务选择,建议 Read/Write)。
  5. 将测点加入用于上云的 分组 (如 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 上确认虚拟控制器数值更新

  1. 打开 测点监控 ,选择虚拟控制器 can_virtual
  2. 查看测点 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 控制台准备(若已完成可跳过)

  1. 登录 AWS 或中国区 AWS 宁夏/北京
  2. 进入 IoT Core ,创建 物品(Thing)策略证书 并下载。
  3. 设置 页复制 终端节点(Endpoint)

参考: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

  1. 打开 AWS IoT → 测试 → MQTT 测试客户端
  2. 订阅主题 中输入与网关一致的 Topic,例如:awsiot/can/pressure
  3. 当 CAN 侧有数据且虚拟控制器更新后,应能看到 JSON 测点上报。

【图 7-1:AWS 收到上报消息内容(三)】


八、常见问题与排错

现象 可能原因 处理建议
SSH 连不上 IP/网口错误、防火墙 确认接 ETH2192.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

相关推荐
光影少年1 小时前
前端如何和蓝牙物联网进行通信和兼容性问题
前端·物联网·掘金·金石计划
阿狸猿1 小时前
论边缘计算及其应用
人工智能·边缘计算
腾视科技AI1 小时前
企业调研——工业边缘计算隐形黑马,腾视科技以“硬件+算法”加速出海落地
大数据·人工智能·科技·ai·边缘计算·无人叉车·ainas
兆。1 小时前
LangChain自动化工具集成指南:面向爬虫开发者
爬虫·langchain·自动化
“码”力全开2 小时前
解耦品牌壁垒:基于 Docker 与边缘计算的高并发视频中台架构(支持 GB28181/RTSP 统一接入与源码交付)
docker·音视频·边缘计算
熊出没2 小时前
我用 Netty TCP 搭建物联网云平台,并对接车辆电池信息解析
物联网·网络协议·tcp/ip
古月开发2 小时前
比价助手:截图自动全网比价与历史价格查询实战
人工智能·信息可视化·自动化
我命由我123452 小时前
BOM 极简理解
运维·经验分享·笔记·物联网·学习·运维开发·学习方法
“码”力全开2 小时前
解耦安防碎片化:基于 Docker 与边缘计算的 AI 视频中台架构设计(支持 GB28181/RTSP 与源码交付)
人工智能·docker·边缘计算