本指南将帮助您熟悉ThingsBoard IoT Gateway的CAN连接器配置。
请使用通用配置启用此连接器。
下面将说明连接器配置文件。
CAN连接器配置文件示例。
根节点配置
CAN连接器配置的根节点部分提供了连接/重连CAN总线的基本信息,并包含设备配置列表。
| 参数 | 默认值 | 描述 |
|---|---|---|
| name | CAN Connector | 连接器名称。 |
| interface | socketcan | CAN接口类型。 |
| channel | vcan0 | CAN接口的通道名称。 |
| backend | 接口特定配置。 | |
| reconnect | true | 确定在发送/接收CAN消息发生总线错误后是否重连。 |
| reconnectPeriod | 30.0 | 重连尝试之间的时间间隔(秒)。浮点数可实现比秒更精确的时间控制。 |
| reconnectCount | 总线错误后的重连尝试次数。如未指定,表示无限次尝试。 | |
| devices | 设备列表。 |
您可以在Python CAN库文档中查看支持的CAN接口列表。
“backend”配置节
此配置节为可选项,用于对特定CAN接口进行配置。每个选项都有默认值。要获取可用选项列表,请参阅特定接口类型的文档。
例如,SocketCAN接口支持以下配置选项:
- receive_own_messages
- fd
- can_filters
1
2
3
4
"backend": {
"receive_own_messages": true,
"fd": true
}
这表示已发送的消息也应被接收,且应支持CAN-FD帧。默认情况下,这些选项处于禁用状态。
“devices”配置节
此配置节提供了通过CAN总线连接的设备的配置数组。
| 参数 | 默认值 | 描述 |
|---|---|---|
| name | 设备名称。 | |
| type | can | 设备类型。 |
| sendDataOnlyOnChange | false | 仅在数据相较上次检查发生变化时发送,如未指定则在每次接收到CAN消息后发送。 |
| strictEval | true | Python eval() API的受限模式。 |
| enableUnknownRpc | false | 允许处理未在serverSideRpc子节中列出的RPC命令。 |
| overrideRpcConfig | false | 允许通过从服务器接收的数据覆盖RPC命令配置(全部或部分选项)。 |
| converters | 自定义转换器。 | |
| attributes | 设备属性列表。 | |
| timeseries | 时间序列键列表。 | |
| attributeUpdates | 需订阅的共享属性列表。 | |
| serverSideRpc | RPC命令列表。 |
如果enableUnknownRpc设置为true,则overrideRpcConfig也会被强制设置为true。
注意,尽管attributes、timeseries、attributeUpdates和serverSideRpc均为可选子节,但至少需要设置其中一个才能使设备配置生效。
“converters”子节
CAN连接器内置了上行/下行数据转换器。可以为上行、下行或两者指定自定义转换器。
| 参数 | 默认值 | 描述 |
|---|---|---|
| uplink | 上行转换器的Python类。 | |
| downlink | 下行转换器的Python类。 |
作为输入数据,上行转换器获取CAN有效载荷(字节数组)以及来自“attributes”和”timeseries”子节的配置列表,以确定获取哪些字节及如何解析。
作为输出数据,上行转换器返回包含属性和遥测列表的字典。列表中的每个元素都是键/值对,其中键为属性名称或时间序列键,值为对应的数据值。
1
2
3
4
{
"attributes": [{"isDriverDoorOpened": "true"}],
"telemetry": [{"rpm":100},{"milliage": 300000}]
}
作为输入数据,下行转换器获取值(RPC情况下为多个值)以及配置(来自“attributeUpdates”或“serverSideRpc”子节),用于描述如何将值转换为CAN有效载荷。
作为输出数据,下行转换器返回CAN有效载荷(字节数组)以供后续发送。
“attributes”或”timeseries”子节
此子节提供了配置列表,每个配置描述了从CAN有效载荷(字节数组)中获取哪些字节,以及如何将这些字节转换为ThingsBoard属性或时间序列键。
| 参数 | 默认值 | 描述 |
|---|---|---|
| key | 属性或时间序列键的名称。 | |
| nodeId | CAN节点(仲裁)ID。 | |
| value | 值转换配置。 | |
| expression | Python eval()表达式,用于以某种方式修改_value_。 | |
| command | 命令转换配置。 | |
| polling | 轮询配置。 | |
| isExtendedId | false | 如果为True,表示使用扩展CAN节点(仲裁)ID。 |
| isFd | false | 如果为True,表示使用CAN FD模式。 |
| bitrateSwitch | false | 仅适用于CAN FD模式如果为True,表示数据传输使用更高的比特率。 |
“command”
command选项是一个附加但非必需的抽象层,允许根据CAN消息的一部分来不同地解析同一CAN消息的另一部分。
例如,灌溉系统的控制器可以告知系统的不同参数。通信通过CAN总线完成。
CAN有效载荷的第一个字节是command。如果命令值为2,表示后续字节为温度数据。
如果命令值为4,数据为湿度值。
_command_选项支持以下格式:
- JSON字符串格式:
1
command: "<start>:<length>:[byteorder]:[value]"
- JSON对象格式:
1 2 3 4 5 6
"command": { "start": <start_value>, "length": <length_value>, "byteorder": <byteorder_value>, "value": <value> }
其中:
- start -第一个字节的位置- CAN协议为0到7,CAN FD协议为0到63
- length -获取命令值所需的字节数
- byteorder -字节顺序- big或little(默认big)
- value -十进制格式的命令整数值
示例:
1.从第0个位置开始以little字节顺序读取2个字节,仅当命令值为12345时才触发后续字节的处理。
1
"command": "0:2:little:12345"
“value”
value选项描述了从CAN有效载荷中获取多少字节以及用于转换的对应原始类型。
_value_选项支持以下格式:
- JSON字符串格式:
1
"value": "<start>:<length>:[byteorder]:<type>:[encoding|signed]"
- JSON对象格式:
1 2 3 4 5 6 7 8
"value": { "start": <start_value>, "length": <length_value>, "byteorder": <byteorder_value>, "type": <type_value>, "encoding": <encoding_value>, "signed": <signed_value> }
其中:
- start -第一个字节的位置- CAN协议为0-7,CAN FD协议为0-63
- length -获取值所需的字节数
- byteorder -字节顺序- big或little(默认big)
- type - Python原始类型bool、boolean、int、long、float、double或string。 bool、int和float类型分别对应ThingsBoard的boolean、long和double类型。 注意,float类型值需要4个字节,double类型值需要8个字节。
- encoding - 仅适用于string类型字符串的编码(默认ascii)。
- signed - 仅适用于int/long类型指示整数是有符号值还是无符号值- signed或unsigned(默认unsigned)
示例:
-从第2个位置开始以big字节顺序读取1个字节,并转换为unsigned int类型的值。
1
"value": "2:1:int"
-从第0个位置开始以big字节顺序读取8个字节,并转换为double类型的值。
1
"value": "0:7:double"
-从第0个位置开始以little字节顺序读取4个字节,并转换为float类型的值。
1
"value": "0:4:little:float"
-从第4个位置开始以little字节顺序读取2个字节,并转换为signed int类型的值。该值用于Python eval()表达式以获取最终值。
1
2
"value": "4:2:little:int:signed",
"expression": "value / 4"
“expression”
_expression_选项通过Python eval() API进行求值。在eval()上下文中可使用以下变量:
- value -将值配置应用于CAN有效载荷后的结果
- can_data - CAN有效载荷(字节数组)
注意,默认情况下Python eval() API以某种受限模式运行,拒绝直接访问__builtins__ API。要禁用受限模式,请将strictEval选项设置为_False_。
“polling”
如果未指定轮询配置,CAN连接器仅接收CAN节点自行决定发送的数据。
按需发送在CAN节点接收到轮询配置中指定的特定数据后激活。根据轮询类型,CAN连接器可以一次性或周期性地发送该数据。
| 参数 | 默认值 | 描述 |
|---|---|---|
| type | always | always类型表示周期性发送CAN消息,而once表示仅发送一次。 |
| period | 1.0 | 轮询周期(秒)。浮点数可实现比秒更精确的时间控制。 |
| dataInHex | 十六进制格式的CAN消息有效载荷。 |
“attributeUpdates”子节
此子节提供了订阅ThingsBoard共享属性变更的配置列表。
| 参数 | 默认值 | 描述 |
|---|---|---|
| attribute | 共享属性的名称。 | |
| nodeId | CAN节点(仲裁)ID。 | |
| isExtendedId | false | 如果为True,表示使用扩展CAN节点(仲裁)ID。 |
| isFd | false | 如果为True,表示使用CAN FD模式。 |
| bitrateSwitch | false | 仅适用于CAN FD模式如果为True,表示数据传输使用更高的比特率。 |
| dataLength | 1 | 仅适用于整数值打包integer值的字节数。 |
| dataByteorder | big | 仅适用于整数和浮点值打包numeric值的字节顺序。 |
| dataSigned | false | 仅适用于int/long类型指示整数是否为有符号值。 |
| dataExpression | Python eval()表达式,用于在打包为字节数组之前以某种方式修改属性值。 | |
| dataEncoding | ascii | 仅适用于字符串值字符串打包的编码。 |
| dataBefore | 位于值字节之前的十六进制字节字符串。 | |
| dataAfter | 位于值字节之后的十六进制字节字符串。 |
属性更新的处理步骤如下:
1.如果设置了dataExpression,则从ThingsBoard服务器接收的值将通过Python eval() API进行修改。变量value在dataExpression中可用,这是已变更属性的值。 如果未设置dataExpression,则保持值不变。 2.步骤1中的值根据其类型(通过Python isinstance() API推断)和为该属性提供的配置打包为字节数组。注意,float类型值需要4个字节。 3.如果设置了dataBefore和/或dataAfter,它们将被转换为字节数组,并分别添加到value字节(来自步骤2)的前面和后面。 4.通过CAN总线发送最终的字节数组。
“serverSideRpc”子节
此子节提供了处理从ThingsBoard服务器发送到设备的RPC命令的配置列表。
| 参数 | 默认值 | 描述 |
|---|---|---|
| method | RPC命令名称。 | |
| response | false | 如果为true,将向ThingsBoard发送响应。 |
| nodeId | CAN节点(仲裁)ID。 | |
| isExtendedId | false | 如果为True,表示使用扩展CAN节点(仲裁)ID。 |
| isFd | false | 如果为True,表示使用CAN FD模式。 |
| bitrateSwitch | false | 仅适用于CAN FD模式如果为True,表示数据传输使用更高的比特率。 |
| dataLength | 1 | 仅适用于整数值打包integer值的字节数。 |
| dataByteorder | big | 仅适用于整数和浮点值打包numeric值的字节顺序。 |
| dataSigned | false | 仅适用于int/long类型指示整数是否为有符号值。 |
| dataExpression | Python eval()表达式,用于在打包为字节数组之前以某种方式修改属性值。 | |
| dataEncoding | ascii | 仅适用于字符串值字符串打包的编码。 |
| dataBefore | 位于值字节之前的十六进制字节字符串。 | |
| dataAfter | 位于值字节之后的十六进制字节字符串。 | |
| dataInHex | 仅适用于无参数RPC发送到CAN节点的十六进制字节字符串。 |
CAN连接器支持无参数和有参数的RPC命令(参见params JSON对象)。
无参数RPC类型仅需要设置dataInHex(其他data*选项不使用)。每次处理RPC命令时,dataInHex的值将作为CAN消息的有效载荷发送。
有参数RPC类型基于除dataInHex之外的所有data*选项。处理步骤与属性更新相同,但有以下区别:
-如果未设置dataExpression,RPC参数必须包含名为value的JSON属性。该JSON属性的值将被打包为字节数组,并作为CAN消息的有效载荷发送到CAN节点。
1
2
3
4
5
6
7
8
9
{
"device": "Car",
"data": {
"method": "setLightLevel",
"params": {
"value": 70
}
}
}
-如果已设置dataExpression,则不需要特定的JSON属性,且所有RPC参数在dataExpression中均可用。
例如,用户想将车速提升到150英里/小时,但汽车控制系统有自己的限速,设置为100英里/小时。
1
2
3
4
5
6
7
8
9
10
11
{
"device": "Car",
"data": {
"id": 1,
"method": "setSpeed",
"params": {
"userSpeed": 150,
"maxAllowedSpeed": 100
}
}
}
此RPC命令的配置方式为如果用户超过限速,车速将被强制设置为该限速值:
1
2
3
4
5
6
7
8
9
"serverSideRpc": [
{
"method": "setSpeed",
"nodeId": 16,
"dataBefore": "09",
"dataAfter": "aabb",
"dataExpression": "userSpeed if maxAllowedSpeed > userSpeed else maxAllowedSpeed"
}
]
因此,处理_setSpeed_ RPC命令后,CAN有效载荷如下:
[ 0x09, 0x64, 0xAA, 0xBB ],其中0x64为100英里/小时,因为用户超过了限速。
下一步
浏览与ThingsBoard主要功能相关的指南: