;
CAN(Control Area Network)Bus 是一种串行通信协议,能够让设备之间可靠而高效地传输数据。它广泛应用于车辆领域,像神经系统一样连接车辆内部的各个电子控制单元。
CAN Bus 最初由博世公司在 20 世纪 80 年代为汽车应用而设计。它是一种多主、多从、半双工、具有容错能力的协议,非常适合汽车领域的需求。它简单、低成本、可靠,能够在恶劣的环境中工作。CAN Bus 为车辆中所有电子控制单元提供了一个统一的接入点,方便进行连接和诊断。
CAN Bus 数据能够反映连接设备的能和状态。然而,由于数据量大、带宽有限以及网络不稳定等因素,收集和处理 CAN Bus 数据可能面临一些挑战。
为了应对这些挑战,可以利用 MQTT 协议,确保在网络状况不佳的情况下及时将车辆数据传输到云端。EMQX 是一款开源的 MQTT Broker,能够搭建可靠且可扩展的 MQTT 基础设施,用来收集 CAN Bus 数据。
src="https://assets.emqx.com/images/e8c8c72601898e841855a8efa306d63e.png?imageMogr2/thumbnail/1520x"
alt="Collecting CAN bus data"
sizes="(max-width: 640px) 100vw, (max-width: 768px) 100vw, 1520px"
srcset="
https://assets.emqx.com/images/e8c8c72601898e841855a8efa306d63e.png?imageMogr2/thumbnail/640x 640w,
https://assets.emqx.com/images/e8c8c72601898e841855a8efa306d63e.png?imageMogr2/thumbnail/768x 768w,
https://assets.emqx.com/images/e8c8c72601898e841855a8efa306d63e.png?imageMogr2/thumbnail/1520x 1520w
"
loading="lazy"
>
CAN Bus 由德国跨国工程技术巨头博世在 20 世纪 80 年代初开发,旨在为汽车应用提供一种高效的通信系统,主要目的是简化车辆内部线束的复杂程度。
1986 年,博世发布了首个 CAN 协议,由于其可靠和健壮,很快受到了汽车制造商的青睐。1993 年,它成为 ISO-11898 国际标准。该协议演进过程大致如下:
除了汽车领域外,CAN Bus 协议还逐渐应用于其它行业,例如工业自动化系统(CANopen)和船用电子设备(NMEA 2000)。它的广泛应用主要得益于它能够在恶劣的条件下稳定运行,并且实施成本较低。
CAN Bus 是一种分布式的通信协议。它的分布式特点使它非常适合对可靠和实时有较高要求的应用,如汽车和工业系统。
在 CAN 网络中,所有的节点都通过双绞线或光纤相连。每个节点都有自己的微控制器,负责处理收到的消息和发送的消息。数据由节点在共享总线上广播,所有其它节点都能收到。通信过程的几个关键阶段包括:
这些特相互配合,使得 CAN Bus 能够高效运行,确保车辆或工厂自动化设备等复杂系统中各个组件之间的可靠通信。
在 CAN Bus 系统中,消息结构对于设备间的高效通信非常重要。该协议的数据帧格式由以下几个字段组成:标识符、控制字段、数据字段和错误检测机制。
CAN 主要包括三种类型:
低速 CAN,也叫做容错 CAN 或 ISO 11898-3,最高传输速度为 125 kbps。它适用于像车身控制模块、门锁、窗户控制等不太重要的系统,这些系统对数据传输速度的要求不高。它的主要特点是即使总线中的一根线断了,也能继续正常工作。
高速 CAN,或 ISO 11898-2,传输速度最高可达 1 Mbps。因为它比低速网络有更快的数据传输速度,因此适合需要及时响应的应用,如发动机管理系统和电子制动系统。但是,它没有低速网络的容错能力。
CAN FD 由博世在 2012 年推出,是高速网络的扩展版,具有更高的数据传输速度,最高可达 5 Mbps,同时向后兼容现有高速设备。这项技术的主要优势在于它比传统的 CAN 能更有效地传输更大的载荷,使其非常适合现代车辆日益复杂的电子系统。
CAN Bus 数据可以反映车辆的能、健康状况和行为特征。把 CAN Bus 数据收集到云端是一种利用车辆数据潜力的有效方法,可以通过大数据分析来发现数据价值。通过将机器学习、人工智能或其它分析工具应用于从车辆收集的大量数据,车辆制造商可以获得有价值的信息,并利用它们优化车辆能。
在人工智能时代,数据是最有价值的资产。通过将车辆的数据收集到云端,然后将其分发到各种数据基础设施,如数据库和数据湖,用户可以利用数据实现各种类型的应用。
尽管在车辆本地收集 CAN Bus 数据已经相当成熟,但由于高数据速率、低带宽和不稳定的网络环境,导致收集、处理和实时传输 CAN Bus 数据到云端面临着巨大的挑战。将所有 CAN Bus 数据都传输到云端进行处理是不切实际的。所以,可以在边缘端本地收集和处理 CAN Bus 数据,以减少数据量,然后将处理结果实时传输到云端。
我们至少需要两个组件来构建这样的解决方案:
接下来,我们将详细介绍结合 EMQX 和 eKuiper 的整体解决方案。
eKuiper 是一款开源的边缘计算引擎,可以帮助您实时处理和分析 CAN Bus 数据。eKuiper 是为边缘流处理而设计的,适合对 CAN Bus 产生的典型流数据进行实时处理。eKuiper 可以应对以下挑战:
eKuiper 使用 CAN 源插件来连接 CAN Bus 并接收 CAN 帧。它支持两种连接 CAN Bus 的模式,如下图所示。
src="https://assets.emqx.com/images/998a9d2d4c155f86566506b2df4ab368.png?imageMogr2/thumbnail/1520x"
alt="eKuiper supports two modes to connect to CAN bus"
sizes="(max-width: 640px) 100vw, (max-width: 768px) 100vw, 1520px"
srcset="
https://assets.emqx.com/images/998a9d2d4c155f86566506b2df4ab368.png?imageMogr2/thumbnail/640x 640w,
https://assets.emqx.com/images/998a9d2d4c155f86566506b2df4ab368.png?imageMogr2/thumbnail/768x 768w,
https://assets.emqx.com/images/998a9d2d4c155f86566506b2df4ab368.png?imageMogr2/thumbnail/1520x 1520w
"
loading="lazy"
>
CAN Bus 数据是二进制数据并且以帧为单位,CAN 帧由多个字段组成。CAN 协议有多个版本,包括 CAN 2.0A、CAN 2.0B 和 CAN FD。不同版本的 CAN 帧格式略有不同。下图显示了 CAN 2.0A 的帧格式。
src="https://assets.emqx.com/images/cbc0baed755040774507737927c30f5a.png?imageMogr2/thumbnail/1520x"
alt="CAN 2.0A 的帧格式"
sizes="(max-width: 640px) 100vw, (max-width: 768px) 100vw, 1520px"
srcset="
https://assets.emqx.com/images/cbc0baed755040774507737927c30f5a.png?imageMogr2/thumbnail/640x 640w,
https://assets.emqx.com/images/cbc0baed755040774507737927c30f5a.png?imageMogr2/thumbnail/768x 768w,
https://assets.emqx.com/images/cbc0baed755040774507737927c30f5a.png?imageMogr2/thumbnail/1520x 1520w
"
loading="lazy"
>
其中,有两个字段对解码 CAN Bus 数据很重要:
在有效载荷中,数据由一系列的信号组成,每个信号都有自己的名称、长度和位置。DBC 文件是一个文本文件,其中包含将原始 CAN Bus 数据解码为“物理值”的相关信息。该文件定义了信号的名称、长度、位置以及将原始数据转换为物理值所使用的转换公式。
在 eKuiper 中,用户可以在解析 CAN Bus 数据时指定要使用的 DBC 文件路径。在 eKuiper 中配置 DBC 非常灵活和安全。
配置完 eKuiper CAN 源后,用户可以创建一个流来接收并解析 CAN Bus 数据,从中提取有意义的物理信号。例如,CAN 有效载荷 可以解析为以下信号:华体会最新地址
接下来,用户可以像从 MQTT 接收数据一样,利用 eKuiper 强大的流处理能力,对解析后的数据进行灵活处理。
在得到解析过的数据后,我们可以利用 eKuiper 对它进行各种操作。为了节省传输数据的带宽,我们可以只挑选感兴趣的信号。比如,可以仅选择 和 这两个信号。
用 eKuiper SQL 语句可以很容易实现这一点:
由于 CAN 帧的大小有限,我们可能需要从多个 CAN 帧中提取所需的信号。因此,我们可以根据需要使用算法灵活地组合不同 CAN 帧中的信号,以构建完整的消息供应用程序使用。您可以在数据合并的示例中了解更多详细信息。这里,我们用 signal1 作为主要条件来筛选数据。
另一个示例是只在特定事件发生时才收集数据,这样可以显著减少带宽的消耗。举个例子,我们可以只在 signal1 超过 100 时才进行数据收集。
此外,这些处理规则非常灵活,可以随时进行修改。即使在最初阶段没有确定所需的信号,也无需担心,您可以根据需求的变化随时调整规则,并实现热加载。
除了数据采集这一常见用途,eKuiper 还可以应用于其它场景,例如:
使用 EMQX 这类 MQTT Broker 收集 CAN Bus 数据有以下几个优势:
除此之外,EMQX 还提供了许多其它功能,并能够与 eKuiper 协同工作,从而帮助用户在传输 CAN Bus 数据时节省带宽、减少延迟、提高可靠。
在通过 MQTT 传输 CAN Bus 数据时,我们通常需要在带宽受限的弱网络环境下进行传输。因此,我们需要尽量减小数据的大小。
在 eKuiper sink 中,我们可以使用 选项来指定数据格式。默认格式是 。我们可以将其改为 ,将数据序列化为二进制格式,以显著减少数据大小。另外,我们可以使用 选项来通过 或其它压缩方法来压缩数据。通过这些方式我们可以让数据的大小比原来的 JSON 数据小很多。在我们的一个测试用例中,在批量发送数据时数据的大小可以减少 90% 以上。
对于云端应用而言,某些数据具有时间敏感,例如用于车辆事故诊断的数据。在这种情况下,降低延迟非常重要。在 eKuiper 规则中,我们可以用 MQTT sink 把数据快速发送到 EMQX,以满足高效的数据传输需求。
为了在实时场景中节省带宽,我们可以像前文介绍的那样,在 eKuiper MQTT sink 中设置序列化格式和压缩方法。EMQX 提供了规则引擎,可以解压缩和反序列化数据,这样云端应用不用编写代码就可以实时地处理数据。
对于不急于处理的数据,我们可以保存在文件或本地数据库里,然后批量发送到云端。这样可以达到更高的压缩比,进而节省更多的带宽。在 eKuiper 规则中,我们可以使用文件 sink 来本地保存和压缩数据。文件 sink 支持设置文件滚动策略,例如每 10 分钟滚动一次,这样我们可以将数据批量保存在文件中。EMQX 正在开发一个新功能,实现用 MQTT 传输文件。等这个功能完成后,保存的文件就可以用 MQTT 传输了。目前,用户可以用其它工具把文件传输到云端。
本文介绍了如何利用 eKuiper 和 EMQX 从车辆收集、处理、传输 CAN Bus 数据到云端。在接下来的文章中,我们将对每个步骤进行更详细地讲解。