ctGateway网关与平台交互协议

2025.4.24 版本1

目录

ctGateway网关与平台交互协议... 1

2025.4.24 版本1. 1

1     概述... 3

1.1       总体说明... 3

1.2       基本数据格式... 3

1.3       数据序列... 3

1.4       压缩和加密... 3

2     协议... 4

2.1       通用类... 4

2.1.1        应答respond. 4

2.1.2        日志级别loglevel 4

2.1.3        设置超时overtime. 4

2.1.4        报告report 5

2.2       网关管理类... 5

2.2.1        网关发现... 5

2.2.2        网关注册reg. 5

2.2.3        未注册notreg. 6

2.2.4        上报状态state. 6

2.2.5        上报心跳hb. 8

2.2.6        上报故障report 8

2.2.7        固件升级fota(未实现)... 9

2.2.8        重置协议reset 9

2.2.9        指定配置conf 9

2.2.10      下发网络配置ip(尚未完全实现). 10

2.2.11      下发wifi配置wifi(未实现)... 11

2.2.12      下发北向平台连接配置connt 11

2.2.13      重启网关restart 11

2.2.14      重启程序reload. 11

2.2.15      文件列表List(隐藏功能)... 11

2.2.16      下载文件download(隐藏功能)... 12

2.2.17      上传文件upload(隐藏功能)... 12

2.2.18      Sudo(隐藏功能)... 13

2.2.19      Show(隐藏功能)... 13

2.2.20      启用压缩enablecompress. 13

2.2.21      启用加密enablecrypt 13

2.2.22      更新密钥(保密)... 14

2.3       数据操作类... 14

2.3.1        数据上报push. 14

2.3.2        重新采集acquire. 14

2.3.3        数据确认confirm... 14

2.3.4        请求重新上报missing. 14

2.3.5        平台写入点位write. 15

2.3.6        隧道协议写指令send. 15

2.4       特定协议类... 15

2.4.1        正在连接connecting. 15

2.4.2        连接失败connecting_failed. 15

2.4.3        连接成功connected. 15

3     安全措施... 16

3.1       忽略retain消息... 16

3.2       部分指令必须加密... 16

4     透传示例... 16

 


 

 

1     概述

1.1    总体说明

本文件是网关和平台的交互协议,首先在网关和网关管理工具上实现。

协议MQTT上实现,基于无连接的MQTT消息,消息为UTF-8编码的JSON数据结构(涉及到不同编码的在数据包内特别处理)。

       协议计划扩展到http和通用串行总线,仍保持同样的消息处理模式。

       协议包括设备管理和数据上报两个。

       设备管理包括网关注册、网关更新、网关配置、状态查询等功能。

       数据操作包括实时上报、历史上报、数据确认、数据写入等功能。

1.2    基本数据格式

       基本格式:

数据项

平台

功能

必填

说明

func

 

功能

 

ts

 

时间戳

 

数据包生成的时间戳

uid

 

唯一标识

 

唯一识别数据包

data

 

数据项

 

每个func的独特数据

 

1.3    数据序列

数据序列是网关上报的数据的序列,单调递增。网关注册时会报告起始数据序列值-1(相当于已经确认的数据的最大值,如果发生了数据丢弃,这个值表明这些数据已经不存在)。已经确认数据无法再次上报。

平台定时或定量向网关发送数据确认消息。如果平台长时间没有确认数据,网关可能丢弃部分数据或停止采集。

数据序列从1开始递增。

1.4    压缩和加密

普通数据为json格式。压缩数据则以大写字母“Z”开头,加密数据以大写字母“E”开头,先压缩后加密的数据则以大写字母“EZ”开头。

网关默认不压缩,默认不对reghbpush加密。

网关使用约定的密码加密其它上报数据。网关存在初始密码并可通过平台指令更改密码。

2     协议

2.1    通用类

2.1.1 应答respond

用于网关对平台下发的各种指令的应答,部分指令规定了专门的应答,通用和专用的应答平台都应该支持。

应答包格式:

Data

功能

必填

说明

func

功能

对应的下发指令的func

uid

唯一标识

对应的下发指令的uid

state

状态

0:失败 1:成功

error_code

错误码

 

如果失败,建议携带错误码

message

附加信息

 

可能是出错信息也可能是执行结果

{

  "func": "respond",

  "ts": 1706676012126,

  "uid": "1e0b8d3d86f28702bda02f6998897bdb",

  "data": {

    "func": "sudo",

    "uid": "请求包的uid",

    "state": 1,

    "error_code": 0,

    "message": ""

  }

}

2.1.2 日志级别loglevel

指定网关的日志级别。

Data

功能

必填

说明

loglevel

日志级别

0为正常,1为调试。仅对正在运行的程序有效,重启后失效。

调试用,网关无需应答。

2.1.3 设置超时overtime

设置平台下发指令的处理时间(某些指令可能导致死锁从而影响网关运行,如果发生因为处理时间限制而未能完成处理的情况可适当增大超时设置)。

Data

功能

必填

说明

overtime

超时时间(秒)

大于等于30

2.1.4 报告report

用于尚未正规化的信息上报。

Data

功能

必填

说明

interface_code

接口

 

相关的接口,未填则属于整体信息

device_code

设备

 

未填则属于整个接口

channel_code

通道

 

未填则属于整个设备

messsage

消息

信息文本

 

2.2    网关管理类

2.2.1 网关发现

网关上电时注册信息同时发送到专用topic"device_gateway/reg",此topic仅用来进行网关发现。

注册信息同reg

2.2.2 网关注册reg

由网关发起,向平台注册自身,汇报自身的序列号、硬件版本、软件版本。

平台返回注册成功或失败。

网关请求包格式:

Data

功能

必填

说明

sn

序列号

网关序列号IMEI

model

型号

 

硬件型号,5G网关、4G网关、wifi网关

sw_version

软件版本

网关程序的版本

iccid

SIM卡号

 

SIM卡号(如果有)

latitude

纬度

 

 

longitude

经度

 

 

key_seq

配置的密钥标识

 

 

current_key_seq

实际的密钥标识

 

 

data_sequence

数据序列

 

已确认的数据序列,这些数据已经在网关上丢弃,无法再次提供

 

uid

 

 

start_time

程序启动时间

 

程序的启动时间

uptime

系统启动时间

 

操作系统的启动时间

       平台应答包格式:

Data

功能

必填

说明

code

处理状态

0成功,1失败

2.2.3 未注册notreg

平台发起,平台认为网关需要注册时下发。网关可能必须先注册才能发送其它数据包(由平台决定),平台发送此数据包后可能会立即关闭网关的连接,也可能保持连接并丢弃所有非注册数据包。网关收到此数据包应立即重新注册或重新连接平台注册。

包格式:

Data

功能

必填

说明

 

 

 

data

{

  "func": "notreg",

  "sn": "ABCD1234567890"

}

2.2.4 上报状态state

平台现在为网关主动上报。2-配置轮询中 3-无配置 4-主板通信异常 5-点位读取异常

改为平台请求。

平台下发包格式:

Data

功能

必填

说明

 

 

 

data

{

  "func": "state"

}

网关上报包格式:

Data

功能

必填

说明

gw_state

网关状态

 

 

mobile_type

连接类型

 

5G/4G/Wifi

csq

信号强度

 

 

interface_state[]

设备状态

 

每个接口的状态

       Interface_state格式:

数据项

功能

必填

说明

interface_state

接口状态

 

已连接、未连接、连接失败

interface_code

接口名

 

 

device_state[]

设备状态

 

每个设备的状态,包含存在错误的设备

Device_state格式:

数据项

功能

必填

说明

device_state

设备状态

 

 

device_code

设备标识

 

channel_state[]

设备状态

 

每个通道的状态,包含存在错误的通道

       Channel_state格式:

数据项

功能

必填

说明

channel_state

通道状态

 

 

Channel_write_state

通道写入状态

 

 

channel_code

通道标识

 

{

  "func": "state",

  "ts": 1706681745689,

  "uid": "529a9d42abf8bc75b1fde02ec59e3d01",

  "data": {

    "gw_state": 0,

    "mobile_type": "5G",

    "csq": "27",

    "interface_state": [

      {

        "interface_code": "",

        "interface_state": 1,

        "device_state": [

          {

            "device_code": "device503",

            "device_state": 0,

            "channel_state": [

              {

                "channel_no": 0,

                "channel_code": "code1",

                "channel_name": "规格",

                "channel_state": 1,

                "channel_write_state": 0

              }

            ]

          }

        ]

      },

      {

        "interface_code": "",

        "interface_state": 2,

        "device_state": [

          {

            "device_code": "La1",

            "device_state": 0,

            "channel_state": [

              {

                "channel_no": 0,

                "channel_code": "0",

                "channel_name": "",

                "channel_state": 0,

                "channel_write_state": 0

              },

              {

                "channel_no": 1,

                "channel_code": "1",

                "channel_name": "testBit",

                "channel_state": 0,

                "channel_write_state": 0

              }

            ]

          }

        ]

      }

    ]

  }

}

2.2.5 上报心跳hb

网关主动上报。仅当一段时间内没有任何信息上报的时候发送。

无需特别数据。

{

  "func": "hb",

  "ts": 1706681046297,

  "uid": "58261d73bcbf864005185c4f814c9aa0",

  "data": {

    "hb": 1,

    "ts": 1706681046298,

  }

}

2.2.6 上报故障report

网关上报异常。

Data

功能

必填

说明

interface_code

接口

消息相关的网口或串口标识

device_code

设备

消息相关的设备标识

channel_code

通道

消息相关的通道标识

message

消息

消息内容

 

2.2.7 固件升级fota(未实现)

升级网关软件,由平台发起,提供一个下载链接。网关应答升级成功或失败。

2.2.8 重置协议reset

清除网关的协议配置,由平台发起,网关应答。

{"func":"reset","data":{"seq":"6a67acf6935040c4bf78384c9ce2d628"}}

网关程序下次启动时生效。

2.2.9 指定配置conf

数据结构:

Data

子项

功能

必填

说明

protocolCode

 

协议标识

 

interfaceCode

 

接口名称

串口名称,非串口协议可不填

resolvePropertyMap

 

接口参数

消息相关的通道标识

 

rate

采集频率

(非串口)

ip

 

 

port

 

 

(串口)

serial_port

串口名

 

不可与interfaceCode同时为空

baudRate

波特率

最高115200

parity

校验

N E O

dataBit

数据位

5 6 7 8

stopBit

停止位

1 2

timeout

响应时间

实际未用(库有问题)

confTabs[]

 

设备数组

见下表

       confTabs的每个数组成员:

confTabs []

子项

功能

必填

说明

deviceCode

 

设备标识

全局唯一

encodeType

 

编码类型

 

仅用于隧道协议,hex ascii

stationCode

 

从站号

 

仅用于非隧道协议

resolveParamConfigVOList[]

 

通道列表数组

 

paramCode

通道标识

 

 

paramName

通道名称

 

 

paramCommand

指令

 

仅用于隧道协议,并且隧道协议不使用后续所有字段

 

dataType

数据类型

自本字段以下仅适用于非隧道协议

 

paramAddr

地址

使用functionCode则基于0,使用zone(仅用于从csv配置)则基于1

 

functionCode

功能码

注意与PCL分区的关系

 

dataLength

数据长度

实际仅用于string类型

 

processType

读写类型

 

 

reportStrategy

上报类型

1-按采集频率上报 2-变化上报 3-监听上报(尚未支持) 4-条件上报(尚未支持) 5-依赖上报6-变化触发全量

 

transferRuleStr

字节序

 

ABCD AB 适用于所有数据类型包括string

 

associationParamCode

依赖的通道标识

 

用于依赖上报

       尚未规范化的特征:

平台

功能

必填

说明

zone

 

Plc分区

 

目前仅在csv中使用,使用此字段配置时地址基于1(网关执行时会自动修正指令)

collectorRate

 

采集频率或变化上报的变化百分比

 

目前仅在csv中使用,变化幅度超过此值才上报

charsetCode

 

字符串编码

 

目前仅在csv中使用,设备使用的编码,网关与平台交互始终是utf-8,但设备使用的编码可能是本地编码,如果设置了此值,网关会尝试做编码转换

 

2.2.10           下发网络配置ip(尚未完全实现)

平台下发,网关应答。

下发格式:

{"func":"ip","data":{"phyConnect":"a","ip":"b","gateway":"c","seq":"1706682377329","ts":1706682377329}}

       由于硬件差异,串口名和网卡名不确定,目前缺乏与平台的沟通机制,所以网关暂时只处理ipIP是点分格式+/24”。

       注意,由于网关是执行shell命令方式修改,网关应答成功并不一定表示操作成功。

       网关支持额外的选项:

Data

功能

必填

说明

operate

操作

add(默认)

del 删除

show 列出现有IP

 

2.2.11           下发wifi配置wifi(未实现)

平台下发,网关应答。

2.2.12           下发北向平台连接配置connt

       网关程序下次启动时生效。由于网关需要支持不同的平台,因此需要对协议做些修改。

Data

功能

必填

说明

comment

说明

 

 

type

连接类型

MQTT MQTTS

platform

平台代码

 

MQTTS必填,此值影响使用的证书

hostname

主机名

 

port

端口

 

userid

用户名

 

upwd

密码

 

 

2.2.13           重启网关restart

平台发起,重启网关。注意,此命令如果成功执行,可能收不到任何应答(因为网关已经重启)。

无需额外数据。

2.2.14           重启程序reload

重启程序,重新加载配置。

无需额外数据。

2.2.15           文件列表List(隐藏功能)

网关的可操作列表,目前功能是提供网关可供下载的文件列表。

平台下发格式(可以无data):

Data

功能

必填

说明

dir

目录

目录名,绝对路径或相对路径,默认为网关的工作路径

 

网关上报包含请求的uid以供识别。

Data

功能

必填

说明

file_list[]

文件名

文件列表

       file_list结构:

数据项

功能

必填

说明

file_name

文件名

 

is_dir

是否是目录

1:目录

file_size

文件长度

 

file_time

文件时间

最后修改时间

YYYY-MM-DD HH:MM:SS

file_checksum

文件校验和

MD5-16字节,HEX字符串

 

2.2.16           下载文件download(隐藏功能)

下载网关的文件。

平台请求格式:

Data

功能

必填

说明

file_name

文件名

文件名

dir

目录路径

 

相对或绝对

private_data

回送字段

 

在应答中原样回送,实际上是对应的本地路径

       网关应答:

Data

功能

必填

说明

file_name

文件名

 

file_size

文件长度

 

file_content

文件内容

Base64编码

file_time

文件修改时间

YYYY-MM-DD HH:MM:SS

private_data

回送字段

 

如果请求中存在,原样回送

content_start

开始位置

 

内容开始位置,如果是完整内容,不需要发送

content_length_

内容长度

 

必须和content_start一起发送

 

2.2.17           上传文件upload(隐藏功能)

上传文件。可能需要额外的认证。

Data

功能

必填

说明

file_name

文件名

 

dir

目录

 

相对或绝对路径

file_size

文件长度

 

file_content

文件内容

Base64编码

file_time

文件修改时间

YYYY-MM-DD HH:MM:SS

content_start

开始位置

 

内容开始位置,如果是完整内容,不需要发送

content_length_

内容长度

 

必须和content_start一起发送

file_checksum

文件校验和

 

MD5-16字节,HEX字符串

随最后一个分段发送

网关使用通用应答回复。最后一个应答会告知是否全部处理成功。如果文件校验失败,不会真正写入文件(如果分段到达顺序混乱则会失败)。

2.2.18           Sudo(隐藏功能)

执行控制台命令。

2.2.19           Show(隐藏功能)

显示内部数据。

2.2.20           启用压缩enablecompress

启用压缩(小数据包压缩后更长,所以依据实际效果选择),压缩的数据包第一个字符为’Z’,其后为base64编码的数据,数据通过zlib压缩:

数据项

 

 

Z(大写)

 

前导符,非压缩数据包总是以大括号开始

Base64数据

 

通过base64编码的下列数据

 

解压缩后长度

8字节,网关的字节序

 

压缩数据

使用zlib压缩的数据块(不是zip文件)

       下发此指令不需要其它数据。

2.2.21           启用加密enablecrypt

启用加密,所有数据都会加密传输(如果已经压缩则加密的数据为压缩之后的数据)。加密算法为AES256-CBC。默认控制类指令已经是加密的。

数据项

 

 

E(大写)

 

前导符

Base64数据

 

通过base64编码的下列数据

 

明文长度

8字节,网关的字节序

 

填充字节

8字节

 

初始IV

16字节

 

加密数据

16字节的倍数,最后一个块不足部分用0填充

       下发此指令不需要其它数据。

2.2.22           更新密钥(保密)

下发新密钥。网关已实现,由于配套设施尚未完成,暂不公开。

2.3    数据操作类

2.3.1 数据上报push

按照平台接口。

补充的数据:

Data数组项

含义

必填

说明

type

上报类型

1为全采,包含所有可读通道,0为其它

events

触发事件

 

事件被触发的通道代码,空格分隔:

关联上报的依赖的通道

变化全部上传的通道

注意,全采时不判断是否变化,不会有触发事件

ms

耗时

 

本次处理所用的时间,单位为毫秒

count

个数

上报数据的个数

 

2.3.2 重新采集acquire

无需额外数据。网关立即发起一次全部采集。

2.3.3 数据确认confirm

平台下发已经收到的数据序列号,网关收到后即可丢弃此序列号以及之前的所有数据。

Data

功能

必填

说明

data_sequence

数据序列

 

平台已经收到的最大数据序列

       网管使用通用应答回复处理状态。

2.3.4 请求重新上报missing

平台下发缺失的数据序列,网关重新发送。如果指定的数据序列不存在,网关将重新注册。如果数据存在,网关重新push

数据包格式:

Data

功能

必填

说明

data_sequence

数据序列

 

逗号分隔,短横线表示范围

范例:“2,6-10

 

2.3.5 平台写入点位write

平台请求,网关返回执行结果。

Data是一个数组,每个元素的属性如下:

Data

功能

必填

说明

deviceCode

设备标识

 

paramCode

点位标识

二选一

 

channelNo

通道编号

 

value

要写入的值

 

2.3.6 隧道协议写指令send

仅可用于隧道协议。

Data

功能

必填

说明

deviceCode

设备标识

 

dataValue

要写入的指令

编码必须和设备属性一致(hexascii

2.4    特定协议类

2.4.1 正在连接connecting

用于隧道协议报告连接状态。

2.4.2 连接失败connecting_failed

用于隧道协议。连接失败后网关自动重连存在时间间隔,可以发送reload指令重启程序(相当于快速重连)。

考虑到流量问题,此消息不再发送。

2.4.3 连接成功connected

用于隧道协议。连接成功后如果设备异常断开,网关可能无法知晓设备断开而无法自动重连,此时需要重启网关(发送reload重启程序即可)。

3     安全措施

3.1    忽略retain消息

Retain消息会被忽略(MQTT服务器仅在真正的遗嘱消息上标记retain,所以不影响正常发送的消息)。

3.2    部分指令必须加密

系统还原、文件传输、后台指令、修改密码必须加密(即必须知晓网关密钥)。

4     透传示例

透传支持:

设备配置增加encodeType,取值为hexstring

点位配置用于配置采集指令,增加paramCommand

 

配置示例:

    {

      "protocolCode": "TCP_TUNNEL",

      "protocolName": "TCP隧道协议",

      "resolvePropertyMap": {

        "ip": "192.168.136.1",

        "port": "503",

        "rate": "30000" ----------采集间隔,每条指令间隔为1秒(后续可用参数调整),多条指令之间会用一秒钟来接收数据

      },

      "confTabs": [

        {

          "deviceCode": "deviceTcpTunnel",

          "encodeType": "hex",

          "resolveParamConfigVOList": [

            {

              "paramCode": "read",----------任意

              "paramName": "0开始读取10个保持寄存器",---------任意

              "paramCommand": "00 06 00 00 00 06 01 03 00 00 00 0A"----------指令

            }

          ]

        }

      ]

    }

 

上报数据:

(此上报数据与上面的指令无关联!)

{

  "func": "push",

  "ts": 1710150390230,

  "uid": "270e27cb353752fd4bedc4f1f32d634f",

  "identify": 175,

  "data": [

    {

      "deviceCode": "tunnel",

      "dataValues": [

        {

          "paramCode": "tunnel",

          "paramName": "tunnel",

          "ts": 1710150390230,

          "val": "000600000017010314000A109AFFFE0000CDCC0C400000000000000000"-----------只有这个有意义,其余均无意义,编码与指令相同(同为hex或字符串)

        }

      ]

    }

  ]

}

 

 

 

(完)