物联网运行时组件配置#
配置文件是一个JSON结构化文件,所有组件(管理器、监视器、控制器、驱动)都将使用该文件。它允许插入某些令牌,根据具体上下文,下表对这些令牌进行了说明:
| 名称 | 类型 | 用法 | 描述 |
|---|---|---|---|
| applicationName | Application | ${applicationName} | 当前应用的名称 |
| pid | Application | ${pid} | 当前应用的进程ID |
| componentId | Application | ${componentId} | 正在运行的组件的名称(AutomationManager、AutomationMonitor、AutomationController、DriverCsv等) |
| entityName | Application | ${entityName} | 当前应用的上下文实体的名称 |
| tmp | OperatingSystem | ${tmp} | 用户临时目录 |
| pwd | OperatingSystem | ${pwd} | 正在运行的脚本的位置 |
| cwd | OperatingSystem | ${cwd} | 工作目录(执行命令的位置) |
Table: 物联网模块配置令牌
基本结构#
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| ID | 字符串 | 进程的标识符 | |
| monitorHost | 字符串 | "localhost" | 本地监视器侦听器的地址 |
| monitorPort | 整数 | 0 | 本地监视器侦听器的端口。对于自动端口分配,则为0 |
| cache | 字符串 | 下载和执行包的本地路径 | |
| monitorApplication | 字符串 | ""${pwd}\monitor.js" | 监视器进程的完整路径 |
| repository | Repository | 有关包处理的代码库 | |
| system | System | 系统访问设置 | |
| storage | Storage | 用于配置持久性位置的部分 | |
| logging | Logging | 日志记录机制设置 | |
| monitor | monitor | 监视器进程特定设置 | |
| controller | controller | 控制器进程特定设置 | |
| driver | driver | 驱动进程特定设置 |
Table: 物联网模块基本结构
代码库结构#
代码库表示监视器进程处理包所在位置(远程)和存储位置(本地)的方式。
| 名称 | 类型 | 可能的值 | 默认值 | 描述 |
|---|---|---|---|---|
| 类型 | 字符串 | NpmDirectory | 代码库类型 - Npm - 使用NPM服务器- Directory - 使用包的本地目录和基于json的数据库描述符- System - 从 MES 下载包(从下面详述的系统结构中检索设置) | |
| settings | 对象 | 代码库设置(取决于类型) |
Table: 物联网模块代码库结构
键入Npm设置#
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| url | 字符串 | NPM服务器所在的网址(包括端口) | |
| 令牌 | 字符串 | 用于身份验证的可选不记名令牌 |
Table: Npm特定设置
键入Directory设置#
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| 路径 | 字符串 | 包所在的目录。必须可被进程访问,目前不支持UNC |
Table: 目录特定设置
目录示例#
"repository": {
"type": "Npm",
"settings": {
"url": "http://cmflab:4873/",
"token": "asjndlkjhwquelwqhjoidwquofdhwqudfW"
}
}
存储结构#
| 名称 | 类型 | 可能的值 | 默认值 | 描述 |
|---|---|---|---|---|
| 类型 | 字符串 | Directory | Directory | 持久性位置的类型 |
| 设置 | 对象 | 存储类型设置 | ||
| settings\path | 字符串 | 将存储持久性数据的基本路径。 支持 OperatingSystem标记 | ||
| settings\retentionTime | Integer string | "30d" | 存储数据的秒数。0表示永远。 支持带有用来表示时间单位的尾随标记的字符串: s - 秒m - 分钟h - 小时d - 天w - 周(7天)m - 月(30天) |
Table: 物联网模块存储结构
存储结构示例#
"storage": {
"type": "Directory",
"settings": {
"path": "D:/Temp/Persistency",
"retentionTime": 3600
}
}
"storage": {
"type": "Directory",
"settings": {
"path": "${tmp}/Persistency",
"retentionTime": "10d"
}
}
系统结构#
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| tenantName | 字符串 | 组件要使用的系统租户名称 | |
| 地址 | 字符串 | "localhost" | |
| 端口 | 整数 | ||
| timeout | 整数 | ||
| useSsl | 布尔值 | false | |
| isLoadBalancingEnabled | 布尔值 | false | 配置是否指向负载均衡 |
| authentication | Authentication | 对象 |
Table: 物联网模块系统结构
Authentication结构#
| 名称 | 类型 | 可能的值 | 默认值 | 描述 |
|---|---|---|---|---|
| 类型 | 字符串 | PasswordSecurityPortal | 要使用的身份验证类型 | |
| 设置 | 对象 | 身份验证设置(取决于类型) |
Table: 身份验证结构
Password类型身份验证设置#
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| 域 | 字符串 | 用户网域 | |
| 用户名 | 字符串 | 用户名 | |
| 密码 | 字符串 | 用户密码 |
Table: 密码类型身份验证结构
SecurityPortal类型身份验证设置#
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| clientId | 字符串 | 访问(MES)的客户端的ID | |
| 访问令牌 | 字符串 | 安全门户生成的长期访问令牌。在使用安全门户的非交互式使用场景中设置 | |
| openIdConfiguration | 字符串 | 可访问OpenID端点的网址。示例: http://cmflab:11000/tenant/CriticalManufacturing/.well-known/openid-configuration |
Table: 安全门户类型身份验证结构
示例#
"system": {
"tenantName": "CriticalManufacturing",
"address": "CMFLAB",
"port": 8093,
"timeout": 60000,
"useSsl": false,
"isLoadBalancingEnabled": false,
"authentication": {
"_type": "Password",
"settings": {
"domain": "cmf",
"username": "administrator",
"password": "1234567890"
}
}
}
"system": {
"tenantName": "CriticalManufacturing",
"address": "CMFLAB",
"port": 8093,
"timeout": 60000,
"useSsl": false,
"isLoadBalancingEnabled": false,
"authentication": {
"type": "SecurityPortal",
"settings": {
"clientId": "MES",
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsInRlbmFudE5hbWUiOiJDcml0aWNhbE1hbnVmYWN0dXJpbmcifQ.eyJjbGllbnRJZCI6Ik1FUyIsInRlbmFudE5hbWUiOiJDcml0aWNhbE1hbnVmYWN0dXJpbmciLCJzdWIiOiJDTUZcXEFkbWluaXN0cmF0b3IiLCJ1c2VyQWNjb3VudCI6IkNNRlxcQWRtaW5pc3RyYXRvciIsImlhdCI6MTU2MjE3MTU1OSwiZXhwIjoxNjYyMTc1MTU5LCJhdWQiOiJBdXRoUG9ydGFsIiwiaXNzIjoiQXV0aFBvcnRhbCJ9.iiN1Gg7vfW9dYApPCMoLBGgff9IR-uH-GZaBc5QvyGs",
"openIdConfiguration": "http://cmflab:9091/tenant/CriticalManufacturing/.well-known/openid-configuration"
}
}
}
日志记录结构#
日志记录配置允许同时配置多个不同的日志程序,这意味着可以为每种类型的日志程序配置不同的选项。
| 名称 | 类型 | 可能的值 | 默认值 | 描述 |
|---|---|---|---|---|
| ID | 字符串 | 日志程序的标识符;如果未配置,则同一种类型只允许有一个日志程序 | ||
| 类型 | 字符串 | ConsoleFileHttp | 传输类型 | |
| options | 对象 | 传输选项,每种类型的传输的选项各不相同,请参阅下文每种传输的相关信息 | ||
| applications | 字符串数组 | AutomationMonitorAutomationControllerAutomationManagerDriverSecsGemDriverOpcUADriverMqttDriverBleDriverCsvFileDriverRawFileDriverKeyboardWedgeDriverOibDriverOpcDADriverSerialDriverTcpIp | 通配符可以配置全部应用或按名称进行过滤,例如:“Driver*” |
Table: 物联网模块日志记录结构
通用传输选项#
这些选项适用于所有类型:
| 名称 | 类型 | 可能的值 | 默认值 | 描述 |
|---|---|---|---|---|
| 级别 | 字符串 | debuginfowarningerror | "info" | 此传输应记录的消息的最低级别。如果定义了info级别,则系统将记录info、warning和error级别的所有条目,并将忽略debug条目。 |
| label | 字符串 | "${applicationName}" | 要在日志条目的开头附加的标签(如果在格式中使用了标签) | |
| format | 字符串 | "${log.timestamp}${log.level}:${log.message}" | 日志行的格式 | |
| 时间戳 | 布尔值 | true | 指示是否应在输出前加上时间戳的标志。如果指定了函数,则将使用其返回值而不是时间戳 | |
| timestampFormat | 字符串 | "YYYY-MM-DD HH:mm:ss.SSS" | 日志条目中时间戳的格式。有关完整格式的信息,请参阅https://github.com/taylorhakes/fecha#formatting-tokens ⧉ | |
| maxLength | 整数 | 0 | 要记录的消息条目的最大长度(<=0表示忽略)。如果条目长度大于该值,系统将记录消息开头的(maxLength的70%)个字符和最后的(maxLength的30%)个字符。此设置有助于将大量通信日志保持在更可控的状态。 | |
| specificLevelLock | 布尔值 | false | 仅记录指定的详细程度级别。如果将此项设置为true,则系统将忽略大于level的级别。 |
Table: 物联网模块通用传输选项
控制台传输选项#
此传输将所有消息记录到应用控制台。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| colorize | 布尔值 | true | 指示是否应对输出着色的标志。 |
| colorizeMessage | 布尔值 | true | 着色是应用于完整消息还是仅应用于特定详细程度级别。 |
Table: 物联网模块控制台传输选项
示例#
{
"type": "Console",
"options": {
"level": "debug",
"prettyPrint": true,
"colorizeMessage": true
},
"applications": [ "*" ]
}
文件传输选项#
从名称即可看出,此传输会将所有消息记录到文件系统。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| frequency | 字符串 | 表示轮替频率的字符串。如果您希望进行定时轮替,而不是在特定时间进行轮替,此设置将非常有用。有效值为'#m'或'#h'(例如,“5m”或“3h”)。留空则会根据datePattern来确定轮替时间。 | |
| datePattern | 字符串 | "YYYY-MM-DD" | 表示要用于轮替的moment.js日期格式的字符串。此字符串中使用的元字符将决定文件轮替的频率。例如,如果您的datePattern只是简单的'HH',则最终将有24个日志文件每天被收集并附加到系统中。 |
| filename | 字符串 | "LogFile_${date}.log" | 要记录到的文件的文件名。此文件名可以包括${date}占位符,该占位符将在文件名中包含该时刻的格式化datePattern |
| dirname | 字符串 | "." | 要将日志文件保存到的目录的目录名 |
| maxSize | 字符串 | "10m" | 文件的最大大小,超过此大小后文件将被轮替。此设置可以是字节数,也可以KB、MB和GB作为单位。如果使用单位,请添加k、m或g作为后缀。这些单位需要直接跟在数字后面。 |
| maxFiles | 字符串 | "30d" | 要保留的日志数上限。如果未设置,则不会移除任何日志。此设置可以是文件数或天数。如果使用天数,请添加d作为后缀 |
| option | 对象 | { flags: 'a', mode: 0o777 } | 类似https://nodejs.org/api/fs.html#fs_fs_createwritestream_path_options ⧉的对象,表示应传递到文件流的其他选项 |
Table: 物联网模块文件传输选项
文件传输选项示例#
{
"id": "MyFileLogger01",
"type": "File",
"options": {
"filename": "${applicationName}_${date}.log",
"dirname": "${tmp}/JSManager01/Logs/${applicationName}",
"level": "debug",
"timestampFormat": "HH:mm:ss.SSSSS",
"maxSize": "10m",
"maxFiles": 5,
"maxLength": 5000,
"specificLevelLock": false
},
"applications": [ "AutomationMonitor", "AutomationManager" ]
}
HTTP传输选项#
HTTP传输是从任意HTTP端点(最好使用winstond)记录、查询和流式传输日志的通用方式。它将使用传递给node.js http或https请求的选项:
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| 主机 | 字符串 | "localhost" | HTTP日志记录端点的远程主机。 |
| 端口 | 整数 | 80 或443 | HTTP日志记录端点的远程端口。 |
| 路径 | 字符串 | "/" | HTTP日志记录端点的远程URI。 |
| auth | 对象 | None | 表示用于HTTP基本身份验证的用户名和密码的对象。 |
| ssl | 布尔值 | false | 指示是否应使用HTTPS的值 |
Table: 物联网模块HTTP传输选项
HTTP传输选项示例#
{
"id": "MyHttp01",
"type": "Http",
"options": {
"host": "localhost",
"port": "80",
"path": "logger",
},
"applications": [ "AutomationController" ]
}
监视器结构#
可选的监视器部分专门用于监视器进程,其他应用不会使用该模块。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| notifyBeforeKill | 布尔值 | true | 用于指示是在终止进程之前先发出通知(以便这些进程能够正确清理所有资源、断开与设备的连接等)还是直接终止进程的标志。 |
| killNotificationTimeout | 整数 | 10000 | 等待“即将终止”的进程回复已完成清理并准备好被终止的毫秒数。 |
| retryAttempts | 整数 | 30 | 当受重试机制保护的调用失败时,失败前执行的次数 |
| sleepBetweenAttempts | 整型 | 1000 | 当受重试机制保护的调用失败时,重试之间的等待时间 |
| processCommunication | SslConfig | 允许进程间通信使用SSL的配置(监视器<->控制器和监视器<->驱动) |
Table: 物联网模块监视器结构
监视器结构示例#
"monitor": {
"notifyBeforeKill": "true",
"killNotificationTimeout": 30000,
"retryAttempts": 45,
"sleepBetweenAttempts": 1000,
"processCommunication": {
"useSsl": true,
"privateKey": "C:\\Users\\jpsantos\\Desktop\\ssl\\certificates\\key.pem",
"certificate": "C:\\Users\\jpsantos\\Desktop\\ssl\\certificates\\cert.pem",
"certificateAuthority": "C:\\Users\\jpsantos\\Desktop\\ssl\\certificates\\ca-cert.pem"
}
}
控制器结构#
可选的控制器部分专门用于控制器进程,其他应用不会使用该模块。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| retryAttempts | 整数 | 30 | 当受重试机制保护的调用失败时,失败前执行的次数 |
| sleepBetweenAttempts | 整数 | 1000 | 当受重试机制保护的调用失败时,重试之间的等待时间 |
| profilerSessionsLocation | 字符串 | 分析器会话的存储位置 |
Table: 物联网模块控制器结构
控制器结构示例#
"controller": {
"retryAttempts": 45,
"sleepBetweenAttempts": 1000,
"profilerSessionsLocation": "C:\\Users\\jpsantos\\tempController"
}
驱动结构#
可选的驱动部分专门用于驱动进程,其他应用不会使用该模块。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| retryAttempts | 整数 | 30 | 当受重试机制保护的调用失败时,失败前执行的次数 |
| sleepBetweenAttempts | 整数 | 1000 | 当受重试机制保护的调用失败时,重试之间的等待时间 |
| processCommunication | SslConfig | 允许进程间通信使用SSL的配置(驱动<->控制器) |
Table: 物联网模块驱动结构
驱动结构示例#
"driver": {
"retryAttempts": 45,
"sleepBetweenAttempts": 1000,
"processCommunication": {
"useSsl": true,
"privateKey": "C:\\Users\\jpsantos\\Desktop\\ssl\\certificates\\key.pem",
"certificate": "C:\\Users\\jpsantos\\Desktop\\ssl\\certificates\\cert.pem",
"certificateAuthority": "C:\\Users\\jpsantos\\Desktop\\ssl\\certificates\\ca-cert.pem"
}
}
SslConfig结构#
当进程之间的通信需要使用SSL时,请使用这些设置。
| 名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| useSsl | 布尔值 | false | 在组件通信时使用SSL通信 |
| rejectUnauthorized | 布尔值 | false | 如果不为false,服务器将自动拒绝具有无效证书的客户端。 允许绕过错误:如果设置为false,系统将以完全不安全的方式绕过“监视器连接错误:无法验证第一个证书”! 此外,如果要忽略环境变量“NODE_TLS_REJECT_UNAUTHORIZED=”,则可将rejectUnauthorized设置为true 在自签名证书上,可以通过certificateAuthority选项传递正确的CA(证书授权机构)证书 |
| privateKey | 字符串 | PEM编码的SSL私钥值或包含密钥值的文件的完整路径 | |
| certificate | 字符串 | PEM编码的SSL证书值或包含证书值的文件的完整路径 | |
| certificateAuthority | 字符串 | PEM编码的SSL自定义证书授权机构(CA)值或包含证书值的文件的完整路径 |
Table: 物联网模块SslConfig结构
SslConfig结构示例#
{
"useSsl": true,
"privateKey": "C:\\Users\\jpsantos\\Desktop\\ssl\\certificates\\key.pem",
"certificate": "C:\\Users\\jpsantos\\Desktop\\ssl\\certificates\\cert.pem",
"certificateAuthority": "C:\\Users\\jpsantos\\Desktop\\ssl\\certificates\\ca-cert.pem"
}
完整示例#
以下JSON文档展示了一个可能的配置:
{
"id":"JSManager01",
"cache":"D:/Temp/JSManager01/packages",
"hostName":"localhost",
"monitorApplication":"N:/Product/72x/IoMT/src/monitor/src/index.js",
"monitor":{
"notifyBeforeKill":"true",
"killNotificationTimeout":30000,
"retryAttempts":45,
"sleepBetweenAttempts":1000,
"processCommunication":{
"useSsl":true,
"privateKey":"C:\\Users\\jpsantos\\Desktop\\ssl\\certificates\\key.pem",
"certificate":"C:\\Users\\jpsantos\\Desktop\\ssl\\certificates\\cert.pem",
"certificateAuthority":"C:\\Users\\jpsantos\\Desktop\\ssl\\certificates\\ca-cert.pem"
}
},
"controller":{
"retryAttempts":45,
"sleepBetweenAttempts":1000,
"profilerSessionsLocation": "C:\\Users\\jpsantos\\tempController"
},
"repository":{
"type":"Directory",
"settings":{
"path":"D:\\Temp\\fakeNPM"
}
},
"system":{
"tenantName":"CriticalManufacturing",
"address":"CMFLAB",
"port":8093,
"timeout":60000,
"useSsl":false,
"isLoadBalancingEnabled":false,
"authentication":{
"type":"SecurityPortal",
"settings":{
"clientId":"MES",
"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsInRlbmFudE5hbWUiOiJDcml0aWNhbE1hbnVmYWN0dXJpbmcifQ.eyJjbGllbnRJZCI6Ik1FUyIsInRlbmFudE5hbWUiOiJDcml0aWNhbE1hbnVmYWN0dXJpbmciLCJzdWIiOiJDTUZcXEFkbWluaXN0cmF0b3IiLCJ1c2VyQWNjb3VudCI6IkNNRlxcQWRtaW5pc3RyYXRvciIsImlhdCI6MTU2MjE3MTU1OSwiZXhwIjoxNjYyMTc1MTU5LCJhdWQiOiJBdXRoUG9ydGFsIiwiaXNzIjoiQXV0aFBvcnRhbCJ9.iiN1Gg7vfW9dYApPCMoLBGgff9IR-uH-GZaBc5QvyGs",
"openIdConfiguration":"http://cmflab:9091/tenant/CriticalManufacturing/.well-known/openid-configuration"
}
}
},
"storage":{
"type":"Directory",
"settings":{
"path":"${temp}/Persistency",
"retentionTime":3600
}
},
"logging":[
{
"type":"Console",
"options":{
"level":"debug",
"prettyPrint":true,
"colorizeMessage":true
},
"applications":[
"*"
]
},
{
"id":"file01",
"type":"File",
"options":{
"filename":"${applicationName}_${date}.log",
"dirname":"d:/Temp/JSManager01/Logs/${entityNameNormalized}/${componentId}",
"level":"debug",
"timestampFormat":"HH:mm:ss.SSSSS",
"maxSize":"10m",
"maxFiles":5
},
"applications":[
"Driver*",
"AutomationController"
]
},
{
"id":"file02",
"type":"File",
"options":{
"filename":"${applicationName}_${date}.log",
"dirname":"d:/Temp/JSManager01/Logs/${applicationName}",
"level":"debug",
"timestampFormat":"HH:mm:ss.SSSSS",
"maxSize":"10m",
"maxFiles":5,
"maxLength":5000,
"specificLevelLock":false
},
"applications":[
"AutomationMonitor",
"AutomationManager"
]
}
]
}