Skip to content
  • 版块
  • 最新
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
品牌标识

AIRIOT智慧系统搭建平台经验交流

guangdaG

guangda

@guangda
关于
帖子
主题
群组
粉丝
关注

帖子

最新 最佳 有争议的

  • 设备接入-g340t驱动设备接入
    guangdaG guangda

    dtu设备接入平台,安装平台的服务器需要有公网ip。

    1.设备表配置:添加设备表-安装g340t驱动-添加设备-配置手机号、站号-添加数据点。
    7707cd3d-0498-4d0d-a22c-8ef065a8c38b-image.png

    配置说明:

    • 手机号=DTU上配置的IMEI编号。
    • 站号=modbus rtu站号
    • 在线判断方式:心跳检测:用户维持链接的长连接,空闲时一般为一分钟发送一次。平台识别的心跳包为Q,当平台收到心跳包Q时,会立即响应A发送给设备,设备可通过心跳包交互来判断与设备的连接情况。
    • 地址合并间隔:一个资产下同一个分区的数据点起始地址按照该间隔合并读取。
    • 采集周期:表示读取传感器数据的周期时间。
    • 自动化地址:开启自动化地址,数据点偏移地址从1开始。
    • 通讯监控参数:通讯超时时间:单位秒(s)判断设备超时的时间标准,超时时间默认为定义采集周期的3倍。

    2.数据点配置

    2655fb9d-78b2-4832-8a6a-cb3d497d3d22-image.png

    读取区域

    • 线圈状态:01读写,对开关量(bit位)进行读写,写入默认使用05功能码(不需要单独设置),该功能码一般针对PLC的开关输出点。
    • 输入状态:02只读,对开关量(bit位)进行读,是只读的,不允许写入,一般针对PLC的开关输入点。
    • 保持寄存器:03读写,对整形/浮点型数据进行读写,写入默认使用06功能码(16位整形数据)和10功能码(32位和64位整形和浮点型数据),也就是对单个寄存器写入使用06,多个寄存器使用10。
    • 输入寄存器:04只读,对整形/浮点型数据进行读,只读不写。

    偏移地址: 数据点所在寄存器起始地址。

    寄存器个数: 数据点占用的寄存器个数,不填根据数据类型处理。

    数据类型:
    d55dc9f7-f37a-49e6-882a-d07b35f7033d-image.png

    3.指令配置
    5bdc4272-329e-4a27-b7db-bf5134ade9d0-image.png

    写入区域

    • 线圈状态:01读写,对开关量(bit位)进行读写,写入默认使用05功能码(不需要单独设置),该功能码一般针对PLC的开关输出点(比如西门子PLC的Q点)。
    • 保持寄存器:03读写,对整形/浮点型数据进行读写,写入默认使用06功能码(16位整形数据)和10功能码(32位和64位整形和浮点型数据),也就是对单个寄存器写入使用06,多个寄存器使用10。

    偏移地址: 所在寄存器起始地址。

    数据类型: 同数据点。

    默认写入值: 指令写入时候的默认值。

    单字节: 勾选单字节后数据值按寄存器写入数据,否则多个寄存器同时写值。

    4.开放端口:配置完成上述内容后进入运维管理:ip:13030.查看g340t驱动的端口号:开放此端口号。确保telnet能通。Telnet命令文档:
    https://baijiahao.baidu.com/s?id=1723367561977342393&wfr=spider&for=pc

    36299712-e813-4a58-993c-8ec53dae0f7a-image.png

    点击右侧三个点查看g340t驱动的日志,查看设备与平台连接情况。提示成功建立链接则连上平台。

    !未提示链接成功检查以下几项:

    • 13030运维管理中g340t驱动对应的端口是否开放,保证 telnet ip(公网ip):端口正常.
    • 检查dtu配置软件配置的是否是公网ip及运维中g340t驱动对应的端口.
    • 平台配置完之后是否重启驱动.
    • modscan 是否可以读上来数据.

    dtu配置案例:

    b8a8b490-82ce-4563-8961-07bbc87d31e9-image.png
    6b91d239-bc40-444a-ba6b-fca78c81fb4e-image.png


  • 设备接入-mqtt驱动设备接入
    guangdaG guangda

    1.MQTT简介:

    MQTT全称为消息队列遥测传输,是ISO 标准(ISO/IEC PRF 20922)下基于发布
    (Publish)/订阅 (Subscribe)范式的消息协议,工作在 TCP/IP协议族上。
    MQTT 协议定义两种网络实体:消息代理(message broker)与客户端(client)

    • 消息代理用于接收来自客户端的消息并转发至目标客户端,也被称为MQTT服务器。
    • MQTT 客户端可以是任何运行有 MQTT 库并通过网络连接至消息代理的设备,例如微型控制器或大型服务器。

    MQTT 协议中,消息的传输是通过主题(topic)管理的,消息的发布者和订阅者均为客户端(client)。消息由主题(Topic)和负载(payload)两部分组成。
    当某个客户端有需要分发的数据时,会向连接的消息代理(MQTT服务器)发送指定主题的携带有负载的消息。
    服务器收到消息后,会向订阅此主题的客户端分发此消息。发布者不需要配置订阅者的相关信息和具体位置;同样,订阅者也不需要配置发布者的相关信息和具体位置。

    2.平台配置说明

    添加设备表-安装mqtt驱动-添加设备-配置驱动内容-添加数据点。
    791fa0b4-51bb-44a2-9c85-cb268815ded4-image.png

    配置驱动参数

    • MQTT服务器:填写要连接的mqtt服务器的地址。格式为tcp://服务器IP或域名:服务器端口 例如:tcp://127.0.0.1:1883(填写的是需要订阅的mqtt服务器,平台是mqtt的客户端)

    • 用户名、密码:填写MQTT服务器的用户名和密码。

    • 订阅消息主题:填写该模型要订阅的消息主题,可使用通配符#和+。

    Topic是个utf-8编码的字符串,可由多个'/'分割开。
    +:为单级通配符,如:check/+/baseline 
    #:为多级通配符,必须放在topic的最后,前一个字符必须是'/' 建议Topic中不要包含空格符。
    
    
    • 通讯监控参数:平台通用配置,当某个资产数据点中的最新上数时间距离当前时间超过此参数时,平台判定资产掉线。

    • 自定义脚本:由于mqtt协议中未规定具体的消息内容格式,因此需要用户编写自定义脚本,用于解析消息和组装要发送的消息内容。

    3.使用示例

    示例1
    由于MQTT协议通过主题区分不同种类的消息,因此在使用时,不同的主题需要建立不同的模型,下边以网关常用的MQTT格式为例,介绍脚本的编写方法。示例中d1为数据点编号,资产id为订阅主题中间部分abcd1234。

    消息格式
    f2294aef-ba12-457a-9638-2721032a8934-image.png

    脚本
    66c0ec09-35c4-41f5-8b2a-1b420d9265b3-image.png

    脚本示例:
    69e4e987-f833-4853-8628-bc346263e374-image.png

    示例2:资产id在报文中

    数据格式案例:
    {
    "timestamp": 1617860319, //时间戳
    "version": "5.0",
    "messageId": "3",
    "devices": [{
    "deviceId": "xbzc-001", //资产id
    "deviceState": 1,
    "deviceData": {
    "xbzc-temp": 37.0 //数据点标识和数据
    }
    }]
    }

    自定义脚本案例:

    ParseHandle = function (topic, package) {
      // 解析数据
      let msg = JSON.parse(package.toString())
      // console.log(package.toString())
      //  { id, values, time }
      let arr = []
      if (msg.devices) {
        for (let i = 0; i < msg.devices.length; i++) {
          let id = msg.devices[i].deviceId
          let values = msg.devices[i].deviceData
          let time = msg.timestamp * 1000
          arr.push({ id, values, time })
        }
      }
      return arr
    }

    平台未采集到数据需检查如下内容

    1.mqttbox或者其他客户端能否订阅到该主题消息(以mqttbox演示数据订阅)

    • 打开工具界面如图,点击按钮,创建链接。

    829da435-ccca-48f9-aebe-d4753dcdba14-image.png

    • 配置如图。

    03a273e1-7c82-4119-9639-d99a51b88b73-1692177660706.jpg

    • 链接成功后提示绿色图标,设置右侧订阅的主题,主题内容与服务器发送主题保持一致,填写完成主题后,点击下方橙色按钮,等待消息。

    aac6edb4-d69b-4308-8810-63f9583f0f4e-image.png

    • 如果成功订阅,订阅的消息就会显示在页面。

    506ff577-00ec-4bad-9a9f-b3098d399090-image.png

    2.mqtt驱动的运维日志:运维管理地址(ip:13030)点击查看driver-mqtt-client的驱动日志,滚动条拉至最下方查看驱动日志error内容。

    3.检查用户名,密码是否是mqtt服务器用户名密码,检查自定义脚本解析内容是否修改,检查资产编号是否对应。

    .平台mqtt下发指令配置
    18159dcb-0981-4a50-b916-65c05606d13c-3ff3fc6bfddcdb8a6ce3d983039ef58.png
    op是对象
    op.name 是指令名称
    op.tag是指令配置的tag:写入
    op.value是执行的时候输入的那个值 或者默认值
    e564e37a-44eb-4faa-a4ee-df602f539f59-image.png
    脚本例子:
    CommandHandle = function (topic, id, op) {
    let sendTopic = topic
    let sendData = JSON.stringify([{ [op.tag]:op.value}])
    return { sendTopic, sendData } //返回的对象中的key的名字必须为sendTopic,sendData
    }
    指令配置案例:
    4a370d9c-8fb1-4c4f-9b78-dac72ae5b201-image.png

    4.新建MQTT服务器方法

    1. Windows

    • 在软件安装的目录下找到mosquitto文件夹复制并重命名,重命名后在文件夹下找到mosquitto.conf文件以记事本方式打开,在211行找到port 1883。将端口进行修改 例如1884 然后在文件夹窗口下输入cmd进入命令窗口输入mosquitto.exe -c mosquitto.conf运行。
      121c9872-5d3f-45c4-a242-681874fc60ee-image.png

    • 在软件平台中添加mqtt的服务器
      进入到运维平台127.0.0.1:13030中,点击服务管理—— 添加服务——高级添加应用名称例如:mqtt2, 命令:mosquitto.exe -c mosquitto.conf 目录:../mqtt2 (mqtt2为本文档一中复制的文件夹重命名后名称)
      cdcc6ca7-e9de-44e7-8454-1b7a7d15f33b-image.png

    2. Linux

    • Linux平台启用mqtt server:
      找到docker-compose.yml文件位置
      dce36b07-2156-403b-b3da-b446fed02aa2-image.png
      8d7dc19b-0f2c-46c7-b952-33577847c609-image.png

    • 将下面这句复制到docker-compose.yml里,按照截图修改格式。
      mqttserver: container_name: mqttserver
      environment:
      RABBITMQ_DEFAULT_USER=admin
      RABBITMQ_DEFAULT_PASS=public
      image: airiot/rabbitmq:3.8.3-management-alpine logging: driver: json-file
      options: max-size: 100m max-file: "1" networks: backend
      ports:1884:1883 restart: always ulimits: nproc: 40960 nofile: soft: 10240 hard: 30720 volumes:
      /etc/localtime:/etc/localtime:ro
      dec4f7a2-5122-41ed-88c1-afe2571b4d10-image.png
      配置完成后需要进入平台安装目录下 创建并启动服务:docker-compose up -d
      查看mqtt服务是否启动:docker ps | grep mqtt


  • 设备接入-Modbus TCP驱动设备接入
    guangdaG guangda

    1.Modbus TCP协议概述

    MODBUS是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。平台的MBTCP协议是建立在TCP协议之上的应用层协议。自带MODBUS TCP协议的设备一般为TCP server端(只能由客户端主动连接,不能主动连接平台),所以需要一个TCPserver转TCPclient的透明转发模块,来连接设备和平台。当然,如果设备本身支持client模式可直连。

    2.平台配置说明:

    7edfd865-2b18-4067-a5ec-f8030e8b7743-image.png

    设备表配置:

    • 设备IP:设备的IP地址。
    • 端口:设备的端口号。
    • 连接超时时间:单位秒,默认10s,创建连接的最长超时时间及读写数据的最长超时时间。
    • 连接空闲时间:单位秒,默认30s,从上一次请求后超过时间链接未使用,关闭当前链接。
    • 连接使用间隔:单位毫秒,默认1毫秒,同一设备IP和端口下的设备,读取的时间间隔。
    • 站号:将请求发送到 Modbus TCP 从站设备的设备ID。
    • 采集周期:表示读取传感器数据的周期时间,单位秒。
    • 自动化地址:开启自动化地址,数据点偏移地址从1开始。 偏置表示的是数据地址。如果数据地址是16进制表示(0x0000开始),则需要把16进制转为十进制并加1,才是偏置的值。如果地址使用区号+序号表示(比如40001),则偏置只取序号就可以了(也就是1)。
    • 通讯监控参数:通讯超时时间:单位秒(s),判断设备超时的时间标准,超时时间默认为定义采集周期的3倍。

    数据点配置:
    69df0b4a-52ea-4a0d-bb2a-271095919230-image.png

    • 名称:数据点名称
    • 标识:数据点唯一标识
    • 读取区域
      1) 线圈状态:01读写,对开关量(bit位)进行读写,写入默认使用05功能码(不需要单独设置),该功能码一般针对PLC的开关输出点(比如西门子PLC的Q点)。
      2) 输入状态:02只读,对开关量(bit位)进行读,是只读的,不允许写入,一般针对PLC的开关输入点(比如西门子PLC的I点)。
      3)保持寄存器:03读写,对整形/浮点型数据进行读写,写入默认使用06功能码(16位整形数据)和10功能码(32位和64位整形和浮点型数据),也就是对单个寄存器写入使用06,多个寄存器使用10。
      4)输入寄存器:04只读,对整形/浮点型数据进行读,只读不写。
    • 偏移地址:数据点所在寄存器起始地址。
    • 寄存器个数:数据点占用的寄存器个数,不填根据数据类型处理。

    数据类型
    be179d81-8cf5-4210-917f-7eb9c02c00b5-image.png

    指令配置:

    fc3c1337-9951-4ea0-a448-fa142fe4baca-image.png
    写入区域

    • 线圈状态:01读写,对开关量(bit位)进行读写,写入默认使用05功能码(不需要单独设置),该功能码一般针对PLC的开关输出点(比如西门子PLC的Q点)。
    • 保持寄存器:03读写,对整形/浮点型数据进行读写,写入默认使用06功能码(16位整形数据)和10功能码(32位和64位整形和浮点型数据),也就是对单个寄存器写入使用06,多个寄存器使用10。
      偏移地址
      点所在寄存器起始地址。

    数据类型:同数据点。

    默认写入值:指令写入时候的默认值。

    单字节:勾选单字节后数据值按寄存器写入数据,否则多个寄存器同时写值。


  • 设备接入-西门子PLC设备接入
    guangdaG guangda

    西门子PLC平台配置说明:

    1.AIRIOT与西门子300 1200 1500 PLC连接配置说明:
    选择西门子siemens-s7驱动程序,设备表配置页面示例:
    f277e341-362f-4434-b26f-c1dda9c408bc-image.png

    设备配置页面示例:

    148bf95e-bb8c-4ccf-b8df-28433ccfa2f5-image.png

    数据点配置示例:取位的数据点需要选择“位下标”。

    e6d51b6a-9a84-402c-b27a-ba8144b72ecb-image.png

    指令配置页面示例:

    fe0e2f0c-1459-461e-bbed-5dd936fb6c1f-image.png

    注意:在TIA软件中,设备视图——常规——保护,勾选“允许从远程伙伴(PLC、HMI、OPC、…)使用PUT/GET通信访问”。
    994f7991-5c0e-46ef-8c64-d7ca608e9710-image.png

    2.AIRIOT与西门子s7-200、smart200 PLC连接
    选择西门子siemens-s7-200s驱动程序,设备表配置页面示例:
    bc6d39bb-dd33-450e-aee2-2b1b4f518997-image.png
    默认localTsap为0101,remoteTsap为0301,如果用户进行了修改,需要以实际的为准。

    设备配置页面示例:

    72b47388-f350-429a-9c1b-2fc2f1c41f9b-image.png

    数据点配置示例:取位的数据点需要选择“位下标”。

    decd2ce0-b226-47e0-8b2e-430065b75a32-image.png


  • 设备接入-欧姆龙PLC设备接入
    guangdaG guangda

    FINS协议简述

    FINS通讯服务是由欧姆龙提供的PLC和计算机对各种网络相互通信的方式,欧姆龙(Omron)是来自日本的知名电子和自控设备制造商,其中、小型PLC在国内市场有较高的占有率,有CJ、CM等系列。PLC可以支持Fins、Host link等协议进行通信。 支持以太网的欧姆龙PLC CPU、以太网通信模块根据型号的不同,一般都会支持FINS(Factory Interface Network Service)协议,一些模块也会支持EtherNet/IP协议。Omron fins协议缺省TCP/UDP端口号为9600。Fins协议封装在TCP/UDP之上,需要注意的是基于TCP的Fins数据包和基于UDP的包在头部上差异较大。协议的具体构造可以参考欧姆龙官方文档。

    平台配置:
    选择欧姆龙驱动程序,设备表配置页面示例:
    ce018c41-6e0e-4074-bb84-164efb7d1a69-image.png

    • 设备ip:plc设备的ip地址
    • 端口:plc设备的端口号,通常默认9600
    • 设备节点: 在同一级网络里,各个连接节点的节点号需要设置为不一样的号码, 一个节点对应一个PLC.如果是以太网网络,节点号一般是IP地址的最后一个字段.
    • 站号: 在同一个PLC中,各个模块站号互不相同,CPU一直为0,其余的自行设置.
    • 网络: 如果只有一个本地网络, 那么网络号都设置为0,代表只有一个网络. 如果有多个网络, 为了避免冲突,那么就必须指定各级网络号,范围是1-127.

    数据点

    • 存储地址:需要读取的寄存器的首地址

    • 寄存器数:需要读取的寄存器的个数

    • 偏移地址:按位读取的时候,配置的偏移地址

    • 数据类型:
      e79f7463-c4b8-4506-a268-f9e8b12900d7-image.png

    • 内存地址

    b2c11edd-145c-4e87-9b0e-a17b1612328b-image.png
    测试过程:

    • 原始数据:

    3e4b25e3-dc63-47aa-a05c-f43288634f55-image.png

    • 参数汇总:

    ba069b12-6d09-4582-aedb-558b46a7601e-image.png

    • 流程画面:

    59e0ae9c-1d23-4f33-954b-caed226f6490-image.png


  • 设备接入-Modbus RTU驱动设备接入
    guangdaG guangda

    1.Modbus RTU协议概述

    Modbus是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。平台的MBRTU协议是建立在TCP协议之上的应用层协议。一般使用DTU实现底层TCP连接,然后平台和设备进行应用层的modbus协议通讯。

    2.平台配置概述

    05aad9eb-3c03-42dd-acf3-196e64a19972-image.png

    • 串口:设备的串口号。
    • 串口配置:设备的串口配置。
    • 连接超时时间:单位秒,默认10s,创建连接的最长超时时间及读写数据的最长超时时间。
    • 连接空闲时间:单位秒,默认30s,从上一次请求后超过时间链接未使用,关闭当前链接。
    • 连接使用间隔:单位毫秒,默认1毫秒,同一设备IP和端口下的设备,读取的时间间隔。
    • 采集周期:表示读取传感器数据的周期时间,单位秒,最小值0.001秒,由于MODBUS协议是请求应答式协议,每次读数据都会等待接收,等待的过程会产生延时,最长等待超时时间(秒),所以越多数据不响应,采集周期会越长。
    • 站号:将请求发送到 Modbus TCP 从站设备的设备ID。
    • 自动化地址:开启自动化地址,数据点偏移地址从1开始。 偏置表示的是数据地址。如果数据地址是16进制表示(0x0000开始),则需要把16进制转为十进制并加1,才是偏置的值。如果地址使用区号+序号表示(比如40001),则偏置只取序号就可以了(也就是1)。
    • 通讯监控参数:通讯超时时间:单位秒(s),判断设备超时的时间标准,超时时间默认为定义采集周期的3倍。

    3.数据点配置

    4094ca84-ce83-4753-9d7d-955c7e2f0f68-image.png

    • 名称:数据点名称
    • 标识:数据点唯一标识
    • 读取区域:
      • 线圈状态:01读写,对开关量(bit位)进行读写,写入默认使用05功能码(不需要单独设置),该功能码一般针对PLC的开关输出点(比如西门子PLC的Q点)。
      • 输入状态:02只读,对开关量(bit位)进行读,是只读的,不允许写入,一般针对PLC的开关输入点(比如西门子PLC的I点)。
      • 保持寄存器:03读写,对整形/浮点型数据进行读写,写入默认使用06功能码(16位整形数据)和10功能码(32位和64位整形和浮点型数据),也就是对单个寄存器写入使用06,多个寄存器使用10。
      • 输入寄存器:04只读,对整形/浮点型数据进行读,只读不写。
    • 偏移地址:数据点所在寄存器起始地址。
    • 寄存器个数:数据点占用的寄存器个数,不填根据数据类型处理。
    • 数据类型
      5f52b11f-b5cc-46a5-8ccc-e0290a267b1f-image.png

    4.指令配置

    53731c58-e87a-459d-8edb-b2e07a7df009-image.png

    • 写入区域
      • 线圈状态:01读写,对开关量(bit位)进行读写,写入默认使用05功能码(不需要单独设置),该功能码一般针对PLC的开关输出点(比如西门子PLC的Q点)。
      • 保持寄存器:03读写,对整形/浮点型数据进行读写,写入默认使用06功能码(16位整形数据)和10功能码(32位和64位整形和浮点型数据),也就是对单个寄存器写入使用06,多个寄存器使用10。
    • 偏移地址:点所在寄存器起始地址。
    • 数据类型:同数据点。
    • 默认写入值:指令写入时候的默认值。
    • 单字节:勾选单字节后数据值按寄存器写入数据,否则多个寄存器同时写值。

  • 设备接入-TCP Server驱动设备接入
    guangdaG guangda

    windows测试工具链接端口前,先检查端口是否被监听
    netstat -ano|findstr 端口

    image.png


  • 设备接入-TCP Server驱动设备接入
    guangdaG guangda

    链接tcp-server驱动,调试工具链接不上端口(运维管理地址的端口号),检查tcp-server驱动的四个处理脚本是否全部修改保存。驱动案例脚本是展示的功能,不生效,修改保存后才会生效。再点击重启驱动

    image.png


  • 设备接入-TCP Server驱动设备接入
    guangdaG guangda
    TCP Server 驱动 v3.2

    该驱动内置了一个 tcp server 服务, 驱动启动后可以接收客户端的连接和数据, 同时也可以向客户端发送数据. 如果使用容器部署时, 需要将 tcp 服务端口开放.

    注: 每个驱动实例只能添加一个模型
    

    配置说明
    以下内容为 tcp-server 驱动的配置项
    e1adb1bf-c703-4a57-b4c2-1d99e7358b11-image.png

    数据处理流程说明

    • 当接收到客户端发送的数据时, 会读取所有的发送数据并存放到 Buffer 中, 然后调用 数据包拆分脚本

    • 列表数据包拆分脚本 从 Buffer 中提取完整的数据包信息或.

    脚本说明
    脚本语言: JavasScript ECMAScript 5.1

    驱动使用时要求提供 数据包拆分脚本, 数据处理脚本 和 指令处理脚本 3 个脚本函数来处理接收和发送数据过程中的协议和数据格式问题.

    在脚本的上下文中内置了 Buffer 包, 可用于处理接收或发送二进制数据.

    除此之外, 还内置了 lodash, crypto-js, moment, xml-js 和 formulajs(Excel函数) 包.

    注: 所有的脚本函数名必须为 **handler**
    

    客户端对象

    在 数据包拆分脚本, 数据处理脚本, 指令处理脚本 和 连接处理脚本 函数的参数中提供了 client 对象, 该对象为当前 TCP 连接客户端对象, 可以通过该对象实现向客户端发送数据的功能. 例如: 向客户端发送 ack 信息等.

    该对象提供了以下函数:

    register
    用于注册设备. 接收到客户端发送的设备注册信息时, 在脚本函数中通过调用 client 对象中的 register 函数注册该设备, 驱动会将该设备与当前连接绑定. 当需要向设备发送指令时, 会通过该绑定关系向对应的连接发送数据. 如果协议未定义设备注册, 会向上次接收到该设备数据的连接发送. 详细信息见 设备与连接绑定关系说明

    参数说明
    0dc85afe-678b-41e7-899a-3bada00a6765-image.png
    返回值

    string 或 undefined 如果参数不正确、部分设备标识错误或对应的设备不存在时返回 string, 内容为错误说明. 如果所有设备注册成功, 返回 undefined

    示例
    4096229b-c771-4385-977a-2077e46cc730-image.png

    unregister
    用于注销设备. 注销设备与连接的绑定关系, 参数及返回值说明同 register

    示例
    abc18c4c-7865-420a-9eb7-ac059b4a1762-image.png
    send
    用于向客户端发送数据. 例如: 在接收到数据时向客户端发送 ack 信息.

    参数说明
    1d304e7c-80ff-49df-a0a3-81c157fe1611-image.png

    返回值

    string 或 undefined 如果参数不正确(字节数组为空或空数组)或发送失败则返回 string 内容为错误说明, 如果发送成功则返回 undefined.

    示例

    c61fd574-754a-4952-8fb5-afadea29a4d2-image.png

    getRemoteAddr
    用于获取客户端地址信息.

    参数说明

    无

    返回值

    string. 格式: IP:Port. 例如: 192.0.2.1:25

    示例
    50a7afa1-8dd6-4209-a275-fbb270cb1863-image.png

    getRemoteIp

    用于获取客户端 IP 地址信息.

    参数说明
    无

    返回值

    string. 例如: 192.0.2.1

    示例
    e39bcb3f-18eb-4a79-b028-68b7e9d0cc21-image.png

    reportCommand
    上报指令执行结果. 有些场景指令的执行结果反馈是异步的, 在指令发送后, 过一段时间才会收到响应报文, 此时可以在接收到响应报文时通过 client.reportCommand(...) 方法上报指令执行结果.

    参数说明
    38fb5e91-7099-44b6-b7b9-085aeb660d81-image.png

    注: serialNo 为平台在发送指令时生成, 会传入到 指令处理脚本 中, 当指令执行结果为异步反馈时, 可以将 serialNo 保存到 设备上下文 中, 以便在后续 reportCommand 使用
    

    返回值

    string 或 undefined. 如果返回 undefined 则表示发送成功, 否则返回数据为错误原因.

    示例

    f49c2e3e-f03d-439b-be37-64312c749368-image.png

    getMediaFile
    请求媒体库文件

    参数说明
    14572741-3f26-4d07-a615-4a46d9370405-image.png
    返回值
    7782a7f0-afff-44e6-94ee-c7b87f7cecc1-image.png

    示例
    fd16f150-7277-4b91-aed6-ec69f548f849-image.png

    getMediaFileByURL
    请求媒体库文件

    参数说明
    7fe258e2-b4a5-4a27-b7ec-9991bfbc6797-image.png
    返回值
    d5ef901b-8162-4c9e-a5b1-173908fa4f50-image.png
    示例
    b53bf6dc-bd6c-421f-af5b-03d2f474b1b2-image.png

    uploadMediaFile
    上传文件到媒体库

    参数说明
    c7979dcc-5d78-4c0e-8841-974e0e15ce27-image.png
    返回值
    2e6182c3-7965-4646-964c-2ec084d35b6f-image.png
    示例
    d493184f-0921-4738-842e-cceed83e5171-image.png

    deleteMediaFile
    删除媒体库文件

    参数说明
    d3f466ce-8f34-483d-bcf8-6b1bd7b0e601-image.png

    返回值
    be98075f-fea0-4850-86ff-359166afbedd-image.png
    示例
    6d9ff39b-1e11-4e7a-8707-e55a879995f8-image.png

    saveWorkTableRow
    向工作表写入一条数据

    参数说明
    425f0962-7f7e-408b-837d-e7696a3a899b-image.png
    返回值
    3573b9c8-8c64-4c34-9d01-27eda8e6c39e-image.png
    示例
    7b149b63-aea6-43fb-9aed-22ec539d91f9-image.png

    updateWorkTableRow
    更新工作表中的数据

    7d23d55e-ea9e-4db1-aa1a-02cadeaa92a4-image.png

    updateNodeById
    根据资产标识更新资产数据
    fed8201c-ae9e-4b25-8ca0-4749442d75a5-image.png

    getContext
    用于获取上下文对象, 可以在上下文中存储数据. 详细信息

    注: 第一次调用的时候才会创建上下文
    

    e1a917e2-b163-4cd4-8d77-2f185a1770ef-image.png

    getDeviceContext
    用于获取设备上下文对象, 使用设备标识作为上下文标识, 可以在上下文中存储数据. 详细信息

    与 getContext 不同的是, 当设备被删除后, 重启驱动时会自动清理被删除设备的上下文对象.

    注: 第一次调用的时候才会创建上下文
    
    

    46c06d7d-2229-4f63-a8ab-4e2ab1455f95-image.png

    removeContext
    删除上下文对象
    817db45b-91b8-4e79-a497-a69e68ccdbd5-image.png

    removeDeviceContext
    删除设备上下文对象
    778d600d-f918-4ecc-a593-ff266d7541b7-image.png

    getContextIds
    获取全部上下文标识(不包含设备上下文)
    8df06010-e339-462b-812d-e861b033aa53-image.png

    getDeviceContextIds
    获取全部设备上下文标识(只包含设备上下文)
    52c6ee2e-46f6-4ccb-b42b-305068b39763-image.png

    context
    上下文对象, 用来存储数据, 上下文中的数据可以在不同的脚本中共享. 例如: 可以在 指令处理脚本中 写入数据, 然后从 数据处理脚本 中读取数据. 不同上下文彼此独立, 互不影响.

    注: 可以根据需求创建多个上下文对象, 但是上下文对象以及上下文中的数据需要及时清理, 否则会造成 **OOM** 问题, 导致驱动程序崩溃.
    

    put
    用于向上下文中存储数据.

    注: 存入的数据需要自行清理, 否则可能导致 OOM 等问题.
    

    4d5dbecf-5811-4d19-9a55-ed1bff46ecf9-image.png

    containsKey
    判断上下文中是否存在指定的 key
    b98c0328-b817-4aed-80d2-d7d2e5db7b80-image.png

    get
    从上下文中获取指定的 key 对应的数据. 如果 key 不存在则返回 undefined
    8295a643-b047-413a-9b2d-f4af29a6d570-image.png

    getAndRemove
    从上下文中获取指定的 key 对应的数据并且在返回后 删除 该 key. 如果 key 不存在则返回 undefined.

    注: 该函数返回后, 再使用 get 或 getAndRemove 均返回 undefined.
    

    cd5a47ff-496d-4bc6-940a-f42d203913fd-image.png

    remove
    从上下文中删除指定的 key, 如果 key 不存在则不执行任何操作.
    3ae45176-54ab-400d-a8cd-8fe7f9b8ea4b-image.png

    内置函数
    crc 校验
    驱动中内置了 crc 对象, 可以在脚本中直接使用 crc 对象中的校验函数.

    • 使用 checksum16 实现 crc16 校验

    ce27119c-45cc-4cee-8643-7e3083173e97-image.png

    • 使用 checksum32 实现 crc32 校验

    381f450d-21a1-41fa-b686-3e5a81bc450b-image.png

    • 使用 checksum64 实现 crc64 校验

    cfd0e938-ddb0-4e39-8f14-3eb1f6d98ef0-image.png

    • 使用 checksumModbus 实现 modbus 协议 crc 校验

    modbus 校验为 crc16, 所以校验码类型为 uint16. 另外, checksumModbus 不需要 poly 多项式参数.
    176c6f8b-e660-4926-9ec9-44ab449689da-image.png

    数据包拆分脚本

    该脚本用于处理接收数据过程中的半包和粘包问题, 该函数需要根据协议和数据格式判断接收到的字节数组中是否包含完整的数据包, 如果包含了完整数据包则返回完据包的起始位置和长度. 或者当数据包有错误时丢掉该数据包或有问题部分的数据.

    如果字节数组中不包含完整的数据包, 直接返回 undefined 表示需要从客户端接收更多的数据.

    函数定义如下:
    cc5d7ef2-6526-44bb-ab5b-ac5363ddf1e0-image.png
    参数说明
    8def868c-efd1-421e-b002-07fa02a1b162-image.png
    返回值说明

    • 当字节数组中包含完整数据包时, 返回包含 package 字段的对象.
    • 如果字节数组中存在错误, 则返回包含 drop 字段的对象, 丢弃掉错误的数据.
    • 如果字节数组中即不包含完整的数据包也不存在错误, 直接返回 undefined, 表示需要从客户端接收更多的数据. | 参数名 | 参数类型 | 参数说明 | 示例值 | | ----------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------- | ---------------------------------------- | | package | object | 数据包信息, 如果要丢弃数据该字段不需要返回 | {"start": 0, "length": 128, "next": 129} | | start | 数值 | 数据包在 data | | 中的起始位置 | 4 表示第 5 个字节为数据包的起始位置 | | length | 数值 | 数据包的长度, 表示从 start | | 后多少个字节为一个完整的数据包 | start=4, length=128 表示从第 5 个字节开始(包括第 5 个字节)连续 128 个字节为一个完整的数据包 | | next | 数值 | 下一个数据包的起始位置 | 例如: 在使用 \r\n | | 作为数据包间的固定分隔符时, 下一个数据包的起始位置应该为 start + length + 2 | | drop | 数值 | 要丢弃的字节数量, 即丢弃字节数组中 data[0:drop] | | 内容 | 128 表示丢弃前 128 个字节. 一般用于数据包错误时丢弃掉错误的数据包场景 |

    正常接收数据
    当数据包拆分脚本返回以下内容时, 表示已接收到的数据中包含了完整的数据包. 该数据包在所有数据中的起始位置为 0, 长度为 128, 下一个数据包的起始位置为 129

    d890d8fe-8c5f-40e1-955e-68dc2200c3ff-image.png

    例如, 使用 \r\n 作为数据包间的分隔符, 以解析该数据时 {"a":1,"b":2}\r\n{"a":3,"b":4}\r\n, 拆分结果为 {"package":{"start":0,"length":13,"next":15}}. 此时, 数据处理脚本 中接收到的数据为 {"a":1,"b":2}, 并不会包含 \r\n, 而下一次数据拆分脚本接收到的数据为 {"a":3,"b":4}\r\n.

    包含错误或不完整数据包时
    返回以下内容时, 表示接收到的数据不完整, 需要丢弃 0 - 12 部分内容.
    d881ddb0-56d6-42eb-8a2a-0d4c4f39a4c7-image.png
    例如, 接收到的内容为 :1,"b":2}\r\n{"a":3,"b":4}\r\n 时, :1,"b":2}\r\n 为不完整的数据包需要丢弃, 则需要返回 {"drop":11}. 下一次数据拆分脚本接收到的数据为 {"a":3,"b":4}\r\n

    不包含完整的数据包和错误包时
    例如, 接收到的数据为 {"a":1, 未找到分隔符 \r\n, 此时返回 undefined 表示需要接收更多的数据. 当客户端发送 "b":2}\r\n{"a":3,"b":4}\r\n 数据时, 会再次调用 数据包拆分脚本, 此时 Buffer 中的数据为 {"a":1,"b":2}\r\n{"a":3,"b":4}\r\n, 此时可以提取出完整的数据包.

    注: 如果返回结果中同时包含了 drop 和 package 字段并且 drop 的值大于 0 时, 只做丢弃数据处理.

    示例
    b060a3cd-b68d-4ef4-b13f-0a1cd53df663-image.png
    驱动内置数据包拆包函数

    • 固定长度头 该函数会取前 N 个字节作为长度信息, 然后根据长度信息读取主体内容. +--------+-----------+ | Length | Data | +--------+-----------+

    在数据包拆分脚本中直接使用内置的拆分函数, 如下所示:
    c1abdf26-065a-440c-8185-6617af1c22fd-image.png

    • 固定分隔符 该函数会使用固定分隔符拆分数据包. 使用方式如下所示:

    c1f4931b-5cb3-4ce7-8927-3b404f01e96e-image.png

    • 固定开始和结束符 该函数会读取指定开始符和结束符之间的数据做为一个完整的数据包. 使用方式如下所示:

    384d4c7a-cea5-4fc6-8b4a-b797941c2bda-image.png

    数据处理脚本
    该脚本用于处理 数据包拆分脚本 函数解析得到的完整数据包, 根据协议和数据格式将数据包解析为平台定义的数据格式.

    函数定义如下:

    561aff23-f9e6-4b5b-853d-5f070ca6ab6c-image.png
    参数说明
    7bd38951-e2e8-4eae-be95-bb8667a2e8a2-image.png
    返回值
    91e01ec0-54f5-4048-8ed0-fddd77a53ef3-image.png

    注: 返回值必须为 **Object[]** 或 **undefined** 其中之一. 返回空数组表示未从接收到的数据中解析出有效数据, **undefined**表示无返回结果, 驱动程序无须处理返回结果. 例如: 接收到的数据为心跳数据, 不包含采集数据.
    

    示例
    6a5707d5-d8f3-4076-83d5-7510646c798b-image.png

    指令处理脚本

    该脚本用于将发送的指令内容转换为字节数组, 当向设备发送指令时, 驱动会将要发送的内容先经过 命令处理脚本 函数处理, 返回结果作为实际发送的内容.

    函数定义如下:

    ee9ca845-f803-4f3c-b752-e72d2219a635-image.png
    参数说明
    95822d23-8528-4a50-9781-eeaca41608bf-image.png
    指令格式如下:

    以 test 指令为例
    055bb6ec-a0b1-41bd-916f-838de4a11ac4-image.png

    04a32c43-ebf3-44bb-ade0-b3040ea54905-image.png

    注: ops.value 通常为实际发送的内容, 该字段为必填值. opts 为数组, 目前长度固定为 1.
    
    当要发送的数据内容比较复杂时, 可以先转发送内容转换为 base64 格式的字符串, 然后在在指令脚本中再进行 base64 解码后再发送.
    

    返回值说明

    必须值必须为 Buffer 对象.

    注: 可以使用 Buffer.from("this is a string"") 等方法创建 Buffer 对象. 关于 Buffer 的使用说明可以点击查看

    示例

    d580b020-a33b-4732-b58d-f4c171b1f0ab-image.png

    连接处理脚本
    当客户端连接到驱动或断开时, 会调用 连接处理脚本.

    函数定义如下:
    373a3ac8-6af6-434f-a237-61230a280d45-image.png
    参数说明
    e15c50c2-bd5e-4315-807c-b84f67015410-image.png

    返回值说明

    无返回值

    示例
    9e8dc912-0d9f-402b-aab8-aa06bae361ef-image.png

    设备与连接绑定关系说明
    设备与连接关系绑定, 主要用于向设备发送指令时, 驱动会根据该绑定关系确认通过哪个连接发送指令数据. 绑定关系的创建有以下两种:

    • 当协议中定义了设备注册功能时, 由 数据处理脚本 函数在接收到设备注册数据包时, 通过调用 client 中的 register 向驱动注册设备实现设备与连接折绑定.
    • 当协议中未定义设备注册功能时, 驱动会自动记录每个设备是由哪个连接上报实时数据的(设备每次上传实时数据时都会自动更新), 当驱动下发指令时, 会自动根据该信息向对应的连接发送指令数据.
    注: 如果通过 **register** 函数注册了设备时, 会忽略根据实时数据建立的绑定关系. 如果协议中未定义设备注册功能并且设备未上报过实时数据时, 无法通过实时数据建立绑定关系, 此时无法向该设备发送数据
    

  • 设备接入-海康isc视频驱动设备接入
    guangdaG guangda

    1.平台配置说明:
    驱动市场安装,添加设备表在设备配置中,选择已安装的isc视频驱动,配置内容,再添加设备,1个设备对应一个摄像头。appKey和appSecret获取方式如下文介绍。
    57cc109c-4b9e-4a17-8ca9-71fc988561a4-image.png

    f0e4e68d-8f0f-4536-a862-222093678ec1-image.png

    2.isc平台配置如下
    1)首先登录iSC,进入系统管理。
    2d45749c-84b6-4940-86a3-47b772f6282e-image.png
    2)按照iSC平台使用说明,在平台中添加编码设备和监控点。可以看到ip和端口号。
    29129142-1e87-4a08-b611-0fb990fb83fe-image.png

    3)登入iSC管理页面,在状态监控页面左侧,点击API网关,点击API管理,进入API网关管理页面,在网关管理页面点击左侧合作方管理,点击右侧对内合作方,即可查看合作方Key和Secret。
    a1e697fc-47eb-42b9-9294-5795ee85bbc5-image.png
    e0347445-ab11-4d00-b44c-7fb4f4cface1-image.png
    b4d19218-faaa-45d0-a33b-ae21e6595684-image.png
    234762b5-106e-4422-b26e-a20ab3fc9acd-image.png
    3.添加完信息内容,重启驱动,添加画面-视频组件-选择isc设备查看对应视频画面。


  • 设备接入-OPCDA驱动设备接入
    guangdaG guangda

    平台驱动配置说明

    驱动配置决定驱动如何连接 OPCDA 服务器,数据点配置决定驱动从 OPCDA 服务器上读取哪些数据。

    如何测试

    • 1.安装驱动,安装完成后在选择设备驱动时可以看到 opcda。没有驱动授权时也可以添加少量数据点做测试。
    • 2.创建一个模型,设备驱动选择 opcda。创建一个属于该模型的资产。
    • 3.参考驱动配置一节,配置模型中的驱动配置。
    • 4.参考数据点配置一节,在模型中添加一个状态正常的数据点。
    • 5.保存配置,点击重启驱动。
    • 6.在模型的数据点的下拉框中选择第 2 步创建的资产,查看是否有数据。

    一、驱动配置

    1、前提:DCOM 配置
    opc 经典协议基于 windows 的 COM/DCOM 技术,所以需要对此进行配置。可以参考:

    • OPC和DCOM配置
    • kepware: Quick Start Guide Remote OPC DA (DCOM)

    2、打开设备表管理,切换到设备配置,选择OPCDA驱动程序。
    4771e90a-8b70-47b6-81d7-193f8486e841-image.png
    参数说明

    • IP: OPCDA 服务器所在计算机的 IP 地址
    • 计算机名(Domain): OPCDA 服务器所在计算机的计算机名
    • progId: opc 程序名
    • clsid:组件id,不填时自动获取(非必填)
    • 用户名: 拥有 DCOM 权限的 windows 用户的用户名(DCOM 配置时需要给一个用户 DCOM 权限)
    • 密码: 上述用户的密码
    • 采集周期参数决定了驱动将数据上传到平台的频率,默认为5s。
    OPCDA 驱动使用 IOPCSyncIO 接口读取数据,每个资产下的数据点属于同一个 Group
    

    获取计算机名
    方法一:控制面板 -> 系统和安全 -> 系统 -> 设备名称
    方法二:命令行 -> hostname命令
    方法三:文件管理器 -> 此电脑 -> 属性 -> 设备名称

    获取 progId
    progId 一般是由几段字符串(有字母或数字)通过“.”拼接而成, 一般可以在 OPCDA 服务器界面看到。如果没法找到则需要通过第三方客户端找。

    第三方客户端都需要通过 OPCEnum 服务获取当前计算机上运行的 opc 服务器,需要确保 OPCEnum 服务运行。 任务管理器 -> 服务 -> OPCEnum

    获取 clsid
    clsid 至于 progId 有关(同一款 opcda 服务器装在不同的电脑上,clsid 应该是一样的)。不配置 clsid 时,驱动会使用 windows 的服务根据 progId 获取 clsid,配置时使用配置 clsid。

    • 通过注册表获取
      在运行 OPCDA 服务器的机器上打开注册表,在 HKEY_CLASSES_ROOT 子目录下找到 progId 对应的条目(与 progId 完全一致)。点击 CLSID 目录,双击属性即可复制,注意不要复制两侧的括号。
    Matrikon.OPC.Simulation.1 -> F8582CF2-88FB-11D0-B850-00C0F0104305 Kepware.KEPServerEX.V6 -> 7BC0CC8E-482C-47CA-ABDC-0FE7F9C6E729
    
    • 通过第三方客户端获取
      部分第三方 OPC 客户端(比如 Matrikon explorer)在连接后可以在服务器属性中看到 clsid。

    示例
    ea63a6e8-abf5-4f9c-887d-59e8dbe02acb-image.png

    二、数据点配置

    OPCDA的itemId在OPC server中是唯一不重复的。 通过驱动扫点方式快速添加OPCDA数据点。
    3a9be713-85ed-44a7-97eb-015812c4cbcf-image.png
    7f6ee66b-b863-42b7-b26b-925fdd02d519-image.png
    59cc69b8-61af-4138-93e2-894e24970e7f-image.png
    5cfc925e-b049-4db0-8b4c-83da007d9336-image.png

    三、指令配置

    配置指令时必填 ItemId,注意此时必须填写全部 ItemId(Item 前缀无效)。
    每个资产有一个公共 group 用来写入(且与读数时的 group 不同),因此不用配置 group。
    687b614e-f02b-407f-8c87-315fcbc5e41c-image.png

    常见问题

    启动问题需要通过容器日志查看,由于 opcda 造成的问题一般会有一个错误码
    

    opcda 错误码: 0x80010111
    windows 版本过新造成的问题。

    • windows + R
    • winver
    • 查看版本号,大于等于2004(个人电脑2020-05-27发布,服务器2020-06-26发布)则属于版本过新

    配置文件

    配置文件修改后必须重启容器或者进程才能生效。

    驱动是多个 OPCDA 客户端的集合。驱动的配置文件作用于驱动连接的所有服务器,不限制于某个设备表。

    • client.checkInterval: 检查重连的间隔(以秒记),默认 60

  • 设备接入-OPCUA驱动设备接入
    guangdaG guangda

    OPCUA客户端平台配置说明

    驱动配置决定驱动如何连接 OPCUA 服务器,数据点配置决定驱动从 OPCUA 服务器上读取哪些数据。

    一、如何测试

    • 1.安装驱动,安装完成后在选择设备驱动时可以看到 opcua。没有驱动授权时也可以添加少量数据点做测试。
    • 2.创建一个模型,设备驱动选择 opcua。创建一个属于该模型的资产。
    • 3.参考驱动配置一节,配置模型中的驱动配置。
    • 4.参考数据点配置一节,在模型中添加一个状态正常的数据点。
    • 5.保存配置,点击重启驱动。
    • 6.在模型的数据点的下拉框中选择第 2 步创建的资产,查看是否有数据。

    二、驱动配置说明

    跟连接 OPCUA 服务器相关的配置有以下五项(前三项为必填项),这些信息一般从 OPCUA 服务器的配置页面上可以找到,简要说明如下:

    • OPC主机URL:包含了 OPCUA 服务器的 ip 地址(也可以是域名或者计算机名)和端口。请确保驱动运行的服务器可以 ping 通 OPCUA 服务器的地址,并且 OPCUA 服务器的端口没有被占用。
    • 安全模式:连接 OPCUA 服务器时的认证方式。有None,Sign ,和Sign&Encrypt三种,分别对应匿名登录,签名验证和签名与加密认证(不同厂商的翻译可能不同)。局域网环境通常允许匿名登录,不允许匿名登录时需要在驱动配置中填写用户名和密码。
    • 安全策略:证书加密方式。驱动支持选择None,Basic128Rsa15 ,Basic256,和Basic256Sha256四种中的一种,OPCUA 服务器会支持若干种安全策略。当安全模式是None时安全策略也是None。
    • 用户名:非匿名登录时可能需要填写。
    • 密码:非匿名登录时可能需要填写。
      采集周期参数决定了驱动将数据上传到平台的频率,由于驱动是通过订阅的方式更新数据的,缩短采集周期并不会增加 OPCUA 服务器的负载。
    除了采集周期外,OPCUA 服务器上的数据更新后平台上的数据多快更新还取决于 OPCUA 服务器采集实际设备的周期和推送数据更新信息的最小周期。这两个参数可以在驱动的配置文件配置中配置,但是实际的周期由 OPCUA 服务器根据自身能力决定。
    

    示例
    以KEPSevrer为例。版本为 V6.4 321.0。

    匿名登录
    此时支持匿名登录。
    f1fae8f6-bfbc-46c0-8682-8113b385b6a1-image.png
    驱动配置如下:
    eaf12e2f-216e-4336-bc9b-23642a63f6b2-image.png
    非匿名登录
    此时不能匿名登录。注意 KEPServer 支持两种加密方法(对应驱动的安全策略),勾选的加密方法后可以在下拉框中三选一(选择项对应驱动的安全模式)。

    KEPServer 安全策略下拉框选项与驱动的安全模式的对应关系如下,需要注意在测试使用的版本中“签名与加密”比“签名;签名与加密”覆盖的范围更广。
    44e3e407-4947-4eff-b2ff-dff0333c2715-image.png

    增加和修改端点后,需要重启运行时后才能生效。方法为右键点击托盘中的 KEPServer 的绿色小图标,选择“重新初始化”。
    

    f3d0406e-9cbf-46a4-a1ea-1f28cb3f2165-image.png
    根据上述配置,驱动的安全策略和安全模式有2*2=4种有效的组合,以下为其中一种有效配置:
    d874dec3-6ef6-456c-9eed-65669e06efc7-image.png
    当第一次运行驱动时候,需要在 OPCUA 服务器的配置界面添加证书。

    驱动启动或者重启后,刷新受信任的客户端页面,会看到一个名为HTKJ Client的客户端。如果前面没有红叉,则无需做任何操作;如果前有个红叉,右键选择证书,点击信任。等待一段时间即可(驱动会自动重连)。
    365a0c1c-654c-40cc-87da-eabad16b8171-image.png

    三、数据点配置说明

    每个数据点有 3 个 OPCUA 相关的必填配置:

    • 命名空间(NamespaceIndex):整数,0 是 OPCUA 服务器的配置。KEPServer 上的数据点的命名空间一般是 2。
    • 数据点ID(identifier):字符串。一般不同层级之间用一个分隔符分开。
    • 数据类型:实际没有影响,随便选一个就可以。
      数据点的名称和标识只跟平台功能相关,与 OPCUA 无关。

    示例
    需要第三方 OPCUA 客户端Ua Expert,请自行下载。

    首先使用 UaExpert 连接上 OPCUA 服务器,配置与上一节类似(可以参考)

    连接成功后,可以左侧看到一组多级目录(结构类似于下图),在目录中找到一个有效的数据点(图标为标签)。
    51cc3318-ce14-48f6-a2a4-b57c07c2ce5b-image.png
    单击标签页,看右侧的 NamespaceIndex 和 identifier。
    b07b8334-86a7-4fa0-9cca-68da21d2e535-image.png
    在平台上,添加数据点,命名空间写 UaExpert 中 NamespaceIndex 对应的数值,数据点ID写 Identifier 对应的值。注意符号和大小写。

    OPCUA 数据点的状态码不是 Good 时,驱动不会上传这个数据。
    

    b805b2b6-16b3-4668-b191-349ae3862ba5-image.png
    添加大量数据点时推荐使用数据点导入功能。

    尽管 OPCUA 的数据点ID没有格式限制,但是实际上数据点ID由几段字符串拼接而成(与 OPCDA 相似)。比如上图中 OPCUA 服务器上的数据点实际上是在设备 Sim 的通道 dev1 下。
    

    ebbfe8a7-b17e-4de6-bc75-98ccf5e77ac6-image.png

    常见问题

    1.如果驱动运行时实际设备掉线会发生什么

    如果实际设备(如 PLC)掉线,一般 OPCUA 上的数据点的状态码会不正常(不是 Good)。此时驱动会发现数据点状态码的变化(前提是驱动中添加了这个数据点),之后不再向平台推送这个数据点的数据(不影响其他数据的推送),直到数据点的状态码变为 Good。

    2.可以采集哪些数据类型
    布尔型转为0和1,字符串类型(包含ByteString)保存为字符串,日期转化为长整型(毫秒级Unix时间戳),数值类型不做处理。

    3.证书如何生成
    驱动会自动生成证书,证书可以多次使用或导出(在与 jar 包同级的 cert 目录下)。暂不支持导入预先生成的证书。

    4.避免多次信任证书
    一般当安全策略和安全模式不是 None,则需要在 OPCUA 服务器上信任证书。而当容器删除后(比如升级驱动)证书会重新创建,则需要在 OPCUA 服务器上重新信任。可以通过持久化证书的方式解决这个问题(不要改文件名)。

    • 1)正常运行驱动,并在 OPCUA 服务器上信任证书
    • 2)信任后驱动可以正常上数
    • 3)登上服务器,将容器中的 cert 目录拷贝到本地
      • 假设拷贝到 /home/app/ua 目录下,opcua 容器的驱动名是 opcua
      • mkdir -p /home/app/uacert
      • docker cp opcua:/app/cert /home/app/ua
      • 此时 /home/app/ua 下会有一个 cert 目录,里面有一个证书(没有说明没上数)
    • 4)在运维平台中将证书挂载
      • 找到服务,点击修改,增加数据卷
      • 容器:/app/cert,主机:/home/app/ua/cert,模式:bind
      • 保存后会重启驱动
    • 5)也可以直接修改 docker-compose文件
      在 windows 平台中,证书在驱动对应目录的 cert 子目录中,直接保存文件即可。以后更新版本后,在驱动运行前将保存的文件拷贝到 cert 子目录中。

    5.不上数了,怎么排查

    很多原因都能导致不上数,建议按照如下顺序进行排查:

    • OPCUA 驱动服务是否在运行
      • 列表平台后台首页左侧导航栏中找到系统操作,在驱动中是否有 OPCUA 驱动
    • 驱动配置和数据点配置是否无误
    • OPCUA 服务器是否正常工作
      • 用 UaExpert 能否连接到服务器
      • OPCUA 的端口是否被占用
    • 运行平台的服务器能否 ping 通 OPCUA 服务器
    • 驱动容器能否 ping 通 OPCUA 服务器

    配置文件
    配置文件尽量不要自行修改。修改后必须重启容器或者进程才能生效。

    驱动是多个 OPCUA 客户端的集合。驱动的配置文件作用于驱动连接的所有服务器,不限制于某个模型或资产。

    batchSize 的最大值,publishInterval 和 samplingInterval 的最小值由 OPCUA 服务器决定,需要通过 OPCUA 服务器的管理软件查看

    • client.readMode: 读取数据的模式,分为 subscribe(订阅)和 direct(直接读取)两种。默认 subscribe,尽量不要使用 direct 模式。
    • client.batchSize: 每个订阅包含的最大 NodeID 数量。整数,默认100。仅在订阅模式有效。
    • client.publishInterval: 客户端希望服务器执行订阅的周期(秒),实际上的周期由服务器决定。小数,默认0.5,即周期为0.5*1000=500ms。仅在订阅模式有效。
    • client.samplingInterval: 服务器对 MonitoredItems 的采样周期(秒)。小数,默认1.0,即周期为1.0*1000=1000ms。仅在订阅模式有效。
    • client.maxPendingPublishRequests: 客户端 publishRequests 队列的长度,如果订阅模式时服务器总报Bad_TooManyPublishRequests,则要将这个值降低。整数,默认10。如果配置文件中的这个值<0,则实际的maxPendingPublishRequests=所有连接这台服务器的资产的数据点的不重复的NodeId数量/batchSize + 1,比如一个客户端需要订阅590个不同的Node,batchSize为100,则maxPendingPublishRequests=590/100 + 1=5+1=6.
    • client.autoReconnect: 驱动运行一段时间后自动断开所有 opcua 客户端并重连(不断开驱动与平台的连接)。格式为XhYmZs,即X小时加Y分钟加Z秒(例:24h=24小时,1h30m=90分钟)。从配置文件中解析出来的时间不超过10分钟时不启用此功能。
    • client.replaceURL:是否替换 endPointURL ,默认为false。客户端连接 OPCUA 服务器时,会先根据配置的 endpointURL 获取对应设备上的所有 OPCUA 服务器的信息(其中包含另一个 endpointURL ),然后再通过条件筛选出一台 OPCUA 服务器,最后使用服务器返回的信息配置客户端并连通。当平台上配置的 endpointURL 是代理的地址时,返回的服务器信息中的URL可能仍会是内网地址。将这个选项设置为true时,会在检测到两个 enpointURL 不一致时将最终客户端配置的URL替换为平台配置的URL。

  • 设备接入-TCP客户端设备接入
    guangdaG guangda
    一.TCP客户端驱动说明

    该驱动每个模型可以配置一个服务器地址或为为每个设备单独配置一个服务器地址, 同一模型内服务器地址相同的设备将会使用同一个 TCP 连接(如果模型内所有设备都未配置服务器地址, 则该模型内的所有设备共用同一个连接).
    驱动启动后, 每个模型都会主动与服务端建立连接, 然后接收服务端的数据.

    1.当模型没有添加任何设备时, 该模型不会与服务器建立连接.
    2.即使多个模型连接同一服务器, 也会为每个模型会创建一个独立的连接.
    
    二.驱动脚本执行流程说明

    以下处理流程以模型为单位, 多个模型之间独立执行, 互不影响.

    • 当与服务器成功建立连接后, 会执行 连接处理脚本, 此时 state 参数的值为 true.
    • 当接收到服务端发送的数据时, 会读取所有的发送数据并存放到 Buffer 中, 然后调用 数据包拆分脚本.
    • 如果从已接收到的数据中拆分出完整的数据包,则将完整的数据包封装为 Buffer 交由 数据处理脚本.
    • 如果未从已接收到的数据中拆分出完整的数据包, 则根据 数据包拆分脚本 返回的数据决定是等待接收更多的数据或是丢弃部分数据.
    • 当连接断开时, 会执行 连接处理脚本, 此时 state 参数的值为 false.
    三.客户端对象

    客户端对象为当前 TCP 连接对象. 该对象除了提供与服务器通讯的功能外, 并且供一些常用的功能用于简化使用,提高效率.

    在 数据包拆分脚本, 数据处理脚本, 指令处理脚本 和 连接处理脚本 函数的参数中提供了 client 对象参数, 在脚本中可以通过使用 client 中提供的函数完成数据的发送与采集.

    该对象提供了以下函数:

    • 与服务器交互:send(data) 向服务端发送数据
    • 指令相关:reportCommand(serialNo,table,deviceId,state,result) 向平台上报指令执行结果
    • 媒体库(未实现):
      • getMediaFile(path) 请求媒体库文件
      • getMediaFileByURL(url) 请求媒体库文件
      • uploadMediaFile(filename,catalog,action,data) 上传文件到媒体库
      • deleteMediaFile(path) 删除媒体库文件
    • 工作表:
      • saveWorkTableRow(tableId, rowData) 向工作表中写入数据
      • updateWorkTableRow(tableId,query,rowData) 更新工作表数据(未实现)
      • updateWorkTableRowById(tableId,rowId,rowData) 根据记录标识更新工作表数据
    • 数据存储:
      • getContext(contextId) 获取数据上下文
      • removeContext(contextId) 删除数据上下文
      • getContextIds() 获取全部上下文标识
      • getDeviceContext(deviceId) 获取设备数据上下文
      • removeDeviceContext(deviceId) 删除设备上下文
      • getDeviceContextIds() 获取全部设备上下文标识**

    函数案例:

    ①向服务端发送数据

    用于向服务端发送数据. 例如: 在接收到数据时向服务端发送 ack 信息或发送心跳数据.

    2e83f276-3470-48a7-b110-633aa5abe6f2-image.png

    返回值
    string 或 undefined. 如果参数不正确(字节数组为空或空数组)或发送失败则返回 string 内容为错误说明, 如果发送成功则返回 undefined.

    47aa5264-b299-4dcc-99d9-5aae993019e9-image.png

    ②向平台上报指令执行结果

    上报指令执行结果. 有些场景指令的执行结果反馈是异步的, 在指令发送后, 过一段时间才会收到响应报文, 此时可以在接收到响应报文时通过 client.reportCommand(...) 方法上报指令执行结果. 通过该方法上报的结果信息可以在平台中 指令状态管理 页面中查看.
    4c549c42-58e0-436c-b0e2-eaa2bfd3ffb6-image.png

    1.serialNo 为平台在发送指令时生成, 会传入到指令处理脚本中, 当指令执行结果为异步反馈时, 可以将 serialNo 保存到设备上下文中,以便在后续 reportCommand 使用.
    
    2.参数中的 table 来自于 指令处理函数 的参数,当需要通过 reportCommand 上报自定义的命令执行结果信息时,需要在指令处理函数中保存相关参数信息以便后续使用.
    

    返回值

    string 或 undefined. 如果返回 undefined 则表示发送成功, 否则返回数据为错误原因.

    示例

    a7470be9-95c9-4242-b402-cfb0e89f43ea-image.png

    ③请求媒体库文件-路径

    请求媒体库文件

    参数说明
    5a61680c-87ad-4d38-ba6f-857f7287b28d-image.png
    返回值
    80eeca44-a1b5-443f-82f8-b7276c731b52-image.png
    示例
    b8390ade-b985-4b8d-b30c-b007464dd03d-image.png

    ④请求媒体库文件-URL

    请求媒体库文件

    参数说明
    f551a6a3-ebda-4579-ab55-0039099c9f20-image.png

    url 中 default 为项目ID, test 为目录, hello.txt 为文件名.
    

    返回值
    e05144b8-d10c-4073-92e9-2ccdd7def3f8-image.png
    示例
    ffe545a0-291f-401d-9331-e0b0dfaebf9b-image.png

    ⑤上传文件到媒体库

    上传文件到媒体库

    参数说明
    ab4e530f-7535-459b-acc1-b1a6e796eda4-image.png
    返回值
    09ba66d1-b1ac-497f-975e-4c3e4e2a53cd-image.png
    示例
    4839286f-1607-450f-9f6e-741425a49e01-image.png

    ⑥删除媒体库文件

    删除媒体库文件

    参数说明
    833355dc-83e2-4bda-8bc8-d40a25389b7f-image.png
    返回值
    02556d11-ae98-4abf-a9b8-7ff9614a65b1-image.png
    示例

    f0994a7a-04f5-4c6d-a25a-08014e77f8f0-image.png

    ⑦向工作表中写入数据

    向工作表写入一条数据

    参数说明
    de7d6000-8aee-4b6f-86a8-29497452f2ab-image.png

    rowData 对象中必须包含 id 字段, 并且该字段做为数据的唯一标识, 必须唯一.
    

    返回值
    363115df-8efb-4e88-a4e8-327f0cee13d5-image.png
    示例
    23637857-d045-4ced-8c1f-58b742bab137-image.png

    ⑧更新工作表数据

    更新工作表中的数据

    参数说明
    c0c81896-126a-4c2b-a1bb-47f0f83b867d-image.png
    返回值
    1d0a9bb6-296d-4c2c-bafb-452ba6b750d1-image.png
    示例
    43aff785-a4dc-442d-8449-25f0b0160892-image.png

    ⑨根据记录标识更新工作表数据

    根据记录标识更新记录

    参数说明
    754b5b82-cd08-472c-b07d-faa7d46ca52a-image.png
    返回值
    c0500ef2-a4ca-446d-91dd-8ea74f8e3087-image.png
    示例
    d79d1d06-eba4-4ad3-a92f-e868b8c58215-image.png

    ⑩获取数据上下文

    用于获取上下文对象, 可以在上下文中存储数据. 详细信息

    第一次调用的时候才会创建上下文
    

    参数说明
    e58b9e0a-d59b-4402-ae88-2e9cee2628f4-image.png
    返回值

    Object. 数据上下文对象

    示例
    73942d5f-5fba-412d-817a-21597aca69a8-image.png

    ⑪删除数据上下文

    删除上下文对象

    参数说明
    4b86b123-fce2-4eed-864d-8edf50dfeebd-image.png
    返回值

    无

    示例

    3223d74b-5883-4cb1-8209-32af6a666c08-image.png

    ⑫获取全部上下文标识

    获取全部上下文标识(不包含设备上下文)

    参数说明

    无

    返回值

    String[]

    示例
    64f61af8-3391-4a32-b3c2-4c7f8cab2952-image.png

    ⑬获取设备数据上下文

    用于获取设备上下文对象, 使用设备标识作为上下文标识, 可以在上下文中存储数据. 详细信息

    与 getContext 不同的是, 当设备被删除后, 重启驱动时会自动清理被删除设备的上下文对象.

    第一次调用的时候才会创建上下文
    

    参数说明
    32481574-26bb-4f6a-bb3b-a67acee190b0-image.png
    返回值

    Object. 数据上下文对象

    示例

    a0396ade-ceb8-4d3f-a4e6-9a59e12e56db-image.png

    ⑭删除设备上下文

    删除设备上下文对象

    参数说明

    a4ef93df-91e4-4544-8250-2fed8fd6bbf3-image.png
    返回值

    无

    示例
    5d0e0839-0904-475a-a1c5-0af028efedbe-image.png

    ⑮获取全部设备上下文标识

    获取全部设备上下文标识(只包含设备上下文)

    参数说明

    无

    返回值

    String[]

    示例
    3f6291b2-e89c-4f27-8e0f-9e53aa929b22-image.png

    四.数据上下文

    上下文对象, 用来存储数据, 上下文中的数据可以在不同的脚本中共享. 例如: 可以在 指令处理脚本中 写入数据, 然后从 数据处理脚本 中读取数据. 不同上下文彼此独立, 互不影响.

    CAUTION
    可以根据需求创建多个上下文对象, 但是上下文对象以及上下文中的数据需要及时清理, 否则会造成 OOM 问题, 导致驱动程序崩溃.
    

    ①向上下文中保存数据
    用于向上下文中存储数据. 如果 key 已存在则会覆盖已有数据.

    参数说明
    ac49984f-2043-43bb-bb0f-ec240b7ea6f1-image.png

    返回值

    无

    示例
    e40c4580-7428-4ed5-b955-c716c1a7b65f-image.png

    ②判断上下文中是否包含指定数据

    判断上下文中是否存在指定的 key

    参数说明
    21e996fd-c280-49e7-ad4a-7fbd08107053-image.png

    返回值

    bool. true 表示 key 存在, false 表示 key 不存在

    示例
    ee1d0531-a242-4865-88b3-aeb4e03272ad-image.png

    ③获取数据
    从上下文中获取指定的 key 对应的数据. 如果 key 不存在则返回 undefined

    参数说明
    5531858d-c314-49fc-b9b5-b9a0c5b80841-image.png

    返回值

    any 或 undefined. 返回 put 时写入的数据.

    示例
    c335e7d2-c953-4eb7-8b43-b4d1fe10fd67-image.png

    ④获取并删除数据
    从上下文中获取指定的 key 对应的数据并且在返回后 删除 该 key. 如果 key 不存在则返回 undefined.

    TIP
    该函数返回后, 再使用 get 或 getAndRemove 均返回 undefined.
    

    参数说明

    6a5ed132-4e63-457d-9b73-dae9bb4fa92f-image.png

    返回值

    any 或 undefined. 返回 put 时写入的数据.

    示例
    bbf703ab-bc03-4369-a541-68930ef5fb21-image.png

    ⑤删除数据
    从上下文中删除指定的 key, 如果 key 不存在则不执行任何操作.

    参数说明
    d17bbca9-83e7-4252-b06c-b54d317b9d34-image.png

    返回值

    无

    示例
    be949d10-ed55-4896-b1f9-1d8ffd288ac1-image.png

    五.内置对象

    crc 循环冗余校验
    驱动中内置了 crc 对象, 可以在脚本中直接使用 crc 对象中的校验函数.

    • checksum16(Buffer,Poly) CRC-16循环冗余校验
    • checksum32(Buffer,Poly) CRC-32循环冗余校验
    • checksum64(Buffer,Poly) CRC-64循环冗余校验
    • checksumModbus(Buffer) CRC-Modbus循环冗余校验

    CRC-16循环冗余校验
    使用 checksum16(Buffer, Poly) 实现 16位 的循环冗余校验

    参数说明
    e192d261-b4e4-4423-b7c8-2f61daafc010-image.png

    返回值

    uint16. 16位无符号整型

    示例
    37a4f921-625f-4b90-84e0-6045dbacd01d-image.png

    CRC-32循环冗余校验
    使用 checksum32(Buffer, Poly) 实现 32位 的循环冗余校验

    参数说明
    484354e4-2f2d-4ea1-a880-e14f63e71553-image.png

    返回值

    uint32. 32位无符号整型

    示例
    91136ff6-d558-490d-9b8c-4c27be00cd49-image.png
    CRC-64循环冗余校验
    使用 checksum64(Buffer, Poly) 实现 64位 的循环校验码

    参数说明
    b18f3e9a-5eea-42aa-bead-f2b0c4ce14d9-image.png

    返回值

    uint64. 64位无符号整型

    1d6134f5-7ac5-4ca1-a7da-ab5736639bb2-image.png

    CRC-Modbus循环冗余校验
    使用 checksumModbus(Buffer) 实现 modbus 的循环校验码.

    modbus 校验与 crc16 相似, 校验码类型为 uint16. 另外, checksumModbus 不需要 poly 多项式参数.

    参数说明
    2fae34f8-4eee-4cf0-a6d2-3b4d80154086-image.png

    返回值

    uint16. 16位无符号整型

    003b957b-eef3-4669-a7b0-20d880464369-image.png

    六.内置函数

    数据包拆分函数

    • createFixedLengthSplitFn(Length,ByteOrder) 固定长度头
    • createDelimiterSplitFn(Delimiter) 固定分隔符
    • createStartEndDelimiterSplitFn(StartChars,EndChars) 固定开始和结束符
    TIP
    内置数据包拆分函数仅能用于 数据拆包脚本 中
    

    固定长度头

    该函数会取前 N 个字节作为长度信息, 然后根据长度信息读取主体内容.5205fa37-5d66-41fd-aa72-46e380f04fc0-image.png
    在数据包拆分脚本中直接使用内置的拆分函数, 如下所示:
    fe32014d-68db-4fbb-b677-74555ec0bfa6-image.png

    固定分隔符
    该函数会使用固定分隔符拆分数据包. 使用方式如下所示:
    482a7e59-890d-4948-8817-b40b585b976b-image.png

    CAUTION
    数据包内容中不能包含分隔符
    

    固定开始和结束符

    该函数会读取指定开始符和结束符之间的数据做为一个完整的数据包. 使用方式如下所示:
    6752e722-c50a-47ac-8e57-f66f6ea4ef2c-image.png

    INFO
    开始符 和 结束符 可以包含多个字符.
    
    CAUTION
    如果一个数据包中存在多个 开始符 或 结束符 时无法使用该内置函数.
    例如: 使用 @ 和 # 作为开始符和结束符时, 数据包主体部分不能包含 @ 和 #, 否则拆包结果不正确.
    
    七.脚本说明

    脚本语言: JavasScript ECMAScript 5.1

    驱动使用时要求提供 数据包拆分脚本, 数据处理脚本, 连接处理脚本 和 指令处理脚本 脚本函数来处理接收和发送数据过程中的协议和数据格式问题.

    在脚本的上下文中内置了 Buffer 包, 可用于处理接收或发送二进制数据.

    除此之外, 还内置了 lodash, crypto-js, moment, xml-js 和 formulajs(Excel函数) 包.

    TIP
    所有的脚本中的函数名必须为 handler, 参数列表参考各脚本说明.
    

    数据包拆分脚本

    该脚本用于处理接收数据过程中的半包和粘包问题, 该函数需要根据数据格式判断接收到的字节数组中是否包含完整的数据包, 如果包含了完整数据包则返回完据包的起始位置和长度. 或者当数据包有错误时丢掉该数据包或有问题部分的数据.

    如果字节数组中不包含完整的数据包, 直接返回 undefined 表示需要从客户端接收更多的数据.

    函数定义如下:
    e34d16f3-9ce2-4eef-8464-3d327ce4f4df-image.png

    TIP
    驱动内置了常用的数据包拆分函数. 详情
    

    参数说明
    447a1b40-8abc-4a8c-b46a-4ec169302501-image.png
    返回值说明

    • 当字节数组中包含完整数据包时, 返回包含 package 字段的对象.
    • 如果字节数组中存在错误, 则返回包含 drop 字段的对象, 丢弃掉错误的数据.
    • 如果字节数组中即不包含完整的数据包也不存在错误, 直接返回 undefined, 表示需要从客户端接收更多的数据.

    7df03e56-904c-4788-9bb5-2fda5b13389d-image.png
    正常接收数据
    当数据包拆分脚本返回以下内容时, 表示已接收到的数据中包含了完整的数据包. 该数据包在所有数据中的起始位置为 0, 长度为 128, 下一个数据包的起始位置为 129
    055c5868-51a9-436f-b49d-475951fa23a8-image.png
    例如, 使用 \r\n 作为数据包间的分隔符, 以解析该数据时 {"a":1,"b":2}\r\n{"a":3,"b":4}\r\n, 拆分结果为 {"package":{"start":0,"length":13,"next":15}}. 此时, 数据处理脚本 中接收到的数据为 {"a":1,"b":2}, 并不会包含 \r\n, 而下一次数据拆分脚本接收到的数据为 {"a":3,"b":4}\r\n.

    包含错误或不完整数据包时

    返回以下内容时, 表示接收到的数据不完整, 需要丢弃 0 - 12 部分内容.
    5a55ff91-0434-4da9-b52f-d37367058efe-image.png
    例如, 接收到的内容为 :1,"b":2}\r\n{"a":3,"b":4}\r\n 时, :1,"b":2}\r\n 为不完整的数据包需要丢弃, 则需要返回 {"drop":11}. 下一次数据拆分脚本接收到的数据为 {"a":3,"b":4}\r\n

    不包含完整的数据包和错误包时

    例如, 接收到的数据为 {"a":1, 未找到分隔符 \r\n, 此时返回 undefined 表示需要接收更多的数据. 当客户端发送 "b":2}\r\n{"a":3,"b":4}\r\n 数据时, 会再次调用 数据包拆分脚本, 此时 Buffer 中的数据为 {"a":1,"b":2}\r\n{"a":3,"b":4}\r\n, 此时可以提取出完整的数据包.

    注: 如果返回结果中同时包含了 drop 和 package 字段并且 drop 的值大于 0 时, 只做丢弃数据处理.
    

    示例
    8278710e-69ca-4288-a3e9-e1da4ee6ae10-image.png
    数据处理脚本
    该脚本用于处理 数据包拆分脚本 函数解析得到的完整数据包, 根据协议和数据格式将数据包解析为平台定义的数据格式.

    函数定义如下:
    65ecd20f-a293-463d-af94-78db1e2649af-image.png
    参数说明
    40222de5-43da-4a54-bf57-a88113646b52-image.png
    返回值
    9c26785a-d5f1-4c3b-bb2f-7ad7261ff51e-image.png

    注: 返回值必须为 Object[] 或 undefined 其中之一. 返回空数组表示未从接收到的数据中解析出有效数据, undefined 表示无返回结果, 驱动程序无须处理返回结果. 例如: 接收到的数据为心跳数据, 不包含采集数据.
    

    示例
    227fe9db-3b2f-4cbd-8eef-2d129db1191b-image.png
    指令处理脚本
    该脚本用于将发送的指令内容转换为字节数组, 当向设备发送指令时, 驱动会将要发送的内容先经过 命令处理脚本 函数处理, 返回结果作为实际发送的内容.

    函数定义如下:
    de9810d7-6f42-45f1-9a74-d810f16fcc88-image.png
    参数说明
    edc5ea1f-6900-4921-8f31-caffdc283456-image.png
    指令格式如下:

    以 test 指令为例
    ad6cc2bb-9178-41bd-9886-6af128c50824-image.png

    c5ea22f8-6275-4681-8fc8-c6a752a347d1-image.png

    注:ops.value 通常为实际发送的内容, 该字段为必填值. opts 为数组, 
    目前长度固定为 1.
    
    当要发送的数据内容比较复杂时, 可以先转发送内容转换为 base64 格式的字符串
    然后在在指令脚本中再进行 base64 解码后再发送.
    

    返回值说明

    必须值必须为 Buffer 对象.

    注: 可以使用 Buffer.from("this is a string"") 等方法创建 Buffer 对象. 关于 Buffer 的使用说明可以点击查看

    示例
    09cbe826-b845-4393-a005-04c16d9f5adf-image.png
    连接处理脚本
    当客户端连接到驱动或断开时, 会调用 连接处理脚本.

    函数定义如下:
    d33ac598-52e2-40b9-aad7-398e2a48fb59-image.png
    参数说明

    a354bccf-8845-4308-99ee-221e1fa0f6fe-image.png
    返回值说明

    无返回值

    示例
    b20a5fd0-152e-4e32-ac5d-62edf178456d-image.png
    定时器脚本
    用于周期性的执行一些操作. 例如: 定时发送心跳.

    函数定义如下:
    be89f3b6-9164-4d3f-a43b-06a7a06ba5d2-image.png
    参数说明
    108b2323-46d6-4575-94e7-0a571389fdf0-image.png
    返回值说明

    无返回值

    示例

    61376106-536a-4c1c-b102-ebb2ca048729-image.png
    示例
    假设某设备使用 TCP 上报数据, 并且上报的数据格式如下所示:
    22844246-7417-4aaa-9e60-8c65ca79d625-image.png


  • 折线图绑定数据
    guangdaG guangda

    我 现在看一下


  • 折线图绑定数据
    guangdaG guangda

    发一下 远程码把


  • 如果想实现多台服务器部署,并配置负载均衡,AIRIOT该如何部署,是否有成套方案
    guangdaG guangda

    您可以联系下客户经理 帮您解答


  • 普通表里的数据如何直接绑定到折线图中?
    guangdaG guangda

    可以设置数据源配置数据右侧的轮询时间


  • 设备接入-httpserver驱动设备接入
    guangdaG guangda

    日志如果报错提示 未填写数据处理脚本,指令处理脚本,需要修改脚本内容,不可全部删除,必须有 handler 这个函数。因为初始驱动实例中的脚本只是例子,不生效,需修改后才生效。
    image.png


  • 设备接入-httpserver驱动设备接入
    guangdaG guangda

    如果发送端配置的ip+端口号的端口是通过 3030 或 31000 端口,需要修改配置文件:
    1.需要在app目录下修改 docker-compose.yml 的配置,按照截图修改内容,并在请求的时候在请求头中加上项目的ID。(项目id是多空间版本的)
    2.找到 http server 的驱动,添加截图上写的内容,如果不需要校验 token 的话,就把 middleware=auth 那行给删掉就可以。发送端设备需要在请求的时候加上请求头 x-request-project 就可以

    86c2cfa34aa19d341e63c8f623ec705.png


  • 设备接入-httpserver驱动设备接入
    guangdaG guangda

    1.点击进入脚本案例
    2.平台配置:设备表配置信息
    77acdcff-ab76-4315-9f0b-f347423e0cfe-image.png
    1)发送数据端的ip和port 是平台的ip和httpserver驱动的port
    2)平台配置信息中的请求路径和发送端ports后面的保持一致即可,设备端往 url 上推送:比如填写的 /aaa/bbb
    推送的时候,url 就是 http://ip:port/aaa/bbb
    3)数据处理脚本可参考案例
    4)判断是否连接成功可以看下运维管理中httpserver的驱动日志

  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 最新
  • 标签
  • 热门
  • 用户
  • 群组