[JAVA版] GBT 20999-2017 SDK 通讯协议工具 —— 3. 程序集成开发者项目的案例说明

ChinaGBT创始人
• 阅读 6

GBT 20999-2017 SDK 程序集成开发者项目的案例说明

索引

1. 简介

标准与协议基础

SDK-GBT20999-2017.jar是基于中国国家标准GB/T 20999-2017《交通信号控制机与上位机间的数据通信协议》设计开发的Java实现。该SDK严格遵循国标规定的通讯协议标准,为智能交通信号控制系统的上下位机通信提供了标准化解决方案。

技术架构与集成特性

作为TCP服务端实现,本SDK可与各类符合GB/T 20999-2017标准的下位机信号机(TCP客户端)建立稳定可靠的网络通信连接。其设计特点包括:
  ● 采用纯Java语言开发,具有良好的跨平台兼容性
  ● 可无缝集成到任何基于Java/JVM的技术栈项目中
  ● 提供简洁易用的API静态方法接口,开发者可直接调用

核心功能模块

1.​参数管理​:

  ● 支持信号机运行参数的查询与获取
  ● 提供参数设置与配置功能

2.​设备控制​:

  ● 实现信号机的远程控制指令下发
  ● 支持多种控制模式切换

3.​状态监控​:

  ● 实时获取信号机运行状态信息
  ● 处理下位机主动上报的状态变更信息

2. JAVA项目集成

ChinaGBT体系目前尚未提供Maven中央仓库支持,开发者需要通过官方渠道手动下载SDK-GBT20999-2017.jar核心包及配套的ChinaGBT框架工具包集合(包括协议解析工具、通信基础库、加解密组件等必要依赖),建议在项目中建立专用的lib目录统一管理这些依赖,并详细记录每个jar包的版本号、下载日期和校验信息以确保版本一致性。由于SDK深度依赖于ChinaGBT整体框架,集成时除了主SDK外还必须引入框架内的公共工具包(如UtilKit-10.0.jar),这些配套组件共同构成了完整的开发环境,为保障兼容性,建议严格遵循官方提供的依赖清单和版本匹配矩阵,同时建立规范的依赖管理机制,可通过构建工具配置本地仓库或使用系统范围变量指定依赖路径来实现项目间的统一管理。

2.1. Maven依赖

pom文件配置示例代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.chinagbt</groupId>
    <artifactId>DemoGBT20999-2017</artifactId>
    <version>1.0</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>

        <dependency>
            <groupId>org.chinagbt</groupId>
            <artifactId>SDK-GBT20999-2017</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/jar/SDK-GBT20999-2017-1.0.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>org.chinagbt</groupId>
            <artifactId>UtilKit</artifactId>
            <version>10.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/src/main/resources/jar/UtilKit-10.0.jar</systemPath>
        </dependency>

        <!-- hutool工具包 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.29</version>
        </dependency>

        <!-- netty -->
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.92.Final</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.57</version>
        </dependency>

        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.10.9.2</version>
        </dependency>

        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>4.4.0</version>
        </dependency>

        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.9.0</version>
        </dependency>

        <dependency>
            <groupId>org.dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>2.1.3</version>
        </dependency>

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.4</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.20.0</version>
        </dependency>

        <dependency>
            <groupId>com.github.oshi</groupId>
            <artifactId>oshi-core</artifactId>
            <version>6.6.4</version>
        </dependency>

        <!-- jaxen依赖 -->
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.2.0</version>
            <exclusions>
                <exclusion>
                    <groupId>xerces</groupId>
                    <artifactId>xercesImpl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.14.2</version>
        </dependency>

    </dependencies>

</project>

2.2. 资源配置文件

SDK程序所需要的资源配置文件并不多,其中包含:gbt20999_2017_sdkconfig.propertiesGBT20999Dict.jsonlog4j2.xml三个配置文件,详细还请开发者自行查看示例项目。
gbt20999_2017_sdkconfig.properties:配置文件,包含SDK程序运行时需要的参数。SDK程序配置类中有默认值,开发者可以使用配置文件覆盖默认值,也可以调用API的方法覆盖默认值。
GBT20999Dict.json:字典文件,包含GB/T 20999-2017标准中的所有字符。
log4j2.xml:日志配置文件,用于配置SDK程序运行时日志的输出位置、格式、级别等信息。

3. HelloWorld万事开头第一步

开发者自己的项目集成依赖SDK,只需要在自己项目服务启动时调用SDK的初始化方法即可。

3.1. SDK启动所需配置

SDK项目启动时,所需要的配置就是将SDK的配置类属性值初始化,并且在SDK程序运行中也支持动态修改。其本质就是对ConfigParam.java类里的静态变量进行赋值,以保证程序在正常运行时,可以获取到最新的配置参数。另外,就是加载国标文件中的定义字典数据,也是方便程序运行中使用。字典配置文件GBT20999Dict.json,这里的配置基本上是与国标文件一致,只是将国标文件里的数据转换成JSON格式,方便程序使用。

3.1.1. TCP监听端口号

SDK程序的TCP服务监听端口号默认是:20999,开发者可以通过配置文件gbt20999_2017_sdkconfig.properties或配置类或使用LoadConfig.java加载配置类进行修改。该端口号的静态变量位置在:ConfigParam.ConnectParam.TCP_SERVER_PORT处,开发者也可以直接修改。

3.1.2. 消息推送器数据接收类

SDK程序内置数据消息推送器机制,因为SDK是被你的程序依赖引入的,SDK程序是无法在SDK程序代码中调用你项目代码,所以使用了JAVA反射机制,将数据推回到你项目代码中。配置的位置在:ConfigParam.MsgParam.PUSH_CLASS_FULLPATHConfigParam.MsgParam.PUSH_METHOD_NAME这两个变量。这两个默认是配置了SDK内部的一个模拟接收类,开发者同样可以自行修改。

3.2. SDK启动代码示例

示例代码如下,详细可以查看Demo项目示例。

package org.chinagbt.demo.gbt209992017;

import cn.hutool.core.io.resource.ClassPathResource;
import com.alibaba.fastjson2.JSONArray;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.chinagbt.gbt209992017.api.GBT209992017API;
import org.chinagbt.gbt209992017.config.LoadConfig;
import org.chinagbt.gbt209992017.util.GBT20999DictUtil;

import java.io.InputStream;

/**
 * 恰同学少年,风华正茂;书生意气,挥斥方遒!
 *
 * @Author cuiyunpeng
 * @Date 2025/6/24 8:21
 * @Description 与HelloWorld遥相响应
 */
public class HelloWorld_GBT209992017_Main {

    public static void main(String[] args) throws Exception{
        yourWebListener();
    }

    /**
     * 模拟你的Web项目监听器,你的项目启动服务时,调用SDK启动TCP服务
     */
    public static void yourWebListener() {
        /*
         * 加载配置文件里的默认配置,属性配置文件里配置的参数,将会覆盖配置类ConfigParam.java里的参数。
         * 开发者还可以使用LoadConfig.autoLoadConfigParam的方法自行传递参数。将自己组装的Properties对象传递给该方法,通常在自己项目里,这些参数可以
         * 配置在数据库里,当你的项目启动时,从数据库获取到配置数据,封装组织成Properties对象,并调用该方法即可。
         */
        // 默认加载项目中的属性配置文件
        LoadConfig.load();
        // 自定义灵活配置
        //LoadConfig.autoLoadConfigParam(你的Properties对象);       // 本行的方法执行完会根据端口号是否发化变化自动调用启动TCP服务

        // 加载json文件中字典数据
        loadDictRootData();

        // 启动创建 TCP 服务
        GBT209992017API.startTCPServer();

        // 调用你项目中数据库配置数据初始SDK配置其它动作
        doOthers();
    }

    /**
     * 加载字典JSON数据
     */
    private static void loadDictRootData() {
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            // 加载你项目中resources下的GBT20999Dict.json文件
            ClassPathResource resource = new ClassPathResource("GBT20999Dict.json");
            InputStream inputStream = resource.getStream();
            JSONArray dictContent = objectMapper.readValue(inputStream, JSONArray.class);

            // SDK程序工具类中,加载字典内容数据
            GBT20999DictUtil.loadDictRootData(dictContent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 该方法是你自己项目中的启动时操作你数据库初始配置的方法
     */
    private static void doOthers() {

        // 初始化容器数据,你自己项目中应该有一套基于你自己数据库中设备数据对象容器
//        SigDeviceInfoContainer.init();

        // 初始SDK帧类型,厂家自定义
//        CustomFrameTypeService customFrameTypeService = SpringUtil.getBean(CustomFrameTypeService.class);
//        customFrameTypeService.reInitFrameType2SDK();
        /**
         * reInitFrameType2SDK方法示例代码:
         * 就是取你自己项目中的数据,自定帧类型数据集合
         * public void reInitFrameType2SDK() {
         *      List<CustomFrameType> dataList = getDataByWhere("");
         *      GBT209992017API.reFactoryCustomFrameType((JSONArray)JSON.toJSON(dataList));
         * }
         *
         * GBT209992017API.reFactoryCustomFrameType(JSONArray array)方法的数据格式如下:
         * 主要就是需要有【frameKey】、【keyDesc】这两个关键字段
         * 【frameKey】:表示帧类型码,开发者还是需要根据国标协议文档约定中而定义。
         * 【keyDesc】:表示帧类型码的描述值
         * [
         *     {
         *         "createRecordTime": "2024-11-26 10:20:11",
         *         "frameKey": 240,
         *         "id": "service_customframetype_20241126102011719_611a9c1ec1b5076b67bd3841784798e8",
         *         "keyDesc": "数据帧校验错误",
         *         "updateRecordTime": "2024-11-26 10:20:11"
         *     },
         *     {
         *         "createRecordTime": "2024-11-26 10:20:21",
         *         "frameKey": 241,
         *         "id": "service_customframetype_20241126102021268_429a96a8ef7bc00a35a40d5040d6e10a",
         *         "keyDesc": "帧头帧尾错误",
         *         "updateRecordTime": "2024-11-26 10:20:21"
         *     },
         *     {
         *         "createRecordTime": "2024-11-26 10:20:31",
         *         "frameKey": 242,
         *         "id": "service_customframetype_20241126102031361_9521d05383998ea42cbd1b7db4892963",
         *         "keyDesc": "长度错误",
         *         "updateRecordTime": "2024-11-26 10:20:31"
         *     },
         *     {
         *         "createRecordTime": "2024-11-26 10:20:46",
         *         "frameKey": 243,
         *         "id": "service_customframetype_20241126102046006_7f70f3ef08ee65cb1a4ba80983181ead",
         *         "keyDesc": "信号机ID错误",
         *         "updateRecordTime": "2024-11-26 10:20:46"
         *     },
         *     {
         *         "createRecordTime": "2024-11-26 10:20:59",
         *         "frameKey": 244,
         *         "id": "service_customframetype_20241126102059654_7c6919191d70ca261fd5247f0a3c9bf7",
         *         "keyDesc": "帧类型错误",
         *         "updateRecordTime": "2024-11-26 10:20:59"
         *     },
         *     {
         *         "createRecordTime": "2024-11-26 10:21:11",
         *         "frameKey": 245,
         *         "id": "service_customframetype_20241126102111906_312a25adbfe5ca19afd18af45f062ad7",
         *         "keyDesc": "帧值索引错误",
         *         "updateRecordTime": "2024-11-26 10:21:11"
         *     }
         * ]
         */





        // 初始SDK错误值状态,厂家自定义
//        CustomErrorStatusService customErrorStatusService = SpringUtil.getBean(CustomErrorStatusService.class);
//        customErrorStatusService.reInitErrorStatus2SDK();
        /**
         * reInitErrorStatus2SDK方法示例代码:
         * public void reInitErrorStatus2SDK() {
         *    List<CustomErrorStatus> dataList = getDataByWhere("");
         *    GBT209992017API.reFactoryCustomErrorStatus((JSONArray) JSON.toJSON(dataList));
         * }
         *
         * GBT209992017API.reFactoryCustomErrorStatus(JSONArray array)方法的数据格式如下:
         * 主要就是需要有【statusKey】、【keyDesc】这两个关键字段
         * 【statusKey】:表示状态码,开发者还是需要根据国标协议文档约定中而定义。
         * 【keyDesc】:表示状态码的描述值
         * [
         *     {
         *         "createRecordTime": "2025-04-11 20:04:48",
         *         "id": "service_customerrorstatus_20241126114618828_26841252c502baba80d7c4ef10375175",
         *         "keyDesc": "数据值总长度组成数据帧超出缓冲区大小",
         *         "statusKey": 240,
         *         "updateRecordTime": "2025-04-11 20:04:48"
         *     }
         * ]
         */





        // 初始SDK数据验证错误值状态,厂家自定义
//        CustomDbVerifyErrorStatusService customDbVerifyErrorStatusService = SpringUtil.getBean(CustomDbVerifyErrorStatusService.class);
//        customDbVerifyErrorStatusService.reDbVerifyErrorStatus2SDK();
        /**
         * reDbVerifyErrorStatus2SDK方法示例代码:
         *
         * public void reInitErrorStatus2SDK() {
         *      List<CustomErrorStatus> dataList = getDataByWhere("");
         *      GBT209992017API.reFactoryCustomErrorStatus((JSONArray) JSON.toJSON(dataList));
         * }
         *
         * GBT209992017API.reFactoryCustomErrorStatus(JSONArray array)方法的数据格式如下:
         * 主要就是需要有【dbVerifyError】、【dbVerifyErrorDesc】这两个关键字段
         * 【dbVerifyError】:表示审核状态码,开发者还是需要根据国标协议文档约定中而定义。
         * 【dbVerifyErrorDesc】:表示审核状态码的描述值
         * 示例数据:
         * [
         *     {
         *         "dbVerifyError": 0,
         *         "dbVerifyErrorDesc": "没有错误"
         *     },
         *     {
         *         "dbVerifyError": 1,
         *         "dbVerifyErrorDesc": "错误1"
         *     },
         * ]
         */
    }
}

这样,你的SDK程序就已经启动成功了,默认的TCP服务监听端口是:20999,如果开发者有下位信号机,可以连接到SDK程序上,看看是否可以连接成功。

3.3. Demo项目集成示例及项目下载

Demo示例目录结构如图: [JAVA版] GBT 20999-2017 SDK 通讯协议工具 —— 3. 程序集成开发者项目的案例说明

既然有程序示例代码,何必上面那么多废话。实惠一些,各位看官请看,Demo 示例下载地址链接:

Demo示例项目版本号 链接地址 内部关联程序版本
1.0.0 [百度网盘下载  提取码: 1234]    [蓝奏云网盘下载] SDK-GBT20999-2017.jar [版本1.0]    UtilKit.jar [版本10.0]

4. API方法使用示例

这一小节介绍ChinaGBT体系中SDK-GBT20999-2017程序对外提供的一些API方法使用示例。开发者的程序可以直接调用这些方法,完成数据处理。

4.1. 加载SDK配置参数

加载SDK程序配置参数,既可以在程序启动之前加载,也可以在程序运行过程中加载。其实本质上就是变更内存的数据而已。真正的内存工作类为:ConfigParam.java。加载类为:LoadConfig.java

方法名称 方法参数 方法描述 调用示例
load() 默认加载 resources/gbt20999_2017_sdkconfig.properties 属性配置文件。 LoadConfig.load();
load(String filePath) filePath : 属性文件路径 若开发者还有其它自定义文件,可以单独传入文件路径即可。 LoadConfig.load("你的自定义属性文件路径");
autoLoadConfigParam(Properties prop) prop : 属性配置对象 开发者可以自定义属性对象,传入该方法也可以,属性的key值要与SDK配置类或属性文件中的变量一一对应。 该方法可以在开发者自己项目中,将配置持久化,服务启动时读取数据封装属性对象后,调用此方法即可实现动态配置的效果。【推荐开发者使用】 LoadConfig.autoLoadConfigParam(prop);

4.2. 加载SDK标准字典

SDK程序内置了标准文档中约定声明的字典数据。笔者已经将其封装在了resources/GBT20999Dict.json文件中,请自行加载,工具类为:GBT20999DictUtil.java。并且针对使用字典,笔者也设计了获取字典值的工具方法。

方法名称 方法参数
返回值
方法描述 调用示例
loadDictRootData(JSONArray dictContent) dictContent : 字典的JSON格式对象。 void 开发者可自行查看GBT20999Dict.json文件。 GBT20999DictUtil.loadDictRootData(dictContent);
getDictValue(String typeCode , String stdCode) typeCode : 类型编码值。
stdCode : 数据值编码。
String 获取字典显示或描述信息值(平时看得懂的信息)。 GBT20999DictUtil.getDictValue("ALARMTYPE" , "96"); 表示获取报警类型下数据码是96的显示值。
getDictValuesByTypeCode(String typeCode) typeCode : 类型编码值。 JSONArray 得到某一类型下的所有字典值。 GBT20999DictUtil.getDictValuesByTypeCode("CARCATEGORY"); 获取报警类型下的所有数据信息值。

4.3. 加载厂家自定义帧类型

第三方厂家开发者可以在现有国标文件基础之上,继续追加自定义帧类型。

方法名称 方法参数 方法描述 调用示例
reFactoryCustomFrameType(JSONArray frameTypeArray) frameTypeArray : 帧类型集合对象。示例:[{frameKey: 数字值不得超过255,keyDesc: 对应的描述值,要精简}] 添加厂家自定义帧类型,集合批量添加。 GBT209992017API.reFactoryCustomFrameType(frameTypeArray);
putFactoryErrorFrameType(Integer frameKey , String keyDesc) frameKey : 帧类型标识,不得超过255
keyDesc : 帧类型描述。
添加厂家自定义帧类型,单个对象添加。 GBT209992017API.putFactoryErrorFrameType(frameKey, keyDesc);

4.4. 加载厂家自定义错误值状态

第三方厂家自定义的错误情况帧类型,可定义现标准文档之外的其它错误数据值。由于每个厂家在开发下位机时,定义其它错误值都不相同,所以需要加载厂家自定义的错误值状态。

方法名称 方法参数 方法描述 调用示例
reFactoryCustomErrorStatus(JSONArray statusTypeArray) statusTypeArray : 状态类型集合对象,示例:[{statusKey: 数字值不得超过255,keyDesc: 对应的描述值,要精简}] 创建厂家自定义的错误数据值状态 GBT209992017API.reFactoryCustomErrorStatus(statusTypeArray);
putFactoryErrorStatus(Integer statusKey , String keyDesc) statusKey : 状态类型数字值,不得超过255
keyDesc : 对应的描述值,要精简
添加厂家自定义的错误数据值状态 GBT209992017API.putFactoryErrorStatus(statusKey, keyDesc);

4.5. 加载厂家自定义数据验证错误值状态

第三方厂家自定义数据验证错误值状态,数据在使用设置时,可以定义设置错误时的值和描述信息。

方法名称 方法参数
方法描述
调用示例
initCustomDbVerifyErrorStatus(JSONArray dbVerifyErrorStatusArray) dbVerifyErrorStatusArray : 设置错误状态集合,示例:[{"dbVerifyErrorStatus": 0,"dbVerifyErrorDesc": "没有错误"},{"dbVerifyErrorStatus": 1,"dbVerifyErrorDesc": "错误1"}] 厂家自定义数据验证错误值状态 GBT209992017API.initCustomDbVerifyErrorStatus(dbVerifyErrorStatusArray)
addCustomDbVerifyErrorStatus(int dbVerifyErrorStatus, String dbVerifyErrorDesc) dbVerifyErrorStatus : 错误码,不得超过255
dbVerifyErrorDesc : 错误描述
添加自定义数据库验证错误状态 GBT209992017API.addCustomDbVerifyErrorStatus(3 , "描述信息");
clearCustomDbVerifyErrorStatus() 清除自定义数据库验证错误状态 GBT209992017API.clearCustomDbVerifyErrorStatus();

4.6. 启动TCP服务

启动SDK程序的TCP服务,配置加载完成后,开发者便可以调用TCP启动Socket Netty服务了,笔者在UtilKit.jar的项目中封装了Netty的工具服务,所以在SDK-GBT20999-2017.jar程序的TCP服务启动方法中,调用的是UtilKit.jar的工具方法。

方法名称
方法参数
方法描述 调用示例
startTCPServer() 启动GBT20999-2017 SDK的TCP服务,服务监听端口号默认是:20999。开发者可以通过配置自行修改监听端口信息。 GBT209992017API.startTCPServer();

4.7. 查询数据指令

SDK程序向下位信号机发送查询数据指令,支持多个查询数据指令,SDK程序会自动根据下位机内存缓冲区大小,自动分多个数据帧进行发送。SDK设计时,查询指令方法封装了两套方案,即默认只取第一个数据帧,以及获取所有数据帧。在查询时,Instruct集合对象中的elementValue属性不必设置值,因为是要查询数据,elementValue数据值是在设置参数时需要设置的。

方法名称 方法参数
返回值
方法描述 调用示例
queryInstructs_4_Get0(int sigID , List<Instruct> instructsList) sigID: 信号机ID。
instructsList : 指令对象集合,开发者可封装传入多个查询指令对象为List。
JSONObject 获取指定信号机ID的指令列表,本方法默认返回1个查询结果对象,适用于开发者开发调试程序时使用。通常使用本方法时,所有查询指令数据的字节缓存区大小不建议超过配置中的缓冲区大小。 GBT209992017API.queryInstructs_4_Get0(sigID, instructsList);
queryInstructs(int sigID , List<Instruct> instructsList) sigID: 信号机ID。
instructsList : 指令对象集合,开发者可封装传入多个查询指令对象为List。
JSONObject 获取指定信号机ID的指令列表,在使用本方法时,开发者不必考虑下位机缓冲区大小,SDK会根据instructsList里的数据,自动分帧,并最终将所有分帧数据对象合并成一个总对象而返回结果。 GBT209992017API.queryInstructs(sigID, instructsList);

4.8. 设置数据指令

设置数据指令是指通过SDK程序将数据写入下位信号机设备的过程。在执行数据写入操作时,SDK会根据预设的配置规则,自动判断当前数据设置操作是否需要纳入事务交易跟踪机制。在设置时,Instruct集合对象中的elementValue属性必须要设置值。开发者同样不需要考虑下位机缓冲区字节大小,SDK会自动根据配置自行拆分数据。在设置数据时,国标采取事务机制,在ConfigParam.CommonParam.USE_SET_TRANSACTION,这个配置参数,默认是启用的。若下位机厂家不支持事务机制,则需要禁用该参数。关闭后,即可像普通查询动作一样。

方法名称 方法参数
返回值
方法描述 调用示例
setInstructs(int sigID , List<Instruct> instructsList) sigID: 信号机ID。
instructsList : 指令对象集合,开发者可封装传入多个设置指令对象为List。
JSONObject 设置信号机参数,开发者需要按照每个数据的字节标准规范,对数据进行设置。 GBT209992017API.setInstructs(sigID, instructsList);

4.9. 查询下位机全部配置参数

SDK程序中查询下位机全部配置参数的接口,开发者可调用该接口查询下位机全部配置参数。查询包含了信号机的配置数据,这些数据均定义在国标2099-2017中。开发者可使用此接口进行远端参数实时查询,以及远端设备参数回传的功能。 方法名称 | 方法参数 |

返回值
| 方法描述 | 调用示例 :------ | :------ | :------ | :------ | :------ uploadParam(int sigID) | sigID: 信号机ID。 | JSONArray | 设置信号机参数,开发者需要按照每个数据的字节标准规范,对数据进行设置。 | GBT209992017API.uploadParam(sigID);

4.10. 查询客户端连接容器

SDK程序设计了一个客户端连接容器,用于保存所有已连接的TCP客户端,开发者可查询此容器,获取所有已连接的TCP客户端。

方法名称 方法参数
返回值
方法描述 调用示例
getClients() Map<String, ClientInfo>
返回对象中,Map的key值是ip和端口号拼的串,示例:192.168.22.21:54671
获取所有已连接的TCP客户端。 GBT209992017API.getClients();

4.11. 中心控制

ChinaGBT项目组在解读中心控制功能时,将其归类为对下位信号机设备的逻辑功能。例如:在中心指挥平台系统中,可以选择信号机某个路口进行控制,因为一台下位机可以控制多个路口。可以对不同的路口进行路口独有的控制,本质是对路口所关联的灯组通道进行控制。所以,ChinaGBT研发项目组称之为逻辑性的控制。而下面要聊的管道命令控制则是针对设备本身而言,属于全局性的物理层面控制。

方法名称 方法参数
返回值
方法描述 调用示例
center_ctrlSig_LocalFixCycle(int clientSigID, int crossNo) clientSigID: 信号机ID。
crossNo: 交叉路口编号。
void 本地运行周期控制,将某个路口的运行模式切换至本地运行周期。 GBT209992017API.center_ctrlSig_LocalFixCycle(1, 1);
center_ctrlSig_LocalFixCycle(int clientSigID) clientSigID: 信号机ID。如果没有传路口ID,默认传的是路口1。 void 本地运行周期控制,将某个路口的运行模式切换至本地运行周期。 GBT209992017API.center_ctrlSig_LocalFixCycle(1);
center_ctrlSigLocalSpecialRunMode(int clientSigID, int ctrlTarget, int crossNo, int curCtrlRunTime) clientSigID: 信号机ID。
ctrlTarget: 控制目标【运行模式】的数值,参考:GBT20999-2017文档中A.2.11。
crossNo: 交叉路口编号。
curCtrlRunTime: 管道控制时长,单位是:秒。
JSONObject 中心控制——控制运行模式。 GBT209992017API.center_ctrlSigLocalSpecialRunMode(1, 2, 1, 10);
center_ctrlSigPlan(int clientSigID, int ctrlTarget, int crossNo, int curCtrlRunTime) clientSigID: 信号机ID。
ctrlTarget: 控制目标【方案】的数值。
crossNo: 交叉路口编号。
curCtrlRunTime: 控制时长,单位是:秒。
JSONObject 中心控制——指定运行方案。 GBT209992017API.center_ctrlSigPlan(1, 2, 1, 10);
center_ctrlSigPhaseStage(int clientSigID, int ctrlTarget, int crossNo, int curCtrlRunTime) clientSigID: 信号机ID。
ctrlTarget: 控制目标【相位阶段】的数值。
crossNo: 交叉路口编号。
curCtrlRunTime: 管道控制时长,单位是:秒。
JSONObject 中心控制——指定相位阶段控制时长。 GBT209992017API.center_ctrlSigPhaseStage(1, 2, 1, 10);

4.12. 管道命令控制

管道命令控制,也叫管道控制,是信号机设备本身所支持的指令,通过管道命令控制,可以控制设备本身,例如:设置设备时钟,设置设备参数,设置设备状态等等。又如:下发全红、黄闪、关灯等命令时,针对的是整个设备本身而言,而不是路口所关联的灯组通道。

方法名称 方法参数
返回值
方法描述 调用示例
点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
8个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
4年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
4年前
P2P技术揭秘.P2P网络技术原理与典型系统开发
Modular.Java(2009.06)\.Craig.Walls.文字版.pdf:http://www.t00y.com/file/59501950(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.t00y.com%2Ffile%2F59501950)\More.E
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
ChinaGBT创始人
ChinaGBT创始人
Lv1
君子温文尔雅而豪气纵横!
文章
3
粉丝
0
获赞
0