使用内置脚本模拟第三方设备
http脚本
仓库地址:https://svn.liangtusoft.com:8443/demo-conf
运行仿真程序 httpServer.js
找到【设备接入-扩展IO-内置脚本模式】文件夹
使用nodejs运行设备仿真工具 testServer/httpServer.js
该测试工具内置了http文件服务器,打开测试界面 http://127.0.0.1:30001/ 测试http接口协议
通过 /get 接口可以获取到设备的当前所有实时值
使用 /set 接口设置某个参数,可以同时设置多个参数
配置监控对象树
| 名称 | 对象层级 | IO类型 |
|---|---|---|
| 测试项目 | ||
| 科技大楼 | 组织结构 | |
| 一楼 | 监控对象 | |
| 温度(当前温度) | 监控点 | |
| 湿度 | 监控点 | |
| 开关 | 监控点(布尔型) | 输入/输出 (来自硬件数据采集,支持控制输出) |
| 设定温度(空调) | 监控点 | 输入/输出 (来自硬件数据采集,支持控制输出) |
添加设备
在tds的io配置界面新增一个【自定义设备】,设置地址模式为【http服务端】,并配置为仿真设备的对外服务 ip:127.0.0.1 和端口:30001
将设备内的数据抽象为4个通道,此处根据不同的设备协议,需要自主设计不同的通道抽象方法
每个通道都需绑定监控点
添加完设备,在node脚本运行的情况下,可以看到设备上线
添加全局脚本
进入脚本管理,添加2个【设备脚本】,一个负责周期采集,一个负责控制输出
HTTP设备_周期采集脚本
// http的请求参数
const res = http.request({
hostname: 'localhost',
port: 30001, //仿真设备的服务端口
path: '/get', //获取当前所有实时数据的接口
method: 'POST'
});
console.log(JSON.stringify(res));
//http是tds脚本环境的内置对象,使用http.request函数发起http请求
//http.request是一个同步函数,无需设置回调函数,阻塞代码运行
if (res && res.body) {
// Dev 是 tds脚本内置对象,具有 setOnline,setOffline,input函数
Dev.setOnline();
const resObj = JSON.parse(res.body);
Dev.input(resObj.temp, "temp"); //第一个参数是输入值,第二个参数是通道地址
Dev.input(resObj.humi, "humi");
Dev.input(resObj.power, "power");
Dev.input(resObj.tempSet, "tempSet");
} else {
Dev.setOffline();
console.log('请求失败')
}
设备绑定自定义脚本
进入到【自定义设备】的编辑页面,设置【周期采集】和【控制输出】使用的脚本。下拉框中,可以选择在脚本管理中预先编辑好的脚本
设置控制输出命令的返回信息,第三方api一般是http请求,为了将自定义脚本的执行结果返回给tds,在tds脚本当中使用 setReturn函数,将一个错误信息对象返回给tds
当设置 ret["result"]="ok"时,tds可以获得成功信息,如图点击开关进行开关输出,弹出成功信息
关闭设备仿真程序,模拟设备不在线时,执行控制输出脚本的效果,返回的错误信息就是在脚本中设置的ret["error"] 中的信息
UDP脚本
使用nodejs运行设备仿真工具 testServer/udpServer.js,文件目录和 httpServer.js同级
监控对象复制一楼的数据后,粘贴改名为二楼
接入设备
添加设备脚本
var req = [0x01,0x01];
var resp = Dev.doTransaction(req);
if(resp!=null){
console.log(resp);
Dev.input(resp[3],String(resp[2]));
Dev.input(resp[5],String(resp[4]));
Dev.setOnline();
}
else{
Dev.setOffline();
}点击调试运行向node仿真程序发送数据

TCP 脚本
使用nodejs运行设备仿真工具 testServer/tcpServer.js,文件目录和 httpServer.js同级
添加tcp设备
var req = [0x01,0x01];
var resp = Dev.doTransaction(req);
if(resp!=null){
console.log(resp);
Dev.input(resp[3],String(resp[2]));
Dev.input(resp[5],String(resp[4]));
Dev.setOnline();
}
else{
Dev.setOffline();
}TCP设备-控制输出
//01 02 03 30
//地址 01
//命令码 02 表示输出
//通道 03
//输出值 30
var req = [01,02,03,30];
var resp = Dev.doTransaction(req);
console.log(resp)
var ret = {};
if(resp){
console.log("输出成功");
ret["result"] = "ok";
} else {
ret["error"] = "请求失败";
}
setReturn(ret);