本篇文章,分享前段时间折腾的一个开源项目。聊聊我们是如何解决调试开发阶段 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 设备。为此,它支持生产级的以下功能:
- 多接口支持:
can0
、can1
,一直到canX
,想接多少接多少 - 命令行配置:支持
bitrate
、sample-point
、restart-ms
、retry
等参数设置 - 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