Skip to content

使用内置脚本模拟第三方设备

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设备_周期采集脚本

javascript
// 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同级

监控对象复制一楼的数据后,粘贴改名为二楼

接入设备

添加设备脚本

javascript
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设备

TCP设备-周期采集
javascript
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设备-控制输出

javascript
//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);