如何使用配置化控制下发功能
顺序:
- 1.首先构建对应的网关设备类、网关子设备类
- 2.构建对应的设备
- 3.数据采集功能正常(是否在页面上能看到正常上数据),控制下发后的上传需注意,通过topic:up/gateway/进行上传,则需要开发人员配合转发到up/callback/gateway/。
- 4.若是网关设备,请在网关子设备的设备类上进行配置 下发配置文件,组合设备、普通设备在对应的设备类上进行配置即可。
- 5.该有的技术参数进行配置,可在设备上、以及设备继承的所有父设备类上配置。存在重复与设备越亲则优先级越高。
下发控制文件配置不正确,会出现情况:
- 1.有下发,无回复
- 2.无下发,无回复
如何正确的配置:下发配置文件
需注意:
- 1.动态填充符填写后,但并未进行技术参数配置,下发时后端会出现错误
- 2.枚举填充符字母填写不一,下发时后端会出现错误
动态填充符:
通过在设备的技术参数配置”xxx”相关参数为前缀的变量,将做”${attribute.xxx}”的方式进行配置文件的全局填充。
枚举填充符:
${TARGET_VALUE}:填充下发时候的值,根据属性描述的类型进行填写。
${LOWER_CONTROL_ID}:填充异步下发时需要携带给下位的控制id。
${MQTT_SERVER}:平台的MQTT broker 地址,使用MQTT方式时填写生效。
${MQTT_PROTOCOL}: 平台使用的MQTT版本 协议,使用MQTT方式时填写生效。
${MQTT_QOS}:平台使用的MQTT QOS,使用MQTT方式时填写生效。
${TIMEOUT}:平台使用的超时时间,单位为毫秒。
以下使用可根据实体类扩展。常用的有
${deviceTemplate.name}:设备类的标识名称
${deviceTemplate.id}:设备类的id
${deviceTemplate.displayName}:设备类的id
等等设备类相关 设备类型、设备类通讯方式等等
${device.id}:设备id
${device.name}:设备标识
${device.displayName}:设备展示名称
${device.userId}:设备userid 相当于 MQTT client 的client_id
${device.userName}:设备MQTT client账号
${device.token}:设备MQTT client密码
${device.gatewayId}:设备的网关设备id
等等设备相关 设备类型、设备通讯方式等等
${tslProperty.name}:属性标识
${tslProperty.displayName}:属性展示名称
${tslProperty.standardName}:属性标准化名称
等等相关信息
${tenantId}:当前租户id
${userId}:该次控制是由谁进行发起的 用户id。
${async}:是否开启异步控制。
${DATE}: 默认返回当前时间的Date类型的数据
${TIME_STAMP}: 默认返回当前时间的时间戳格式
根据以下图片示例,使用方式可例举以下常用方式
${DATE?string('yyyy-MM-dd hh:mm:ss')}:则时间为2023-02-23 12:12:12
${DATE?string('yyyy-MM-dd')}:则时间为2023-02-23 12:12:12
注意:freemarker模板引擎填充数字格式时默认以科学计数法填充,如果数字超过1000 则为1,000的形式,回出现多一个逗号。 解决方式:${xxx?c} 填充数字的时候以”?c” 为后缀即为则以普通字符填充。
FreemarkerQ 日期格式化处理 基本参数:
date:只显示日期,不显示时间!
{createTime?date('yyyy-MM-dd’)}
time: 只显示时间,不显示日期
fcreateTime?time('hh:mm:ss ))datetime:时间和日期同时显示
createTime?datetime('yyyy-MM-dd hh:mm:ss’)fcreateTime?string.short} 01.45 PMcreateTime?string.long} 01:45:09 PM PSTcreateTime?string.xs} 13:45:09-08:00
book.date?string('yyyy-MM-dd’)}
帮助文档实例:
control:
## carrier:描述使用的载体方式(目前支持MQTT、http方式的下发,通过carrier进行字段配置。)【必填】
- carrier: "mqtt"
## foreign:在使用MQTT时的定制描述,是否使用外部载体。【必填】
foreign: true
## async:控制是否是异步操作。【必填】
async: true
## propertyName:对应的属性字段,若不填写则为通配。通配作为最低优先级,优先单个配置。【非必填】
propertyName: "test_01"
## 使用外部载体时,需配置MQTT broker的地址。【使用外部载体必填】
server: "${MQTT_SERVER}"
## 使用外部载体时,需配置连接MQTT broker传输的协议版本(目前暂时仅支持3.1.1,可使用$MQTT_PROTOCOL填写代替)。【使用外部载体必填】
protocol: "${MQTT_PROTOCOL}"
## 使用外部载体时,需配置信息传达的目标topic【使用外部载体必填】
topic: "down/device/208/7Qr4d3iqlX/1"
## qos:使用外部载体时,需配置传达到的目标的ack方式(平台默认0,可使用$MQTT_QOS填写代替)【使用外部载体必填】
qos: ${MQTT_QOS}
## 使用外部载体时,需配置使用连接MQTT broker的clientId【使用外部载体必填】
clientId: "84812"
## 使用外部载体时,需配置使用连接MQTT broker的账号【使用外部载体必填】
username: "gev9oTcwKd@监听设备"
## 使用外部载体时,需配置使用连接MQTT broker的密码【使用外部载体必填】
password: "779e7ed8e3c0404f8f80a839eba9d402"
## timeout:该点位控制的超时时间,从实际下发开始。可填占位符后端默认15s【必填】
timeout: ${TIMEOUT}
## body:作为MQTT载体中主要携带的信息。【必填】
body: "{\"id\":${LOWER_CONTROL_ID},\"deviceId\": \"modbus\",\"data\":{\"wendu\":${TARGET_VALUE}}\"}"
## propertyMap:mqtt v5 协议新特性 property 以下propertyMap配置为边缘 需接受的模板
propertyMap:
userId: ${userId?c}
deviceName: ${device.name}
propertyName: ${tslProperty.name}
targetValue: ${TARGET_VALUE}
async: ${async?c}
callback:
## 描述回调时信息中所携带控制字段名,通过"."的方式描述字段的层级,例如:a.b.c描述为a对象,下的b对象,下的c字段。【异步必填】
controlIdField: "id"
## 使用外部载体时,描述回调时监听信息返回的通道。【异步且使用外部载体时必填】
topic: "up/callback/device/208/7Qr4d3iqlX/1"
## 描述回调时信息的成功字符包含条件。【异步必填】
payload: "success"
## 控制是否是异步操作。【必填】
- async: true
##【carrier:描述使用的载体方式(目前支持MQTT、http方式的下发,通过carrier进行字段配置。)【必填】
carrier: "http"
## propertyName:对应的属性字段,若不填写则为通配。通配作为最低优先级,优先单个配置。【非必填】
propertyName: "test_01"
## url:控制的http地址【必填】
url: "http://1.116.134.81:8088/control"
## method:控制的http方式(目前仅支持post、get)【必填】
method: "post"
## headers:控制的http请求头参数,该项为不定扩展项,map的形式key作为请求头参数的key,value作为请求头参数需要的值。
headers:
tenantId: ${tenantId}
deviceTemplateId: ${deviceTemplate.id}
cjq: ${attribute.cjq}
## body:使用post请求时需描述的参数。
body: "{\"target\":\"${TARGET_VALUE}\"}"
## timeout:该点位控制的超时时间,从实际下发开始。可填占位符后端默认15s【必填】
timeout: 15000
## successStatusCodes:作为http响应成功的认定条件之状态码,发起控制时,判断信息是否成功的条件之一,满足列表项之一即可,但需与successResponseBody同时成立。
## successResponseBody:作为http响应成功的认定条件之字符包含,发起控制时,判断信息是否成功的条件之一,满足列表项之一即可,但需与successStatusCodes同时成立。
successStatusCodes:
- 200
- 204
successResponseBody:
- "成功"
callback:
## 描述回调时信息的成功字符包含条件。【异步必填】
payload: "success"
网关测试实例
注意事项
该功能需要控制权限、以及回调权限
响应:code:0即为成功、code:1即为失败
对于网关设备: 如果下发了没有得到up/callback/gateway/的回应 需要开发人员确认 脚本是否正常采集到up/callback/gateway/的数据,是否需要类似领旗、安科瑞 实际控制回调是经过 up/gateway/ 进行上传的,需要开发人员进行一层转发到up/callback/gateway/ 。
星原网关
点位通配情况:指的是下发的点位均可以通过这种方式进行传输
control:
- carrier: "mqtt"
foreign: false
async: true
timeout: 15000
body: "{\"id\":${LOWER_CONTROL_ID},\"deviceId\": \"${device.id?c}\",\"data\":{\"${tslProperty.name}\":${TARGET_VALUE}}}"
propertyMap:
userId: ${userId?c}
deviceName: ${device.name}
propertyName: ${tslProperty.name}
targetValue: ${TARGET_VALUE}
async: ${async?c}
callback:
payload: "success"
controlIdField: "id"
点位不同需要进行不同的定制
control:
- carrier: "mqtt"
foreign: false
async: true
propertyName: M1
timeout: 15000
body: "{\"id\":${LOWER_CONTROL_ID},\"deviceId\": \"${device.id?c}\",\"data\":{\"${tslProperty.name}\":${TARGET_VALUE}}}"
callback:
payload: "success"
controlIdField: "id"
- carrier: "mqtt"
foreign: false
async: true
propertyName: M2
timeout: 15000
## 根据定制方式进行修改传输内容
body: "{\"id\":${LOWER_CONTROL_ID},\"deviceId\": \"${device.id?c}\",\"data\":{\"${tslProperty.name}\":${TARGET_VALUE}}}"
callback:
payload: "success"
controlIdField: "id"
领旗网关
配置文件示例
control:
- carrier: "mqtt"
foreign: false
async: true
timeout: 20000
body: "{\"type\":\"write\",\"sn\":\"${attribute.sn}\",\"time\":\"${DATE?string('yyyy-MM-dd hh:mm:ss')}\",\"PublicAddr\":\"${attribute.addr}\",\"tagid\":\"${tslProperty.name}\",\"value\":\"${TARGET_VALUE}\",\"id\":${LOWER_CONTROL_ID}}"
propertyMap:
userId: ${userId?c}
deviceName: ${device.name}
propertyName: ${tslProperty.name}
targetValue: ${TARGET_VALUE}
async: ${async?c}
callback:
controlIdField: "tags.id"
payload: "success"
有${attribute.xxx}类似参数均需配置技术参数,若为父设备类固定技术参数,可实现最亲优先继承。
安科瑞网关
配置文件示例
control:
- carrier: "mqtt"
foreign: false
async: true
timeout: 15000
body: "{\"saleid\":\"10100001\", \"gateid\":\"10100001001\", \"type\":\"control\", \"cuuid\":\"${LOWER_CONTROL_ID}\", \"time\":\"${DATE?string('yyyy-MM-dd HH:mm:ss')}\", \"meterid\":\"1\", \"name\":\"${device.name}\", \"functionid\":\"${tslProperty.name}\",\"value\":${TARGET_VALUE}}"
propertyMap:
userId: ${userId?c}
deviceName: ${device.name}
propertyName: ${tslProperty.name}
targetValue: ${TARGET_VALUE}
async: ${async?c}
callback:
payload: "success"
controlIdField: "cuuid"
济南长输西线案例 http
control:
- async: true
##【carrier:描述使用的载体方式(目前支持MQTT、http方式的下发,通过carrier进行字段配置。)【必填】
carrier: "http"
## url:控制的http地址【必填】
url: "http://172.18.75.42:32081/jncsxx/control"
## method:控制的http方式(目前仅支持post、get)【必填】
method: "post"
headers:
tenantId: ${tenantId}
## body:使用post请求时需描述的参数。
body: "{\"targetValue\":\"${TARGET_VALUE}\",\"point\":\"${device.name}\",\"uuid\":\"${LOWER_CONTROL_ID}\"}"
## timeout:该点位控制的超时时间,从实际下发开始。可填占位符后端默认15s【必填】
timeout: 30000
## successStatusCodes:作为http响应成功的认定条件之状态码,发起控制时,判断信息是否成功的条件之一,满足列表项之一即可,但需与successResponseBody同时成立。
## successResponseBody:作为http响应成功的认定条件之字符包含,发起控制时,判断信息是否成功的条件之一,满足列表项之一即可,但需与successStatusCodes同时成立。
successStatusCodes:
- 200
- 204
successResponseBody:
- "命令已缓存"
callback:
## 描述回调时信息的成功字符包含条件。【异步必填】
payload: "Code=0"