1、代码完善;
2、江海协议解析不正确处修改,如金额是4位小数;
3、根据江海协议,新建RTU模拟器模块,可以上报心跳、开阀、关阀数据。
| | |
| | | /** |
| | | * æ£æ¥å¤´ |
| | | * @param bs ä¸è¡åèæ°ç» |
| | | * @return [rt1->true:æ¯æ¬åè®®P206ï¼false:䏿¯æ¬åè®®; rt2->true:æ¯æ°´èµæºåè®®ï¼false:æ¯å级åè®®] |
| | | * @return [ã0ã->true:æ¯æ¬åè®®P206ï¼false:䏿¯æ¬åè®®; ã1ã->true:æ¯æ°´èµæºåè®®ï¼false:æ¯å级åè®®] |
| | | * @throws Exception å¼å¸¸ |
| | | */ |
| | | public Boolean[] isThisProtocolHead(byte[] bs) throws Exception{ |
| | |
| | | |
| | | public class ProtocolConstantV206V202404 { |
| | | |
| | | public static final String version = "202404" ; |
| | | |
| | | /** |
| | | * 注解ç¸å
³ |
| | | */ |
| | |
| | | |
| | | index += 5 ; |
| | | Long moneyRemain = ByteUtil.BCD2Long_LE(bs, index, index + 4) ; |
| | | cdData.moneyRemain = moneyRemain/100.0D; |
| | | cdData.moneyRemain = moneyRemain/10000.0D; |
| | | |
| | | index += 5 ; |
| | | Long waterRemain = ByteUtil.BCD2Long_LE(bs, index, index + 4) ; |
| | |
| | | |
| | | index += 4 ; |
| | | int thisMoney = ByteUtil.BCD2Int_LE(bs, index, index + 3) ; |
| | | cdData.thisMoney = thisMoney/100.0D; |
| | | cdData.thisMoney = thisMoney/10000.0D; |
| | | |
| | | index += 4 ; |
| | | cdData.thisDuration = ByteUtil.BCD2Int_LE(bs, index, index + 1) ; |
| | |
| | | }else{ |
| | | System.out.println("@@@@@@$ #@@@@@@@@@$ &@@@@@@@@" ) ; |
| | | } |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@@@@# &@@@@@@@@ Runing in standalone mode" ) ; |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@@@@# &@@@@@@@@ Running in standalone mode" ) ; |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@@@& &@@@@@@@@ Startup in " + (System.currentTimeMillis() - start) + " MS" ) ; |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@# &@@@@@@@@ " + company) ; |
| | | System.out.println("@@@@@@@@@@@@@@@@#O &@@@@@@@@") ; |
| | |
| | | import com.dy.common.mw.protocol.Data; |
| | | import com.dy.common.mw.protocol.p206V202404.DataV202404; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd02Vo; |
| | | import com.dy.common.mw.protocol.p206V202404.upVos.DataCd8AVo; |
| | | import com.dy.pipIrrGlobal.pojoPr.PrControllerTramp; |
| | | import com.dy.rtuMw.server.rtuData.TaskSurpport; |
| | | import org.apache.logging.log4j.LogManager; |
| | |
| | | boolean toNext = true ; |
| | | if(d.getSubData() != null) { |
| | | DataV202404 dataV202404 = (DataV202404)d.getSubData() ; |
| | | if(dataV202404 != null && dataV202404.subData != null && dataV202404.subData instanceof DataCd02Vo){ |
| | | //è¿æ»¤æå¿è·³æ°æ® |
| | | if(dataV202404 != null && dataV202404.subData != null && (dataV202404.subData instanceof DataCd8AVo || dataV202404.subData instanceof DataCd02Vo)){ |
| | | //è¿æ»¤æç»å½åå¿è·³æ°æ® |
| | | toNext = false ; |
| | | } |
| | | } |
| | |
| | | Data d = (Data)data ; |
| | | String rtuAddr = d.getRtuAddr() ;//TkRtuDataé夿äºrtuAddr为空 |
| | | if(d.subData != null && d.subData instanceof DataV202404){ |
| | | DataV202404 dataV1 = (DataV202404)d.subData ; |
| | | if(dataV1.subData != null && dataV1.subData instanceof DataCd02Vo){ |
| | | //è¿æ»¤æå¿è·³æ°æ® |
| | | DataV202404 dataV202404 = (DataV202404)d.subData ; |
| | | if(dataV202404.subData != null && (dataV202404.subData instanceof DataCd8AVo || dataV202404.subData instanceof DataCd02Vo)){ |
| | | //è¿æ»¤æç»å½åå¿è·³æ°æ®ï¼ä½ç¬¬ä¸æ¬¡ä¸è¿æ»¤ |
| | | if(onceUpDataRtus.containsKey(rtuAddr)){ |
| | | return ; |
| | | } |
| | |
| | | datasource: #é
ç½®æ°æ®æº |
| | | type: com.alibaba.druid.pool.DruidDataSource |
| | | driver-class-name: com.mysql.cj.jdbc.Driver |
| | | url: jdbc:mysql://127.0.0.1:3306/pipIrr_ym?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull |
| | | # url: jdbc:mysql://127.0.0.1:3306/pipIrr_ym?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull |
| | | url: jdbc:mysql://192.168.40.166:3306/pipIrr_ym?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNull |
| | | username: root |
| | | password: dysql,;.abc!@# |
| | | druid: |
| | |
| | | System.out.println("@@@@@@$ O@@@@@@@@@ &@@@@@@@@") ; |
| | | } |
| | | System.out.println("@@@@@@$ #@@@@@@@@@$ &@@@@@@@@ æ¬RTU模æå°å " + ServerProperties.rtuAddr ) ; |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@@@@# &@@@@@@@@ Runing in standalone mode" ) ; |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@@@@# &@@@@@@@@ Running in standalone mode" ) ; |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@@@& &@@@@@@@@ Startup in " + (System.currentTimeMillis() - start) + " MS" ) ; |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@# &@@@@@@@@ " + company) ; |
| | | System.out.println("@@@@@@@@@@@@@@@@#O &@@@@@@@@") ; |
New file |
| | |
| | | /mvnw text eol=lf |
| | | *.cmd text eol=crlf |
New file |
| | |
| | | HELP.md |
| | | target/ |
| | | /pipIrr-mw-simulate-rtu202404.iml |
| | | !.mvn/wrapper/maven-wrapper.jar |
| | | !**/src/main/**/target/ |
| | | !**/src/test/**/target/ |
| | | |
| | | ### STS ### |
| | | .apt_generated |
| | | .classpath |
| | | .factorypath |
| | | .project |
| | | .settings |
| | | .springBeans |
| | | .sts4-cache |
| | | |
| | | ### IntelliJ IDEA ### |
| | | .idea |
| | | *.iws |
| | | *.iml |
| | | *.ipr |
| | | |
| | | ### NetBeans ### |
| | | /nbproject/private/ |
| | | /nbbuild/ |
| | | /dist/ |
| | | /nbdist/ |
| | | /.nb-gradle/ |
| | | build/ |
| | | !**/src/main/**/build/ |
| | | !**/src/test/**/build/ |
| | | |
| | | ### VS Code ### |
| | | .vscode/ |
New file |
| | |
| | | # Licensed to the Apache Software Foundation (ASF) under one |
| | | # or more contributor license agreements. See the NOTICE file |
| | | # distributed with this work for additional information |
| | | # regarding copyright ownership. The ASF licenses this file |
| | | # to you under the Apache License, Version 2.0 (the |
| | | # "License"); you may not use this file except in compliance |
| | | # with the License. You may obtain a copy of the License at |
| | | # |
| | | # http://www.apache.org/licenses/LICENSE-2.0 |
| | | # |
| | | # Unless required by applicable law or agreed to in writing, |
| | | # software distributed under the License is distributed on an |
| | | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| | | # KIND, either express or implied. See the License for the |
| | | # specific language governing permissions and limitations |
| | | # under the License. |
| | | wrapperVersion=3.3.2 |
| | | distributionType=only-script |
| | | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip |
New file |
| | |
| | | #!/bin/sh |
| | | # ---------------------------------------------------------------------------- |
| | | # Licensed to the Apache Software Foundation (ASF) under one |
| | | # or more contributor license agreements. See the NOTICE file |
| | | # distributed with this work for additional information |
| | | # regarding copyright ownership. The ASF licenses this file |
| | | # to you under the Apache License, Version 2.0 (the |
| | | # "License"); you may not use this file except in compliance |
| | | # with the License. You may obtain a copy of the License at |
| | | # |
| | | # http://www.apache.org/licenses/LICENSE-2.0 |
| | | # |
| | | # Unless required by applicable law or agreed to in writing, |
| | | # software distributed under the License is distributed on an |
| | | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| | | # KIND, either express or implied. See the License for the |
| | | # specific language governing permissions and limitations |
| | | # under the License. |
| | | # ---------------------------------------------------------------------------- |
| | | |
| | | # ---------------------------------------------------------------------------- |
| | | # Apache Maven Wrapper startup batch script, version 3.3.2 |
| | | # |
| | | # Optional ENV vars |
| | | # ----------------- |
| | | # JAVA_HOME - location of a JDK home dir, required when download maven via java source |
| | | # MVNW_REPOURL - repo url base for downloading maven distribution |
| | | # MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven |
| | | # MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output |
| | | # ---------------------------------------------------------------------------- |
| | | |
| | | set -euf |
| | | [ "${MVNW_VERBOSE-}" != debug ] || set -x |
| | | |
| | | # OS specific support. |
| | | native_path() { printf %s\\n "$1"; } |
| | | case "$(uname)" in |
| | | CYGWIN* | MINGW*) |
| | | [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" |
| | | native_path() { cygpath --path --windows "$1"; } |
| | | ;; |
| | | esac |
| | | |
| | | # set JAVACMD and JAVACCMD |
| | | set_java_home() { |
| | | # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched |
| | | if [ -n "${JAVA_HOME-}" ]; then |
| | | if [ -x "$JAVA_HOME/jre/sh/java" ]; then |
| | | # IBM's JDK on AIX uses strange locations for the executables |
| | | JAVACMD="$JAVA_HOME/jre/sh/java" |
| | | JAVACCMD="$JAVA_HOME/jre/sh/javac" |
| | | else |
| | | JAVACMD="$JAVA_HOME/bin/java" |
| | | JAVACCMD="$JAVA_HOME/bin/javac" |
| | | |
| | | if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then |
| | | echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 |
| | | echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 |
| | | return 1 |
| | | fi |
| | | fi |
| | | else |
| | | JAVACMD="$( |
| | | 'set' +e |
| | | 'unset' -f command 2>/dev/null |
| | | 'command' -v java |
| | | )" || : |
| | | JAVACCMD="$( |
| | | 'set' +e |
| | | 'unset' -f command 2>/dev/null |
| | | 'command' -v javac |
| | | )" || : |
| | | |
| | | if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then |
| | | echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 |
| | | return 1 |
| | | fi |
| | | fi |
| | | } |
| | | |
| | | # hash string like Java String::hashCode |
| | | hash_string() { |
| | | str="${1:-}" h=0 |
| | | while [ -n "$str" ]; do |
| | | char="${str%"${str#?}"}" |
| | | h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) |
| | | str="${str#?}" |
| | | done |
| | | printf %x\\n $h |
| | | } |
| | | |
| | | verbose() { :; } |
| | | [ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } |
| | | |
| | | die() { |
| | | printf %s\\n "$1" >&2 |
| | | exit 1 |
| | | } |
| | | |
| | | trim() { |
| | | # MWRAPPER-139: |
| | | # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. |
| | | # Needed for removing poorly interpreted newline sequences when running in more |
| | | # exotic environments such as mingw bash on Windows. |
| | | printf "%s" "${1}" | tr -d '[:space:]' |
| | | } |
| | | |
| | | # parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties |
| | | while IFS="=" read -r key value; do |
| | | case "${key-}" in |
| | | distributionUrl) distributionUrl=$(trim "${value-}") ;; |
| | | distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; |
| | | esac |
| | | done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" |
| | | [ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" |
| | | |
| | | case "${distributionUrl##*/}" in |
| | | maven-mvnd-*bin.*) |
| | | MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ |
| | | case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in |
| | | *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; |
| | | :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; |
| | | :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; |
| | | :Linux*x86_64*) distributionPlatform=linux-amd64 ;; |
| | | *) |
| | | echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 |
| | | distributionPlatform=linux-amd64 |
| | | ;; |
| | | esac |
| | | distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" |
| | | ;; |
| | | maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; |
| | | *) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; |
| | | esac |
| | | |
| | | # apply MVNW_REPOURL and calculate MAVEN_HOME |
| | | # maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash> |
| | | [ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" |
| | | distributionUrlName="${distributionUrl##*/}" |
| | | distributionUrlNameMain="${distributionUrlName%.*}" |
| | | distributionUrlNameMain="${distributionUrlNameMain%-bin}" |
| | | MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" |
| | | MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" |
| | | |
| | | exec_maven() { |
| | | unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : |
| | | exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" |
| | | } |
| | | |
| | | if [ -d "$MAVEN_HOME" ]; then |
| | | verbose "found existing MAVEN_HOME at $MAVEN_HOME" |
| | | exec_maven "$@" |
| | | fi |
| | | |
| | | case "${distributionUrl-}" in |
| | | *?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; |
| | | *) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; |
| | | esac |
| | | |
| | | # prepare tmp dir |
| | | if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then |
| | | clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } |
| | | trap clean HUP INT TERM EXIT |
| | | else |
| | | die "cannot create temp dir" |
| | | fi |
| | | |
| | | mkdir -p -- "${MAVEN_HOME%/*}" |
| | | |
| | | # Download and Install Apache Maven |
| | | verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." |
| | | verbose "Downloading from: $distributionUrl" |
| | | verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" |
| | | |
| | | # select .zip or .tar.gz |
| | | if ! command -v unzip >/dev/null; then |
| | | distributionUrl="${distributionUrl%.zip}.tar.gz" |
| | | distributionUrlName="${distributionUrl##*/}" |
| | | fi |
| | | |
| | | # verbose opt |
| | | __MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' |
| | | [ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v |
| | | |
| | | # normalize http auth |
| | | case "${MVNW_PASSWORD:+has-password}" in |
| | | '') MVNW_USERNAME='' MVNW_PASSWORD='' ;; |
| | | has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; |
| | | esac |
| | | |
| | | if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then |
| | | verbose "Found wget ... using wget" |
| | | wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" |
| | | elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then |
| | | verbose "Found curl ... using curl" |
| | | curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" |
| | | elif set_java_home; then |
| | | verbose "Falling back to use Java to download" |
| | | javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" |
| | | targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" |
| | | cat >"$javaSource" <<-END |
| | | public class Downloader extends java.net.Authenticator |
| | | { |
| | | protected java.net.PasswordAuthentication getPasswordAuthentication() |
| | | { |
| | | return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); |
| | | } |
| | | public static void main( String[] args ) throws Exception |
| | | { |
| | | setDefault( new Downloader() ); |
| | | java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); |
| | | } |
| | | } |
| | | END |
| | | # For Cygwin/MinGW, switch paths to Windows format before running javac and java |
| | | verbose " - Compiling Downloader.java ..." |
| | | "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" |
| | | verbose " - Running Downloader.java ..." |
| | | "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" |
| | | fi |
| | | |
| | | # If specified, validate the SHA-256 sum of the Maven distribution zip file |
| | | if [ -n "${distributionSha256Sum-}" ]; then |
| | | distributionSha256Result=false |
| | | if [ "$MVN_CMD" = mvnd.sh ]; then |
| | | echo "Checksum validation is not supported for maven-mvnd." >&2 |
| | | echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 |
| | | exit 1 |
| | | elif command -v sha256sum >/dev/null; then |
| | | if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then |
| | | distributionSha256Result=true |
| | | fi |
| | | elif command -v shasum >/dev/null; then |
| | | if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then |
| | | distributionSha256Result=true |
| | | fi |
| | | else |
| | | echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 |
| | | echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 |
| | | exit 1 |
| | | fi |
| | | if [ $distributionSha256Result = false ]; then |
| | | echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 |
| | | echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 |
| | | exit 1 |
| | | fi |
| | | fi |
| | | |
| | | # unzip and move |
| | | if command -v unzip >/dev/null; then |
| | | unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" |
| | | else |
| | | tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" |
| | | fi |
| | | printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" |
| | | mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" |
| | | |
| | | clean || : |
| | | exec_maven "$@" |
New file |
| | |
| | | <# : batch portion |
| | | @REM ---------------------------------------------------------------------------- |
| | | @REM Licensed to the Apache Software Foundation (ASF) under one |
| | | @REM or more contributor license agreements. See the NOTICE file |
| | | @REM distributed with this work for additional information |
| | | @REM regarding copyright ownership. The ASF licenses this file |
| | | @REM to you under the Apache License, Version 2.0 (the |
| | | @REM "License"); you may not use this file except in compliance |
| | | @REM with the License. You may obtain a copy of the License at |
| | | @REM |
| | | @REM http://www.apache.org/licenses/LICENSE-2.0 |
| | | @REM |
| | | @REM Unless required by applicable law or agreed to in writing, |
| | | @REM software distributed under the License is distributed on an |
| | | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| | | @REM KIND, either express or implied. See the License for the |
| | | @REM specific language governing permissions and limitations |
| | | @REM under the License. |
| | | @REM ---------------------------------------------------------------------------- |
| | | |
| | | @REM ---------------------------------------------------------------------------- |
| | | @REM Apache Maven Wrapper startup batch script, version 3.3.2 |
| | | @REM |
| | | @REM Optional ENV vars |
| | | @REM MVNW_REPOURL - repo url base for downloading maven distribution |
| | | @REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven |
| | | @REM MVNW_VERBOSE - true: enable verbose log; others: silence the output |
| | | @REM ---------------------------------------------------------------------------- |
| | | |
| | | @IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) |
| | | @SET __MVNW_CMD__= |
| | | @SET __MVNW_ERROR__= |
| | | @SET __MVNW_PSMODULEP_SAVE=%PSModulePath% |
| | | @SET PSModulePath= |
| | | @FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( |
| | | IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) |
| | | ) |
| | | @SET PSModulePath=%__MVNW_PSMODULEP_SAVE% |
| | | @SET __MVNW_PSMODULEP_SAVE= |
| | | @SET __MVNW_ARG0_NAME__= |
| | | @SET MVNW_USERNAME= |
| | | @SET MVNW_PASSWORD= |
| | | @IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) |
| | | @echo Cannot start maven from wrapper >&2 && exit /b 1 |
| | | @GOTO :EOF |
| | | : end batch / begin powershell #> |
| | | |
| | | $ErrorActionPreference = "Stop" |
| | | if ($env:MVNW_VERBOSE -eq "true") { |
| | | $VerbosePreference = "Continue" |
| | | } |
| | | |
| | | # calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties |
| | | $distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl |
| | | if (!$distributionUrl) { |
| | | Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" |
| | | } |
| | | |
| | | switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { |
| | | "maven-mvnd-*" { |
| | | $USE_MVND = $true |
| | | $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" |
| | | $MVN_CMD = "mvnd.cmd" |
| | | break |
| | | } |
| | | default { |
| | | $USE_MVND = $false |
| | | $MVN_CMD = $script -replace '^mvnw','mvn' |
| | | break |
| | | } |
| | | } |
| | | |
| | | # apply MVNW_REPOURL and calculate MAVEN_HOME |
| | | # maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash> |
| | | if ($env:MVNW_REPOURL) { |
| | | $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } |
| | | $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" |
| | | } |
| | | $distributionUrlName = $distributionUrl -replace '^.*/','' |
| | | $distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' |
| | | $MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" |
| | | if ($env:MAVEN_USER_HOME) { |
| | | $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" |
| | | } |
| | | $MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' |
| | | $MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" |
| | | |
| | | if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { |
| | | Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" |
| | | Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" |
| | | exit $? |
| | | } |
| | | |
| | | if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { |
| | | Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" |
| | | } |
| | | |
| | | # prepare tmp dir |
| | | $TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile |
| | | $TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" |
| | | $TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null |
| | | trap { |
| | | if ($TMP_DOWNLOAD_DIR.Exists) { |
| | | try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } |
| | | catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } |
| | | } |
| | | } |
| | | |
| | | New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null |
| | | |
| | | # Download and Install Apache Maven |
| | | Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." |
| | | Write-Verbose "Downloading from: $distributionUrl" |
| | | Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" |
| | | |
| | | $webclient = New-Object System.Net.WebClient |
| | | if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { |
| | | $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) |
| | | } |
| | | [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 |
| | | $webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null |
| | | |
| | | # If specified, validate the SHA-256 sum of the Maven distribution zip file |
| | | $distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum |
| | | if ($distributionSha256Sum) { |
| | | if ($USE_MVND) { |
| | | Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." |
| | | } |
| | | Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash |
| | | if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { |
| | | Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." |
| | | } |
| | | } |
| | | |
| | | # unzip and move |
| | | Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null |
| | | Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null |
| | | try { |
| | | Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null |
| | | } catch { |
| | | if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { |
| | | Write-Error "fail to move MAVEN_HOME" |
| | | } |
| | | } finally { |
| | | try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } |
| | | catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } |
| | | } |
| | | |
| | | Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" |
New file |
| | |
| | | <?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <parent> |
| | | <artifactId>pipIrr-mw</artifactId> |
| | | <groupId>com.dy</groupId> |
| | | <version>1.0.0</version> |
| | | <relativePath>../pom.xml</relativePath> |
| | | </parent> |
| | | |
| | | <packaging>jar</packaging> |
| | | <artifactId>pipIrr-mw-simulate-rtu202404</artifactId> |
| | | <version>1.0.0</version> |
| | | <name>pipIrr-mw-simulate-rtu202404</name> |
| | | <description>RTU模æå¨ï¼æ¨¡æçæ±æµ·åè®®çRTU</description> |
| | | |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-web</artifactId> |
| | | <exclusions> |
| | | <exclusion> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-json</artifactId> |
| | | </exclusion> |
| | | <exclusion> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-logging</artifactId> |
| | | </exclusion> |
| | | </exclusions> |
| | | </dependency> |
| | | |
| | | <!-- 卿å è½½æ°ç¼è¯çç±» --> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-devtools</artifactId> |
| | | <scope>runtime</scope> |
| | | </dependency> |
| | | |
| | | |
| | | <!-- apache mina --> |
| | | <dependency> |
| | | <groupId>org.apache.mina</groupId> |
| | | <artifactId>mina-core</artifactId> |
| | | <version>2.2.2</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>org.slf4j</groupId> |
| | | <artifactId>slf4j-api</artifactId> |
| | | <version>2.0.7</version> |
| | | </dependency> |
| | | |
| | | <!-- æµè¯ --> |
| | | <dependency> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-starter-test</artifactId> |
| | | <scope>test</scope> |
| | | </dependency> |
| | | </dependencies> |
| | | |
| | | <build> |
| | | <plugins> |
| | | <!-- çæä¸å
å«ä¾èµjarç坿§è¡jarå
|
| | | <plugin> |
| | | !- spring bootæä¾çmavenæå
æä»¶ - |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-maven-plugin</artifactId> |
| | | <executions> |
| | | <execution> |
| | | !- |
| | | <goals> |
| | | <goal>repackage</goal> |
| | | </goals> |
| | | - |
| | | <configuration> |
| | | !- ä¸å çè¯æç»å
å为: ${artifactId}-${version}.jar, å äºçè¯æç»å
å: ${artifactId}-${version}-${classifier}.jar - |
| | | <classifier>execute</classifier> |
| | | !- 䏿å®çæè·¯å¾çè¯, é»è®¤ä¿åå¨ ${build.directory} ä¸ - |
| | | <outputDirectory>${project.build.directory}/execute</outputDirectory> |
| | | <finalName>${artifactId}-${version}</finalName> |
| | | <layout>ZIP</layout> |
| | | <mainClass>com.dy.pipIrrBase.PipIrrBaseApplication</mainClass> |
| | | <includes> |
| | | <include> |
| | | <groupId>com.dy</groupId> |
| | | <artifactId>pipIrr-common</artifactId> |
| | | </include> |
| | | <include> |
| | | <groupId>com.dy</groupId> |
| | | <artifactId>pipIrr-global</artifactId> |
| | | </include> |
| | | </includes> |
| | | <excludes> |
| | | <exclude> |
| | | <groupId>org.projectlombok</groupId> |
| | | <artifactId>lombok</artifactId> |
| | | </exclude> |
| | | </excludes> |
| | | </configuration> |
| | | </execution> |
| | | </executions> |
| | | |
| | | </plugin> |
| | | --> |
| | | <!-- æ·è´ä¾èµçjarå
å°libç®å½--> |
| | | <plugin> |
| | | <groupId>org.springframework.boot</groupId> |
| | | <artifactId>spring-boot-maven-plugin</artifactId> |
| | | <executions> |
| | | <execution> |
| | | <configuration> |
| | | <!-- ä¸å çè¯æç»å
å为: ${artifactId}-${version}.jar, å äºçè¯æç»å
å: ${artifactId}-${version}-${classifier}.jar |
| | | <classifier>execute</classifier> |
| | | --> |
| | | <!-- ${project.build.directory}æ¯mavenåéï¼å
ç½®çï¼è¡¨ç¤ºtargetç®å½,妿ä¸åï¼å°å¨æ ¹ç®å½ä¸å建/lib --> |
| | | <outputDirectory>${project.build.directory}/lib</outputDirectory> |
| | | <!-- excludeTransitive:æ¯å¦ä¸å
å«é´æ¥ä¾èµå
ï¼æ¯å¦æä»¬ä¾èµAï¼ä½æ¯Aåä¾èµäºBï¼æä»¬æ¯å¦ä¹è¦æBæè¿å» é»è®¤ä¸æ--> |
| | | <excludeTransitive>false</excludeTransitive> |
| | | <!-- å¤å¶çjaræä»¶å»æçæ¬ä¿¡æ¯ --> |
| | | <stripVersion>false</stripVersion> |
| | | <finalName>${project.artifactId}-${project.version}</finalName> |
| | | <layout>ZIP</layout> |
| | | <mainClass>com.dy.rtuMw.PipIrrMwAcceptApplication</mainClass> |
| | | <includes> |
| | | <include> |
| | | <groupId>com.dy</groupId> |
| | | <artifactId>pipIrr-common</artifactId> |
| | | </include> |
| | | <include> |
| | | <groupId>com.dy</groupId> |
| | | <artifactId>pipIrr-global</artifactId> |
| | | </include> |
| | | </includes> |
| | | <excludes> |
| | | <exclude> |
| | | <groupId>org.projectlombok</groupId> |
| | | <artifactId>lombok</artifactId> |
| | | </exclude> |
| | | </excludes> |
| | | </configuration> |
| | | </execution> |
| | | </executions> |
| | | </plugin> |
| | | |
| | | <plugin> |
| | | <!-- 设置javaç¼è¯çæ¬ï¼è¿è¡ç¯å¢çæ¬ --> |
| | | <groupId>org.apache.maven.plugins</groupId> |
| | | <artifactId>maven-compiler-plugin</artifactId> |
| | | <!-- sourceï¼ æºä»£ç ç¼è¯çæ¬ï¼targetï¼ ç®æ å¹³å°ç¼è¯çæ¬ï¼encodingï¼ å符éç¼ç ã --> |
| | | <configuration> |
| | | <source>${java.version}</source> |
| | | <target>${java.version}</target> |
| | | <encoding>${encoding}</encoding> |
| | | </configuration> |
| | | </plugin> |
| | | <plugin> |
| | | <!-- è§£å³èµæºæä»¶çç¼ç é®é¢ --> |
| | | <groupId>org.apache.maven.plugins</groupId> |
| | | <artifactId>maven-resources-plugin</artifactId> |
| | | <configuration> |
| | | <encoding>${encoding}</encoding> |
| | | </configuration> |
| | | </plugin> |
| | | <plugin> |
| | | <!-- mavenéæ§è¡æµè¯ç¨ä¾çæä»¶ --> |
| | | <groupId>org.apache.maven.plugins</groupId> |
| | | <artifactId>maven-surefire-plugin</artifactId> |
| | | <configuration> |
| | | <skipTests>true</skipTests> |
| | | </configuration> |
| | | </plugin> |
| | | <plugin> |
| | | <!-- ä¸é¢è§£å³ï¼å½è¿è¡Maven Lifecycle packageæ¶æ¥éï¼Could not find artifact org.apache.mina:mina-core:bundle:2.2.1 in maven (https://repo1.maven.org/maven2/)--> |
| | | <groupId>org.apache.felix</groupId> |
| | | <artifactId>maven-bundle-plugin</artifactId> |
| | | <extensions>true</extensions> |
| | | </plugin> |
| | | </plugins> |
| | | </build> |
| | | </project> |
New file |
| | |
| | | package com.dy.simRtu202404; |
| | | |
| | | |
| | | import com.dy.simRtu202404.tcpClient.TcpClUnitAdapter; |
| | | import com.dy.simRtu202404.tcpClient.TcpClUnitConfigVo; |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:10 |
| | | * @Description |
| | | */ |
| | | public class AdapterImp_TcpClUnit implements TcpClUnitAdapter { |
| | | |
| | | private TcpClUnitConfigVo configVo ; |
| | | |
| | | public TcpClUnitConfigVo getConfig() { |
| | | return configVo; |
| | | } |
| | | |
| | | public void setConfig(TcpClUnitConfigVo configVo){ |
| | | this.configVo = configVo ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404; |
| | | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.boot.CommandLineRunner; |
| | | import org.springframework.boot.WebApplicationType; |
| | | import org.springframework.boot.autoconfigure.SpringBootApplication; |
| | | import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; |
| | | import org.springframework.boot.builder.SpringApplicationBuilder; |
| | | import org.springframework.context.annotation.ComponentScan; |
| | | import org.springframework.context.annotation.FilterType; |
| | | |
| | | @Slf4j |
| | | @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) //ç¦æ¢å¯å¨æ°æ®åºè¿æ¥æ± |
| | | @ComponentScan(basePackages = {"com.dy.common", "com.dy.pipIrrGlobal", "com.dy.simRtu202404"}, |
| | | excludeFilters = { |
| | | @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = { |
| | | com.dy.common.apiDoc.SpringApiConfig.class, //ä¸ç§æé¤ç±»çæ¹å¼ |
| | | com.dy.pipIrrGlobal.config.DingTalk.class |
| | | }), |
| | | @ComponentScan.Filter(type = FilterType.REGEX, pattern = { |
| | | //äºç§æé¤ç±»çæ¹å¼ï¼åæ£å表达å¼ï¼éè¦å¯¹ç®æ ç±»çå®å
¨éå®åå®å
¨å¹é
ï¼å¦åä¸çæ |
| | | "com.dy.common.aop..*", |
| | | "com.dy.common.apiDoc..*", |
| | | "com.dy.common.multiDataSource..*", |
| | | "com.dy.common.mybatis..*", |
| | | "com.dy.common.singleDataSource..*", |
| | | "com.dy.common.webFilter..*", |
| | | "com.dy.common.webListener..*", |
| | | "com.dy.pipIrrGlobal.webCtrls..*" |
| | | }) |
| | | } |
| | | ) |
| | | public class PipIrrMwSimulateRtu202404Application implements CommandLineRunner { |
| | | |
| | | public static void main(String[] args) { |
| | | parseArg0(args, 0) ; |
| | | parseArg1(args, 1) ; |
| | | parseArg2(args, 2) ; |
| | | parseArg3(args, 3) ; |
| | | parseArg4(args, 4) ; |
| | | parseArg5(args, 5) ; |
| | | |
| | | new SpringApplicationBuilder(PipIrrMwSimulateRtu202404Application.class) |
| | | .web(WebApplicationType.NONE)//ä¸å¯å¨webæå¡ |
| | | .run(args); |
| | | } |
| | | |
| | | private static void parseArg0(String[] args, int index){ |
| | | if(args != null |
| | | && args.length > index |
| | | && args[index] != null |
| | | && !args[index].trim().equals("")){ |
| | | ServerProperties.rtuAddr = args[index] ;//æ¬æ¨¡æå¨æ¨¡æRTUå°å |
| | | log.info("åæ°1ï¼" + ServerProperties.rtuAddr); |
| | | } |
| | | if(ServerProperties.rtuAddr == null){ |
| | | ServerProperties.rtuAddr = "37142501020100218" ; |
| | | } |
| | | } |
| | | private static void parseArg1(String[] args, int index){ |
| | | if(args != null |
| | | && args.length > index |
| | | && args[index] != null |
| | | && !args[index].trim().equals("")){ |
| | | ServerProperties.icCardAddr = args[index] ;//ICå¡å°å |
| | | log.info("åæ°2ï¼" + ServerProperties.icCardAddr); |
| | | } |
| | | if(ServerProperties.icCardAddr == null){ |
| | | ServerProperties.icCardAddr = "C49A340D" ; |
| | | } |
| | | } |
| | | private static void parseArg2(String[] args, int index){ |
| | | if(args != null |
| | | && args.length > index |
| | | && args[index] != null |
| | | && !args[index].trim().equals("")){ |
| | | ServerProperties.icCardNo = args[index] ;//ICå¡ç¼å· |
| | | log.info("åæ°3ï¼" + ServerProperties.icCardNo); |
| | | } |
| | | if(ServerProperties.icCardNo == null){ |
| | | ServerProperties.icCardNo = "37142501020100257" ; |
| | | } |
| | | } |
| | | private static void parseArg3(String[] args, int index){ |
| | | if(args != null |
| | | && args.length > index |
| | | && args[index] != null |
| | | && !args[index].trim().equals("")){ |
| | | ServerProperties.serverIp = args[index] ;//éä¿¡ä¸é´ä»¶æå¡ç«¯IP |
| | | log.info("åæ°4ï¼" + ServerProperties.serverIp); |
| | | } |
| | | if(ServerProperties.serverIp == null){ |
| | | ServerProperties.serverIp = "127.0.0.1" ; |
| | | } |
| | | } |
| | | private static void parseArg4(String[] args, int index){ |
| | | if(args != null |
| | | && args.length > index |
| | | && args[index] != null |
| | | && !args[index].trim().equals("")){ |
| | | ServerProperties.serverPort = Integer.parseInt(args[index]) ;//éä¿¡ä¸é´ä»¶æå¡ç«¯ç«¯å£ |
| | | log.info("åæ°5ï¼" + ServerProperties.serverPort); |
| | | } |
| | | if(ServerProperties.serverPort == null){ |
| | | ServerProperties.serverPort = 60000 ; |
| | | } |
| | | } |
| | | private static void parseArg5(String[] args, int index){ |
| | | if(args != null |
| | | && args.length > index |
| | | && args[index] != null |
| | | && !args[index].trim().equals("")){ |
| | | ServerProperties.type = Integer.parseInt(args[index]) ;//è¿è¡æ¹å¼ |
| | | log.info("åæ°6ï¼" + ServerProperties.type); |
| | | } |
| | | if(ServerProperties.type == null){ |
| | | ServerProperties.type = 0 ; |
| | | } |
| | | } |
| | | /** |
| | | * Spring容å¨å¯å¨å®æåï¼æ§è¡ä¸é¢æ¹æ³ |
| | | * @param args åæ° |
| | | * @throws Exception å¼å¸¸ |
| | | */ |
| | | @Override |
| | | public void run(String... args) throws Exception { |
| | | try{ |
| | | //çå¾
ä¸ä¸ |
| | | Thread.sleep(500L); |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | } |
| | | finally { |
| | | this.startMwSv() ; |
| | | } |
| | | } |
| | | |
| | | private void startMwSv(){ |
| | | if(sv != null){ |
| | | sv.startServer(); |
| | | } |
| | | } |
| | | |
| | | |
| | | private Server sv ; |
| | | |
| | | @Autowired |
| | | public void setSv(Server sv){ |
| | | this.sv = sv ; |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404; |
| | | |
| | | import com.dy.common.mw.UnitInterface; |
| | | import com.dy.common.util.ConfigXml4Springboot; |
| | | import com.dy.simRtu202404.tcpClient.TcpClUnit; |
| | | import com.dy.simRtu202404.tcpClient.TcpClUnitConfigVo; |
| | | import org.jdom2.Document; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.core.io.ResourceLoader; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:03 |
| | | * @Description |
| | | */ |
| | | @Component |
| | | public class Server { |
| | | @Autowired |
| | | protected ResourceLoader resourceLoader ; |
| | | |
| | | private ConfigXml4Springboot conf = null ; |
| | | private Document doc = null ; |
| | | private boolean showStartInfo = false ; |
| | | |
| | | private List<UnitInterface> units = new ArrayList<UnitInterface>() ; |
| | | |
| | | /** |
| | | * å¯å¨æå¡ |
| | | */ |
| | | public void startServer() { |
| | | long start = System.currentTimeMillis(); |
| | | try { |
| | | this.conf = new ConfigXml4Springboot() ; |
| | | this.doc = this.conf.createDom(resourceLoader, "config.xml") ; |
| | | //////////////// |
| | | //æå¡ é
ç½® |
| | | this.showStartInfo = this.conf.getSetAttrBoolean(this.doc, "config.server", "showStartInfo", null, null) ; |
| | | |
| | | this.startUnits() ; |
| | | |
| | | String svName ; |
| | | try{ |
| | | svName = this.conf.getSetAttrTxt(this.doc, "config.server", "name", null, false, null) ; |
| | | }catch(Exception e){ |
| | | svName = "" ; |
| | | } |
| | | |
| | | String company ; |
| | | try{ |
| | | company = this.conf.getSetAttrTxt(this.doc, "config.server", "company", null, true, null) ; |
| | | }catch(Exception e){ |
| | | company = "" ; |
| | | } |
| | | System.out.println("OOOOOOOOOO OOOOOOOO OOOOOOOO") ; |
| | | System.out.println("@@@@@@@@@@@@@@@@#O $@@@@@@@@& @@@@@@@@#") ; |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@# @@@@@@@@# $@@@@@@@@&") ; |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@@@# #@@@@@@@@@@@@@@@@O") ; |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@@@@@ &@@@@@@@@@@@@@@") ; |
| | | System.out.println("@@@@@@$ $@@@@@@@@@& O@@@@@@@@@@@#") ; |
| | | System.out.println("@@@@@@$ @@@@@@@@@ @@@@@@@@@& " + svName ) ; |
| | | System.out.println("@@@@@@$ O@@@@@@@@@ &@@@@@@@@") ; |
| | | |
| | | if(ServerProperties.serverIp != null){ |
| | | System.out.println("@@@@@@$ O@@@@@@@@@ &@@@@@@@@ è¿ç¨ä¸é´ä»¶æå¡ " + (ServerProperties.serverIp + " " + ServerProperties.serverPort) ) ; |
| | | }else{ |
| | | System.out.println("@@@@@@$ O@@@@@@@@@ &@@@@@@@@") ; |
| | | } |
| | | System.out.println("@@@@@@$ #@@@@@@@@@$ &@@@@@@@@ æ¬RTUå°å " + ServerProperties.rtuAddr ) ; |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@@@@# &@@@@@@@@ Running in standalone mode" ) ; |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@@@& &@@@@@@@@ Startup in " + (System.currentTimeMillis() - start) + " MS" ) ; |
| | | System.out.println("@@@@@@@@@@@@@@@@@@@# &@@@@@@@@ " + company) ; |
| | | System.out.println("@@@@@@@@@@@@@@@@#O &@@@@@@@@") ; |
| | | |
| | | }catch(Exception e){ |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | |
| | | private void startUnits() { |
| | | try { |
| | | // /////////////// |
| | | // TCP 模å |
| | | TcpClUnitConfigVo tcpVo = new TcpClUnitConfigVo(); |
| | | AdapterImp_TcpClUnit tcpAdap = new AdapterImp_TcpClUnit(); |
| | | tcpAdap.setConfig(tcpVo); |
| | | TcpClUnit tcpUnit = TcpClUnit.getInstance(); |
| | | tcpUnit.setAdapter(tcpAdap); |
| | | tcpUnit.start(obj -> { |
| | | }); |
| | | units.add(tcpUnit) ; |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404; |
| | | |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:03 |
| | | * @Description |
| | | */ |
| | | public class ServerProperties { |
| | | |
| | | public static String rtuAddr ; |
| | | public static String icCardAddr ;//ICå¡å°å |
| | | public static String icCardNo ;//ICå¡ç¼å· |
| | | |
| | | public static String serverIp ;//éä¿¡ä¸é´ä»¶æå¡ç«¯IP |
| | | public static Integer serverPort ;//éä¿¡ä¸é´ä»¶æå¡ç«¯ç«¯å£ |
| | | public static Integer connectTimeout = 3000 ; |
| | | |
| | | /** |
| | | * è¿è¡æ¹å¼ |
| | | * 0ï¼åªä¸æ¥å¿è·³ |
| | | * 1ï¼ä¸æ¥å¿è·³ + 1次ï¼å¼éï¼ |
| | | * 2ï¼ä¸æ¥å¿è·³ + 1次ï¼å
³éï¼ |
| | | * 3ï¼ä¸æ¥å¿è·³ + 1次ï¼å¼é + å
³éï¼ |
| | | * 4ï¼ä¸æ¥å¿è·³ + n次ï¼å¼é + å
³éï¼ |
| | | */ |
| | | public static Integer type ; |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient; |
| | | |
| | | import org.apache.mina.core.session.IoSession; |
| | | import org.apache.mina.filter.codec.ProtocolCodecFactory; |
| | | import org.apache.mina.filter.codec.ProtocolDecoder; |
| | | import org.apache.mina.filter.codec.ProtocolEncoder; |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:10 |
| | | * @Description |
| | | */ |
| | | public class LocalCodecFactory implements ProtocolCodecFactory { |
| | | private ProtocolEncoder encoder; |
| | | private ProtocolDecoder decoder; |
| | | |
| | | public LocalCodecFactory() { |
| | | encoder = new LocalEncoder(); |
| | | decoder = new LocalDecoder(); |
| | | } |
| | | |
| | | /** |
| | | * å¾å°åè®®ç¼ç å¨ |
| | | * @param ioSession ç½ç»ä¼è¯ |
| | | * @return åè®®ç¼ç å¨ |
| | | */ |
| | | @Override |
| | | public ProtocolEncoder getEncoder(IoSession ioSession) { |
| | | return encoder; |
| | | } |
| | | /** |
| | | * å¾å°å议解ç å¨ |
| | | * @param ioSession ç½ç»ä¼è¯ |
| | | * @return å议解ç å¨ |
| | | */ |
| | | @Override |
| | | public ProtocolDecoder getDecoder(IoSession ioSession) { |
| | | return decoder; |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient; |
| | | |
| | | import com.dy.common.util.ByteUtil; |
| | | import com.dy.simRtu202404.tcpClient.downData.DownData; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | import org.apache.mina.core.buffer.IoBuffer; |
| | | import org.apache.mina.core.session.IoSession; |
| | | import org.apache.mina.filter.codec.CumulativeProtocolDecoder; |
| | | import org.apache.mina.filter.codec.ProtocolDecoderOutput; |
| | | |
| | | import java.io.IOException; |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:10 |
| | | * @Description |
| | | */ |
| | | public class LocalDecoder extends CumulativeProtocolDecoder { |
| | | |
| | | private static final Logger log = LogManager.getLogger(LocalDecoder.class) ; |
| | | |
| | | private static final String DECODER_STATE_KEY = LocalDecoder.class.getName() + ".STATE"; |
| | | |
| | | public static final int MAX_SIZE = 2147483647 ; |
| | | |
| | | |
| | | /** |
| | | * 对ç½ç»ä¼ è¾æ¥çæ°æ®è¿è¡è§£ç |
| | | */ |
| | | protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws IOException, Exception{ |
| | | int remain = in.remaining() ; |
| | | if(remain > 0){ |
| | | byte[] bs = new byte[remain]; |
| | | in.get(bs) ; |
| | | in.position(0) ; |
| | | log.info("æ¶å°ä¸é´ä»¶ä¸è¡æ°æ®ï¼" + ByteUtil.bytes2Hex(bs, true)); |
| | | new DownData().parseData(bs); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient; |
| | | |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | import org.apache.mina.core.buffer.IoBuffer; |
| | | import org.apache.mina.core.session.IoSession; |
| | | import org.apache.mina.filter.codec.ProtocolEncoderAdapter; |
| | | import org.apache.mina.filter.codec.ProtocolEncoderOutput; |
| | | |
| | | import java.io.IOException; |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:10 |
| | | * @Description |
| | | */ |
| | | public class LocalEncoder extends ProtocolEncoderAdapter { |
| | | |
| | | private static final Logger log = LogManager.getLogger(LocalEncoder.class) ; |
| | | |
| | | /** |
| | | * å¯¹æ°æ®è¿è¡ç¼ç ï¼ä»¥å¤ç½ç»ä¼ è¾ |
| | | */ |
| | | public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws IOException, Exception{ |
| | | byte[] data = (byte[])message; |
| | | //log.info("ä¸è¡æ°æ®ï¼" + ByteUtil.bytes2Hex(data, true)); |
| | | |
| | | out.write(IoBuffer.allocate((data==null?0:data.length), false).put(data).flip()); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient; |
| | | |
| | | import com.dy.common.util.Callback; |
| | | import com.dy.simRtu202404.ServerProperties; |
| | | import com.dy.simRtu202404.tcpClient.upData.UpData; |
| | | import com.dy.simRtu202404.tcpClient.upData.UpHeartBeat; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | import org.apache.mina.core.session.IoSession; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:10 |
| | | * @Description |
| | | */ |
| | | public class Starter { |
| | | |
| | | private static final Logger log = LogManager.getLogger(TcpClUnit.class) ; |
| | | |
| | | private static Starter instance = new Starter() ; |
| | | |
| | | private static TcpClUnitConfigVo confVo ; |
| | | |
| | | public static IoSession session ; |
| | | |
| | | private Starter(){ |
| | | } |
| | | |
| | | public static Starter getInstance(TcpClUnitConfigVo confVo){ |
| | | Starter.confVo = confVo ; |
| | | return instance ; |
| | | } |
| | | |
| | | public void doStart(){ |
| | | new Thread(() -> { |
| | | Exception ex ; |
| | | while(true){ |
| | | ex = null ; |
| | | try { |
| | | new TcpConnect().createSession( |
| | | ServerProperties.serverIp, |
| | | ServerProperties.serverPort, |
| | | ServerProperties.connectTimeout, |
| | | new TcpHandler(), |
| | | new Callback() { |
| | | @Override |
| | | public void call(Object obj) { |
| | | if (obj == null) { |
| | | log.error("å建ç½ç»ä¼è¯è¿å为null"); |
| | | } else { |
| | | Starter.session = (IoSession) obj; |
| | | log.info("æåå建ä¸éä¿¡ä¸é´ä»¶çç½ç»è¿æ¥"); |
| | | Worker.getInstance(Starter.session).doWork(); |
| | | } |
| | | } |
| | | @Override |
| | | public void call(Object... objs) { |
| | | } |
| | | @Override |
| | | public void exception(Exception e) { |
| | | } |
| | | }); |
| | | }catch (Exception e){ |
| | | ex = e ; |
| | | } |
| | | if(ex == null){ |
| | | break ; |
| | | }else{ |
| | | try{ |
| | | Thread.sleep(100); |
| | | }catch (Exception e){ |
| | | } |
| | | } |
| | | } |
| | | }).start(); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient; |
| | | |
| | | import com.dy.common.mw.UnitAdapterInterface; |
| | | import com.dy.common.mw.UnitCallbackInterface; |
| | | import com.dy.common.mw.UnitInterface; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:10 |
| | | * @Description |
| | | */ |
| | | public class TcpClUnit implements UnitInterface { |
| | | |
| | | private static TcpClUnit instance = new TcpClUnit() ; |
| | | |
| | | public static TcpClUnitAdapter adapter ; |
| | | public static TcpClUnitConfigVo confVo ; |
| | | |
| | | private static Starter worker ; |
| | | |
| | | private TcpClUnit(){} ; |
| | | |
| | | public static TcpClUnit getInstance(){ |
| | | return instance ; |
| | | } |
| | | |
| | | @Override |
| | | public void setAdapter(UnitAdapterInterface adapter) throws Exception { |
| | | if(adapter == null){ |
| | | throw new Exception("Tcp Client模åéé
å¨å¯¹è±¡ä¸è½ä¸ºç©ºï¼") ; |
| | | } |
| | | TcpClUnit.adapter = (TcpClUnitAdapter)adapter ; |
| | | TcpClUnit.confVo = TcpClUnit.adapter.getConfig() ; |
| | | if(TcpClUnit.confVo == null){ |
| | | throw new Exception("Tcp Client模åé
置对象ä¸è½ä¸ºç©ºï¼") ; |
| | | } |
| | | TcpClUnit.worker = Starter.getInstance(TcpClUnit.confVo) ; |
| | | } |
| | | |
| | | @Override |
| | | public void start(UnitCallbackInterface callback) throws Exception { |
| | | System.out.println("Tcp Client模åæåå¯å¨"); |
| | | TcpClUnit.worker.doStart(); |
| | | callback.call(null) ; |
| | | } |
| | | |
| | | @Override |
| | | public void stop(UnitCallbackInterface callback) throws Exception { |
| | | callback.call(null); |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient; |
| | | |
| | | import com.dy.common.mw.UnitAdapterInterface; |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:10 |
| | | * @Description |
| | | */ |
| | | public interface TcpClUnitAdapter extends UnitAdapterInterface { |
| | | |
| | | TcpClUnitConfigVo getConfig() ; |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient; |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:10 |
| | | * @Description |
| | | */ |
| | | public class TcpClUnitConfigVo { |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient; |
| | | |
| | | import com.dy.common.util.Callback; |
| | | import org.apache.mina.core.future.ConnectFuture; |
| | | import org.apache.mina.core.session.IoSession; |
| | | import org.apache.mina.filter.codec.ProtocolCodecFilter; |
| | | import org.apache.mina.transport.socket.SocketConnector; |
| | | import org.apache.mina.transport.socket.nio.NioSocketConnector; |
| | | |
| | | import java.net.InetSocketAddress; |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:10 |
| | | * @Description |
| | | */ |
| | | public class TcpConnect { |
| | | |
| | | /** |
| | | * 夿ä¼è¯æ¯å¦ææ |
| | | * @param se ç½ç»ä¼è¯ |
| | | * @return æ¯å¦è¿æ¥ |
| | | */ |
| | | public boolean isConnected(IoSession se) { |
| | | return (se != null && se.isConnected()); |
| | | } |
| | | |
| | | /** |
| | | * å建æ°ä¼è¯ |
| | | * @param host æå¡å¨URI |
| | | * @param port æå¡å¨ç«¯å£ |
| | | * @param connectTimeout è¿æ¥è¶
æ¶æ¶é¿ |
| | | * @param handler æ°æ®å¤çè
|
| | | * @param callback åè° |
| | | * @return ç½ç»ä¼è¯ |
| | | */ |
| | | public void createSession(String host , |
| | | int port , |
| | | int connectTimeout , |
| | | TcpHandler handler, |
| | | Callback callback) throws Exception{ |
| | | SocketConnector connector = new NioSocketConnector(); |
| | | connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new LocalCodecFactory())); |
| | | connector.setHandler(handler); |
| | | ConnectFuture connectFuture = connector.connect(new InetSocketAddress(host, port)); |
| | | connectFuture.awaitUninterruptibly(connectTimeout); |
| | | IoSession se = connectFuture.getSession(); |
| | | callback.call(se) ; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * å
³éä¼è¯èæ¥ |
| | | * @param se |
| | | * @param connectTimeout |
| | | */ |
| | | public void disconnect(IoSession se , int connectTimeout) { |
| | | if (se != null) { |
| | | try{ |
| | | se.closeNow().awaitUninterruptibly(connectTimeout); |
| | | }catch(Exception e){ |
| | | }finally{ |
| | | se = null; |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient; |
| | | |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | import org.apache.mina.core.service.IoHandlerAdapter; |
| | | import org.apache.mina.core.session.IdleStatus; |
| | | import org.apache.mina.core.session.IoSession; |
| | | import org.apache.mina.filter.FilterEvent; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:10 |
| | | * @Description |
| | | */ |
| | | public class TcpHandler extends IoHandlerAdapter { |
| | | |
| | | private static Logger log = LogManager.getLogger(TcpHandler.class.getName()) ; |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void sessionCreated(IoSession session) throws Exception { |
| | | super.sessionCreated(session); |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void sessionOpened(IoSession session) throws Exception { |
| | | super.sessionOpened(session); |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void sessionClosed(IoSession session) throws Exception { |
| | | super.sessionClosed(session); |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void sessionIdle(IoSession session, IdleStatus status) throws Exception { |
| | | super.sessionIdle(session, status); |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void exceptionCaught(IoSession session, Throwable cause) throws Exception { |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void messageReceived(IoSession session, Object message) throws Exception { |
| | | if(message != null){ |
| | | byte[] bs = (byte[])message ; |
| | | log.info("æ¶å°ä¸é´ä»¶æ°æ®ï¼" + ByteUtil.bytes2Hex(bs, true)); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void messageSent(IoSession session, Object message) throws Exception { |
| | | if(message != null){ |
| | | byte[] bs = (byte[])message ; |
| | | log.info("\nç½ç»åéäºæ°æ®ï¼" |
| | | + (session==null?"":(session.getRemoteAddress() != null?("ä¸é´ä»¶ç½åæ¯ï¼" + session.getRemoteAddress().toString()):"")) |
| | | + ("\næ°æ®ï¼" + ByteUtil.bytes2Hex(bs, true))); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void inputClosed(IoSession session) throws Exception { |
| | | session.closeNow(); |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void event(IoSession session, FilterEvent event) throws Exception { |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient; |
| | | |
| | | import com.dy.simRtu202404.ServerProperties; |
| | | import com.dy.simRtu202404.tcpClient.upData.UpData; |
| | | import com.dy.simRtu202404.tcpClient.upData.UpHeartBeat; |
| | | import com.dy.simRtu202404.tcpClient.upData.UpOpenCloseValve; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | import org.apache.mina.core.session.IoSession; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/2/26 14:39 |
| | | * @Description |
| | | */ |
| | | public class Worker { |
| | | |
| | | private static final Logger log = LogManager.getLogger(TcpClUnit.class) ; |
| | | |
| | | protected static IoSession session ; |
| | | |
| | | private static Worker instance = new Worker() ; |
| | | |
| | | private static Integer UpHeartBeatTimes = 0 ; |
| | | private static boolean isOpenValve = false ; |
| | | private static boolean isCloseValve = false ; |
| | | private static Integer OpenedCount = 0 ; |
| | | private static Integer ClosedCount = 0 ; |
| | | |
| | | private Worker(){ |
| | | } |
| | | |
| | | public static Worker getInstance(IoSession session){ |
| | | Worker.session = session ; |
| | | return instance ; |
| | | } |
| | | |
| | | public void doWork(){ |
| | | UpData.setSession(Starter.session); |
| | | new Thread(new Runnable(){ |
| | | @Override |
| | | public void run() { |
| | | while(true){ |
| | | try { |
| | | reportData() ; |
| | | Thread.sleep(1000L); |
| | | }catch (Exception e){ |
| | | continue; |
| | | } |
| | | } |
| | | } |
| | | }).start(); |
| | | } |
| | | private void reportData() throws Exception{ |
| | | UpHeartBeat.upCd02Data(ServerProperties.rtuAddr); |
| | | UpHeartBeatTimes += 1 ; |
| | | |
| | | Thread.sleep(10000L); |
| | | |
| | | if(UpHeartBeatTimes == 2){ |
| | | UpHeartBeatTimes = 0 ; |
| | | if(ServerProperties.type == 1){ |
| | | if(!isOpenValve){ |
| | | UpOpenCloseValve.upCd84Data(ServerProperties.rtuAddr); |
| | | isOpenValve = true ; |
| | | } |
| | | } |
| | | |
| | | if(ServerProperties.type == 2){ |
| | | if(!isCloseValve){ |
| | | UpOpenCloseValve.upCd85Data(ServerProperties.rtuAddr); |
| | | isCloseValve = true ; |
| | | } |
| | | } |
| | | |
| | | if(ServerProperties.type == 3){ |
| | | if(!isOpenValve){ |
| | | UpOpenCloseValve.upCd84Data(ServerProperties.rtuAddr); |
| | | isOpenValve = true ; |
| | | } |
| | | OpenedCount += 1 ; |
| | | if(OpenedCount == 10){ |
| | | OpenedCount = 0 ; |
| | | if(!isCloseValve){ |
| | | UpOpenCloseValve.upCd85Data(ServerProperties.rtuAddr); |
| | | isCloseValve = true ; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if(ServerProperties.type == 4){ |
| | | if(!isOpenValve && !isCloseValve){ |
| | | //忬¡ |
| | | UpOpenCloseValve.upCd84Data(ServerProperties.rtuAddr); |
| | | isOpenValve = true ; |
| | | isCloseValve = false ; |
| | | }else{ |
| | | if(isOpenValve){ |
| | | OpenedCount += 1 ; |
| | | } |
| | | if(OpenedCount == 10){ |
| | | OpenedCount = 0 ; |
| | | UpOpenCloseValve.upCd85Data(ServerProperties.rtuAddr); |
| | | isOpenValve = false ; |
| | | isCloseValve = true ; |
| | | } |
| | | |
| | | if(isCloseValve){ |
| | | ClosedCount += 1 ; |
| | | } |
| | | if(ClosedCount == 10){ |
| | | ClosedCount = 0 ; |
| | | UpOpenCloseValve.upCd84Data(ServerProperties.rtuAddr); |
| | | isOpenValve = true ; |
| | | isCloseValve = false ; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient.downData; |
| | | |
| | | import com.dy.common.mw.protocol.p206V202404.ProtocolConstantV206V202404; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:10 |
| | | * @Description |
| | | */ |
| | | public class DownData { |
| | | |
| | | private static int count9602 = 0; |
| | | |
| | | public void parseData(byte[] bs){ |
| | | if(bs != null && bs.length > 0){ |
| | | if(bs.length >= (ProtocolConstantV206V202404.ctrlIndex) |
| | | && bs[0] == ProtocolConstantV206V202404.P_Head_Byte |
| | | && bs[2] == ProtocolConstantV206V202404.P_Head_Byte){ |
| | | this.dealP206V1(bs); |
| | | }else if(bs.length >= (ProtocolConstantV206V202404.UG_codeIndex) |
| | | && bs[0] == ProtocolConstantV206V202404.UG_P_Head_Byte |
| | | && bs[3] == ProtocolConstantV206V202404.UG_P_Head_Byte){ |
| | | this.dealUpgrade(bs); |
| | | } |
| | | |
| | | } |
| | | } |
| | | private void dealP206V1(byte[] bs){ |
| | | //åºè¯¥æ¯é¾è·¯æ£æµæ°æ® |
| | | } |
| | | private void dealUpgrade(byte[] bs){ |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient.upData; |
| | | |
| | | import com.dy.common.mw.protocol.p206V202404.ProtocolConstantV206V202404; |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.mina.core.session.IoSession; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:10 |
| | | * @Description |
| | | */ |
| | | public class UpData { |
| | | |
| | | protected static IoSession session ; |
| | | |
| | | private static Object synObj = new Object() ; |
| | | |
| | | public static void setSession(IoSession session){ |
| | | UpData.session = session ; |
| | | } |
| | | |
| | | protected static void upSend(byte[] bs) throws Exception{ |
| | | synchronized (synObj){ |
| | | session.write(bs) ; |
| | | } |
| | | } |
| | | |
| | | protected static byte[] creatHead(String rtuAddr, String code, byte ctrl)throws Exception { |
| | | byte[] bsHead = new byte[ProtocolConstantV206V202404.lenHead2Code] ; |
| | | byte index = 0 ; |
| | | bsHead[index] = ProtocolConstantV206V202404.P_Head_Byte ; |
| | | |
| | | index++ ; |
| | | bsHead[index] = 0 ;//帧é¿åº¦ |
| | | |
| | | index++ ; |
| | | bsHead[index] = ProtocolConstantV206V202404.P_Head_Byte ; |
| | | |
| | | index++ ; |
| | | bsHead[index] = ctrl; //æ§å¶ååè½ç |
| | | |
| | | index++ ; |
| | | GlCreate.createRtuAddr(rtuAddr, bsHead, index); |
| | | index += 8 ; |
| | | |
| | | ByteUtil.hex2Bytes(code, bsHead, index) ; |
| | | |
| | | return bsHead ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient.upData; |
| | | |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:10 |
| | | * @Description |
| | | */ |
| | | public class UpHeartBeat extends UpData { |
| | | |
| | | private static final Logger log = LogManager.getLogger(UpHeartBeat.class) ; |
| | | |
| | | public static void upCd02Data(String rtuAddr){ |
| | | try{ |
| | | if(UpData.session != null && UpData.session.isConnected()){ |
| | | byte[] bs = createCd02Data(rtuAddr) ; |
| | | UpData.upSend(bs) ; |
| | | }else{ |
| | | log.error("æªè¿æ¥éä¿¡ä¸é´ä»¶ï¼ä¸è½åéæ°æ®"); |
| | | } |
| | | }catch (Exception e){ |
| | | log.error("åéä¿¡ä¸é´ä»¶åéæ°æ®äº§çå¼å¸¸", e); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * æé å¿è·³æ°æ® |
| | | * @return åèæ°ç» |
| | | * @throws Exception å¼å¸¸ |
| | | */ |
| | | private static byte[] createCd02Data(String rtuAddr) throws Exception { |
| | | byte[] bytes = creatHead(rtuAddr, "02", (byte)0x81); |
| | | |
| | | byte[] bs = new byte[]{(byte)0x02} ;//0x02:表éä¸ä½æº |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[]{(byte)0x0A} ;//项ç®ç¼å· |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[]{(byte)0xF2} ;//ä¿æå¨çº¿ |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | GlCreate.createLen(bytes);//é¿åº¦æ¾åèæ°ç»ä¸ |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRCåå°¾å å åèæ°ç»ä¸ |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.simRtu202404.tcpClient.upData; |
| | | |
| | | import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate; |
| | | import com.dy.common.util.ByteUtil; |
| | | import com.dy.common.util.DateTime; |
| | | import com.dy.simRtu202404.ServerProperties; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/2/26 11:42 |
| | | * @Description |
| | | */ |
| | | public class UpOpenCloseValve extends UpData { |
| | | |
| | | private static final Logger log = LogManager.getLogger(UpOpenCloseValve.class) ; |
| | | |
| | | private static String orderNo = null ; |
| | | private static String openValveDt = null ; |
| | | |
| | | private static Double totalWaterAmount = 1234.56 ;//累计æµé |
| | | private static Double remainMoney = 65.4321 ;//å©ä½éé¢ |
| | | |
| | | private static Double thisWaterAmount = 100.00 ;//æ¬æ¬¡ä½¿ç¨çµé |
| | | private static Double thisMoney = 10.00 ;//æ¬æ¬¡ä½¿ç¨éé¢ |
| | | |
| | | public static void upCd84Data(String rtuAddr){ |
| | | try{ |
| | | if(UpData.session != null && UpData.session.isConnected()){ |
| | | byte[] bs = createCd84Data(rtuAddr) ; |
| | | UpData.upSend(bs) ; |
| | | }else{ |
| | | log.error("æªè¿æ¥éä¿¡ä¸é´ä»¶ï¼ä¸è½åéæ°æ®"); |
| | | } |
| | | }catch (Exception e){ |
| | | log.error("åéä¿¡ä¸é´ä»¶åéæ°æ®äº§çå¼å¸¸", e); |
| | | } |
| | | } |
| | | |
| | | public static void upCd85Data(String rtuAddr){ |
| | | try{ |
| | | if(UpData.session != null && UpData.session.isConnected()){ |
| | | byte[] bs = createCd85Data(rtuAddr) ; |
| | | UpData.upSend(bs) ; |
| | | }else{ |
| | | log.error("æªè¿æ¥éä¿¡ä¸é´ä»¶ï¼ä¸è½åéæ°æ®"); |
| | | } |
| | | }catch (Exception e){ |
| | | log.error("åéä¿¡ä¸é´ä»¶åéæ°æ®äº§çå¼å¸¸", e); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * æé å¼éæ°æ® |
| | | * @return åèæ°ç» |
| | | * @throws Exception å¼å¸¸ |
| | | */ |
| | | private static byte[] createCd84Data(String rtuAddr) throws Exception { |
| | | orderNo = DateTime.yyyyMMddHHmmss() + "00" ; |
| | | openValveDt = DateTime.yyMMddhhmmss() ; |
| | | |
| | | byte[] bytes = creatHead(rtuAddr, "84", (byte)0x81); |
| | | |
| | | byte[] bs = new byte[]{(byte)0x02} ;//0x02:表éä¸ä½æº |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[]{(byte)0x0A} ;//项ç®ç¼å· |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[]{(byte)0xF0} ;//0xf0:éé¨ 0x00:æ°´æ³µ |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[]{(byte)0x00} ;//0x00:æ£å¸¸å·å¡å¼æ³µ/éç¨æ°´ |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[4] ;//ç¨æ·ICå¡å· 4åèHEXç (è¿ç¨å¼æ³µ/éæ¶æ¤æ°æ®ä¸º0) |
| | | GlCreate.createIcCardAddr(ServerProperties.icCardAddr, bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[8] ;//ç¨æ·åºåå· 8åè 6åèBCD:è¡æ¿ç¼å· 2åèHEX:ç¨æ·ç¼å· |
| | | GlCreate.createIcCardNo(ServerProperties.icCardNo, bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[8] ;//æ¬æ¬¡è®¢åå· 8åè BCDç |
| | | ByteUtil.string2BCD_LE( bs, orderNo,0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[6] ;//弿³µ/éæ¶é´ 6åèçBCDç (ç§åæ¶æ¥æå¹´) |
| | | ByteUtil.string2BCD_LE( bs, openValveDt,0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[5] ;//水表累计水é 5åèBCDç ï¼åä½0.01ç«æ¹ç±³ |
| | | ByteUtil.int2BCD_LE(Double.valueOf(totalWaterAmount * 100).intValue(), bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[5] ;//çµè¡¨ç´¯è®¡çµé 5åèBCDç ï¼åä½0.01度 |
| | | ByteUtil.int2BCD_LE(0, bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[5] ;//ç¨æ·å©ä½éé¢ 5åèBCDç ï¼ åä½0.0001å
|
| | | ByteUtil.int2BCD_LE(Double.valueOf(remainMoney * 10000).intValue(), bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[5] ;//ç¨æ·å©ä½æ°´é 5åèBCDç ï¼ åä½0.01m3 |
| | | ByteUtil.int2BCD_LE(0, bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[4] ;//æºäº/éç¶æåæ¥è¦ä¿¡æ¯ 4åèHEXç å®ä¹è§è¡¨41 |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | |
| | | GlCreate.createLen(bytes);//é¿åº¦æ¾åèæ°ç»ä¸ |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRCåå°¾å å åèæ°ç»ä¸ |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | /** |
| | | * æé å
³éæ°æ® |
| | | * @return åèæ°ç» |
| | | * @throws Exception å¼å¸¸ |
| | | */ |
| | | private static byte[] createCd85Data(String rtuAddr) throws Exception { |
| | | if(orderNo == null){ |
| | | orderNo = DateTime.yyyyMMddHHmmss() + "00" ; |
| | | } |
| | | if(openValveDt == null){ |
| | | openValveDt = DateTime.yyMMddhhmmss() ; |
| | | } |
| | | |
| | | totalWaterAmount -= thisWaterAmount ; |
| | | remainMoney -= thisMoney ; |
| | | |
| | | byte[] bytes = creatHead(rtuAddr, "85", (byte)0x81); |
| | | |
| | | byte[] bs = new byte[]{(byte)0x02} ;//0x02:表éä¸ä½æº |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[]{(byte)0x0A} ;//项ç®ç¼å· |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[]{(byte)0x01} ;//å
³æ³µ/éæ¹å¼ 0x00:å·å¡é 0x01:å¹³å°å
³ 0x02:APPå
³ 0x03:éæ³å¡å
³ 0x04:水表é讯å¼å¸¸å
³ 0x05:çµè¡¨å¼å¸¸å
³ 0x06:å©ä½æ°´éä¸è¶³å
³ 0x07:å©ä½éé¢ä¸º0å
³ 0x08:弿³µ/éåç®¡éæ²¡ææµéå
³ 0x09:æçµåä¸çµå
³ï¼0x0a:æ°´è¡¨ç¬æ¶æµé为0å
³ï¼0x0b:å·å¡å¼æ³µï¼è¿ç¨å
³ã0x0c:çµæ± ä½çµåå
³ã |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[4] ;//ç¨æ·ICå¡å· 4åèHEXç (è¿ç¨å¼æ³µ/éæ¶æ¤æ°æ®ä¸º0) |
| | | GlCreate.createIcCardAddr(ServerProperties.icCardAddr, bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[8] ;//ç¨æ·åºåå· 8åè 6åèBCD:è¡æ¿ç¼å· 2åèHEX:ç¨æ·ç¼å· |
| | | GlCreate.createIcCardNo(ServerProperties.icCardNo, bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[8] ;//æ¬æ¬¡è®¢åå· 8åè BCDç |
| | | ByteUtil.string2BCD_LE( bs, orderNo,0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[6] ;//å¼å§æ¶é´ 6åèçBCDç (ç§åæ¶æ¥æå¹´) |
| | | ByteUtil.string2BCD_LE( bs, openValveDt,0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[6] ;//ç»ææ¶é´ 6åèçBCDç (ç§åæ¶æ¥æå¹´) |
| | | ByteUtil.string2BCD_LE( bs, DateTime.yyyyMMddHHmmss(),0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[5] ;//水表累计水é 5åèBCDç ï¼åä½0.01ç«æ¹ç±³ |
| | | ByteUtil.int2BCD_LE(Double.valueOf(totalWaterAmount * 100).intValue(), bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[5] ;//çµè¡¨ç´¯è®¡çµé 5åèBCDç ï¼åä½0.01度 |
| | | ByteUtil.int2BCD_LE(0, bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[5] ;//ç¨æ·å©ä½éé¢ 5åèBCDç ï¼ åä½0.0001å
|
| | | ByteUtil.int2BCD_LE(Double.valueOf(remainMoney * 10000).intValue(), bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[5] ;//ç¨æ·å©ä½æ°´é 5åèBCDç ï¼ åä½0.01m3 |
| | | ByteUtil.int2BCD_LE(0, bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[4] ;//æ¬æ¬¡ä½¿ç¨çµé 4åèBCDç åä½0.01度 |
| | | ByteUtil.int2BCD_LE(0, bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[4] ;//æ¬æ¬¡ä½¿ç¨æ°´é 4åèBCDç åä½0.01ç«æ¹ç±³ |
| | | ByteUtil.int2BCD_LE(Double.valueOf(thisWaterAmount * 10000).intValue(), bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[4] ;//æ¬æ¬¡ä½¿ç¨éé¢ 4åèBCDç åä½0.0001å
|
| | | ByteUtil.int2BCD_LE(Double.valueOf(thisMoney * 10000).intValue(), bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[2] ;//æ¬æ¬¡ä½¿ç¨æ¶é´é¿ 2åèBCDç åä½ï¼åé |
| | | ByteUtil.int2BCD_LE(10, bs, 0); |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | bs = new byte[4] ;//æºäº/éç¶æåæ¥è¦ä¿¡æ¯ 4åèHEXç å®ä¹è§è¡¨41 |
| | | bytes = ByteUtil.bytesMerge(bytes, bs) ; |
| | | |
| | | GlCreate.createLen(bytes);//é¿åº¦æ¾åèæ°ç»ä¸ |
| | | |
| | | byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRCåå°¾å å åèæ°ç»ä¸ |
| | | |
| | | bytes = ByteUtil.bytesMerge(bytes, bsTail) ; |
| | | |
| | | return bytes ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | logging: |
| | | charset: |
| | | console: UTF-8 |
| | | config: |
| | | classpath: log4j2.yml |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <config> |
| | | <server name="RTU模æå¨ï¼çæ±æµ·ï¼" showStartInfo="true" company="http://www.dyjs.com"/> |
| | | |
| | | </config> |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <Configuration status="OFF"> |
| | | <Appenders> |
| | | <Console name="Console" target="SYSTEM_OUT"> |
| | | <PatternLayout charset="UTF-8" pattern="%d %-5p [%t] (%F:%L) - %m%n%throwable"/> |
| | | </Console> |
| | | <RollingFile name="File" fileName="logs/simRtu202404.log" filePattern="logs/simRtu-%d{yyyyMMdd}-%i.log"> |
| | | <PatternLayout charset="UTF-8" pattern="%d %-5p [%t] (%class.%method:%L) - %m%n%throwable"/> |
| | | <Policies> |
| | | <TimeBasedTriggeringPolicy interval="7" /> |
| | | <SizeBasedTriggeringPolicy size="10MB"/> |
| | | </Policies> |
| | | <DefaultRolloverStrategy max="50" /> |
| | | </RollingFile> |
| | | </Appenders> |
| | | <Loggers> |
| | | <!-- |
| | | <Logger name="com.zhzc.jgTest" level="debug"> |
| | | <AppenderRef ref="Console"/> |
| | | </Logger> |
| | | <Logger name="org.jgroups" level="info"> |
| | | <AppenderRef ref="File"/> |
| | | </Logger> |
| | | --> |
| | | <!-- Rootä¸å个Loggeråæ¶èµ·ä½ç¨ --> |
| | | <Root level="info"> |
| | | <AppenderRef ref="Console"/> |
| | | <AppenderRef ref="File"/> |
| | | </Root> |
| | | </Loggers> |
| | | </Configuration> |
New file |
| | |
| | | package com.dy.simRtu202404.pipirrmwsimulatertu202404; |
| | | |
| | | import org.junit.jupiter.api.Test; |
| | | import org.springframework.boot.test.context.SpringBootTest; |
| | | |
| | | @SpringBootTest |
| | | class PipIrrMwSimulateRtu202404ApplicationTests { |
| | | |
| | | @Test |
| | | void contextLoads() { |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | æ¬æ¨¡åæ¯RTU模æå¨ï¼æ¨¡æçæ±æµ·åè®®çRTU |
| | |
| | | <modules> |
| | | <module>pipIrr-mw-rtu</module> |
| | | <module>pipIrr-mw-simulate-rtu</module> |
| | | <module>pipIrr-mw-simulate-rtu202404</module> |
| | | <module>pipIrr-mwTest-server</module> |
| | | <module>pipIrr-mwTest-client</module> |
| | | </modules> |