前言

在智慧物流和智能仓储场景中,AGV(自动导引车)的调度是核心环节。海康威视 RCS (Robot Control System) 作为国内主流的机器人调度系统,提供了丰富的 HTTP/RPC 接口供上层业务系统(如 WMS、MES)调用。

本文将分享一个基于 Java + Hutool 工具库集成海康 RCS 系统的实战案例。我们将通过构建标准的 JSON 报文,调用 genAgvSchedulingTask 接口,实现 AGV 从起点到终点的自动任务下发。

适用场景:WMS/MES 系统需要指挥 AGV 进行物料搬运、产线对接等场景。

一、核心设计思路

集成过程主要分为三个步骤:

  1. 定义 DTO:映射 RCS 接口返回的标准响应结构及路径参数结构。
  2. 构建请求体:根据业务规则(如拆盘机逻辑)动态组装 JSON 参数。
  3. 发送与解析:利用 Hutool 的 HttpRequest 发送 POST 请求并反序列化结果。

二、代码实现

1. 定义数据传输对象 (DTO)

首先,我们需要定义两个实体类来接收响应和构建路径参数。这里使用了 Lombok 简化代码。

AgvRes.java (响应实体)

/**
 * AGV 接口通用响应实体
 */
@Data
public class AgvRes {
    private String code;      // 响应码,0表示成功
    private String message;   // 响应消息
    private String data;      // 业务数据
    private String reqCode;   // 请求流水号
}

AgvPositionCodePath.java (位置路径实体)

/**
 * AGV 位置路径定义
 */
@Data
public class AgvPositionCodePath {
    public String positionCode; // 位置编号
    public String type;         // 位置类型

    public AgvPositionCodePath() {
    }

    public AgvPositionCodePath(String positionCode, String type) {
        this.positionCode = positionCode;
        this.type = type;
    }
}

2. 核心工具类实现

这是集成的核心部分。我们使用 cn.hutool.http.HttpRequest 进行链式调用,代码简洁且易于维护。

AgvIntegrationUtil.java

package org.jeecg.modules.utils;

import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.modules.utils.dto.AgvPositionCodePath;
import org.jeecg.modules.utils.dto.AgvRes;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Description: RCS(海康AGV) 集成工具类
 * @Author: Wang Yuhuang
 * @Date: 2025-10-22
 * @Version: V1.0
 */
@Slf4j
public class AgvIntegrationUtil {

    private static final String POST_URL = "http://IP:8182/rcms/services/rest/hikRpcService";

    private static final String TASK_TYPE = "F011";
    private static final String PATH_TYPE_0 = "00";
    private static final String TYPE_1 = "1";
    private static final String TYPE_2 = "2";

    /**
     * 创建AGV任务 【AGV叉车案例】
     * 
     * @param reqCode 请求编号,唯一
     * @param start 开始位置
     * @param end 结束位置
     * @return
     */
    public static AgvRes createAgvTask(String reqCode, String start, String end) {
        //构建参数
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("reqCode", reqCode);
        jsonObject.put("reqTime", DateUtil.formatDateTime(new Date()));
        jsonObject.put("taskTyp", TASK_TYPE);//任务类型
        jsonObject.put("ctnrTyp", TYPE_2);//容器类型
        jsonObject.put("ctnrNum", "1");//容器数量
        List<AgvPositionCodePath> list = new ArrayList<>();
        list.add(new AgvPositionCodePath(start, PATH_TYPE_0));
        list.add(new AgvPositionCodePath(end, PATH_TYPE_0));
        jsonObject.put("positionCodePath", list);
        //链式构建请求
        String result = HttpRequest.post(POST_URL + "/genAgvSchedulingTask")
                .header("Content-Type", "application/json;charset=UTF-8")
                .body(jsonObject.toString())// 设置请求体
                .execute()
                .body();
        //解析
        AgvRes agvRes = JSONUtil.toBean(result, AgvRes.class);
        return agvRes;
    }

    public static void main(String[] args) {
        //执行前确认IP在RCS系统中是否加入白名单
        AgvRes agvRes1 = createAgvTask("请求编号", "开始位置", "结束位置");
        System.out.println(agvRes1);
    }
}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐