zy-acs-common/src/main/java/com/zy/acs/common/hk/HkConnectionStateType.java
File was deleted zy-acs-common/src/main/java/com/zy/acs/common/hk/action/HkAction.java
New file @@ -0,0 +1,29 @@ package com.zy.acs.common.hk.action; import com.zy.acs.common.hk.action.type.HkActionType; import com.zy.acs.common.hk.action.type.HkBlockingType; import lombok.Data; import java.util.List; /** * 节点动作或即时动作的通用定义。 */ @Data public class HkAction { // 动作名称 private HkActionType actionType; // 动作 ID private String actionId; // 动作描述 private String actionDescription; // 动作阻塞类型:NONE、SOFT、HARD private HkBlockingType blockingType; // 动作参数数组 private List<HkActionParameter> actionParameters; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/HkActionParameter.java
New file @@ -0,0 +1,16 @@ package com.zy.acs.common.hk.action; import lombok.Data; /** * 动作参数键值对。 */ @Data public class HkActionParameter { // 参数键 private String key; // 参数值 private Object value; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/HkInstantActionMessage.java
New file @@ -0,0 +1,18 @@ package com.zy.acs.common.hk.action; import com.zy.acs.common.hk.base.HkMessageHeader; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.List; /** * instantActions 主题即时动作消息。 */ @EqualsAndHashCode(callSuper = true) @Data public class HkInstantActionMessage extends HkMessageHeader { // 即时动作数组 private List<HkAction> instantActions; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/param/HkCancelOrderActionParam.java
New file @@ -0,0 +1,13 @@ package com.zy.acs.common.hk.action.param; import lombok.Data; /** * cancelOrder 动作参数。 */ @Data public class HkCancelOrderActionParam { // 是否立即停车 private Boolean stopRightInstantStop; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/param/HkConfigAgvActionParam.java
New file @@ -0,0 +1,22 @@ package com.zy.acs.common.hk.action.param; import lombok.Data; /** * configAGV 动作参数。 */ @Data public class HkConfigAgvActionParam { // AMS 服务器 IP private String amsIp; // AMS 服务器端口 private Integer amsPort; // NTP 服务器 IP private String ntpIp; // NTP 服务器端口 private Integer ntpPort; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/param/HkControlAudioActionParam.java
New file @@ -0,0 +1,17 @@ package com.zy.acs.common.hk.action.param; import com.zy.acs.common.hk.action.type.HkAudioModeType; import lombok.Data; /** * controlAudio 动作参数。 */ @Data public class HkControlAudioActionParam { // 播放模式 private HkAudioModeType mode; // 音频方案名字 private String scheme; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/param/HkDropActionParam.java
New file @@ -0,0 +1,22 @@ package com.zy.acs.common.hk.action.param; import lombok.Data; /** * drop 动作参数。 */ @Data public class HkDropActionParam { // 货架 ID private String loadId; // 货架类型 private String loadType; // 举升精度 private Double precision; // 下放货架后转盘是否回零 private Boolean tabZero; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/param/HkInitPositionActionParam.java
New file @@ -0,0 +1,25 @@ package com.zy.acs.common.hk.action.param; import lombok.Data; /** * initPosition 动作参数。 */ @Data public class HkInitPositionActionParam { // 初始化车体坐标系 x 值 private Double x; // 初始化车体坐标系 y 值 private Double y; // 初始化车体坐标系角度值 private Double theta; // 初始化车体地图 ID private String mapId; // 初始化车体 lastNodeId private String lastNodeId; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/param/HkLampControllerActionParam.java
New file @@ -0,0 +1,31 @@ package com.zy.acs.common.hk.action.param; import com.zy.acs.common.hk.action.type.HkLampColorType; import com.zy.acs.common.hk.action.type.HkLampDirectionType; import com.zy.acs.common.hk.action.type.HkLampModeType; import lombok.Data; /** * lampController 动作参数。 */ @Data public class HkLampControllerActionParam { // 指示灯模式 private HkLampModeType mode; // 指示灯方向 private HkLampDirectionType dir; // 指示灯颜色 private HkLampColorType color; // 持续时间 private Integer keepTime; // 亮灯时长 private Integer blinkOnTime; // 灭灯时长 private Integer blinkOffTime; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/param/HkPickActionParam.java
New file @@ -0,0 +1,22 @@ package com.zy.acs.common.hk.action.param; import lombok.Data; /** * pick 动作参数。 */ @Data public class HkPickActionParam { // 货架 ID private String loadId; // 货架类型 private String loadType; // 举升高度 private Double height; // 举升精度 private Double precision; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/param/HkRotateAgvActionParam.java
New file @@ -0,0 +1,13 @@ package com.zy.acs.common.hk.action.param; import lombok.Data; /** * rotateAGV 动作参数。 */ @Data public class HkRotateAgvActionParam { // 车体需要旋转到地图坐标系角度值,单位 rad private Double angle; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/param/HkRotateLoadLiftActionParam.java
New file @@ -0,0 +1,16 @@ package com.zy.acs.common.hk.action.param; import lombok.Data; /** * rotateLoadLift 动作参数。 */ @Data public class HkRotateLoadLiftActionParam { // 旋转载物到地图坐标系角度,单位 rad private Double angle; // 调整夹包升降高度,单位 m private Double height; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/param/HkStartChargingActionParam.java
New file @@ -0,0 +1,19 @@ package com.zy.acs.common.hk.action.param; import lombok.Data; /** * startCharging 动作参数。 */ @Data public class HkStartChargingActionParam { // 充电时间,单位分钟 private Integer time; // 充电桩 IP private String ip; // 充电桩端口 private Integer port; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/param/HkSwitchEnergyWorkModeActionParam.java
New file @@ -0,0 +1,17 @@ package com.zy.acs.common.hk.action.param; import com.zy.acs.common.hk.action.type.HkEnergyModeType; import lombok.Data; /** * switchEnergyWorkMode 动作参数。 */ @Data public class HkSwitchEnergyWorkModeActionParam { // 能源模式 private HkEnergyModeType energyMode; // 模式持续时间,单位秒 private Integer time; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/param/HkUpgAmrActionParam.java
New file @@ -0,0 +1,16 @@ package com.zy.acs.common.hk.action.param; import lombok.Data; /** * upgAMR 动作参数。 */ @Data public class HkUpgAmrActionParam { // 升级包下载路径 private String url; // 升级包版本 private String version; } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/type/HkActionType.java
New file @@ -0,0 +1,107 @@ package com.zy.acs.common.hk.action.type; import com.google.gson.annotations.SerializedName; import lombok.Getter; import org.springframework.util.StringUtils; /** * 海康协议动作类型枚举。 */ @Getter public enum HkActionType { // 初始位置初始化 @SerializedName("initPosition") INIT_POSITION("initPosition"), // 暂停 AGV @SerializedName("startPause") START_PAUSE("startPause"), // 取消暂停 @SerializedName("stopPause") STOP_PAUSE("stopPause"), // 开始充电 @SerializedName("startCharging") START_CHARGING("startCharging"), // 取消充电 @SerializedName("stopCharging") STOP_CHARGING("stopCharging"), // 请求 AGV 立即上报状态 @SerializedName("stateRequest") STATE_REQUEST("stateRequest"), // 车辆急停 @SerializedName("stopAGV") STOP_AGV("stopAGV"), // 取消当前任务 @SerializedName("cancelOrder") CANCEL_ORDER("cancelOrder"), // 旋转车体 @SerializedName("rotateAGV") ROTATE_AGV("rotateAGV"), // 请求 factsheet @SerializedName("factsheetRequest") FACTSHEET_REQUEST("factsheetRequest"), // 请求维保信息 @SerializedName("maintainRequest") MAINTAIN_REQUEST("maintainRequest"), // 配置 AGV 属性 @SerializedName("configAGV") CONFIG_AGV("configAGV"), // 升级 AMR @SerializedName("upgAMR") UPG_AMR("upgAMR"), // 切换能源工作模式 @SerializedName("switchEnergyWorkMode") SWITCH_ENERGY_WORK_MODE("switchEnergyWorkMode"), // 控制指示灯 @SerializedName("lampController") LAMP_CONTROLLER("lampController"), // 控制语音播放 @SerializedName("controlAudio") CONTROL_AUDIO("controlAudio"), // 潜伏式举升取货 @SerializedName("pick") PICK("pick"), // 潜伏式下放货架 @SerializedName("drop") DROP("drop"), // 潜伏式举升旋转载物 @SerializedName("rotateLoadLift") ROTATE_LOAD_LIFT("rotateLoadLift"); private final String code; HkActionType(String code) { this.code = code; } public static HkActionType fromCode(String code) { if (!StringUtils.hasText(code)) { return null; } for (HkActionType actionType : values()) { if (actionType.code.equalsIgnoreCase(code)) { return actionType; } } return null; } } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/type/HkAudioModeType.java
New file @@ -0,0 +1,13 @@ package com.zy.acs.common.hk.action.type; /** * 音频播放模式。 */ public enum HkAudioModeType { // 设备按默认方案播放 NORMAL, // 播放指定方案 SPECIFIC } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/type/HkBlockingType.java
New file @@ -0,0 +1,16 @@ package com.zy.acs.common.hk.action.type; /** * 动作阻塞类型。 */ public enum HkBlockingType { // 允许与其他动作并行执行 NONE, // 允许与部分动作并行,但不允许移动 SOFT, // 同时只允许一个动作执行 HARD } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/type/HkEnergyModeType.java
New file @@ -0,0 +1,19 @@ package com.zy.acs.common.hk.action.type; /** * 能源工作模式。 */ public enum HkEnergyModeType { // 正常模式 NORMAL, // 节能模式 ENERGYSAVING, // 休眠模式 HIBERNATE, // 关机模式 POWEROFF } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/type/HkLampColorType.java
New file @@ -0,0 +1,16 @@ package com.zy.acs.common.hk.action.type; /** * 指示灯颜色。 */ public enum HkLampColorType { // 红灯 RED, // 绿灯 GREEN, // 黄灯 YELLOW } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/type/HkLampDirectionType.java
New file @@ -0,0 +1,16 @@ package com.zy.acs.common.hk.action.type; /** * 指示灯方向。 */ public enum HkLampDirectionType { // 左侧指示灯 LEFT, // 右侧指示灯 RIGHT, // 所有指示灯 ALL } zy-acs-common/src/main/java/com/zy/acs/common/hk/action/type/HkLampModeType.java
New file @@ -0,0 +1,19 @@ package com.zy.acs.common.hk.action.type; /** * 指示灯模式。 */ public enum HkLampModeType { // 恢复设备默认模式 NORMAL, // 常亮 ON, // 常灭 OFF, // 闪烁 BLINK } zy-acs-common/src/main/java/com/zy/acs/common/hk/base/HkMessageHeader.java
File was renamed from zy-acs-common/src/main/java/com/zy/acs/common/hk/HkMessageHeader.java @@ -1,7 +1,10 @@ package com.zy.acs.common.hk; package com.zy.acs.common.hk.base; import lombok.Data; /** * 海康 VDA 协议通用消息头。 */ @Data public class HkMessageHeader { zy-acs-common/src/main/java/com/zy/acs/common/hk/connection/HkConnectionMessage.java
File was renamed from zy-acs-common/src/main/java/com/zy/acs/common/hk/HkConnectionMessage.java @@ -1,8 +1,12 @@ package com.zy.acs.common.hk; package com.zy.acs.common.hk.connection; import com.zy.acs.common.hk.base.HkMessageHeader; import lombok.Data; import lombok.EqualsAndHashCode; /** * connection 主题消息。 */ @EqualsAndHashCode(callSuper = true) @Data public class HkConnectionMessage extends HkMessageHeader { zy-acs-common/src/main/java/com/zy/acs/common/hk/connection/HkConnectionStateType.java
New file @@ -0,0 +1,17 @@ package com.zy.acs.common.hk.connection; /** * connection 主题连接状态枚举。 */ public enum HkConnectionStateType { // AGV 在线注册 RCS ONLINE, // AGV 主动下线 OFFLINE, // AGV 异常下线 CONNECTIONBROKEN } zy-acs-common/src/main/java/com/zy/acs/common/hk/order/HkNodePosition.java
File was renamed from zy-acs-common/src/main/java/com/zy/acs/common/hk/HkNodePosition.java @@ -1,7 +1,10 @@ package com.zy.acs.common.hk; package com.zy.acs.common.hk.order; import lombok.Data; /** * 任务节点地图坐标信息。 */ @Data public class HkNodePosition { zy-acs-common/src/main/java/com/zy/acs/common/hk/order/HkOrderEdge.java
File was renamed from zy-acs-common/src/main/java/com/zy/acs/common/hk/HkOrderEdge.java @@ -1,9 +1,13 @@ package com.zy.acs.common.hk; package com.zy.acs.common.hk.order; import com.zy.acs.common.hk.action.HkAction; import lombok.Data; import java.util.List; /** * order 消息中的路径段定义。 */ @Data public class HkOrderEdge { @@ -52,6 +56,6 @@ // 轨迹对象,待协议细化 private Object trajectory; // 路径上的动作列表,待协议细化 private List<Object> actions; // 路径上的动作列表 private List<HkAction> actions; } zy-acs-common/src/main/java/com/zy/acs/common/hk/order/HkOrderMessage.java
File was renamed from zy-acs-common/src/main/java/com/zy/acs/common/hk/HkOrderMessage.java @@ -1,10 +1,14 @@ package com.zy.acs.common.hk; package com.zy.acs.common.hk.order; import com.zy.acs.common.hk.base.HkMessageHeader; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.List; /** * order 主题任务下发消息。 */ @EqualsAndHashCode(callSuper = true) @Data public class HkOrderMessage extends HkMessageHeader { zy-acs-common/src/main/java/com/zy/acs/common/hk/order/HkOrderNode.java
File was renamed from zy-acs-common/src/main/java/com/zy/acs/common/hk/HkOrderNode.java @@ -1,9 +1,13 @@ package com.zy.acs.common.hk; package com.zy.acs.common.hk.order; import com.zy.acs.common.hk.action.HkAction; import lombok.Data; import java.util.List; /** * order 消息中的节点定义。 */ @Data public class HkOrderNode { @@ -37,6 +41,6 @@ // 执行机构姿态信息,待协议细化 private Object actuator; // 节点上的动作列表,待协议细化 private List<Object> actions; // 节点上的动作列表 private List<HkAction> actions; } zy-acs-hk/zy-acs-hk-latent/src/main/java/com/zy/acs/hk/latent/listen/MessageListener.java
New file @@ -0,0 +1,53 @@ package com.zy.acs.hk.latent.listen; import com.alibaba.fastjson.JSON; import com.zy.acs.common.constant.RedisConstant; import com.zy.acs.common.domain.AgvProtocol; import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.framework.common.Cools; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; /** * 下行报文监听器 * 消息队列: redis list * Created by vincent on 2019-04-02 */ @Component public class MessageListener { private Thread thread; private final RedisSupport redis = RedisSupport.defaultRedisSupport; private final static Logger log = LoggerFactory.getLogger(MessageListener.class); @PostConstruct private void start(){ thread = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { AgvProtocol protocol = redis.pop(RedisConstant.AGV_PATH_DOWN_FLAG); if (null != protocol) { log.info("监听器 >>> {}", JSON.toJSONString(protocol)); if (!Cools.isEmpty(protocol.getAgvNo())) { // publisher.publish(ProtocolUtils.installDownProtocol(protocol)); } } // 间隔 try { Thread.sleep(300); } catch (Exception ignore) {} } }); thread.start(); } @PreDestroy public void shutDown(){ if (thread != null) thread.interrupt(); } } zy-acs-hk/zy-acs-hk-latent/src/main/java/com/zy/acs/hk/latent/mqtt/handler/ConnectionMessageHandler.java
@@ -1,7 +1,7 @@ package com.zy.acs.hk.latent.mqtt.handler; import com.zy.acs.common.hk.HkConnectionMessage; import com.zy.acs.common.hk.HkConnectionStateType; import com.zy.acs.common.hk.connection.HkConnectionMessage; import com.zy.acs.common.hk.connection.HkConnectionStateType; import com.zy.acs.common.constant.RedisConstant; import com.zy.acs.common.utils.GsonUtils; import com.zy.acs.common.utils.RedisSupport; zy-acs-hk/zy-acs-hk-latent/src/main/java/com/zy/acs/hk/latent/mqtt/publisher/HkInstantActionPublisher.java
New file @@ -0,0 +1,46 @@ package com.zy.acs.hk.latent.mqtt.publisher; import com.zy.acs.common.hk.action.HkInstantActionMessage; import com.zy.acs.common.utils.GsonUtils; import com.zy.acs.hk.latent.mqtt.EmqxMqttClient; import com.zy.acs.hk.latent.mqtt.HkTopicBuilder; import com.zy.acs.hk.latent.mqtt.type.HkSubTopicType; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @Slf4j @Component public class HkInstantActionPublisher { @Autowired private EmqxMqttClient emqxMqttClient; @Autowired private HkTopicBuilder hkTopicBuilder; public void publish(HkInstantActionMessage instantActionMessage) { if (instantActionMessage == null) { throw new IllegalArgumentException("instantActionMessage can not be null"); } if (!StringUtils.hasText(instantActionMessage.getSerialNumber())) { throw new IllegalArgumentException("instantActionMessage.serialNumber can not be blank"); } if (instantActionMessage.getInstantActions() == null || instantActionMessage.getInstantActions().isEmpty()) { throw new IllegalArgumentException("instantActionMessage.instantActions can not be empty"); } String topic = hkTopicBuilder.buildTopic( instantActionMessage.getSerialNumber(), HkSubTopicType.INSTANT_ACTIONS.getCode() ); String payload = GsonUtils.toJson(instantActionMessage); emqxMqttClient.publish(topic, payload); log.info("publish hk instant action message, agvNo={}, actionCount={}, topic={}", instantActionMessage.getSerialNumber(), instantActionMessage.getInstantActions().size(), topic); } } zy-acs-hk/zy-acs-hk-latent/src/main/java/com/zy/acs/hk/latent/mqtt/publisher/HkOrderPublisher.java
@@ -1,6 +1,6 @@ package com.zy.acs.hk.latent.mqtt.publisher; import com.zy.acs.common.hk.HkOrderMessage; import com.zy.acs.common.hk.order.HkOrderMessage; import com.zy.acs.common.utils.GsonUtils; import com.zy.acs.hk.latent.mqtt.EmqxMqttClient; import com.zy.acs.hk.latent.mqtt.HkTopicBuilder;