Skip to content

NATS数据总线

云组态平台提供了向 Nats 消息中间件转发数据的功能。用户可以通过向 Nats 订阅,获取实时数据更新。

Nats 客户端 SDK 下载地址

参数名称说明默认值
ProjectID项目IDiotopo
ModelID设备模型ID
DeviceID设备ID
PointID点位ID

设备实时数据

消息主题:iot.platform.device.datas.{ProjectID}.{ModelID}.{DeviceID}.{PointID}

消息主题示例:

  • 订阅 mydevice_01 设备下的所有测点数据:iot.platform.device.datas.iotopo.*.mydevice_01.*
  • 订阅 mydevice_01 设备下的 t1 测点数据:iot.platform.device.datas.iotopo.*.mydevice_01.t1
  • 订阅 mymodel_01 模型下的所有设备测点数据:iot.platform.device.datas.iotopo.mymodel_01.*.*

消息体格式:

json
{
  "deviceID": "D01",
  "pointID": "P01",
  "value": 1,
  "quality": 0,
  "timestamp": 1655342160703,
  "tenantID": "iotopo",
  "projectID": "iotopo",
  "gatewayID": "G01"
}

Java 示例

javascript
package com.iotopo.topstack;

import io.nats.client.Connection;
import io.nats.client.Dispatcher;
import io.nats.client.Nats;
import io.nats.client.Subscription;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class DataConnector {
    public static void main(String[] args) {
        // 官方客户端地址:https://github.com/nats-io/nats.java
        try {
            Connection nc = Nats.connect("nats://127.0.0.1:4222");

            // 订阅全部实时数据
            Dispatcher d = nc.createDispatcher((msg) -> {
            });
            Subscription s = d.subscribe("iot.platform.device.datas.iotopo.>", (msg) -> {
                String response = new String(msg.getData(), StandardCharsets.UTF_8);
                System.out.println("Message received: " + response);
            });
            //s.unsubscribe(10);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

通道状态

topic:iot.platform.channel.state.{ProjectID}.{ChannelID}

json
{
  "deviceID": "D01",
  "pointID": "P01",
  "value": 1,
  "quality": 0,
  "timestamp": 1655342160703,
  "tenantID": "iotopo",
  "projectID": "iotopo",
  "gatewayID": "G01"
}

网关状态

topic:iot.platform.gateway.state.{ProjectID}.{GatewayID}

json
{
  "projectID": "iotopo",
  "gatewayID": "G01",
  "state": 1,  // 0: 离线, 1:在线
  "timestamp": 1655342160703
}

设备状态

topic:iot.platform.device.state.{ProjectID}.{DeviceID}

json
{
  "projectID": "iotopo",
  "gatewayID": "G01",
  "deviceID": "D01",
  "state": 1,  // 0: 离线, 1:在线
  "timestamp": 1655342160703
}

告警推送

topic:iot.platform.alert.{ProjectID}.{DeviceID}

json
{
    "id": "cak5i5te97ejrjko7qe0",
    "status": "handled", // unhandled/handled/ignored
    "createdAt": "2022-06-14T17:47:02.461192+08:00",
    "recoveredAt": null,
    "handledAt": "2022-06-14T17:47:09.123729+08:00",
    "handler": "admin",
    "orderCreated": true,
    "title": "告警标题",
    "content": "告警内容",
    "remark": "确认信息备注"
    "ruleTemplateID": "告警规则ID",
    "deviceID": "c",
    "pointID": "TEST",
    "mode": "property",
    "duration": 1,
    "inputValue": "111",
    "compareMode": ">",
    "compareValue": "2",
}

字段说明

名称类型说明
idstring告警记录标识
statusstring告警状态:unhandled/handled/ignored
createdAtstring告警发生时间,ISO8601 格式
recoveredAtstring告警解除时间,ISO8601 格式,空表示新产生的告警,不为空表示告警解除或者状态更新。
handledAtstring确认告警时间
handlerstring告警确认人
remarkstring确认信息备注
orderCreatedboolean是否创建工单
titlestring告警标题
contentstring告警内容
ruleTemplateIDstring告警规则ID
deviceIDstring设备标识
pointIDstring测点标识
inputValuestring告警值
durationnumber持续时长(秒)
modestring触发方式:point:单测点not_upload:长时间不上传not_change:长时间数据不变化offline:设备离线expression:表达式
compareModestring比较方式如下:>>=<<==!=区间内(between):测点值处于区间外时,触发告警。区间格式:(100, 200), [100,200]区间外(not_between):测点值处于区间内时,触发告警。数值偏差(diff):测点值与阈值的差值大于偏差值时,触发告警。
compareValuestring告警阈值
deadBandnumber死区值
diffnumber偏差值