• 平台功能
  • 功能介绍
    • 配置文件
    • 系统函数
    • 组态图形
    • 页面集成
    • 功能扩展
    • SSL TLS
  • 本地部署
    • 数据库备份与还原
  • 协议处理
    • WebSocket
    • 国标协议
    • JT808协议
    • MQTT协议
    • OPC网关
    • 自定义协议(my)
    • 自定义协议(di)
    • 平台主动发给终端
    • 串口功能
    • 客户端功能
  • 完整案例演示
  • 系统函数源代码
  • 简洁的Ajax代码
  • * 使用场景:
    • 1. ds后缀的文件
    • 2. 模板事件
  • * 函数调用:
  • C#常用函数
  • 字符串操作
    • $
    • ``
  • 类型转换
    • json
    • obj
    • int
    • string
    • number
    • date
    • localtime
    • local
    • timestamp
    • dateformat
    • bytes
    • bytes.change
    • byte
  • 字符串与二进制互转
    • encoding
    • utf8
    • ascii
    • utf8.bytes
    • utf8.string
    • ascii.bytes
    • ascii.string
    • string.bytes
    • bytes.string
    • bytes.base64
    • base64.bytes
    • base64
  • 数组操作
    • add
    • push
    • addrange
  • 进制转换
    • unit
    • hex.bytes
    • bin
    • bytes.hex
    • hex
    • float
    • bytes.bits
    • bits
    • bits.bin
    • bits.bytes
    • bytes.obj
    • obj
    • hex.obj
    • bytes.zhuanyi
    • zhuangyi
    • bytes.parse
    • parse
    • units.bytes
  • 校验码
    • crc
    • bcc
    • crc16
    • crc32
    • modbus.crc16
    • crc32_mpeg_2
  • 数据加解密
    • sm2.pair
    • sm2.sign
    • sm2.sign2
    • sm2.verify
    • sm2.verify2
    • sm2.encode
    • sm2.decode
  • 数据对象操作
    • object.info
    • object.delete
    • file.delete
    • group.delete
    • object.query
    • file.query
    • template.query
    • ref.query
    • file.bytes
    • object
    • file
    • template
    • template.get
    • instance
    • instance.data
    • data
    • instance.get
    • instance.set
    • set
    • set2
    • instance.delete
    • instance.query
    • instance.binding
    • symbol.tid
    • data.query
    • data.query2
    • data.insert
    • data.insert2
    • data.update
    • data.updatebyquery
    • data.delete
    • data.DeleteByQuery
    • data.DeleteAll
    • timeout
    • group.update
  • 历史查询操作
    • instance.history
    • history.query
    • history.querydeleted
    • history.restore
  • 导入导出操作
    • group.export
    • group.clone
    • file.export
    • object.import
    • group.import
  • 数据统计操作
    • mapreduce
  • 网口(tcp/udp)操作
    • client.new
    • tcp.new
    • ucp.new
    • client.exist
    • client.close
    • client.send
    • session.get
    • session.send
    • session.close
    • tcp操作完整示例
  • 串口操作
    • com.list
    • com.isopen
    • com.open
    • com.close
  • 脚本执行操作
    • script.run
    • runscript
    • test
    • runat
    • async.run
    • runds
    • timeout
  • 压缩与解压操作
    • zip
    • unzip
    • zip.add
  • Excel操作
    • excel.read
    • excel.write
  • Rest操作
    • rest.get
    • get
    • rest.post
    • post
  • 图片操作
    • compressimage
    • qr
  • 日志操作
    • log.get
    • log.set
    • log.delete
    • log.clear
  • 数据库索引操作
    • dbindex.query
    • dbindex.create
    • dbindex.drop
  • 短信与邮件操作
    • sms
    • email
  • 其他操作
    • redirect
    • go
    • id
    • token
    • cookie.set
    • cache
    • cache.set
    • cache.get
    • random
    • 时间格式化
  • 服务配置操作
    • config.get
    • config.set
    • createservice
    • removeservice
    • checkservice
  • 本地文件操作
    • localfile.read
    • localfile.write
    • shell.run
  • 插件
    • SqlServer.Query
    文档主题
    https://twuyun.com/help/doc/0/index?id=5f503ed4a5a79a5d7ccb6557
    功能
    模板管理图形管理脚本测试文档管理系统日志
    0

    系统函数

    下面的函数主要用在ds脚本中,通过平台提供的脚本测试工具可以在线运行测试脚本:
    在线运行测试脚本

    * 使用场景:

    ds脚本由服务器解析执行,可用在下面几个地方:

    1. ds后缀的文件

    只要是服务器中的ds后缀文件,加载时会执行脚本内容。

    2. 模板事件

    模板事件指实例节点在节点值变化后会执行脚本,脚本中可以使用几个特色的变量:

    1. this -- 当前节点值
    2. $$.value -- 当前节点新值
    3. $$.time -- 当前节点新值关联的时间点
    4. this.parent -- 当前节点上级节点值
    5. this.parent.send -- 同上级的节点(如send)值
    6. this.root -- 根节点值
    7. this.root._id -- 获取的是该实例的id
    8. this.root.data -- 根节点下的节点(如data)值
    9. this.$old -- 节点的变化前的旧值
    10. this.$path -- 节点全路径(如:/admin/test2/222.code)
    11. this.$id -- 节点全id(如:/63dbc6a5a5a79a124cc750e5.code)
    12. this.$name -- 节点名称(如:code)

    * 函数调用:

    C#常用函数

    支持C#包含的常用函数:查看所有C#支持函数
    也可以通过下面这个函数获取到所有支持的操作函数:

    1. functions()

    字符串操作

    $

    字符串替换函数

    1. $("aa{0}{1}",参数1,参数2)

    ``

    字符串表达式

    1. a=1;
    2. b=2;
    3. return `我是变量 ${a+b}`

    类型转换

    json

    将一个对象转成json字符串

    obj

    将一个json字符串转成对象

    • 如果参数为二进制,则跟bytes.obj功能一样

    int

    将一个对象转成整数

    string

    将一个对象转成字符串

    number

    将一个对象转成数值,包含小数

    date

    将一个字符串转成时间,可以有多种参数:

    1. date("2022-11-11 11:11:11",false)//可以有两个参数,第二个参数为true,表示本地,false表示UTC时间,默认为false, 也就是UTC时间
    2. date(2022,11,11,11,11,11,false)//大于2个参数的时候,就是年月日时分秒,以及是否本地时间,同上

    localtime

    local

    将一个UTC时间转成服务器上的本地时间

    1. local(now())

    timestamp

    将一个UTC时间转成时间戳

    1. timestamp(now())

    dateformat

    将一个日期时间格式化为字符串

    1. dateformat(now(),"yyyyMMdd HH:mm:ss")
    2. //这个等同于tostring:
    3. now().tostring("yyyyMMdd HH:mm:ss")

    bytes

    将一个对象转成字节数组

    如果是字符串,有2种字节表现:

    1. //base64
    2. bytes("11111",true)
    3. //ascii
    4. bytes("11111",false)

    bytes.change

    将一个字节数组重新排列,一般用于改变高低位

    1. //第二个参数是重组的索引数组
    2. bytes.change([1,2,3,4],[2,3,0,1])
    3. 结果:[3,4,1,2]

    byte

    将一个对象转成字节

    字符串与二进制互转

    encoding

    任意编码的二进制转换

    1. encoding("gb2312").getstring(bin("C4E3BAC3"))
    2. encoding("utf-8").getbytes("test");

    utf8

    自动判断变量,如果字符串就转成二进制,否则字符串

    1. utf8(二进制)
    2. utf8("11111111111")

    ascii

    自动判断变量,如果字符串就转成二进制,否则字符串

    1. ascii(二进制)
    2. ascii("11111111111")

    utf8.bytes

    1. utf8.bytes("11111111111")

    utf8.string

    1. utf8.string(二进制)

    ascii.bytes

    1. ascii.bytes("11111111111")

    ascii.string

    1. ascii.string(二进制)

    string.bytes

    1. string.bytes("11111111111","UTF-8")

    bytes.string

    1. bytes.string(二进制,"UTF-8")

    bytes.base64

    1. string.base64(二进制)
    2. 结果为base64字符串

    base64.bytes

    1. base64.bytes(base64字符串)
    2. 结果为二进制

    base64

    自动判断变量,如果字符串就转成二进制,否则字符串

    1. base64(二进制)
    2. base64("11111111111")

    数组操作

    add

    push

    在一个数组中增加元素,如果参数是字节数组增加字节数组,则会自动跟addrange一致

    1. var a=[];
    2. a.add(1);
    3. a.add([2,3],true)//第二个参数代表将参数的数组分开加入,所以结果为:[1,2,3]
    4. //下面是特殊的字节数组
    5. var a=bytes([1,2,3,4]);
    6. a=a.add(bytes([5,6]));
    7. return a; // 结果为字节数组 [1,2,3,4,5,6]

    addrange

    在一个数组中批量增加元素

    1. var a=[];
    2. a.add(1);
    3. a.addrange([2,3])//结果为:[1,2,3]

    进制转换

    unit

    定义一个构成协议的单元内容

    1. unit(name, type, length, value,forlength)
    2. var units = [
    3. unit("数据采集时间", "DATE2", 6),
    4. unit("芯片 ID", "STRING", 16),
    5. unit("公钥", "BYTE[]", 64),
    6. unit("VIN", "STRING", 17),
    7. unit("签名信息", "BYTE[]", -1)
    8. ];

    参数说明

    参数序号 类型 说明
    1 字符串 单元描述,无实际意义
    2 字符串 类型定义
    3 int 长度(字节)可以定义为一个函数名,在前面参数解析好的情况下获取到自己的长度; -1 表示此长度为剩下未解析的所有内容; -2 表示获取前一个解析的数据作为长度; 0 如果有函数就调用函数获取,没有就获取前一个数据作为长度
    4 byte[] 初始值
    5 bool 表示定义后面一个字段的长度为此数据值

    类型定义参考

    类型名 字节数 说明
    BIT 1位 位
    ASCII n ASCII字符串
    UTF8 n UTF8字符串
    GBK n GBK字符串
    STRING n GBK字符串
    WORD 2 2字节数字
    DWORD 4 4字节数字
    DECIMAL 8 8字节数字
    BCD 6 BCD时间
    DATE 6 时间
    DATE2 6 时间
    BYTE 1 1字节
    BYTE[] n n字节
    FLOAT 4 4字节小数

    hex.bytes

    bin

    16进制转二进制,如果参数多于一个,表示要将数据转成二进制,参考下面例子:

    1. bin(要转换的数据,"WORD",字节数, 缺省字节(不够的时候补这个字节),true:小端,false:大端)
    2. bin(100,"WORD",3,0,true); //结果: 0x006400

    参数说明
    第二个参数参考上面类型定义

    bytes.hex

    hex

    二进制转16进制

    float

    二进制转float

    bytes.bits

    bits

    二进制转位

    1. //下面可以将二进制数据或字节转为1010类似的字符串
    2. bits(二进制数据);
    3. bits(字节);

    bits.bin

    bits.bytes

    位转二进制

    1. //下面可以将1010类似的字符串转成二进制
    2. bits.bin("11111111");//结果:0xFF

    bytes.obj

    obj

    二进制转数据

    1. //下面可以将二进制数据转为数字
    2. bytes.obj(二进制数据, "WORD",缺省字节(不够的时候补这个字节),true:小端,false:大端);
    3. bytes.obj(二进制数据, "WORD",0,false);

    第二个参数就是数据类型:
    类型定义参考

    类型名 字节数 说明
    BIT 1位 位
    ASCII n ASCII字符串
    UTF8 n UTF8字符串
    GBK n GBK字符串
    STRING n GBK字符串
    WORD 2 2字节数字
    DWORD 4 4字节数字
    DECIMAL 8 8字节数字
    BCD 6 BCD时间
    DATE 6 时间
    DATE2 6 时间
    BYTE 1 1字节
    BYTE[] n n字节
    FLOAT 4 4字节小数

    hex.obj

    16进制转数据,原理与bytes.obj一致

    1. //下面可以将16进制数据转为数字
    2. hex.obj(0xaabb, "WORD");

    bytes.zhuanyi

    zhuangyi

    如果协议包含转义的字符,在数据接收后或发送前都需要转义

    1. 转义定义=
    2. {
    3. "7D2E":"7E",//都用16进制表示
    4. "7D01":"7D"
    5. }
    6. bytes.zhuanyi1(待转义的二进制数据,转义定义)

    bytes.parse

    parse

    二进制解析

    1. bytes.parse(bytes, units);
    2. 例子: 其中bytes是二进制数据
    3. var body = bytes.parse(bytes,
    4. [
    5. unit("状态码", "BYTE", 1),
    6. unit("信息", "BYTE", 1),
    7. ]);

    units.bytes

    单元定义加数据转二进制

    1. units.bytes(units, data);
    2. 例子
    3. var body = units.bytes([
    4. unit("状态码", "BYTE", 1),
    5. unit("信息", "BYTE", 1),
    6. ], [0x02, 0x01]);

    校验码

    crc

    bcc

    BCC(异或校验)法

    crc16

    crc32

    循环冗余检验

    modbus.crc16

    适用于modbus的循环冗余检验

    crc32_mpeg_2

    适用于crc32_mpeg_2算法

    数据加解密

    sm2.pair

    sm2密匙对生成

    1. sm2.pair()

    sm2.sign

    sm2签名,返回完整的签名字节串

    1. sm2.sign(byte[] msgBytes, byte[] privatekey, string ident = "1234567812345678")

    sm2.sign2

    sm2签名,返回签名的R和S部分,结构为:

    1. {"r":r部分字节串,"s":s部分字节串}

    例子

    1. var result=sm2.sign2(byte[] msgBytes, byte[] privatekey, string ident = "1234567812345678")
    2. var r=result.r;
    3. var s=result.s;

    sm2.verify

    sm2校验,该方法需要用签名的R和S组成一个结构性的字节串校验

    1. sm2.verify(byte[] msgBytes, byte[] publickey, byte[] sig, string ident = "1234567812345678")

    说明:sign 按下面结构

    1. [
    2. unit("签名R值长度", "BYTE", 1),
    3. unit("签名R值", "BYTE[]", getlength),
    4. unit("签名S值长度", "BYTE", 1),
    5. unit("签名S值", "BYTE[]", getlength),
    6. ];
    7. function getlength(bytes) {
    8. return bytes.substr(bytes.length - 1,1);
    9. }

    sm2.verify2

    sm2校验,该方法用签名的R和S部分校验

    1. sm2.verify2(byte[] msgBytes, byte[] publickey, byte[] rb, byte[] sb, string ident = "1234567812345678")

    签名校验完整例子:

    1. var kp={
    2. "private": "5d4d7960fa613c20eb31c5a0ec32263c4f37a6574c4bbef81330f09e5edeccf3",
    3. "public": "4fc58ec228b9605b7fcd4ecfbae4441fd74be9b2b116843b2b1eb2d71d0febf4074d0969f9f4d5b4f7eac13de8b22e9623a330725746a4d853a46f1ace428d3f"
    4. }
    5. var result=sm2.sign(utf8.bytes("11111111111111"),hex.bytes(kp.private))
    6. sm2.verify2(utf8.bytes("11111111111111"), hex.bytes(kp.public), result.substr(0,32),result.substr(32,32))

    sm2.encode

    sm2加密

    1. sm2.encode(byte[] 待加密消息,byte[] 秘钥, bool isprivate, int style)

    说明:isprivate—>默认是公钥加密,如果要用私钥加密,该参数指定为true

    参数 类型 说明
    待加密消息 byte[] 待加密消息
    秘钥 byte[] 加密密匙,一般是公钥
    isprivate bool 如果想用私钥加密,这个参数可以为true
    style int 两种输出模式:0->C1C2C3 1->C1C3C2

    sm2.decode

    sm2解密

    1. sm2.decode(byte[] 待解密消息,byte[] 秘钥, bool isprivate,int style)

    说明:isprivate—>默认是公钥加密,如果要用私钥解密,该参数指定为true

    参数 类型 说明
    待解密消息 byte[] 待解密消息
    秘钥 byte[] 加密密匙,一般是私钥
    isprivate bool 默认是私钥,为true,如果要用公钥,该参数需要设为false
    style int 两种输出模式:0->C1C2C3 1->C1C3C2

    数据对象操作

    平台包含数据对象主要包含文件、模板和实例

    • 文件
      1. 展示用的html/js/css
      2. 可以在服务端运行的ds脚本
      3. 其他任何web文件,如图形,zip文件,视频等
    • 模板
      1. 模板是指构成一个数据类的所有节点的定义。
      2. 模板包含数据节点的位置关系和逻辑关系。
      3. 基于模板可以产生多个具体的数据实体(实例)。
    • 实例

      1. 实例是基于模板产生的真正数据实体,可以代表真实的数据节点内容。
      2. 实例的更新主要是针对数据节点的更新。
    • 对象名称说明
      主要是this使用

    1. /this/test --- this代表用户名称,自动指向用户下的文件、模板、实例

    object.info

    文件/模板/实例的基本信息

    示例

    1. object.info(对象id或路径,"file");

    调用结果

    1. {
    2. "path": "help/1111",
    3. "id": "5f56dd9aa5a79a6b78f8f5b2",
    4. "name": "1111",
    5. "desc": "",
    6. "share": null,
    7. "type":".html",
    8. "uid": "5f503e83a5a79a5d7ccb6549",
    9. "created": "2020-09-08T01:25:46.237Z",
    10. "updated": "2020-09-13T14:16:54.674Z"
    11. }

    参数说明

    参数序号 类型 说明
    1 字符串 对象id或路径
    2 字符串 类型:File/Template/Instance

    object.delete

    文件/模板/实例的删除(文件夹与文件)

    1. //如果删除的是文件夹,需要调用string.encode(文件夹路径),传入对象id
    2. object.delete(类型(File/Template/Instance), 对象的id);

    file.delete

    文件/模板/实例的删除

    1. file.delete(文件的id ? file/template/instance);

    group.delete

    文件/模板/实例的文件夹的删除

    1. group.delete(文件夹的路径 ? file/template/instance);

    object.query

    文件/模板/实例的结构查询(文件夹与文件)

    示例
    参考1:
    直接传入参数

    1. object.query("File","/admin/文件夹1","_name like 'a'",{"_created":-1},false);

    参考2:
    将参数放入一个字典里

    1. object.query(
    2. "File",//对象类型:File|Template|Instance
    3. {
    4. "group":"",//文件夹:如 /admin/a/b/c
    5. "query":"",//过滤
    6. "sortby":"",//排序
    7. "nofolder":"",//true将取全部文件
    8. "relative":"",//true将用this命名
    9. "team":""//团队
    10. }
    11. );

    调用结果

    1. {
    2. "files": [
    3. {
    4. "type": "folder",
    5. "path": "help/doc",
    6. "id": "_aGVscC9kb2M",
    7. "name": "doc"
    8. },
    9. {
    10. "type": "file",
    11. "id": "5f56dd9aa5a79a6b78f8f5b2",
    12. "path": "help/1111",
    13. "name": "1111",
    14. "desc": "",
    15. "tid": null,
    16. "size": 5,
    17. "created": "2020-09-08T01:25:46.237Z",
    18. "modified": "2020-09-08T01:25:46.237Z",
    19. "share": null
    20. }
    21. ],
    22. "path": [
    23. {
    24. "id": "_aGVscA",
    25. "name": "help",
    26. "index": 0
    27. }
    28. ]
    29. }

    参数说明

    参数序号 类型 说明
    1 字符串 类型:File/Template/Instance
    2 字符串 文件夹:如 /admin/a/b/c
    3 字符串 过滤: 可以用 _name ,_created , _modified 等过滤
    4 json 排序
    5 布尔 是否用无文件夹模式

    补充说明
    无文件模式表示查询指定文件夹所有文件(包含子文件夹中的文件)

    file.query

    与object.query相同,只是第一个参数不需要了

    template.query

    与object.query相同,只是第一个参数不需要了

    ref.query

    如果模板直接引用了模板,这个api可以查询被引用的模板相关的模板列表

    file.bytes

    获取文件的二进制内容

    1. file.bytes(文件id或路径)

    object

    文档/模板/实例的获取与更新
    该函数的一个参数是类型(file/template/instance),其他参数及含义与file/template/instance 函数一致。

    file

    文档/模板/实例的获取与更新

    示例

    1. //方法1:
    2. file("名称?类型",值,描述,是否解压,是否忽略存在,是否新增,是否增加min文件,指定id,团队,更新说明);
    3. //方法2
    4. var data = {
    5. "name": "",
    6. "value": "",
    7. "desc": "",
    8. "ispkg": false,
    9. "ignoreexist": false,
    10. "isnew": false,
    11. "min": false,
    12. "id": "",
    13. "team": "",
    14. "tag": "",
    15. }
    16. file(data);

    调用结果

    1. 只有一个参数(获取数据)的结果:
    2. {
    3. "err": "",
    4. "name": "this/setting.json",
    5. "value": "111111111",
    6. "property": {
    7. "_name": "help/setting.json",
    8. "_desc": "created by system",
    9. "_size": 274,
    10. "_id": "5f503e84a5a79a5d7ccb654b"
    11. }
    12. }
    13. 至少2个参数(更新数据)的结果:
    14. {
    15. "err": "",
    16. "name": "this/1111",
    17. "id": "5f56dd9aa5a79a6b78f8f5b2",
    18. "path": "help/1111",
    19. "type": "file",
    20. "filename": "help/1111"
    21. }

    参数说明

    第一个参数后面可以增加:|新的路径名称
    表示需要更新文件路径名。

    参数序号 类型 说明
    1 字符串 名称?类型 — 类型:File/Template/Instance
    2 字符串 值 — 如果不指定值以及后面的参数,表示只获取数据,指定后表示更新值
    3 字符串 描述
    4 布尔 是否解压
    5 布尔 是否忽略存在
    6 布尔 是否新增
    7 布尔 是否增加min文件
    8 字符串 指定id

    补充说明

    • 名称可以使用id或路径,但是注意相对性,比如
    1. /admin/msg ———以/开头的所有名称都直接代表此路径,包含/id 也可以。
    2. msg/a ———-不是以/开头,将用当前页面的路径加上此名称代表全路径。

    template

    与File函数一致,只是类型默认为Template

    template.get

    获取模板的结构

    示例

    1. template.get("/this/test")

    调用结果

    1. {
    2. "a": {
    3. "_type": "String"
    4. },
    5. "b": {
    6. "_type": "String"
    7. }
    8. }

    instance

    获取或者更新实例

    示例

    1. instance("/this/msg");//实例获取
    2. instance("/this/msg.message","my message");//实例更新

    调用结果

    1. 只有一个参数(获取数据)的结果(实例的结构及数据):
    2. {
    3. "message": {
    4. "_id": "/5f503e83a5a79a5d7ccb654a.message",
    5. "_name": "/help/msg.message",
    6. "_desc": "22222222",
    7. "_type": "String",
    8. "_array": false,
    9. "_value": "1111111111",
    10. "_time": "2020-09-03T00:53:24.034Z",
    11. "_from": "",
    12. "_to": [
    13. "*"
    14. ]
    15. }
    16. }
    17. 2个参数(更新数据)的结果:
    18. 如果更新成功,返回空的字符串,如果更新失败,返回错误描述。

    参数说明

    参数序号 类型 说明
    1 字符串 实例路径 — /this/a/b.c
    2 字符串 值 — 如果不指定值以及后面的参数,表示只获取数据,指定后表示更新值

    instance.data

    data

    获取实例数据

    示例

    1. 用法1:
    2. instance.data("60c1bed19f4a38a4502e1b16");//按模板结构组织
    3. 结果:
    4. {
    5. "温度": {
    6. "最大值": 0
    7. },
    8. "湿度": 0
    9. }
    10. 用法2:
    11. instance.data("60c1bed19f4a38a4502e1b16","_id");//按含id的键值对组织
    12. 结果:
    13. {
    14. "/60c1bed19f4a38a4502e1b16.温度": 55,
    15. "/60c1bed19f4a38a4502e1b16.温度.最大值": 0,
    16. "/60c1bed19f4a38a4502e1b16.湿度": 0
    17. }
    18. 用法3:
    19. instance.data("60c1bed19f4a38a4502e1b16","_name");//按含name的键值对组织
    20. 结果:
    21. {
    22. "/admin/电机2.温度": 55,
    23. "/admin/电机2.温度.最大值": 0,
    24. "/admin/电机2.湿度": 0
    25. }

    instance.get

    获取实例节点数据,包含数据,时间等

    示例

    1. instance.get("/admin/test/a.b");

    调用结果

    1. {
    2. "id": "/643f9592a5a79a129c7ec81f.b",
    3. "value": "11111111111",
    4. "time": "2023-04-19T08:00:24.089Z",
    5. "from": "admin"
    6. }

    instance.set

    set

    set2

    直接新增或设置实例的各个节点值
    set2 — 设置值后只有当值改变才向订阅的客户端发送数据,不变就不发,使用于轮询获取数据的场景

    示例

    1. //如果实例已经存在,第一个参数可以不用
    2. instance.set("/admin/template", "/admin/test/a", {
    3. "终端手机号": sim,
    4. "省域": data[5][0],
    5. "市县域": data[5][1],
    6. "制造商": data[5][2],
    7. "终端型号": data[5][3],
    8. "终端ID": data[5][4],
    9. "车牌颜色": data[5][5],
    10. "车辆标识": data[5][6],
    11. "鉴权码": jqm
    12. });

    调用结果

    1. 如果更新成功,返回true,如果更新失败,返回错误描述。

    参数说明

    参数序号 类型 说明
    1 字符串 模板路径或id — 如果实例已经存在,这个参数可以省略
    2 字符串 实例路径
    3 字符串 待更新的各子节点值
    4 int 一个标识(0-表示有就更新,没有就新增;1-表示新增;2-表示更新;)

    instance.delete

    删除实例

    示例

    1. instance.delete(实例id 或者 实例路径);

    调用结果

    1. 如果更新成功,返回正常,如果更新失败,返回异常。

    参数说明

    参数序号 类型 说明
    1 字符串 实例路径或id

    instance.query

    查询某个模板下产生的实例

    示例

    1. instance.query("/admin/client", "终端手机号 like '6222'", 0, 0, {"排序字段":-1}, ["终端手机号","制造商"]);

    调用结果

    1. {
    2. "rows": [
    3. {
    4. "_id": "5e93ccc318f1420f40b17c38",
    5. "_value": {
    6. "终端手机号": "157042976222",
    7. "制造商": "CATS"
    8. }
    9. },
    10. {
    11. "_id": "5f3a897d18f142120865f620",
    12. "_value": {
    13. "终端手机号": "857030406222",
    14. "制造商": "WUST"
    15. }
    16. },
    17. {
    18. "_id": "5ebcc68418f14230eca942f1",
    19. "_value": {
    20. "终端手机号": "717039562229",
    21. "制造商": ""
    22. }
    23. }
    24. ],
    25. "count": 3
    26. }

    参数说明

    参数序号 类型 说明
    1 字符串 模板路径或id
    2 字符串 查询过滤条件
    3 整数 分页的当前页
    4 整数 分页的每页条数
    5 json 排序
    5 array 显示字段

    补充说明

    1. 字段指模板中定义的节点名加上几个特殊的系统字段:

      • $_value —表示获取所有字段内容
      • $_created —表示记录产生时间
      • $_modified —表示记录修改时间
      • $_id 表示记录的id
      • $_name 表示记录名称路径
      • $_desc 表示记录说明
    2. 查询过滤条件格式:字段1 比较符 值 and/or/&&/|| 字段2 比较符 值

    比较符 说明
    = 等于
    == 同=
    != 不等于
    <> 同!=
    like 包含
    • like还可以配合正则式使用:如 like ‘/9654$/‘ 表示匹配9654结尾的记录
    • 如果是比较时间,需要使用date函数:如 a=date(“2019/12/12 11:11:11”)

    instance.binding

    将一个实例的值实时更新到另一个实例上去
    示例

    1. instance.binding("/实例A.status", "/实例B.status");// /实例A.status的值会实时同步到 /实例B.status
    2. //也可以用变量,如下面语句可以在模板的节点事件上写入,这样这个模板生成的实例都有了同步功能:
    3. instance.binding("/" + this + ".status", parent(this) + ".status");

    symbol.tid

    获取图形中使用的模板id

    1. symbol.tid(图形id)

    data.query

    data.query2

    查询某个模板下产生的数据,跟实例不同,这个数据仅用于存储,比如历史数据等。
    使用方法跟instance.query完全一致。

    data.query2 用于当数据量太大时没有建索引时数据库排序会报错,这个函数可以worker服务器上排序,避免在无索引时查询问题。

    示例

    1. data.query("/admin/client", "终端手机号 like '6222'", 0, 0, {"排序字段":-1}, ["终端手机号","制造商"]);

    调用结果

    1. {
    2. "rows": [
    3. {
    4. "_id": "5e93ccc318f1420f40b17c38",
    5. "_value": {
    6. "终端手机号": "157042976222",
    7. "制造商": "CATS"
    8. }
    9. },
    10. {
    11. "_id": "5f3a897d18f142120865f620",
    12. "_value": {
    13. "终端手机号": "857030406222",
    14. "制造商": "WUST"
    15. }
    16. },
    17. {
    18. "_id": "5ebcc68418f14230eca942f1",
    19. "_value": {
    20. "终端手机号": "717039562229",
    21. "制造商": ""
    22. }
    23. }
    24. ],
    25. "count": 3
    26. }

    参数说明

    参数序号 类型 说明
    1 字符串 模板路径或id
    2 字符串 查询过滤条件
    3 整数 分页的当前页
    4 整数 分页的每页条数
    5 json 排序
    6 array 显示字段

    补充说明

    1. 字段指模板中定义的节点名加上几个特殊的系统字段:

      • $_value —表示获取所有字段内容
      • $_created —表示记录产生时间
      • $_modified —表示记录修改时间
      • $_id 表示记录的id
      • $_name 表示记录名称路径
      • $_desc 表示记录说明
    2. 查询过滤条件格式:字段1 比较符 值 and/or/&&/|| 字段2 比较符 值

    比较符 说明
    = 等于
    == 同=
    != 不等于
    <> 同!=
    like 包含
    • like还可以配合正则式使用:如 like ‘/9654$/‘ 表示匹配9654结尾的记录
    • 如果是比较时间,需要使用date函数:如 a=date(“2019/12/12 11:11:11”)

    data.insert

    在某个模板下插入一条数据。

    示例

    1. var body={};
    2. body.报文 = bytes;
    3. body.原始值 = 原始值;
    4. body.超标详情 = json({
    5. "限行区": 限行区,
    6. "限值": 限值,
    7. "超标时长": 超标时长
    8. });
    9. data.insert("/admin/a/template", body);

    调用结果

    1. 成功后返回true

    参数说明

    参数序号 类型 说明
    1 字符串 模板路径或id
    2 json 字段的值

    data.insert2

    在某个模板下插入一条数据。(异步插入,就是调用后会立即返回,如果失败会记录到日志中)

    data.update

    在某个模板下更新一条数据。

    示例

    1. var body={};
    2. body.报文 = bytes;
    3. body.原始值 = 原始值;
    4. body.超标详情 = json({
    5. "限行区": 限行区,
    6. "限值": 限值,
    7. "超标时长": 超标时长
    8. });
    9. data.update("/admin/a/template", body,dataid);

    调用结果

    1. 成功后返回true

    参数说明

    参数序号 类型 说明
    1 字符串 模板路径或id
    2 json 字段的值
    3 字符串 记录id

    data.updatebyquery

    在某个模板下更新查询到的数据。

    示例

    1. var body={};
    2. body.报文 = bytes;
    3. body.原始值 = 原始值;
    4. data.updatebyquery("/admin/a/template"," id='1' || id='2' ", body);

    调用结果

    1. 成功后返回true

    参数说明

    参数序号 类型 说明
    1 字符串 模板路径或id
    2 字符串 数据过滤条件
    3 json 更新的字段和值的字典

    data.delete

    在某个模板下删除一条数据。

    示例

    1. data.delete("/admin/a/template", 数据的id);

    调用结果

    1. 成功后返回true

    data.DeleteByQuery

    删除某个模板下指定查询内数据。

    示例

    1. data.DeleteByQuery("/admin/a/template","_id='111111111'");

    调用结果

    1. 成功后返回true

    data.DeleteAll

    删除某个模板下所有数据。注意,调用后数据将会清空并无法恢复。

    示例

    1. data.deleteall("/admin/a/template");

    调用结果

    1. 成功后返回true

    timeout

    默认情况下,调用所有api允许的时间不能超过5分钟,这个函数可以自定义一个超时时间(毫秒)
    示例

    1. timeout(90000 * 5);

    参数说明

    参数序号 类型 说明
    1 int 超时毫秒

    group.update

    更新一个目录的名称

    示例

    1. group.update("/admin/abc?file","/admin/newname");

    参数说明

    参数序号 类型 说明
    1 string 旧文件全路径名称?类型(file/template/instance)
    2 string 新的文件全路径名称

    历史查询操作

    instance.history

    查询实例的更新历史。

    1. if (start && end) {
    2. query = $("time>date('{0}') && time<date('{1}')", start, end);
    3. } else if (start) {
    4. query = $("time>date('{0}')", start);
    5. } else if (end) {
    6. query = $("time<date('{0}')", end);
    7. } else {
    8. throw ("必须指定查询时间段");
    9. }
    10. var datas = instance.history(instance, query, 0, 0);
    11. return datas;

    结果:

    1. {
    2. "rows": [
    3. {
    4. "time": "2021-06-17T01:51:02.835Z",
    5. "value": 13
    6. },
    7. {
    8. "time": "2021-06-17T01:51:06.434Z",
    9. "value": 14
    10. },
    11. {
    12. "time": "2021-06-17T02:01:49.074Z",
    13. "value": 12
    14. },
    15. {
    16. "time": "2021-06-17T02:19:24.744Z",
    17. "value": 121
    18. },
    19. {
    20. "time": "2021-06-17T03:20:56.826Z",
    21. "value": 221
    22. },
    23. {
    24. "time": "2021-06-17T03:21:28.708Z",
    25. "value": 321
    26. },
    27. {
    28. "time": "2021-06-17T03:25:26.221Z",
    29. "value": 111
    30. }
    31. ],
    32. "count": 7
    33. }

    history.query

    查询对象的更新历史(新增,更新)

    1. var h = history.query(name, page, pagesize);
    2. v.data = h.rows;
    3. v.count = h.count;

    结果:

    1. {
    2. "rows": [
    3. {
    4. "_id": "6033b2d09f4a384dc425d43d",
    5. "flag": "update",
    6. "time": "2021-02-22T13:34:08.870Z",
    7. "muser": "admin",
    8. "desc": "系统消息模板",
    9. "tag": "",
    10. "name": "admin/msg",
    11. "size": 173
    12. },
    13. {
    14. "_id": "5f5c22f5a5a79a6fa052ed99",
    15. "flag": "update",
    16. "time": "2020-09-12T01:23:01.503Z",
    17. "muser": "admin",
    18. "name": "admin/msg",
    19. "size": 153
    20. },
    21. {
    22. "_id": "5e8d759ba5a79a08fcddceed",
    23. "flag": "update",
    24. "time": "2020-04-08T06:56:27.409Z",
    25. "muser": "admin",
    26. "desc": "",
    27. "name": "admin/msg",
    28. "size": 155
    29. },
    30. {
    31. "_id": "5e664cd3a5a79a0bf80ac6d2",
    32. "flag": "update",
    33. "time": "2020-03-09T14:04:03.565Z",
    34. "muser": "admin",
    35. "desc": "",
    36. "name": "admin/msg",
    37. "size": 155
    38. }
    39. ],
    40. "count": 4,
    41. "type": "t"
    42. }

    history.querydeleted

    查询对象的删除历史(删除操作),可用于删除文件的查看

    1. var h = history.querydeleted(name, page, pagesize);
    2. //name: 用于删除的文件名的模糊匹配

    history.restore

    删除文件的打包下载,可以用于删除文件的恢复

    1. var bytes = history.restore(name, page, pagesize);
    2. //name: 用于删除的文件名的模糊匹配
    3. //返回结果是打包的二进制文件数据,注意用zip后缀可以下载到本地

    导入导出操作

    导入操作主要是利用zip包的文件操作实现。

    group.export

    group.clone

    将一个目录下的文件导出到zip包里
    包里也可以加入模板和实例,用下面的格式:

    • 任意命名.$template$.zip
    • 任意命名.$instance$.zip
      内容就是导出的压缩内容

    示例

    1. //导出
    2. group.export("/admin/abc", "file", "abc.zip",团队id,带上源id,导出的目录,过滤字符串);
    3. //克隆--相当导出时带上源id,保持id一致
    4. group.clone("/admin/abc", "file", "abc.zip");
    5. 说明:
    6. 1. 第3个参数可以是文件或文件夹数组,批量导出/克隆
    7. 2. 第一个参数也可以直接是文件或文件夹数组,批量导出/克隆
    8. 例子:
    9. //导出文件
    10. bytes = group.clone(
    11. [
    12. "/admin/log/",
    13. "/admin/api/",
    14. ]);
    15. //导出模板
    16. templates = group.clone([
    17. "/admin/系统模板/",
    18. ], "template");
    19. //将模板加入文件一起
    20. return zip.add(bytes, {
    21. "a.$template$.zip": templates
    22. });

    调用结果

    1. 自动下载

    参数说明

    参数序号 类型 说明
    1 字符串 文件目录路径
    2 字符串 类型(file/template/instance)
    3 字符串 导出的zip名称
    4 字符串 团队id
    5 字符串 带上源id:true/false — true会将文件保留源文件的id,这样文件相互引用的时候不会有问题
    6 字符串 可以导出到不同的目录下,这里指定那个目录,默认是源目录

    补充说明

    无

    file.export

    将一个文件导出到zip包里

    示例

    1. file.export("/admin/abc.html", "file");

    调用结果

    1. 自动下载

    参数说明

    参数序号 类型 说明
    1 字符串 文件路径
    2 字符串 类型(file/template/instance)

    补充说明

    无

    object.import

    group.import

    将一个zip包里内容导入到平台

    示例

    1. object.import({
    2. "group":"文件夹",
    3. "type":"file/template/instance",
    4. "value":zip,
    5. "team":"",
    6. "isnew":false
    7. })
    8. 或者:
    9. object.import("文件夹", "file/template/instance",zip,team,isnew);

    数据统计操作

    mapreduce

    基于Mongodb数据库的MapReduce,进行数据库数据的分组统计等。可以参考 https://www.runoob.com/mongodb/mongodb-map-reduce.html

    示例

    1. var map = function () {
    2. //this._value.字段1 是数据库表中的分组字段
    3. emit(this._value.字段1, 1);
    4. }
    5. var reduce = function (key, values) {
    6. //values 是分组聚合后的第二个字段集合
    7. return values.length;
    8. }
    9. var finalize = function (key, values) {
    10. //最后处理下
    11. return values;
    12. }
    13. var option={
    14. out: "输出的别名",
    15. sort: {"_value.字段2",-1},
    16. limit: 100
    17. }
    18. //平台中的模板下的数据表格式:Data_模板id
    19. //先获取模板的id
    20. var info=template.info("/admin/ship/安全预警");
    21. //表名
    22. var tablename="Data_" + info.id;
    23. //return mapreduce(表名, 查询过滤字符串, map, reduce, finalize, 选项)
    24. return mapreduce(tablename, query, map, reduce, finalize, option)

    网口(tcp/udp)操作

    client.new

    tcp.new

    ucp.new

    新建一个tcp或udp连接,开始接收数据

    示例

    1. //client.new(地址,单元定义[可为空],接收处理程序,状态处理程序,超时秒断开,保留处理消息数量)
    2. var address = "tcp://117.73.254.2:10828";
    3. //如果是udp:
    4. //var address = "udp://117.73.254.2:10828";
    5. client.new(address, units, function (data, time, tag) {
    6. //接收到的数据,时间,自定义标识字典
    7. return 0;//0:已处理;-1:不处理;大于0:已处理多少字节,其他自动接到后面处理
    8. }, function (data) {
    9. //
    10. this.parent.状态 = data;
    11. if (data) {
    12. this.parent.描述 = "连接成功";
    13. }
    14. else {
    15. this.parent.描述 = "连接断开";
    16. }
    17. });

    client.exist

    检查一个连接是否存在,避免重复连接

    示例

    1. var address = "tcp://117.73.254.2:10828";
    2. //如果是udp:
    3. //var address = "udp://117.73.254.2:10828";
    4. client.exist(address);

    client.close

    关闭一个连接

    示例

    1. var address = "tcp://117.73.254.2:10828";
    2. //如果是udp:
    3. //var address = "udp://117.73.254.2:10828";
    4. client.close(address);

    client.send

    针对一个连接,发送数据

    示例

    1. var address = "tcp://117.73.254.2:10828";
    2. //如果是udp:
    3. //var address = "udp://117.73.254.2:10828";
    4. client.send(address,二进制数据);

    session.get

    服务端操作,获取一个连接

    示例

    1. //获取所有连接
    2. var session = session.get("di_test")[0];
    3. //获取指定clientid的连接
    4. var session = session.get("di_test", clientid)[0];

    session.send

    服务端操作,发送数据给一个连接的客户端

    示例

    1. //获取指定clientid的连接
    2. var session = session.get("di_test", clientid)[0];
    3. //发送数据给这个连接的客户端
    4. session.send(session,bytes)
    5. //也可以三个参数直接发送
    6. session.send("di_test",clientid,bytes)

    session.close

    服务端操作,关闭一个连接的客户端

    示例

    1. //获取指定clientid的连接
    2. var session = session.get("di_test", clientid)[0];
    3. //发送数据给这个连接的客户端
    4. session.close(session)

    tcp操作完整示例

    示例

    1. var address = "tcp://117.73.254.2:10828";
    2. //如果是udp:
    3. //var address = "udp://117.73.254.2:10828";
    4. //定义解析单元
    5. var units = [
    6. //FE FE 00 04 04 00 13 00 18 07 77 07 87 3F B8 03 81 26 FD 00 40 00 00 00 09 00 00 00 06 00 1E 00 59 FE FE
    7. unit("起始", "BYTE[]", 2, [0xfe, 0xfe]),
    8. unit("地址", "BYTE[]", 2), //00 04
    9. unit("功能", "BYTE", 1), //04
    10. unit("寄存器位置", "BYTE[]", 2), //0013
    11. unit("数据长度", "WORD", 2), //00 11
    12. unit("数据", "BYTE[]", getlength), //
    13. unit("校验码", "BYTE[]", 2),
    14. ]
    15. //解析到该单元时需要根据下面函数决定该单元长度
    16. function getlength(bytes) {
    17. //bytes.substr函数表示截取字节,从第几个开始截取多少个字节
    18. var data = bytes.substr(bytes.length - 2, 2);
    19. //bytes.obj函数表示把字节变成一个数字
    20. return bytes.obj(data, "WORD");
    21. };
    22. //client.close函数可以关闭连接
    23. //client.close(address);
    24. //如果不存在连接,就产生一个连接到服务器
    25. if (!client.exist(address)) {
    26. //产生新的连接(连接地址,解析单元定义,收到数据后执行函数)
    27. client.new(address, units, received);
    28. }
    29. //收到后调用的函数
    30. function received(data) {
    31. //这里的data表示收到的二进制数据
    32. console.log("解析结果(二进制):" + bytes.hex(data));
    33. var 解析结果 = bytes.parse(data, units);
    34. console.log("解析结果(单元):" + 解析结果);
    35. };
    36. //定义发送的数据
    37. //hex.bytes表示将16进制转换成二进制字节
    38. var bytes = hex.bytes("0102");
    39. //crc16函数表示校验码,增加到发送的数据后面
    40. var bs = crc16(bytes);
    41. bytes = bytes.add(bs);
    42. //串口发送数据
    43. //bytes.hex表示将二进制数据转换成16进制,这里只是用日志看下数据
    44. console.log(bytes.hex(bytes));
    45. //com.send表示发送二进制数据到串口
    46. client.send(address, bytes);
    47. /*下面例子可以自定义构成一个协议要求的二进制数据,units.bytes函数用于单元数据转换到二进制
    48. var content=0x0012;
    49. var data = [[0xfe, 0xfe], 4, 4, 0x0013, 2, content.length, content, crc16(content)];
    50. var bytes = units.bytes(units, data);
    51. */
    52. //可以随便定义自己的返回
    53. return {
    54. "units": units
    55. };

    串口操作

    com.list

    查询所有存在的串口

    示例

    1. for (var com in com.list()) {
    2. if (!com.isopen(com)) {
    3. com.open(com, {},units, received)
    4. }
    5. }
    6. function received(bytes, name) {
    7. console.log(name + " :" + bytes);
    8. }

    com.isopen

    判断串口是否是开的

    示例

    1. for (var com in com.list()) {
    2. if (!com.isopen(com)) {
    3. com.open(com, {},units, received)
    4. }
    5. }
    6. function received(bytes, name) {
    7. console.log(name + " :" + bytes);
    8. }

    com.open

    打开串口

    示例

    1. var para={};
    2. para.baudRate=9600;
    3. para.parity="None";
    4. para.dataBits=8;
    5. para.stopBits=1;
    6. //定义解析单元
    7. var units=[
    8. unit("起始符", "BYTE[]", 2, [0xfe, 0xfe]),
    9. unit("地址", "BYTE", 1),
    10. unit("功能", "BYTE", 1),
    11. unit("数据长度", "WORD", 2),
    12. unit("数据", "BYTE[]", getlength),
    13. unit("校验码", "BYTE[]", 2),
    14. ]
    15. function getlength(bytes) {
    16. var l = bytes.substr(bytes.length - 2, 2);
    17. return bytes.obj(l, "WORD");
    18. }
    19. //
    20. for (var com in com.list()) {
    21. if (!com.isopen(com)) {
    22. com.open(com, para,units, received)
    23. }
    24. }
    25. function received(bytes, name) {
    26. console.log(name + " :" + bytes);
    27. }

    参数说明:

    参数 类型 描述
    comname string 串口名:COM1/COM2/…
    para 字典 串口参数,参考后面说明
    units array 解析单元,参考解析单元部分
    received function 一个函数,定义收到数据后的处理

    第二个参数是下面字段组成的字典:

    参数 类型 描述
    baudRate int 波特率:默认 9600
    parity stirng 校验位:默认 None
    dataBits int 数据位:8
    stopBits stirng 停止位:1

    com.close

    关闭串口

    示例

    1. for (var com in com.list()) {
    2. com.close(com)
    3. }

    脚本执行操作

    script.run

    runscript

    test

    直接运行脚本,可选择异步

    参数说明

    参数序号 类型 说明
    1 脚本 待执行脚本
    2 参数 脚本中的变量初始值
    3 是否异步 true: 异步执行,不用等待结果
    4 目标机器 机器的domain, 如果未指定,按系统定义
    1. var code = `
    2. try {
    3. log("1111111")
    4. } catch (e) {
    5. console.error(e);
    6. set(instid,{LastError:e});
    7. }
    8. finally {
    9. set(instid,{running:false});
    10. }
    11. `;
    12. test(code, { instid: instid }, false,"192.168.1.1");

    runat

    指定服务器运行函数,函数将在指定服务器上运行

    示例

    1. //定义一个待执行函数,注意不要有参数
    2. function abc() {
    3. log(a + b)
    4. }
    5. runat(abc, 服务器名称);

    参数说明

    参数序号 类型 说明
    1 表达式 待执行函数
    2 字符串 机器的domain, 用servers()可以获取到所有服务器信息

    async.run

    异步运行函数,运行后不用等待结果,立即返回

    示例

    1. //定义一个待执行函数
    2. function abc(a, b) {
    3. log(a + b)
    4. }
    5. async.run(abc, ["参数1", "参数2"]);

    参数说明

    参数序号 类型 说明
    1 表达式 待执行函数
    2 数组 参数

    runds

    直接运行脚本

    示例

    1. runds("/admin/test.ds", {
    2. "a": "11111111"
    3. },30000);

    参数说明

    参数序号 类型 说明
    1 字符串 脚本(全路径或id)
    2 字典 参数
    3 int 超时时间 (毫秒) 默认 60000毫秒
    4 字符串 执行目标机器

    timeout

    脚本执行超时设置,可以放在脚本执行的任何地方,但不要放在耗时的方法后。

    示例

    1. timeout(60000);//脚本执行1分钟后超时

    参数说明

    参数序号 类型 说明
    1 int 超时时间 (毫秒) 默认 60000毫秒

    压缩与解压操作

    zip

    将一个值为二进制内容的字典压缩为zip文件

    1. data["目录/data1.xlsx"]=file.bytes("/admin/excel/data.xlsx");
    2. data["目录/data2.xlsx"]=file.bytes("/admin/excel/data.xlsx");
    3. return zip(data);

    unzip

    将zip文件解压为字典

    1. data["目录/data1.xlsx"]=file.bytes("/admin/excel/data.xlsx");
    2. data["目录/data2.xlsx"]=file.bytes("/admin/excel/data.xlsx");
    3. a= zip(data);
    4. b= unzip(a);

    zip.add

    压缩的zip内增加一个字典内容

    1. data["目录/data1.xlsx"]=file.bytes("/admin/excel/data.xlsx");
    2. data["目录/data2.xlsx"]=file.bytes("/admin/excel/data.xlsx");
    3. a= zip(data);
    4. b= unzip(a);
    5. c=zip.add(a,data)

    Excel操作

    excel.read

    从excel文件中读取数据

    1. excel.read(file.bytes("/admin/excel/data.xlsx"),notitle);

    参数说明

    参数序号 类型 说明
    1 byte[] excel文件内容
    2 bool 默认false表示把第一行当做标题行,如果为true表示所有行都是数据

    excel.write

    将数据写入excel文件

    1. var data={
    2. "sheet1":
    3. [
    4. {
    5. "a":"a",
    6. "b":"b"
    7. },
    8. {
    9. "a":"1",
    10. "b":"2"
    11. }
    12. ]
    13. }
    14. excel.write(data);//输出为excel的文件内容,可以将文件名命名为xxx.xlsx.ds

    Rest操作

    rest.get

    get

    get方式请求

    示例

    1. rest.get("/admin/test.ds", {
    2. "app_key": "11111111"
    3. });

    参数说明

    参数序号 类型 说明
    1 字符串 请求的地址
    2 json 请求的header字典
    3 bool 是否保持连接
    4 int 超时毫秒

    rest.post

    post

    post方式请求

    示例

    1. rest.post("/admin/test.ds", {
    2. "参数1": "11111111",
    3. "参数2": "22222222"
    4. }, {
    5. "app_key": "11111111"
    6. });
    7. result = rest.post("http://127.0.0.1/GetData", data, header, true,
    8. 500, "10.12.13.14");
    9. //其中的header可以支持的格式:
    10. {
    11. "Content-Type":"application/x-www-form-urlencoded, multipart/form-data, application/json, application/xml"//中间选择一种
    12. "gzip":true //默认超过2048会自动gzip
    13. }

    参数说明

    参数序号 类型 说明
    1 字符串 请求的地址
    2 json 请求的参数字典
    3 json 请求的header字典
    4 bool 是否保持连接
    5 int 超时毫秒
    6 string 指定一个机器ip,表示在该机器上执行,一般在有的机器无法连接外网的情况下,需要指定一台可以连接外网的机器发送请求

    图片操作

    compressimage

    压缩图片

    示例

    1. compressimage(data,300);

    调用后获取到压缩后的图片

    参数说明

    参数序号 类型 说明
    1 byte[] 原图字节
    2 int 压缩后的大小

    qr

    生成二维码

    示例

    1. qr(content,level,size,format,drawQuietZones);
    1. var content = p[0]._Str();
    2. var level = p[1]._Int(1);
    3. var size = p[2]._Int(20);
    4. var format = p[3]._Str();
    5. var drawQuietZones = p[4]._Bool();
    6. ImageFormat imagetype = ImageFormat.Jpeg;
    7. if (!string.IsNullOrEmpty(format))
    8. {
    9. switch (format.ToLower())
    10. {
    11. case "gif":
    12. imagetype = ImageFormat.Gif;
    13. break;
    14. case "jpeg":
    15. imagetype = ImageFormat.Jpeg;
    16. break;
    17. case "png":
    18. imagetype = ImageFormat.Png;
    19. break;
    20. case "tiff":
    21. imagetype = ImageFormat.Tiff;
    22. break;
    23. }
    24. }
    1. public enum ECCLevel
    2. {
    3. /// <summary>
    4. /// 7% may be lost before recovery is not possible
    5. /// </summary>
    6. L,
    7. /// <summary>
    8. /// 15% may be lost before recovery is not possible
    9. /// </summary>
    10. M,
    11. /// <summary>
    12. /// 25% may be lost before recovery is not possible
    13. /// </summary>
    14. Q,
    15. /// <summary>
    16. /// 30% may be lost before recovery is not possible
    17. /// </summary>
    18. H
    19. }

    参数说明

    参数序号 类型 说明
    1 string 二维码内容字符串
    2 int 级别
    3 int 尺寸
    4 string 格式
    5 bool 是否画其他区域

    日志操作

    log.get

    获取日志

    示例

    1. var data = log.get("Debug", 1, 100, "_msg like '111'", ["_time", "_type", "_msg", "_server_ip"],{"_time":-1});

    log.set

    新增一条日志

    示例

    1. log.set(type, msg, feature);

    log.delete

    删除日志

    示例

    1. var count = log.delete("_msg like '111'");

    log.clear

    清除日志,这是删除整个日志,需要管理员权限

    示例

    1. log.clear()

    数据库索引操作

    dbindex.query

    查询数据库的索引

    示例

    1. return dbindex.query(模板)

    dbindex.create

    产生新的数据库的索引

    示例

    1. return dbindex.create(模板,索引名,索引内容)

    dbindex.drop

    删除数据库的索引

    示例

    1. return dbindex.drop(模板,索引名)

    短信与邮件操作

    sms

    阿里云的短信服务接口调用,请先在阿里云上申请相关服务

    示例

    1. var b = sms(accessKeyId, accessKeySecret, 接收短信的手机号, 签名, 模板代码, 模板参数);
    2. 模板参数例子:
    3. {
    4. "code": 验证码
    5. }
    6. 结果是阿里云的返回结果,请参考阿里云介绍

    email

    发送邮件
    利用POP3/SMTP发送,需要先开通

    示例

    1. var b = email(string host, int port, string username, string password, string from, object to, string subject, string body, string fromname,dictionary 附件)
    2. *其中的 object to 参数是发送对象,可以用以下几种:
    3. 1. 直接用收件人邮箱:"tchua77@126.com"
    4. 2. 多人:["tchua771@126.com","tchua772@126.com"]
    5. 3. 发送+抄送+密送: {"to":["tchua771@126.com","tchua772@126.com"],"cc":["tchua771@126.com","tchua772@126.com"],"bcc":["tchua771@126.com","tchua772@126.com"]}
    6. //具体例子:
    7. var b = email("smtp.qq.com", 587, "88504660@qq.com", 这个参数是POP3/SMTP的授权码, "88504660@qq.com", "tchua77@126.com", 这个参数是邮件主题, 这个参数是邮件正文, 这个参数是发送方的名称, { "附件1": file.bytes("/admin/文件1"),"附件2": file.bytes("/admin/文件2") });
    8. 发送成功后返回 true

    其他操作

    redirect

    go

    页面跳转

    示例

    1. redirect("/admin/page1")
    2. 或:
    3. go("/admin/page1")

    id

    获取一个唯一的标识字符串,长度24

    示例

    1. return id()

    token

    获取一个用于用户标识的token,是个JWT token

    示例

    1. return token()

    cookie.set

    设置客户端的cookie

    示例

    1. c = {};
    2. c.token = "12345465";
    3. cookie.set(c, now() + 30 * 1000 * 60);

    cache

    当使用脚本获取文件时,可以缓存客户端结果

    示例

    1. cache();

    cache.set

    自定义服务器对象缓存,目的为提高性能

    示例

    1. cache.set(key, obj, timeout【超时秒】, false【true:使用后立即更新时间,延迟超时】);

    cache.get

    获取自定义服务器对象缓存,目的为提高性能

    示例

    1. cache.get(key);

    random

    获取一个随机数字

    示例

    1. random(1,100);//从1到100之间的随机数字

    时间格式化

    示例

    1. local(now()).tostring("yyyy-MM-dd HH:mm:ss.fff");//当前时间本地化后格式化显示

    服务配置操作

    config.get

    获取所有服务器的配置

    示例

    1. config.get()
    2. //结果:
    3. {
    4. "服务1": {
    5. "ServiceName": "TaiwuService",
    6. "DBConnection": "",
    7. "WorkPort": "30010",
    8. "MQTTPort": "1883",
    9. ...
    10. },
    11. "服务2": {
    12. "ServiceName": "TaiwuService",
    13. "DBConnection": "",
    14. "WorkPort": "30010",
    15. "MQTTPort": "1883",
    16. ...
    17. },
    18. "服务3": {
    19. "ServiceName": "TaiwuService",
    20. "DBConnection": "",
    21. "WorkPort": "30010",
    22. "MQTTPort": "1883",
    23. ...
    24. },
    25. }

    config.set

    设置服务器的一个或多个配置, 如果希望配置生效,必须重启服务,重启服务的方式:

    1. 直接进服务器重启
    2. setting.json中的version,给配置的版本数字增加1,服务会自动升级重启。

    示例

    1. //与config.get()得到的结果一致:
    2. var myconfig=
    3. {
    4. "服务1": {
    5. //"ServiceName": "TaiwuService",
    6. "DBConnection": "",
    7. //"WorkPort": "30010",
    8. "MQTTPort": "1883",
    9. ...
    10. },
    11. "服务2": {
    12. "ServiceName": "TaiwuService",
    13. //"DBConnection": "",
    14. //"WorkPort": "30010",
    15. //"MQTTPort": "1883",
    16. ...
    17. },
    18. "服务3": {
    19. //"ServiceName": "TaiwuService",
    20. //"DBConnection": "",
    21. "WorkPort": "30010",
    22. //"MQTTPort": "1883",
    23. ...
    24. },
    25. }
    26. config.set(myconfig);

    createservice

    动态产生一个服务,执行后立即启动服务监听端口

    示例

    1. createservice(servername,port[502],maxconnections[100],timeout[300秒],mode[tcp/udp])

    removeservice

    动态移除自定义服务

    示例

    1. removeservice(servername)

    checkservice

    检查服务是否存在,存在为true,否则false

    示例

    1. checkservice(servername);

    本地文件操作

    localfile.read

    获取服务器上的本地文件内容

    示例

    1. localfile.read("c:\\abc.txt")
    2. //结果:
    3. 二进制

    localfile.write

    写入服务器上的本地文件内容

    示例

    1. localfile.write("c:\\abc.txt",二进制内容)
    2. //结果:
    3. true

    shell.run

    执行操作系统命令

    示例

    1. shell.run(命令,命令参数,执行命令的目录)
    2. shell.run("dir","","/home/worker")
    3. //在指定的服务器上运行
    4. test(`
    5. shell.run("systemctl stop worker4")
    6. `,{},false,"worker1-1")

    插件

    SqlServer.Query

    执行操作系统命令

    示例

    1. //定义连接
    2. var conn = "server=10.35.124.23,1433;database=EquInfo;uid=PLN;pwd=Pln@20220101;"
    3. //
    4. name = "abc"
    5. time = local(now()).tostring("yyyy-MM-dd")
    6. ws = "2222"
    7. line = "kkkk"
    8. //查询数据
    9. aaa = SqlServer.Query(
    10. `
    11. SELECT *
    12. FROM [EquInfo].[dbo].[Energy_BSS] where Time='${time}' and Name='${name}'
    13. `
    14. , conn
    15. )
    16. if (aaa.table.length == 0) {
    17. sql = `
    18. INSERT INTO [dbo].[Energy_BSS]
    19. ([Name]
    20. ,[Volume]
    21. ,[Time]
    22. ,[WS]
    23. ,[Line])
    24. VALUES
    25. ('${name}'
    26. ,${volume}
    27. ,'${time}'
    28. ,'${ws}'
    29. ,'${line}')
    30. `
    31. //插入数据
    32. SqlServer.Query(sql, conn)
    33. //
    34. }