Skip to content

CAN 总线驱动

dc3-driver-can 把 CAN 总线设备接入 IoT DC3——监听 SocketCAN 接口上的 CAN 帧,按位号配置解析帧载荷为采集值,并支持向总线发送命令帧写值。

CAN(Controller Area Network)是汽车与工业自动化里广泛使用的现场总线:节点不靠地址点对点通信,而是把带 CAN ID(标识符)的帧广播到总线上,接收方按 CAN ID 过滤自己关心的帧。一帧最多携带 8 字节载荷。常见于车载 ECU、电池管理系统(BMS)、伺服驱动器、传感器节点等场景。

本驱动作为总线上的一个节点接入:它在 Linux 的 SocketCAN 接口(如 can0)上抓取匹配 CAN ID 的帧来采集,必要时也能先发一帧"请求"再读"应答",并通过命令帧写值。

  • 驱动名 / codeCAN Bus Driver / CanDriver
  • 类型DRIVER_CLIENT(主动在总线上收发帧)

当前为骨架实现

该驱动是一个起步模板:底层协议 I/O 尚未完全实现,read()/write() 通过调用 Linux can-utils 工具(candump/cansend)完成,health()ip link show 检查接口。生产前需补齐原生 SocketCAN 集成。

驱动配置(设备级 driver-attribute

接入一台 CAN 设备时,在设备上填这些属性

属性code类型默认值说明
InterfaceinterfaceNameSTRINGcan0SocketCAN 接口名
BitratebitrateINT500000CAN 总线波特率(bps)
Frame FormatframeFormatSTRINGSTANDARDSTANDARD(11bit) or EXTENDED(29bit)

位号配置(point-attribute

每个采集位号上填:

属性code类型默认值说明
CAN IDcanIdSTRING(空)要匹配的 CAN 标识符(十六进制)
Data OffsetdataOffsetINT0帧载荷内的字节偏移
Data LengthdataLengthINT1读取的字节数
Data FormatdataFormatSTRINGINTINT/UINT/HEX
Byte OrderbyteOrderSTRINGLITTLE字节序(如 LITTLE)
Request CAN IDrequestCanIdSTRING(空)可选请求帧的 CAN ID
Request DatarequestDataSTRING(空)可选请求帧的载荷

主动请求型读取

不少 CAN 设备需要先收到一帧"请求"才会应答数据。若同时填了 requestCanIdrequestData,驱动会在采集前先发一帧请求,再监听 canId 匹配的应答帧;两者留空则纯被动监听总线上周期广播的帧。

写命令配置(command-attribute

可写位号还需在写命令上填:

属性code类型默认值说明
CAN IDcanIdSTRING(空)写入目标的 CAN 标识符
DatadataSTRING${value}帧数据,用命令参数渲染(支持 ${value}

采集与健康

  • 采集周期:默认 cron 0/30 * * * * ?(每 30 秒抓一轮帧)。
  • 健康/在线:设备健康检查默认 cron 0/15 * * * * ?,租约超时 45 秒——驱动用 ip link show <interface> 判断接口是否存在,在线状态机制见设备

最小接入示例

can0 上一个周期广播温度、CAN ID 为 123 的节点接进来:

  1. CAN Bus Driver 创建设备,driver 属性填 interfaceName=can0bitrate=500000frameFormat=STANDARD
  2. 给设备绑定的物模型加一个温度位号READ_ONLY),point 属性填 canId=123dataOffset=0dataLength=2dataFormat=INTbyteOrder=LITTLErequestCanId/requestData 留空(被动监听)。
  3. 启动驱动,30 秒内就能在位号值里看到采集值。

易错点

驱动需运行在装了 can-utils 的 Linux 上

底层读写依赖 candump/cansend,健康检查依赖 ip link show,且要求一个可用的 SocketCAN 接口。驱动进程必须跑在 Linux 主机且能访问该接口;macOS/Windows 或缺少 can-utils 时采集会失败、设备一直离线。

canId 用十六进制、不带前缀

canId/requestCanIdcan-utils 的写法填,例如标准帧 123、扩展帧的 29 位 ID 也按其十六进制原文填;不要加 0x 前缀。frameFormat 选 STANDARD/EXTENDED 要与设备实际帧格式一致。

延伸阅读

Released under the AGPL-3.0 License · 基于 AGPL-3.0 协议发布