产品定价 立即试用
IoT网关
文档 > 配置指南 > CAN连接器
入门
安装
目录

CAN连接器配置

本指南将帮助您熟悉ThingsBoard IoT Gateway的CAN连接器配置。
请使用通用配置启用此连接器。
下面将说明连接器配置文件。

CAN连接器配置文件示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
{
  "interface": "socketcan",
  "channel": "vcan0",
  "backend": {
    "fd": true
  },
  "reconnectPeriod": 5,
  "devices": [
    {
      "name": "Car",
      "sendDataOnlyOnChange": false,
      "enableUnknownRpc": true,
      "strictEval": false,
      "attributes": [
        {
          "key": "isDriverDoorOpened",
          "nodeId": 41,
          "command": "2:2:big:8717",
          "value": "4:1:int",
          "expression": "bool(value & 0b00000100)",
          "polling": {
            "type": "once",
            "dataInHex": "AB CD AB CD"
          }
        }
      ],
      "timeseries": [
        {
          "key": "rpm",
          "nodeId": 1918,
          "isExtendedId": true,
          "command": "2:2:big:48059",
          "value": "4:2:big:int",
          "expression": "value / 4",
          "polling": {
            "type": "always",
            "period": 5,
            "dataInHex": "aaaa bbbb aaaa bbbb"
          }
        },
        {
          "key": "milliage",
          "nodeId": 1918,
          "isExtendedId": true,
          "value": "4:2:little:int",
          "expression": "value * 10",
          "polling": {
            "type": "always",
            "period": 30,
            "dataInHex": "aa bb cc dd ee ff aa bb"
          }
        }
      ],
      "attributeUpdates": [
        {
          "attributeOnThingsBoard": "softwareVersion",
          "nodeId": 64,
          "isExtendedId": true,
          "dataLength": 4,
          "dataExpression": "value + 5",
          "dataByteorder": "little"
        }
      ],
      "serverSideRpc": [
        {
          "method": "sendSameData",
          "nodeId": 4,
          "isExtendedId": true,
          "isFd": true,
          "bitrateSwitch": true,
          "dataInHex": "aa bb cc dd ee ff    aa bb aa bb cc d ee ff"
        },
        {
          "method": "setLightLevel",
          "nodeId": 5,
          "dataLength": 2,
          "dataByteorder": "little",
          "dataBefore": "00AA"
        },
        {
          "method": "setSpeed",
          "nodeId": 16,
          "dataAfter": "0102",
          "dataExpression": "userSpeed if maxAllowedSpeed > userSpeed else maxAllowedSpeed"
        }
      ]
    }
  ]
}

根节点配置

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

注意,尽管attributestimeseriesattributeUpdatesserverSideRpc均为可选子节,但至少需要设置其中一个才能使设备配置生效。

“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 -字节顺序- biglittle(默认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 -字节顺序- biglittle(默认big
  • type - Python原始类型boolbooleanintlongfloatdoublestringboolintfloat类型分别对应ThingsBoard的booleanlongdouble类型。 注意float类型值需要4个字节,double类型值需要8个字节。
  • encoding - 仅适用于string类型字符串的编码(默认ascii)。
  • signed - 仅适用于int/long类型指示整数是有符号值还是无符号值- signedunsigned(默认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()上下文中可使用以下变量:

  1. value -将值配置应用于CAN有效载荷后的结果
  2. 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进行修改。变量valuedataExpression中可用,这是已变更属性的值。 如果未设置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*选项。处理步骤与属性更新相同,但有以下区别:
-如果未设置dataExpressionRPC参数必须包含名为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 ],其中0x64100英里/小时,因为用户超过了限速

下一步

浏览与ThingsBoard主要功能相关的指南: