共计 3830 个字符,预计需要花费 10 分钟才能阅读完成。
CAN Bus 是一种广泛应用于汽车和工业畛域的通信协议,它可能让多个设施在同一网络中进行交互。而 MQTT 是一种广泛应用于物联网畛域的通信协议,作为一种轻量级的公布 - 订阅音讯传输协定,它无效地促成了机器之间的通信。
通过将 CAN Bus 数据桥接到 MQTT,可能实现 CAN Bus 设施与物联网平台和利用的集成。只管市场上存在多种解决方案和工具能够实现这一指标,但它们通常只传输原始的二进制 CAN 数据,这导致对信号进行过滤和解决十分不不便。
在本文中,咱们将介绍一种全新的解决方案,通过应用 开源边缘流式 SQL 引擎 eKuiper,灵便地从 CAN Bus 提取有意义的数据和所需的信号,实现从 CAN Bus 到 MQTT 的无缝桥接。
CAN Bus 的工作原理
CAN Bus 是一种通信零碎,它可能让车辆中的不同设施互相传递数据。它还能提供许多有用的车辆信息,例如速度、油量、发动机温度和诊断码等。然而,从 CAN Bus 中获取和解读这些信息并不是一件容易的事件,因为它们通常以二进制模式进行存储。
深刻理解 CAN Bus,欢送浏览:车联网 CAN Bus 协定介绍与数据实时流解决
CAN 帧
咱们能够从 CAN Bus 接管 CAN 帧流,其中蕴含咱们感兴趣的二进制模式的信号。每个 CAN 帧都蕴含 ID、数据长度码(DLC)和有效载荷。
- ID 用来标识帧中数据的类型。
- DLC 用来指定帧中数据的字节数。
- 有效载荷是帧中携带的理论数据。
CAN 协定有多种类型,它们在 ID 和有效载荷长度的定义上略有不同。上面是一个 CAN 2.0A 帧的例子,其 ID 为 11 位,有效载荷长度最多为 8 字节。
有效载荷由一系列信号组成。每个信号都有名称、长度和值。
- 长度是信号在有效载荷里占用的位数。
- 值是信号里蕴含的理论数据。
为了把二进制数据转换成有意义的信息,咱们须要提取这些信号。
信号提取
CAN 数据库(DBC)是一个文本文件,用于形容 CAN 帧有效载荷中信号的组织形式。它相当于一个字典,提供了每个信号的名称、长度和值的计算方法,这样咱们就能够通过 CAN 帧进行通信。
上面是 DBC 文件的一段内容。它定义了一个 ID 为 544,DLC 为 8 的 CAN 帧。该帧蕴含 5 个信号,每个信号都有名称、长度和值。例如,信号 EngineSpeed 的长度为 16 位,值的范畴是 0 到 16383.75。信号的值是通过把原始数据乘以 0.25 再加上 0 来计算得出。
BO_ 544 EMS_220h: 8 EMS
SG_ EngineSpeed : 0|16@1+ (0.25,0) [0|16383.75] "rpm" Vector__XXX
SG_ CurrentEngineTorque : 16|16@1+ (0.25,-500) [-500|1547.5] "Nm" Vector__XXX
SG_ DriverRequestTorque : 32|16@1+ (0.25,-500) [-500|1547.5] "Nm" Vector__XXX
SG_ CurrentEngineTorqueStatus : 48|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ DriverRequestTorqueStatus : 49|1@1+ (1,0) [0|1] "" Vector__XXX
CAN 帧的解码流程如下:
实现解码后,咱们能够得悉发动机的转速为每分钟 1000 转。然而通过编写利用进行信号解码的话,一旦信号发生变化或更新,咱们就必须从新开发和部署整个解码过程,并通过 OTA 进行更新。应用 eKuiper 能够帮忙您省去这些繁琐的工作。
爱护您的 DBC
DBC 是解码 CAN 帧的要害。即便 CAN Bus 数据泄露,没有 DBC 也简直无奈解码。因而,DBC 是您的重要资产,不应向任何人泄露,包含参加解码开发的工程师。eKuiper 能够在运行时加载 DBC 文件,从而能够防止让开发者看到它。此外,当场景发生变化时,它能够在不重启过程的状况下热加载 DBC 文件。这有助于爱护您的 DBC 文件,使其放弃私密。
eKuiper「了解」CAN Bus 数据
作为一个边缘流式引擎,eKuiper 十分笨重,能够部署在 CAN Bus 设施左近。它可能从 HTTP、文件系统、MQTT,以及本文所提到的 CAN Bus 等各种南向数据源收集数据。收集到的数据能够高效地进行解决,并公布到北向数据源(例如 MQTT 和 HTTP)。
eKuiper 具备对 CAN Bus 数据的理解能力。它简化了 CAN 帧的解码过程,并将其转化为一些配置信息。要解决 CAN Bus 数据,您能够应用以下 SQL 语句创立一个流:
CREATE STREAM canDemo () WITH (TYPE="can", FORMAT="can", SHARED="TRUE", SCHEMAID="dbc")
这条语句创立了一个名为 canDemo 的流,用于从 CAN Bus 中获取数据。该语句还指定了连贯形式和数据格式,并指定应用 DBC 模式将 CAN 帧解码成信号。
DBC 设置
DBC 文件在解码 CAN 帧时表演了模式的角色。就像为 protobuf 格局指定 *.proto 文件一样,您能够在 SCHEMAID 属性中指定 DBC 文件,它能够是文件门路也能够是目录门路。这意味着您能够指定一个独自的 DBC 文件或一个蕴含多个 DBC 文件的目录。eKuiper 会加载目录中的所有 DBC 文件,并将它们作为模式应用。
在运行时,用户能够通过替换文件或向目录中增加新文件来更新 DBC 文件。eKuiper 可能热加载 DBC 文件,并通过重启规定来应用新的模式解码 CAN 帧。这能够帮忙您爱护 DBC 文件,让它放弃私密。
连贯和格局拆散
在创立流的语句中,咱们将 type
属性和 format
属性都设置为 ”can”。这是因为 eKuiper 将数据源的连贯形式和数据格式进行了拆散。
type
属性指定了连贯形式,本案例中是 CAN Bus。format
属性指定了数据格式,本案例中是 CAN 帧。
这种拆散使得 eKuiper 可能反对 CAN 帧和传输协定的各种组合,这在应用一些 CAN 适配器时十分常见。CAN 适配器可能会将 CAN 帧记录到文件中,或者将原始的 CAN 帧发送到 MQTT Broker,或者通过 TCP 或 UDP 以批量的模式发送 CAN 帧。在这些状况下,type
属性将是 ”file” 或 ”mqtt”,而 format
属性将是 ”can”。
如果 type
是“can”,eKuiper 会通过 socketCan 连贯到 CAN Bus。在上面的例子中,eKuiper 从文件中读取 CAN 帧:
CREATE STREAM canDemo () WITH (TYPE="file", FORMAT="can", SHARED="TRUE", SCHEMAID="dbc")
将 CAN Bus 灵便地桥接到 MQTT
CAN Bus 设施会以高频率(如 100HZ)在总线上周期性地发送音讯。因为存储或带宽的限度,咱们可能只想以较低的频率对数据进行采样,并有抉择的保留信号。有了 eKuiper,咱们能够:
- 通过指定采样率来对数据进行采样。
- 通过抉择所需的信号来在信号层面对数据进行过滤。
- 只桥接发生变化的信号。
- 将不同 CAN 帧中的信号合并成一个音讯。
所有这些性能都能够通过规定 SQL 来实现,并且因为具备规定热加载的能力,所以变更简直没有老本。上面让咱们看一些例子。
## 过滤信号
SELECT EnginSpeed, DriverRequestTorqueStatus FROM canDemo
## 将不同 CAN 帧中的信号合并
SELECT latest(EnginSpeed) as speed, latest(anotherSignal) as anotherSignal FROM canDemo
## 只桥接发生变化的信号
SELECT CHANGED_COLS(EngineSpeed, DriverRequestTorqueStatus) FROM canDemo
一旦取得了所需的信号,咱们就须要决定将数据公布到哪个 MQTT 主题。用户能够指定一个固定的主题名称,或者应用从数据中派生进去的动静主题名称。
例如,在上面的规定中,每个解析出的 CAN 帧信号都会被桥接到 MQTT 主题 can/{{CanId}}
。{{CanId}}
是从数据中派生出的动静主题名称,比方一个 CAN ID 为 123 的 CAN 帧将被桥接到 MQTT 主题 can/123
。
{
"id": "distributeRule",
"sql": "SELECT *, meta(id) as canId FROM canDemo",
"actions": [
{
"mqtt": {
"server": "tcp://broker.emqx.io:1883",
"topic": "can/{{.canId}}",
"sendSingle": true
}
}
]
}
eKuiper 容许多个规定解决同一个流。因而,用户能够依据须要创立多个规定,将 CAN Bus 数据桥接到不同的 MQTT 主题。
结语
要实现 CAN Bus 和 MQTT 之间的桥接,咱们的解决方案要可能从 CAN Bus 设施读取数据,依据需要对数据进行过滤和转换,并将数据公布到 MQTT Broker。这正是 eKuiper 的用武之地,它提供了一种简略、高效和灵便的形式来实现这项工作。
除了桥接性能,eKuiper 还能够在边缘规定引擎和边缘计算的多种场景中提供帮忙。咱们将在后续的文章中具体探讨这些场景。
版权申明:本文为 EMQ 原创,转载请注明出处。
原文链接:https://www.emqx.com/zh/blog/bridging-demanded-signals-from-can-bus-to-mqtt-by-ekuiper