本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 2025年06月25日 统计字数: 5539字 阅读时间: 12分钟阅读 本文链接: https://soulteary.com/2025/06/25/build-a-stable-can-network-with-can-bridge.html ----- # 构建稳定的 CAN 网络通信桥梁:CAN-Bridge 本篇文章,分享前段时间折腾的一个开源项目。聊聊我们是如何解决调试开发阶段 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](https://github.com/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 相关的程序部署变得异常简单,同时减少了系统配置错误带来的宕机风险。 当然,我们也可以将参数进行组合,来高自由度的控制服务的行为: ```bash ./can-bridge -can-ports can0,can1 -bitrate 500000 -sample-point 0.875 -restart-ms 100 ``` 如果你不喜欢程序自动初始化 CAN 端口,想要完全通过 API 进行接口初始化,也可以使用下面的方法来初始化程序: ```bash ./can-bridge -auto-setup=false ``` ## 快速上手:一分钟运行你的第一个 CAN 服务 只需要一个二进制文件,你就可以跑起来一个可观测、可配置、可监控的 CAN 服务。(下载地址:[linker-bot/can-bridge/releases](https://github.com/linker-bot/can-bridge/releases)) 默认情况下,它会自动完成 CAN 端口的监听和初始化,并将 HTTP 服务在 5260 端口进行暴露: ```bash # 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 适配器就能够正确使用了: ![自动初始化,指示灯蓝灯亮起](https://attachment.soulteary.com/2025/06/25/can-inited.jpg) 如果你想定制不同的端口,或者速率等参数,可以对 CLI 参数进行定制: ```bash ./can-bridge -can-ports can0,can1 -bitrate 500000 ``` ## API 概览:简单易用又不失强大 CAN-Bridge 构建了完整的 HTTP API,涵盖下面的功能: - 系统状态与接口监控 - CAN 消息的发送与接收 - 接口的启用、关闭、重置、批量管理 - 接口监听启动/停止 - 消息缓存获取与清除、统计分析 你可以用 curl 或任何支持 HTTP 的客户端控制它。 例如,通过如下命令就可动态设置某个接口: ```bash curl -X POST localhost:5260/api/setup/interfaces/can0 \ -H "Content-Type: application/json" \ -d '{"bitrate": 500000, "withRetry": true}' ``` ### 获取系统状态 ```bash GET /api/status ``` 返回所有接口运行状态、版本信息、启动时间等内容。 ### 接口配置和管理 设置接口: ```bash POST /api/setup/interfaces/can0 Content-Type: application/json { "bitrate": 500000, "withRetry": true } ``` 查询接口状态: ```bash GET /api/setup/interfaces/can0/state ``` 重置接口: ```bash POST /api/setup/interfaces/can0/reset ``` 批量操作: ```bash POST /api/setup/interfaces/setup-all ``` ### 发送 CAN 消息 ```bash POST /api/can { "interface": "can0", "id": 0x120, "data": [0x01, 0x02, 0x03] } ``` ### 实时监听与消息缓存 启动监听: ```bash POST /api/messages/can0/listen/start ``` 获取最近接收的消息: ```bash GET /api/messages/can0/recent?count=10 ``` 清空缓存: ```bash DELETE /api/messages ``` ### 获取 Prometheus 指标 ```bash GET /api/metrics ``` 类似的接口还有很多,包括(批量)初始化接口、获取可用接口列表,向接口发送任意指令、监控相关的列表,获取 CAN 服务接收到的历史信息记录等等。 详细的信息,参考 [https://github.com/linker-bot/can-bridge](https://github.com/linker-bot/can-bridge) 项目中的内容即可。 ## 最后 我们最初只是为了方便自己调试灵巧手设备,结果一不小心做成了一个稳定可用的小工具。 如果你也在调试 CAN 设备、做机器人、搭通信系统,希望这个项目能帮你省一点力、少踩一些坑。项目完全开源,欢迎 PR 和 issue,期待和大家一起继续打磨。 也欢迎把这篇文章分享给也在做 CAN 项目的朋友,技术圈里好用的小工具,或许值得传播。 --EOF