Skip to content

开始

这页复用 TCP 接入的开始说明,方便在“快速开始 -> 设备接入 -> TCP设备接入”这条路径下连续阅读。

1. 支持哪些设备?

平台支持通过 TCP 通信的各类设备接入,既包括 JT808DLT645Modbus RTU/TCP 这类常见协议设备,也包括厂商自定义的任何私有协议设备。

TCP 快速接入主线

第一次接 TCP,先按这 6 步走

01平台先具备 TCP 接入能力

开启 TCP 模块

配置 tcp.protocol.enabled=true,然后启动或重启平台。

02先把产品身份定下来

创建 TCP 产品

接入方式选择 TCP,并准备最小物模型与 ProductKey

03这一步才是真正开始监听端口。一款设备一个端口

创建网络组件

绑定产品,设置 hostportparserType,保存后启动。

04先解决“设备是谁、报文是什么、如何解析”

编写产品驱动

重点关注 decoderTypepreDecodedecodeencode

05确认是否设备文档支持的格式,如HEX

设备连接并发报文

让设备或调试工具连入平台,先打通第一条上行消息。

06验证数据和功能

验证完整闭环

确认属性入库、事件上报正常,再验证指令下发与响应。

2. 快速开始

第一步: 开启 TCP 模块

部署侧先确认配置已经打开,如application-prod.properties:

# TCP协议
tcp.protocol.enabled=true

改完后需要启动或重启平台,只改配置不重启不会生效。

第二步: 创建 TCP 产品

在产品管理里新建产品时,接入方式选择 TCP。第一次联调时,建议同时准备好下面几样东西:

create-product

第三步: 创建 TCP 网络组件并启动

这一层才是“设备到底连哪个地址和端口”。

你需要完成 4 个动作:

  1. 新建 TCP 网络组件。
  2. 绑定刚才创建的 TCP 产品。
  3. 配置 hostportparserType
  4. 保存后手动点一次“启动”。

这里最重要的一句是: 保存成功 不等于 已经监听,必须看到组件状态是 运行中 才行。

create-network

这里开启的是31183端口

create-port

第四步: TCP驱动编写!重要!

如果设备直接发的是平台标准格式,理论上可以少写很多脚本;但大多数 TCP 设备都是厂商自定义报文,所以通常至少要写下面 3 个函数:

  1. preDecode 解决“你是谁”。 先从原始报文里提取 deviceId,确定设备唯一性!
  2. decode 解决“你发了什么”。把设备上报解析成 物模型 属性、事件或响应。
  3. encode 解决“我要怎么回你”。平台下发的功能调用转成设备报文。

下面这个例子适合“自定义 HEX 报文”的入门联调:

javascript

var preDecode = (payload, context) => {
  var payloadHex = payload.toUpperCase();
  var result = {};

  if (payloadHex.length() >= 12 && payloadHex.substring(0, 4) === "A5A5") {
    result.deviceId = payloadHex.substring(4, 12);
  }
  return result;
};
//这里返回结果示例:{"deviceId":"abc123"}

var decode = (payload, context) => {
  var payloadHex = payload.toUpperCase();
  var result = [];
  var deviceId = payloadHex.substring(4, 12);
  var cmdCode = payloadHex.substring(12, 14);

  if (cmdCode === "01") {
    result.push({
      "messageType": "PROPERTIES",
      "deviceId": deviceId,
      "properties": {
        "raw": payloadHex
      }
    });
  }

  if (cmdCode === "02") {
    result.push({
      "messageType": "EVENT",
      "deviceId": deviceId,
      "event": "online",
      "data": {
        "raw": payloadHex
      }
    });
  }

  return jsonToStr(result);
};

var encode = payload => {
  var obj = toJson(payload);
  var deviceId = obj.data.deviceId;
  var state = obj.data.state;

  if (obj.function === "switch") {
    return ("A5A5" + deviceId + "03" + "02" + "01" + state + "5A5A").toUpperCase();
  }

  return "";
};

推荐开发顺序

不要一上来就写完整协议,最稳妥的顺序是:

  1. 先写 preDecode,确认能稳定拿到 deviceId
  2. 再写 decode,先把一条属性上报打通。
  3. 最后补 encode,验证指令下发。

codec

第六步: 配置驱动生效

qudong

第一次联调的建议顺序是: 先写通 preDecode,确认平台能认出设备;再写 decode;最后再做 encode

第七步: 让设备连进来,先跑通第一条报文

我们使用模拟器,以下面设备为例,确保啥运行中、绑定了端口和产品信息

codec2

我们用模拟器发送第一条消息:3B8E5D1F7A2C9046

pushData

查看日志

log