本篇文章,分享前段时间折腾的一个开源项目。聊聊我们是如何解决调试开发阶段 CAN 通信和初始化相关的事情的。

希望这篇文章可以为你未来调试设备、构建系统提供一点便利。

写在前面

在物联网、汽车电子、工业自动化等领域,CAN(Controller Area Network)协议被广泛用于设备间高可靠的数据通信。然而,对于开发者来说,快速构建一个稳定、高效、可扩展的 CAN 网络服务平台仍面临诸多挑战。

  • 如何快速初始化多个 CAN 适配器?
  • 如何确保 CAN 适配器通过参数正确地进行初始化?
  • 如何确保初始化的 CAN 适配器的状态是健康的?
  • 如何实现对 CAN 连接的设备进行高效率的单元测试?

CAN-Bridge 项目正是为了解决这一痛点而生 —— 它是一个使用 Golang 构建的轻量级服务端应用,我们将核心逻辑封装成 HTTP API,无需写脚本、不用记配置指令,也能轻松完成端口初始化、状态检测、数据发送等一系列操作。CAN-Bridge 是一个为“CAN 协议适配器管理”而生的工具,目标是让使用 CAN 的开发变得:简单、自动、可靠。

这个项目以 Apache v2 协议进行开源(linker-bot/can-bridge),因为我们相信这样对整个具身领域的开源生态会更加有帮助,欢迎 Star,也欢迎 Fork。

CAN-Bridge 能做什么?

CAN-Bridge 的目标很直接:用最简单的方式连接你的代码和 CAN 设备。为此,它支持生产级的以下功能:

  • 多接口支持:can0can1,一直到 canX,想接多少接多少
  • 命令行配置:支持 bitratesample-pointrestart-msretry 等参数设置
  • HTTP API 管理接口:标准化 RESTful 接口,便于系统集成和自动化测试
  • 接口状态监控:每个 CAN 端口是否正常,一目了然
  • 自动初始化 + 自动恢复:程序启动后可自动设置接口,出问题还能自己修
  • 数据发送与监听:CAN 报文的发送、接收、过滤、缓存、统计统统都有
  • Prometheus 支持:内置 /metrics 端点,轻松接入你的监控系统

无论是需要裸金属部署、Docker 容器封装,还是需要与系统服务(如 systemd)集成,CAN-Bridge 都提供了开箱即用的能力。

技术特性

CAN-Bridge 提供了一个可编程的 Interface Setup Manager:

  • 自动执行接口配置命令(如 ip link set can0 up type can bitrate 1000000),你只需要在启动程序的时候,执行 ./can-bridge -can-ports can0,如果需要其他的速率和更多的端口,可以试试 ./can-bridge -can-ports can0,can1,can2 -bitrate 500000
  • 支持采样点、重启延迟、重试次数等高级参数,./can-bridge -sample-point 0.75./can-bridge -restart-ms 100./can-bridge -setup-retry 3
  • 提供接口状态校验 API,确保接口按预期工作

这些细节的支持,使得 CAN 相关的程序部署变得异常简单,同时减少了系统配置错误带来的宕机风险。

当然,我们也可以将参数进行组合,来高自由度的控制服务的行为:

./can-bridge -can-ports can0,can1 -bitrate 500000 -sample-point 0.875 -restart-ms 100

如果你不喜欢程序自动初始化 CAN 端口,想要完全通过 API 进行接口初始化,也可以使用下面的方法来初始化程序:

./can-bridge -auto-setup=false

快速上手:一分钟运行你的第一个 CAN 服务

只需要一个二进制文件,你就可以跑起来一个可观测、可配置、可监控的 CAN 服务。(下载地址:linker-bot/can-bridge/releases)

默认情况下,它会自动完成 CAN 端口的监听和初始化,并将 HTTP 服务在 5260 端口进行暴露:

# sudo ./can-bridge

2025/06/25 11:28:49 🚀 Starting CAN Communication Service
2025/06/25 11:28:49 📋 Configuration:
2025/06/25 11:28:49    - CAN Ports: [can0]
2025/06/25 11:28:49    - Server Port: 5260
2025/06/25 11:28:49 🔧 Setting up CAN interfaces...
2025/06/25 11:28:49 🔍 Found 1 CAN interfaces: [can0]
2025/06/25 11:28:49 📡 Available CAN interfaces: [can0]
2025/06/25 11:28:49 🔧 Setting up interface can0...
2025/06/25 11:28:49 🔧 Setting up CAN interface can0...
2025/06/25 11:28:49 🔍 Interface can0 exists: true
2025/06/25 11:28:49 ⚙️ Configuring can0 parameters...
2025/06/25 11:28:49 📝 Executing: ip link set can0 type can bitrate 1000000 sample-point 0.75 restart-ms 100
2025/06/25 11:28:49 ✅ Successfully configured can0: bitrate=1000000, sample-point=0.75, restart-ms=100
2025/06/25 11:28:49 🚀 Bringing can0 up...
2025/06/25 11:28:49 ✅ Successfully brought can0 up
2025/06/25 11:28:49 🔍 Verifying can0 configuration...
2025/06/25 11:28:49 ✅ Interface can0 verification passed: up=true, bitrate=1000000, state=UP
2025/06/25 11:28:49 ✅ CAN interface can0 successfully configured and activated
2025/06/25 11:28:49 ✅ Successfully set up can0
2025/06/25 11:28:49 📊 can0 state: bitrate=1000000, state=UP, up=true
2025/06/25 11:28:49 🎯 Successfully set up 1/1 CAN interfaces
2025/06/25 11:28:49 🔧 Initializing CAN interfaces: [can0]
2025/06/25 11:28:49 ✅ can0 initialization successful
2025/06/25 11:28:49 ✅ Successfully initialized can0
2025/06/25 11:28:49 🎯 Successfully initialized 1/1 CAN interfaces
2025/06/25 11:28:49 👂 Starting message listening for active interfaces...
2025/06/25 11:28:49 👂 Starting listener for can0...
2025/06/25 11:28:49 📡 Starting CAN message listener for can0
2025/06/25 11:28:49 ✅ Started listening on can0
2025/06/25 11:28:49 ✅ Successfully started listening on can0
2025/06/25 11:28:49 🎯 Successfully started listening on 1 interfaces
2025/06/25 11:28:49 👂 Listening thread started for can0
2025/06/25 11:28:49 🌐 CAN Communication Service will run at http://localhost:5260
2025/06/25 11:28:49 🐕 Starting CAN interface watchdog
2025/06/25 11:28:49 ✅ CAN Communication Service started successfully
2025/06/25 11:28:49 📡 Message listening active on: [can0]
2025/06/25 11:28:49 📨 can0 RX: ID=0x0, Data=[00], Length=1
2025/06/25 11:28:49 📡 Broadcast successful: {"name":"Can-Bridge","ip":"10.211.55.7","mac":"00:1C:42:BE:52:B1","model":"LinkerHand OSS","version":"v1.3.1"}
2025/06/25 11:28:49 🌐 Starting HTTP server on :5260
2025/06/25 11:28:49 🎯 Service startup summary:
2025/06/25 11:28:49    - Active interfaces: 1
2025/06/25 11:28:49    - Watchdog running: true
2025/06/25 11:28:49    - Listening on: [can0]

初始化完毕后,CAN 适配器就能够正确使用了:

自动初始化,指示灯蓝灯亮起

如果你想定制不同的端口,或者速率等参数,可以对 CLI 参数进行定制:

./can-bridge -can-ports can0,can1 -bitrate 500000

API 概览:简单易用又不失强大

CAN-Bridge 构建了完整的 HTTP API,涵盖下面的功能:

  • 系统状态与接口监控
  • CAN 消息的发送与接收
  • 接口的启用、关闭、重置、批量管理
  • 接口监听启动/停止
  • 消息缓存获取与清除、统计分析

你可以用 curl 或任何支持 HTTP 的客户端控制它。

例如,通过如下命令就可动态设置某个接口:

curl -X POST localhost:5260/api/setup/interfaces/can0 \
  -H "Content-Type: application/json" \
  -d '{"bitrate": 500000, "withRetry": true}'

获取系统状态

GET /api/status

返回所有接口运行状态、版本信息、启动时间等内容。

接口配置和管理

设置接口:

POST /api/setup/interfaces/can0
Content-Type: application/json
{
  "bitrate": 500000,
  "withRetry": true
}

查询接口状态:

GET /api/setup/interfaces/can0/state

重置接口:

POST /api/setup/interfaces/can0/reset

批量操作:

POST /api/setup/interfaces/setup-all

发送 CAN 消息

POST /api/can
{
  "interface": "can0",
  "id": 0x120,
  "data": [0x01, 0x02, 0x03]
}

实时监听与消息缓存

启动监听:

POST /api/messages/can0/listen/start

获取最近接收的消息:

GET /api/messages/can0/recent?count=10

清空缓存:

DELETE /api/messages

获取 Prometheus 指标

GET /api/metrics

类似的接口还有很多,包括(批量)初始化接口、获取可用接口列表,向接口发送任意指令、监控相关的列表,获取 CAN 服务接收到的历史信息记录等等。

详细的信息,参考 https://github.com/linker-bot/can-bridge 项目中的内容即可。

最后

我们最初只是为了方便自己调试灵巧手设备,结果一不小心做成了一个稳定可用的小工具。

如果你也在调试 CAN 设备、做机器人、搭通信系统,希望这个项目能帮你省一点力、少踩一些坑。项目完全开源,欢迎 PR 和 issue,期待和大家一起继续打磨。

也欢迎把这篇文章分享给也在做 CAN 项目的朋友,技术圈里好用的小工具,或许值得传播。

–EOF