【实战教程】映翰通 EC312 边缘计算机:CAN 总线数据采集并经 DSA 上传 AWS IoT 全流程
【实战教程】映翰通 EC312 边缘计算机CAN 总线数据采集并经 DSA 上传 AWS IoT 全流程摘要本文演示如何在映翰通 EC312边缘计算机上通过Python python-can读取CAN2总线数据经Device SupervisorDSA内部 MQTT Broker写入虚拟控制器测点在 Web 管理界面配置AWS IoT云服务将测点数据发布到 AWS。适合工业现场需要将车载/设备 CAN 数据上云、且网关已内置 DSA 的场景。关键词EC312、CAN 总线、python-can、Device Supervisor、DSA、虚拟控制器、南向消息总线、AWS IoT、边缘计算目录一、方案架构与数据流二、环境与物料准备三、阶段一CANbus Reader本地读 CAN四、阶段二创建虚拟控制器五、阶段三CAN 数据写入虚拟控制器南向 MQTT六、阶段四DSA 连接 AWS IoT七、阶段五发布到 AWS 并验证八、常见问题与排错九、参考链接一、方案架构与数据流官方描述的整体数据流如下Python 应用接收 CAN 数据 → 发布到内部 MQTT Broker→ 数据写入虚拟控制器Virtual Controller→ 登录 EC312 Web在Device SupervisorDSA中配置虚拟控制器与云服务 → 将数据发布到 AWS。1.1 架构示意【图 1-1CAN 数据到 AWS 整体数据流架构图】二、环境与物料准备项目说明硬件映翰通EC312边缘计算机、PC、网线、CAN 总线设备及线缆网络PC 接 EC312以太网口 2ETH2设备需能访问外网安装依赖、连接 AWS软件SSH 终端PuTTY / Windows Terminal / MobaXterm 等、EC312 Web 管理账号云端AWS IoT Core账号已创建物品Thing、策略、证书见第六节文档DSA 用户手册、内部 MQTT、AWS IoT 说明默认 SSH 信息以官方博客为准若设备已改密请以现场为准项值地址192.168.4.100ETH2 侧用户edge密码securityedgerootsudo -s密码同上EC 系列内部 MQTT BrokerDSA 手册项值地址127.0.0.1端口9105用户名inhand密码inhand三、阶段一CANbus Reader本地读 CAN本阶段在 EC312 上安装依赖、编写并运行 CAN 采集脚本先在本地验证能读到 CAN 帧。步骤 1SSH 登录设备用网线将 PC 连接到 EC312 的ETH2。在 PC 上打开终端执行sshedge192.168.4.100按提示输入密码securityedge【图 3-1PC 连接 EC312 ETH2 与 SSH 登录终端】步骤 2切换 root 用户sudo-s密码securityedge【图 3-2sudo -s 切换 root 成功】步骤 3确认外网可达ping8.8.8.8-c4能通则说明可通过 apt/pip 安装软件包。【图 3-3ping 8.8.8.8 成功】步骤 4更新 APT 源apt-getupdate【图 3-4apt-get update 执行结果】步骤 5安装 pipapt-getinstall-ypython3-pip【图 3-5python3-pip 安装完成】步骤 6安装 python-canpip3installpython-canaptinstall-ypython3-can【图 3-6python-can 安装成功】步骤 7编写 CAN 测试脚本在设备上创建脚本文件名与官方示例一致can-ec312.py。以下为结构化示例CAN 接口名、波特率、ID 过滤请按现场修改原文 Step Seven 为配图示例此处给出可编辑模板。#!/usr/bin/env python3# -*- coding: utf-8 -*- EC312 CAN2 采集示例阶段一仅本地打印 CAN 帧 发布到 DSA 内部 MQTT 的代码见第五阶段完整脚本。 importcan# 按 EC312 实际 CAN 接口修改常见为 can1 / can2CAN_INTERFACEcan2BITRATE500000# 500k按总线实际配置defmain():buscan.interface.Bus(channelCAN_INTERFACE,bustypesocketcan,bitrateBITRATE,)print(Listening on %s ...%CAN_INTERFACE)try:formsginbus:print(ID0x%03X DLC%d Data%s%(msg.arbitration_id,msg.dlc,msg.data.hex()))exceptKeyboardInterrupt:passfinally:bus.shutdown()if__name____main__:main()若 CAN 接口未 UP需先配置 SocketCAN例如ip link set can2 type can bitrate 500000后ip link set can2 up以设备实际网卡名为准。步骤 8CAN2 接线并连接待测设备将 CAN 设备接入 EC312 的CAN2端口注意CAN_H / CAN_L / GND终端电阻按总线要求。确认总线波特率与脚本中BITRATE一致。步骤 9运行 Python 脚本python3 ./can-ec312.py终端应持续打印 CAN 帧若无数据检查接线、终端电阻、波特率及对端是否在发帧。【图 3-9python3 can-ec312.py 运行输出】四、阶段二创建虚拟控制器虚拟控制器用于在 DSA 内“承接”二次开发应用如本教程 Python 脚本写入的测点数据再供云服务上报 AWS。步骤 1Web 登录并创建虚拟控制器浏览器访问 EC312 Web 管理地址与 ETH 口 IP 规划一致。进入Device Supervisor设备监控 / 边缘计算插件。在测点监控中添加控制器控制器协议选择虚拟控制器名称自定义且全局唯一下文示例为can_virtual添加测点官方示例测点名pressure类型、读写权限按业务选择建议Read/Write。将测点加入用于上云的分组如default。详细界面说明见DSA 知识库【图 4-1DSA 中添加虚拟控制器协议选虚拟控制器】【图 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 与 PayloadDSA 手册项目内容Topicds2/eventbus/south/write/{requestServiceId}requestServiceId第四节记下的虚拟控制器ServiceIdPayload 示例见下{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 并改造脚本pip3installpaho-mqtt完整示例脚本can-ec312-dsa.py请将占位常量改为现场值#!/usr/bin/env python3# -*- coding: utf-8 -*-importjsonimporttimeimportuuidimportcanimportpaho.mqtt.clientasmqtt# ---------- 按现场修改 ----------CAN_INTERFACEcan2BITRATE500000CONTROLLER_NAMEcan_virtualMEASURE_NAMEpressure# 虚拟控制器的 ServiceId第四节获取VIRTUAL_CONTROLLER_SERVICE_ID2000# ← 替换为实际值MQTT_HOST127.0.0.1MQTT_PORT9105MQTT_USERinhandMQTT_PASSinhandWRITE_TOPICds2/eventbus/south/write/%d%VIRTUAL_CONTROLLER_SERVICE_ID# --------------------------------defcan_to_value(msg:can.Message)-float:示例取首字节为压力值请按 DBC/协议自行解析ifmsg.dlc1:returnfloat(msg.data[0])return0.0defpublish_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),qos1)defmain():clientmqtt.Client()client.username_pw_set(MQTT_USER,MQTT_PASS)client.connect(MQTT_HOST,MQTT_PORT,60)client.loop_start()buscan.interface.Bus(channelCAN_INTERFACE,bustypesocketcan,bitrateBITRATE)print(CAN on %s, MQTT write topic: %s%(CAN_INTERFACE,WRITE_TOPIC))try:formsginbus:valcan_to_value(msg)publish_measure(client,val)print(CAN ID0x%03X - %s%s%(msg.arbitration_id,MEASURE_NAME,val))exceptKeyboardInterrupt:passfinally:bus.shutdown()client.loop_stop()client.disconnect()if__name____main__:main()运行python3 ./can-ec312-dsa.py【图 5-1MQTT 发布相关代码】步骤 2在 Web 上确认虚拟控制器数值更新打开测点监控选择虚拟控制器can_virtual。查看测点pressure是否随 CAN 数据变化。也可用 mosquitto 订阅写值响应可选# 需先 apt 安装 mosquitto-clientsServiceId 替换为实际值mosquitto_sub-h127.0.0.1-p9105-uinhand-Pinhand\-tds2/eventbus/south/write/ServiceId/response-v六、阶段四DSA 连接 AWS IoT6.1 AWS 控制台准备若已完成可跳过登录 AWS 或中国区 AWS 宁夏/北京。进入IoT Core创建物品Thing、策略、证书并下载。在设置页复制终端节点Endpoint。参考DSA — AWS IoT Instructions【图 6-1AWS IoT Core 创建 Thing 与证书】【图 6-2AWS IoT 设置页 Endpoint 截图】步骤 1EC312 Web 配置 AWS IoT 云服务路径边缘计算 → 设备监控 → 云服务 → 添加/编辑参数说明启用云服务勾选云平台类型AWS IoT终端节点AWS 控制台 Endpoint使用 VeriSign G5 根 CA 时删除地址中的-ats后缀以 DSA 手册为准MQTT 客户端 ID全局唯一物品证书 / 私有密钥 / CA 证书导入 Thing 创建时下载的文件端口8883【图 6-3DSA 配置 AWS IoT 界面】保存后等待数秒在云服务状态栏确认连接成功。七、阶段五发布到 AWS 并验证步骤 1在 EC312 添加「发布消息」路径云服务 → 消息管理 → 添加发布参数建议值名称自定义如can_to_aws数据源类型测点数据分组/标签虚拟控制器测点所在分组如defaultTopic自定义如awsiot/can/pressureQoS1入口函数main函数代码示例使用 DSA 内置awsiot_publish# 粘贴到「消息管理 → 发布消息 → 函数代码」importjsonfromcommon.Loggerimportloggerfromquickfaas.awsiotimportawsiot_publishdefmain(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-1AWS 收到上报消息内容三】八、常见问题与排错现象可能原因处理建议SSH 连不上IP/网口错误、防火墙确认接ETH2、192.168.4.100PC 同网段pip/apt 失败无外网检查路由/NAT、DNSCAN 无数据接线/波特率/终端电阻用 CAN 分析仪对比检查ip link状态虚拟控制器不更新ServiceId 或控制器/测点名错误核对 Topicds2/eventbus/south/write/{id}与 JSON 中nameMQTT 写失败账号端口错误EC 系列9105 / inhand:inhandAWS 连接失败证书/Endpoint/端口8883、证书匹配 Thing、Endpoint 是否去掉-atsAWS 无消息发布分组未含测点、Topic 不一致检查分组、Topic、测点上传模式九、参考链接资料链接官方博客原文https://inhandgo.com/blogs/articles/can-data-to-aws-edge-computer-ec312DSA 知识库https://help.inhand.com/portal/en/kb/articles/dsa内部 MQTT Brokerhttps://help.inhand.com/portal/en/kb/articles/dsa#21_Connect_to_the_internal_MQTT_BrokerAWS IoT 配置https://help.inhand.com/portal/en/kb/articles/dsa#AWS_IoT_Instructionspython-can 文档https://python-can.readthedocs.io/InHand 支持supportinhandgo.com / 1 (703) 348-2988