接入第三方平台系统(北京农林、新疆农垦)中间件模块框架、TCP接口、Http接口开发完成,接收到的数据处理业务逻辑、与本地业务系统接口等部分未设计开发。
New file |
| | |
| | | package com.dy.common.util; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/13 9:35 |
| | | * @Description |
| | | */ |
| | | public interface HttpCallback { |
| | | void call(String statusCode, String charset, String body) ; |
| | | } |
New file |
| | |
| | | /mvnw text eol=lf |
| | | *.cmd text eol=crlf |
New file |
| | |
| | | HELP.md |
| | | target/ |
| | | /pipIrr-mw-rtu3rd.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-rtu3rd</artifactId> |
| | | <version>1.0.0</version> |
| | | <name>pipIrr-mw-rtu3rd</name> |
| | | <description>第三方接入中间件</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-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> |
| | | |
| | | <!-- 阿里fastjson --> |
| | | <dependency> |
| | | <groupId>com.alibaba.fastjson2</groupId> |
| | | <artifactId>fastjson2</artifactId> |
| | | <version>2.0.40</version> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>com.alibaba.fastjson2</groupId> |
| | | <artifactId>fastjson2-extension-spring6</artifactId> |
| | | <version>2.0.40</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.rtuMw3rd; |
| | | |
| | | |
| | | import com.dy.rtuMw3rd.http4Xjnk.HttpUnitAdapter; |
| | | import com.dy.rtuMw3rd.http4Xjnk.HttpUnitConfigVo; |
| | | import com.dy.rtuMw3rd.tcp4Bjnl.TcpClUnitAdapter; |
| | | import com.dy.rtuMw3rd.tcp4Bjnl.TcpClUnitConfigVo; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/03/18 15:49 |
| | | * @Description |
| | | */ |
| | | public class AdapterImp_HttpUnit implements HttpUnitAdapter { |
| | | |
| | | private HttpUnitConfigVo configVo ; |
| | | |
| | | public HttpUnitConfigVo getConfig() { |
| | | return configVo; |
| | | } |
| | | |
| | | public void setConfig(HttpUnitConfigVo configVo){ |
| | | this.configVo = configVo ; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd; |
| | | |
| | | |
| | | import com.dy.rtuMw3rd.tcp4Bjnl.TcpClUnitAdapter; |
| | | import com.dy.rtuMw3rd.tcp4Bjnl.TcpClUnitConfigVo; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/03/18 15:49 |
| | | * @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.rtuMw3rd; |
| | | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.boot.CommandLineRunner; |
| | | 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.EnableAspectJAutoProxy; |
| | | import org.springframework.context.annotation.FilterType; |
| | | |
| | | |
| | | @Slf4j |
| | | @EnableAspectJAutoProxy |
| | | @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) //禁止启动数据库连接池 |
| | | @ComponentScan(basePackages = {"com.dy.common", "com.dy.pipIrrGlobal", "com.dy.rtuMw3rd"}, |
| | | 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 PipIrrMwRtu3rdApplication implements CommandLineRunner { |
| | | |
| | | public static void main(String[] args) { |
| | | new SpringApplicationBuilder(PipIrrMwRtu3rdApplication.class).run(args); |
| | | } |
| | | |
| | | /** |
| | | * 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 Server sv ; |
| | | @Autowired |
| | | public void setSv(Server sv){ |
| | | this.sv = sv ; |
| | | } |
| | | private void startMwSv(){ |
| | | if(sv != null){ |
| | | sv.startServer(); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd; |
| | | |
| | | import com.dy.common.mw.UnitInterface; |
| | | import com.dy.common.util.ConfigXml4Springboot; |
| | | import com.dy.rtuMw3rd.http4Xjnk.HttpUnit; |
| | | import com.dy.rtuMw3rd.http4Xjnk.HttpUnitConfigVo; |
| | | import com.dy.rtuMw3rd.tcp4Bjnl.TcpClUnit; |
| | | import com.dy.rtuMw3rd.tcp4Bjnl.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/03/18 15:49 |
| | | * @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("0O0OOOOOOOOO00 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.BjnlServerIp != null){ |
| | | System.out.println("@@@@@@@$ O@@@@@@@@@ &@@@@@@@@ 北京农林服务 " + (ServerProperties.BjnlServerIp + " " + ServerProperties.BjnlServerPort) ) ; |
| | | }else{ |
| | | System.out.println("@@@@@@@$ O@@@@@@@@@ &@@@@@@@@") ; |
| | | } |
| | | if(ServerProperties.XjnkServerHttpsBaseUrl != null){ |
| | | System.out.println("@@@@@@@$ O@@@@@@@@@ &@@@@@@@@ 新疆农垦--服务 " + (ServerProperties.XjnkServerHttpsBaseUrl) ) ; |
| | | }else{ |
| | | System.out.println("@@@@@@@$ O@@@@@@@@@ &@@@@@@@@") ; |
| | | } |
| | | System.out.println("@@@@@@@$ #@@@@@@@@@$ &@@@@@@@@") ; |
| | | 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 { |
| | | // /////////////// |
| | | // http 模块 |
| | | HttpUnitConfigVo httpVo = new HttpUnitConfigVo(); |
| | | httpVo.httpsBaseUr = this.conf.getSetAttrTxt(this.doc, "config.xjnk", "httpsBaseUrl", null, false, null) ; |
| | | httpVo.appid = this.conf.getSetAttrTxt(this.doc, "config.xjnk", "appid", null, false, null) ; |
| | | httpVo.secret = this.conf.getSetAttrTxt(this.doc, "config.xjnk", "secret", null, false, null) ; |
| | | httpVo.flushDataFromSvInterval = conf.getSetAttrPlusInt(this.doc, "config.xjnk", "flushDataFromSvInterval", null, 1, 7200000, null) ; |
| | | |
| | | ServerProperties.XjnkServerHttpsBaseUrl = httpVo.httpsBaseUr ; |
| | | |
| | | AdapterImp_HttpUnit httpAdapt = new AdapterImp_HttpUnit(); |
| | | httpAdapt.setConfig(httpVo); |
| | | HttpUnit httpUnit = HttpUnit.getInstance(); |
| | | httpUnit.setAdapter(httpAdapt); |
| | | httpUnit.start(obj -> { |
| | | }); |
| | | units.add(httpUnit) ; |
| | | |
| | | // /////////////// |
| | | // TCP 模块 |
| | | TcpClUnitConfigVo tcpVo = new TcpClUnitConfigVo(); |
| | | tcpVo.BjnlServerIp = this.conf.getSetAttrTxt(this.doc, "config.bjnl", "ip", null, false, null) ; |
| | | tcpVo.BjnlServerPort = conf.getSetAttrPlusInt(this.doc, "config.bjnl", "port", null, 1, 65536, null) ; |
| | | tcpVo.BjnlConnectTimeout = conf.getSetAttrPlusInt(this.doc, "config.bjnl", "connectTimeout", null, 1, 65536, null) ; |
| | | tcpVo.BjnlApikey = this.conf.getSetAttrTxt(this.doc, "config.bjnl", "apikey", null, false, null) ; |
| | | tcpVo.BjnlSecretkey = this.conf.getSetAttrTxt(this.doc, "config.bjnl", "secretkey", null, false, null) ; |
| | | tcpVo.heartBeatInterval = conf.getSetAttrPlusInt(this.doc, "config.bjnl", "heartBeatInterval", null, 1, 3600000, null) ; |
| | | |
| | | ServerProperties.BjnlServerIp = tcpVo.BjnlServerIp ; |
| | | ServerProperties.BjnlServerPort = tcpVo.BjnlServerPort ; |
| | | |
| | | AdapterImp_TcpClUnit tcpAdapt = new AdapterImp_TcpClUnit(); |
| | | tcpAdapt.setConfig(tcpVo); |
| | | TcpClUnit tcpUnit = TcpClUnit.getInstance(); |
| | | tcpUnit.setAdapter(tcpAdapt); |
| | | tcpUnit.start(obj -> { |
| | | }); |
| | | units.add(tcpUnit) ; |
| | | }catch (Exception e){ |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd; |
| | | |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/02/26 11:03 |
| | | * @Description |
| | | */ |
| | | public class ServerProperties { |
| | | public static String XjnkServerHttpsBaseUrl = "https://www.sshyun.com" ;//服务端https服务URL |
| | | public static String BjnlServerIp = "127.0.0.1" ;//服务端IP |
| | | public static Integer BjnlServerPort = 1234 ;//服务端端口 |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.http4Xjnk; |
| | | |
| | | import com.dy.rtuMw3rd.http4Xjnk.deal.XjnkDealer; |
| | | import com.dy.rtuMw3rd.http4Xjnk.protocol.statusPush.ControllerStatusVo; |
| | | import jakarta.servlet.http.HttpServletRequest; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/17 11:24 |
| | | * @Description |
| | | */ |
| | | @Slf4j |
| | | @RestController |
| | | @RequestMapping(path="xjnkCtrl") |
| | | public class HttpSvCtrl { |
| | | |
| | | private XjnkDealer dealer ; |
| | | @Autowired |
| | | private void setDealer(XjnkDealer dealer){ |
| | | this.dealer = dealer; |
| | | } |
| | | |
| | | @PostMapping(path = "receive") |
| | | public void receive(HttpServletRequest request, @RequestBody Map<String, Object> body){ |
| | | log.info("接收的数据:", body); |
| | | ControllerStatusVo vo = ControllerStatusVo.may2Vo(body) ; |
| | | this.dealer.dealPush(vo); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.http4Xjnk; |
| | | |
| | | import com.dy.common.mw.UnitAdapterInterface; |
| | | import com.dy.common.mw.UnitCallbackInterface; |
| | | import com.dy.common.mw.UnitInterface; |
| | | import com.dy.common.springUtil.SpringContextUtil; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/19 15:14 |
| | | * @Description |
| | | */ |
| | | public class HttpUnit implements UnitInterface { |
| | | |
| | | private static final Logger log = LogManager.getLogger(HttpUnit.class) ; |
| | | |
| | | private static HttpUnit instance = new HttpUnit() ; |
| | | |
| | | public static HttpUnitAdapter adapter ; |
| | | public static HttpUnitConfigVo confVo ; |
| | | |
| | | private HttpUnit(){} ; |
| | | |
| | | public static HttpUnit getInstance(){ |
| | | return instance ; |
| | | } |
| | | |
| | | @Override |
| | | public void setAdapter(UnitAdapterInterface adapter) throws Exception { |
| | | if(adapter == null){ |
| | | throw new Exception("Http模块适配器对象不能为空!") ; |
| | | } |
| | | HttpUnit.adapter = (HttpUnitAdapter)adapter ; |
| | | HttpUnit.confVo = HttpUnit.adapter.getConfig() ; |
| | | if(HttpUnit.confVo == null){ |
| | | throw new Exception("Http模块配置对象不能为空!") ; |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void start(UnitCallbackInterface callback) throws Exception { |
| | | System.out.println("Http模块成功启动"); |
| | | this.doStart(); |
| | | callback.call(null) ; |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public void stop(UnitCallbackInterface callback) throws Exception { |
| | | callback.call(null); |
| | | } |
| | | |
| | | private void doStart(){ |
| | | Worker w = SpringContextUtil.getBean(Worker.class) ; |
| | | w.setHttpsBaseUr(confVo.httpsBaseUr); |
| | | w.setAppid(confVo.appid); |
| | | w.setSecret(confVo.secret ); |
| | | w.setWorkInterval(confVo.flushDataFromSvInterval + 0L); |
| | | w.start(); |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.http4Xjnk; |
| | | |
| | | import com.dy.common.mw.UnitAdapterInterface; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/19 15:15 |
| | | * @Description |
| | | */ |
| | | public interface HttpUnitAdapter extends UnitAdapterInterface { |
| | | |
| | | HttpUnitConfigVo getConfig() ; |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.http4Xjnk; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/19 15:15 |
| | | * @Description |
| | | */ |
| | | @Data |
| | | public class HttpUnitConfigVo { |
| | | public String httpsBaseUr ; |
| | | public String appid ; |
| | | public String secret ; |
| | | public Integer flushDataFromSvInterval = 120000 ; |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.http4Xjnk; |
| | | |
| | | import com.dy.common.util.HttpCallback; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.web.client.RestTemplate; |
| | | |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/17 11:14 |
| | | * @Description |
| | | */ |
| | | @Component() |
| | | public class HttpsRq extends HttpRq { |
| | | /** |
| | | * get请求,返回json内容 |
| | | * 同步 |
| | | * @param httpsBaseUrl |
| | | * @param params |
| | | * @param cb |
| | | * @throws Exception |
| | | */ |
| | | public void get4JsonBySync(String httpsBaseUrl, Map<String, String> params, HttpCallback cb) throws Exception { |
| | | super.get4JsonBySync(httpsBaseUrl, params, cb); |
| | | } |
| | | /** |
| | | * get请求,返回json内容 |
| | | * 异步 |
| | | * @param httpsBaseUrl |
| | | * @param params |
| | | * @param cb |
| | | * @throws Exception |
| | | */ |
| | | public void get4JsonByAsync(String httpsBaseUrl, Map<String, String> params, HttpCallback cb) throws Exception { |
| | | super.get4JsonByAsync(httpsBaseUrl, params, cb); |
| | | } |
| | | |
| | | /** |
| | | * get请求,返回json内容 |
| | | * 同步 |
| | | * @param httpsBaseUrl |
| | | * @param params |
| | | * @param cb |
| | | * @throws Exception |
| | | */ |
| | | public void post4JsonBySync(String httpsBaseUrl, Map<String, String> params, HttpCallback cb) throws Exception { |
| | | super.post4JsonBySync(httpsBaseUrl, params, cb); |
| | | } |
| | | /** |
| | | * get请求,返回json内容 |
| | | * 异步 |
| | | * @param httpsBaseUrl |
| | | * @param params |
| | | * @param cb |
| | | * @throws Exception |
| | | */ |
| | | public void post4JsonByAsync(String httpsBaseUrl, Map<String, String> params, HttpCallback cb) throws Exception { |
| | | super.post4JsonByAsync(httpsBaseUrl, params, cb); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.http4Xjnk; |
| | | |
| | | |
| | | import java.util.*; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.dy.rtuMw3rd.http4Xjnk.deal.XjnkDealer; |
| | | import com.dy.rtuMw3rd.http4Xjnk.protocol.XjnkResVo; |
| | | import com.dy.rtuMw3rd.http4Xjnk.protocol.controller.ControllerVo; |
| | | import com.dy.rtuMw3rd.http4Xjnk.protocol.mainController.MainControllerVo; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | import com.dy.rtuMw3rd.http4Xjnk.protocol.XjnkProtocol; |
| | | import com.dy.rtuMw3rd.http4Xjnk.protocol.accessToken.Res4AccessTokenVo; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/19 15:53 |
| | | * @Description |
| | | */ |
| | | @Slf4j |
| | | @Component() |
| | | public class Worker extends TimerTask { |
| | | |
| | | private HttpsRq httpsRq ; |
| | | private XjnkDealer dealer ; |
| | | |
| | | public String httpsBaseUr ; |
| | | public String appid ; |
| | | public String secret ; |
| | | private Long workInterval ;//循环任务间隔 |
| | | |
| | | private Timer timer; |
| | | |
| | | private boolean stop; |
| | | |
| | | private boolean first = true ; |
| | | private boolean isAccessTokenGot = false ; |
| | | private List<MainControllerVo> mainControllerVos ; |
| | | private List<ControllerVo> controllerVos ; |
| | | |
| | | @Autowired |
| | | public void setHttpsRq(HttpsRq httpsRq){ |
| | | this.httpsRq = httpsRq ; |
| | | } |
| | | @Autowired |
| | | private void setDealer(XjnkDealer dealer){ |
| | | this.dealer = dealer; |
| | | } |
| | | public void setHttpsBaseUr(String httpsBaseUr){ |
| | | this.httpsBaseUr = httpsBaseUr ; |
| | | } |
| | | public void setAppid(String appid){ |
| | | this.appid = appid ; |
| | | } |
| | | public void setSecret(String secret){ |
| | | this.secret = secret ; |
| | | } |
| | | public void setWorkInterval(Long workInterval){ |
| | | this.workInterval = workInterval ; |
| | | } |
| | | |
| | | public void stop(){ |
| | | this.stop = true ; |
| | | if(this.timer != null){ |
| | | this.timer.cancel(); |
| | | } |
| | | } |
| | | |
| | | public boolean isStop(){ |
| | | return this.stop ; |
| | | } |
| | | |
| | | public void start(){ |
| | | this.timer = new Timer(); |
| | | this.stop = false ; |
| | | new Thread(() -> { |
| | | while(true){ |
| | | try { |
| | | getAccessToken() ; |
| | | }catch (Exception e){ |
| | | log.error("新疆农垦--获得AccessToken异常" + (e.getMessage() == null ? "" : (":" + e.getMessage())), e); |
| | | } |
| | | try{ |
| | | Thread.sleep(10000); |
| | | }catch (Exception e){ |
| | | } |
| | | if(isAccessTokenGot){ |
| | | timer.schedule(this, 0, this.workInterval); |
| | | break ; |
| | | } |
| | | } |
| | | }).start(); |
| | | } |
| | | |
| | | @Override |
| | | public void run() { |
| | | if(first){ |
| | | first = false ; |
| | | }else{ |
| | | try{ |
| | | getAccessToken() ; |
| | | }catch(Exception e){ |
| | | log.error("新疆农垦--获得AccessToken异常" + (e.getMessage() == null ? "" : (":" + e.getMessage())), e); |
| | | } |
| | | } |
| | | if(isAccessTokenGot) { |
| | | try { |
| | | getMainControllers(); |
| | | } catch (Exception e) { |
| | | log.error("新疆农垦--获得主控制器异常" + (e.getMessage() == null ? "" : (":" + e.getMessage())), e); |
| | | } |
| | | try { |
| | | getControllers(); |
| | | } catch (Exception e) { |
| | | log.error("新疆农垦--获得控制器异常" + (e.getMessage() == null ? "" : (":" + e.getMessage())), e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public void getAccessToken() throws Exception{ |
| | | this.httpsRq.get4JsonBySync(this.httpsBaseUr + "/thirdapi/token?appid=" + this.appid + "&secret=" + this.secret, |
| | | null, |
| | | (statusCode, charset, body) -> { |
| | | // 打印响应状态码 |
| | | //System.out.println("Status Code: " + statusCode); |
| | | // 打印响应内容编码类型 |
| | | //System.out.println("Response encoding: " + charset); |
| | | // 打印响应体内容 |
| | | //System.out.println("Response Body: " + body); |
| | | if(statusCode != null && statusCode.equals(XjnkProtocol.SuccessCode)){ |
| | | Res4AccessTokenVo vo = JSON.parseObject(body, Res4AccessTokenVo.class); |
| | | if(vo != null && vo.errcode != null && vo.errcode.length() > 0){ |
| | | log.error("新疆农垦--获取AccessToken失败,errcode:" + vo.errcode + ",errmsg:" + vo.errmsg); |
| | | }else{ |
| | | isAccessTokenGot = true ; |
| | | XjnkProtocol.AccessToken = vo.accessToken ; |
| | | XjnkProtocol.AccessTokenExpires = vo.expires ; |
| | | log.info("新疆农垦--获取AccessToken成功,accessToken:" + vo.accessToken + ",expires:" + vo.expires); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | |
| | | /** |
| | | * 获取主控制器 |
| | | * @throws Exception |
| | | */ |
| | | public void getMainControllers() throws Exception{ |
| | | this.httpsRq.get4JsonBySync(this.httpsBaseUr + "/thirdapi/pridevice/all?access_token=" + XjnkProtocol.AccessToken, |
| | | null, |
| | | (statusCode, charset, body) -> { |
| | | if(statusCode != null && statusCode.equals(XjnkProtocol.SuccessCode)){ |
| | | try{ |
| | | //首先认为返回的是错误信息,进行尝试 |
| | | XjnkResVo vo = JSON.parseObject(body, XjnkResVo.class); |
| | | if(vo != null && vo.errcode != null && vo.errcode.length() > 0){ |
| | | log.error("新疆农垦--获取主控制器失败,errcode:" + vo.errcode + ",errmsg:" + vo.errmsg); |
| | | } |
| | | }catch (Exception e){ |
| | | //如果不是错误信息,那就是正确信息 |
| | | try{ |
| | | mainControllerVos = JSON.parseArray(body, MainControllerVo.class); |
| | | log.info("新疆农垦--获取主控制器成功:"); |
| | | if(mainControllerVos != null && mainControllerVos.size() > 0){ |
| | | this.dealer.dealMainController(mainControllerVos); |
| | | for(MainControllerVo cvo : mainControllerVos){ |
| | | log.info("主控制器:" + cvo); |
| | | } |
| | | } |
| | | }catch (Exception ee){ |
| | | log.error("新疆农垦--获取主控制器异常" + (ee.getMessage() == null ? "" : (":" + ee.getMessage())), ee); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | /** |
| | | * 获取控制器 |
| | | * @throws Exception |
| | | */ |
| | | public void getControllers() throws Exception{ |
| | | if(this.mainControllerVos != null && this.mainControllerVos.size() > 0){ |
| | | for(MainControllerVo mcvo : this.mainControllerVos){ |
| | | Map<String, String> params = new HashMap<>() ; |
| | | params.put("pdId", "" + mcvo.id) ; |
| | | this.httpsRq.post4JsonBySync(this.httpsBaseUr + "/thirdapi/control_device/query?access_token=" + XjnkProtocol.AccessToken, |
| | | params, |
| | | (statusCode, charset, body) -> { |
| | | if(statusCode != null && statusCode.equals(XjnkProtocol.SuccessCode)){ |
| | | try{ |
| | | //首先认为返回的是错误信息,进行尝试 |
| | | XjnkResVo vo = JSON.parseObject(body, XjnkResVo.class); |
| | | if(vo != null && vo.errcode != null && vo.errcode.length() > 0){ |
| | | log.error("新疆农垦--获取控制器失败,errcode:" + vo.errcode + ",errmsg:" + vo.errmsg); |
| | | } |
| | | }catch (Exception e){ |
| | | //如果不是错误信息,那就是正确信息 |
| | | try{ |
| | | controllerVos = JSON.parseArray(body, ControllerVo.class); |
| | | log.info("新疆农垦--获取控制器成功:"); |
| | | if(controllerVos != null && controllerVos.size() > 0){ |
| | | this.dealer.dealController(controllerVos); |
| | | for(ControllerVo cvo : controllerVos){ |
| | | log.info("控制器:" + cvo); |
| | | } |
| | | } |
| | | }catch (Exception ee){ |
| | | log.error("新疆农垦--获取控制器异常" + (ee.getMessage() == null ? "" : (":" + ee.getMessage())), ee); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.http4Xjnk.deal; |
| | | |
| | | import com.dy.rtuMw3rd.http4Xjnk.protocol.controller.ControllerVo; |
| | | import com.dy.rtuMw3rd.http4Xjnk.protocol.mainController.MainControllerVo; |
| | | import com.dy.rtuMw3rd.http4Xjnk.protocol.statusPush.ControllerStatusVo; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/20 16:09 |
| | | * @Description |
| | | */ |
| | | @Slf4j |
| | | @Component() |
| | | public class XjnkDealer { |
| | | |
| | | public void dealMainController(List<MainControllerVo> list){ |
| | | log.warn("新疆农垦--主控制器数据处理逻辑未实现"); |
| | | } |
| | | |
| | | public void dealController(List<ControllerVo> list){ |
| | | log.warn("新疆农垦--控制器数据处理逻辑未实现"); |
| | | } |
| | | |
| | | public void dealPush(ControllerStatusVo vo){ |
| | | log.warn("新疆农垦--状态推送数据处理逻辑未实现"); |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.http4Xjnk.protocol; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/19 16:27 |
| | | * @Description |
| | | */ |
| | | public class XjnkProtocol { |
| | | public static String AccessToken = null ; |
| | | public static Integer AccessTokenExpires = null ; |
| | | |
| | | public static final String SuccessCode = "200" ; |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.http4Xjnk.protocol; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/19 17:00 |
| | | * @Description |
| | | */ |
| | | @Data |
| | | public class XjnkResVo { |
| | | public String errcode ; |
| | | public String errmsg ; |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.http4Xjnk.protocol.accessToken; |
| | | |
| | | import com.dy.rtuMw3rd.http4Xjnk.protocol.XjnkResVo; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/19 16:53 |
| | | * @Description |
| | | */ |
| | | @Data |
| | | public class Res4AccessTokenVo extends XjnkResVo { |
| | | public String accessToken ; |
| | | public Integer expires ; |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.http4Xjnk.protocol.controller; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/20 14:40 |
| | | * @Description |
| | | */ |
| | | @Data |
| | | public class ControllerVo { |
| | | public String name ; //"阀1", 控制器ID |
| | | public String code ; //"SS110",名称 |
| | | public Integer ctId ; //1,设备编码 |
| | | public Integer pdId ; //1,设备类型 |
| | | public String action ; //"",主控ID |
| | | public Integer groupId ; //1,分组ID |
| | | public String mode ; //"gprs",设备模式 |
| | | public String iccid ; //"SS112",设备iccid |
| | | public Integer sort ; //1,排序 |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.http4Xjnk.protocol.mainController; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/19 17:17 |
| | | * @Description |
| | | */ |
| | | @Data |
| | | public class MainControllerVo { |
| | | public String channel = "1" ; |
| | | public String deviceid = "sanfangceshipingtai" ; |
| | | public Long id = 393L ; |
| | | public Double lat = 0.0 ; |
| | | public Double lng = 0.0 ; |
| | | public String mode = "virtual" ; |
| | | public String name = "三方对接测试平台" ; |
| | | public String panid = "1" ; |
| | | public Integer sort = 0 ; |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.http4Xjnk.protocol.statusPush; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/20 15:59 |
| | | * @Description |
| | | */ |
| | | @Data |
| | | public class ControllerStatusVo { |
| | | public String classify ; //": "1", |
| | | public String code ; //": "723", |
| | | public String line ; //": true, |
| | | public String pdId ; //": "29", |
| | | public String category; // "C", |
| | | |
| | | public String quality; //信号强度 db ("quality": "-36") |
| | | public String battery; //电量 % ("battery": "100",) |
| | | public String realtimePressure; // 实时压力 bar |
| | | public String constantPressure; // 恒定压力 bar |
| | | public String flowRate; // 瞬时流量(可选) m³/h |
| | | public String totalFlowA; // 累计流量 A(可选) m³ |
| | | public String totalFlowB; // 累计流量 B(可选) m³ |
| | | public String onoff; // 状态,“0”:关闭,“1”:开启 ("onoff": "1",) |
| | | public String angle; // 阀门角度,“0”:全关,“90”:A 阀全开,“1-90”:A 阀开启,“180”:B 阀全开,“91-180”:B 阀开启 |
| | | |
| | | public static ControllerStatusVo may2Vo(Map<String, Object> map){ |
| | | ControllerStatusVo vo = new ControllerStatusVo() ; |
| | | vo.classify = map.get("classify").toString(); |
| | | vo.code = map.get("code").toString(); |
| | | vo.line = map.get("line").toString(); |
| | | vo.pdId = map.get("pdId").toString(); |
| | | vo.category = map.get("category").toString(); |
| | | |
| | | vo.quality = map.get("quality").toString(); |
| | | vo.battery = map.get("battery").toString(); |
| | | vo.realtimePressure = map.get("realtimePressure").toString(); |
| | | vo.constantPressure = map.get("constantPressure").toString(); |
| | | vo.flowRate = map.get("flowRate").toString(); |
| | | vo.totalFlowA = map.get("totalFlowA").toString(); |
| | | vo.totalFlowB = map.get("totalFlowB").toString(); |
| | | vo.onoff = map.get("onoff").toString(); |
| | | vo.angle = map.get("angle").toString(); |
| | | return vo ; |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl; |
| | | |
| | | 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/03/18 14:20 |
| | | * @Description |
| | | */ |
| | | public class NetDataCodecFactory implements ProtocolCodecFactory { |
| | | private ProtocolEncoder encoder; |
| | | private ProtocolDecoder decoder; |
| | | |
| | | public NetDataCodecFactory() { |
| | | encoder = new NetDataEncoder(); |
| | | decoder = new NetDataDecoder(); |
| | | } |
| | | |
| | | /** |
| | | * 得到协议编码器 |
| | | * @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.rtuMw3rd.tcp4Bjnl; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.dy.common.springUtil.SpringContextUtil; |
| | | import com.dy.rtuMw3rd.tcp4Bjnl.deal.BjnlDealer; |
| | | import com.dy.rtuMw3rd.tcp4Bjnl.protocol.BjnlProtocol; |
| | | import com.dy.rtuMw3rd.tcp4Bjnl.protocol.Result; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | 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/03/18 14:20 |
| | | * @Description |
| | | */ |
| | | @Slf4j |
| | | public class NetDataDecoder extends CumulativeProtocolDecoder { |
| | | |
| | | /** |
| | | * 对网络传输来的数据进行解码 |
| | | */ |
| | | 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) ; |
| | | String s = new String(bs, "UTF-8") ; |
| | | if(s != null && s.length() > 0){ |
| | | s = s.trim() ; |
| | | } |
| | | this.receive(s); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | |
| | | private void receive(String json){ |
| | | log.info("北京农林--收到数据:" + json); |
| | | try{ |
| | | if(JSON.isValid(json)){ |
| | | Result res = JSON.parseObject(json, Result.class) ; |
| | | if(res.status != null && res.status.code != null && res.status.code.equals(BjnlProtocol.SuccessCode)){ |
| | | if(res.status.type != null){ |
| | | if(res.status.type.equals(BjnlProtocol.ResultTypeAuth)){ |
| | | forLogin(res) ; |
| | | }else if(res.status.type.equals(BjnlProtocol.ResultTypeData)){ |
| | | forData(res) ; |
| | | }else if(res.status.type.equals(BjnlProtocol.ResultTypeControl)){ |
| | | forControl(res) ; |
| | | }else{ |
| | | log.error("北京农林--服务端返回数据其类型不可识别:" + res.status.type); |
| | | } |
| | | } |
| | | }else{ |
| | | //可能推送的数据中不包含status子数据 |
| | | if(res.data != null && res.data.length() > 0){ |
| | | forData(res) ; |
| | | }else{ |
| | | log.error("北京农林--服务端返回失败信息:" + json); |
| | | } |
| | | |
| | | } |
| | | }else{ |
| | | log.error("北京农林--服务端返回数据非有效JSON数据,\n数据为" + json); |
| | | } |
| | | }catch (Exception e){ |
| | | log.error("北京农林--服务端返回数据转JSON异常,\n数据为" + json ,e); |
| | | } |
| | | } |
| | | |
| | | private void forLogin(Result res){ |
| | | Worker.getInstance().setLogined(); |
| | | BjnlDealer d = SpringContextUtil.getBean(BjnlDealer.class) ; |
| | | d.logined(res); |
| | | } |
| | | |
| | | private void forData(Result res){ |
| | | BjnlDealer d = SpringContextUtil.getBean(BjnlDealer.class) ; |
| | | d.receiveData(res); |
| | | } |
| | | |
| | | private void forControl(Result res){ |
| | | BjnlDealer d = SpringContextUtil.getBean(BjnlDealer.class) ; |
| | | d.controlRes(res); |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl; |
| | | |
| | | 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/03/18 14:20 |
| | | * @Description |
| | | */ |
| | | public class NetDataEncoder extends ProtocolEncoderAdapter { |
| | | |
| | | private static final Logger log = LogManager.getLogger(NetDataEncoder.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.rtuMw3rd.tcp4Bjnl; |
| | | |
| | | import com.dy.common.mw.UnitAdapterInterface; |
| | | import com.dy.common.mw.UnitCallbackInterface; |
| | | import com.dy.common.mw.UnitInterface; |
| | | import com.dy.common.util.Callback; |
| | | import com.dy.rtuMw3rd.tcp4Bjnl.protocol.BjnlProtocol; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/03/18 14:20 |
| | | * @Description |
| | | */ |
| | | public class TcpClUnit implements UnitInterface { |
| | | |
| | | private static final Logger log = LogManager.getLogger(TcpClUnit.class) ; |
| | | |
| | | private static TcpClUnit instance = new TcpClUnit() ; |
| | | |
| | | public static TcpClUnitAdapter adapter ; |
| | | public static TcpClUnitConfigVo confVo ; |
| | | |
| | | 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模块配置对象不能为空!") ; |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public void start(UnitCallbackInterface callback) throws Exception { |
| | | System.out.println("Tcp Client模块成功启动"); |
| | | this.doStart(); |
| | | callback.call(null) ; |
| | | } |
| | | |
| | | @Override |
| | | public void stop(UnitCallbackInterface callback) throws Exception { |
| | | callback.call(null); |
| | | } |
| | | |
| | | private void doStart(){ |
| | | new Thread(() -> { |
| | | Exception ex ; |
| | | while(true){ |
| | | ex = null ; |
| | | try { |
| | | new TcpConnect().createSession( |
| | | confVo.BjnlServerIp, |
| | | confVo.BjnlServerPort, |
| | | confVo.BjnlConnectTimeout, |
| | | new TcpHandler(), |
| | | new Callback() { |
| | | @Override |
| | | public void call(Object obj) { |
| | | if (obj == null) { |
| | | log.error("北京农林--创建网络会话返回为null"); |
| | | } else { |
| | | log.info("北京农林--成功创建网络连接"); |
| | | Worker w = Worker.getInstance() ; |
| | | w.setApikey(confVo.BjnlApikey); |
| | | w.setSecretkey(confVo.BjnlSecretkey ); |
| | | w.setWorkInterval(confVo.heartBeatInterval + 0L); |
| | | w.start(); |
| | | } |
| | | } |
| | | @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.rtuMw3rd.tcp4Bjnl; |
| | | |
| | | import com.dy.common.mw.UnitAdapterInterface; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/03/18 14:20 |
| | | * @Description |
| | | */ |
| | | public interface TcpClUnitAdapter extends UnitAdapterInterface { |
| | | |
| | | TcpClUnitConfigVo getConfig() ; |
| | | |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/03/18 14:20 |
| | | * @Description |
| | | */ |
| | | @Data |
| | | public class TcpClUnitConfigVo { |
| | | public String BjnlServerIp = "127.0.0.1" ;//服务端IP |
| | | public Integer BjnlServerPort = 1234 ;//服务端端口 |
| | | public Integer BjnlConnectTimeout = 3000 ; |
| | | public String BjnlApikey = "afcd5254fea7ba348bbdf8723c421fa7eab04545" ; |
| | | public String BjnlSecretkey = "4ebb2143c994d5ecbf3cb4af364642a74294c3be" ; |
| | | public Integer heartBeatInterval = 120000 ; |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl; |
| | | |
| | | 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/03/18 14:20 |
| | | * @Description |
| | | */ |
| | | public class TcpConnect { |
| | | |
| | | private static IoSession ioSession ; |
| | | |
| | | public static IoSession getIoSession(){ |
| | | return ioSession; |
| | | } |
| | | |
| | | /** |
| | | * 判断会话是否有效 |
| | | * @return 是否连接 |
| | | */ |
| | | public static boolean isConnected() { |
| | | return (ioSession != null && ioSession.isConnected()); |
| | | } |
| | | |
| | | /** |
| | | * 创建新会话 |
| | | * @param host 服务器URI |
| | | * @param port 服务器端口 |
| | | * @param connectTimeout 连接超时时长 |
| | | * @param handler 数据处理者 |
| | | * @param callback 回调 |
| | | * @return 网络会话 |
| | | */ |
| | | public static 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 NetDataCodecFactory())); |
| | | connector.setHandler(handler); |
| | | ConnectFuture connectFuture = connector.connect(new InetSocketAddress(host, port)); |
| | | connectFuture.awaitUninterruptibly(connectTimeout); |
| | | ioSession = connectFuture.getSession(); |
| | | callback.call(ioSession) ; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 关闭会话联接 |
| | | * @param se |
| | | * @param connectTimeout |
| | | */ |
| | | public static void disconnect(IoSession se , int connectTimeout) { |
| | | if (se != null) { |
| | | try{ |
| | | se.closeNow().awaitUninterruptibly(connectTimeout); |
| | | }catch(Exception e){ |
| | | if(se.isConnected()){ |
| | | se.closeNow().awaitUninterruptibly(connectTimeout); |
| | | } |
| | | }finally{ |
| | | se = null; |
| | | } |
| | | } |
| | | } |
| | | |
| | | public static void output(byte[] bs) throws Exception{ |
| | | if (!isConnected()) { |
| | | throw new Exception("未创建网络连接"); |
| | | }else{ |
| | | ioSession.write(bs); |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl; |
| | | |
| | | 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/03/18 14:20 |
| | | * @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 { |
| | | } |
| | | |
| | | /** |
| | | * {@inheritDoc} |
| | | */ |
| | | @Override |
| | | public void messageSent(IoSession session, Object message) throws Exception { |
| | | if(message != null){ |
| | | log.info("北京农林--发送数据:" + new String((byte[])message, "UTF-8")); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * {@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.rtuMw3rd.tcp4Bjnl; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.dy.rtuMw3rd.tcp4Bjnl.protocol.*; |
| | | import org.apache.logging.log4j.LogManager; |
| | | import org.apache.logging.log4j.Logger; |
| | | |
| | | import java.util.Timer; |
| | | import java.util.TimerTask; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/2/26 14:39 |
| | | * @Description |
| | | */ |
| | | public class Worker extends TimerTask { |
| | | |
| | | private static final Logger log = LogManager.getLogger(Worker.class) ; |
| | | |
| | | private static Worker instance = new Worker() ; |
| | | |
| | | private String apikey ; |
| | | private String secretkey ; |
| | | private Long workInterval ;//循环任务间隔 |
| | | |
| | | private Timer timer; |
| | | |
| | | private boolean stop; |
| | | |
| | | private boolean first = true ; |
| | | private static boolean isLogined = false ; |
| | | |
| | | private Worker(){ |
| | | this.timer = new Timer(); |
| | | this.stop = false ; |
| | | } |
| | | |
| | | public static Worker getInstance(){ |
| | | return instance ; |
| | | } |
| | | |
| | | |
| | | public void setApikey(String apikey){ |
| | | this.apikey = apikey ; |
| | | } |
| | | public void setSecretkey(String secretkey){ |
| | | this.secretkey = secretkey ; |
| | | } |
| | | public void setWorkInterval(Long workInterval){ |
| | | this.workInterval = workInterval ; |
| | | } |
| | | |
| | | public void setLogined(){ |
| | | log.info("北京农林--请求登录成功"); |
| | | isLogined = true ; |
| | | } |
| | | |
| | | public void stop(){ |
| | | this.stop = true ; |
| | | if(this.timer != null){ |
| | | this.timer.cancel(); |
| | | } |
| | | } |
| | | public boolean isStop(){ |
| | | return this.stop ; |
| | | } |
| | | |
| | | public void start(){ |
| | | new Thread(() -> { |
| | | while(true){ |
| | | try { |
| | | login() ; |
| | | }catch (Exception e){ |
| | | log.error("北京农林--请求登录异常" + (e.getMessage() == null ? "" : (":" + e.getMessage())), e); |
| | | } |
| | | try{ |
| | | Thread.sleep(10000); |
| | | }catch (Exception e){ |
| | | } |
| | | if(isLogined){ |
| | | timer.schedule(this, 0, this.workInterval); |
| | | break ; |
| | | } |
| | | } |
| | | }).start(); |
| | | } |
| | | |
| | | @Override |
| | | public void run() { |
| | | if(first){ |
| | | first = false ; |
| | | }else{ |
| | | if(TcpConnect.isConnected() && isLogined) { |
| | | try{ |
| | | heartbeat() ; |
| | | }catch(Exception e){ |
| | | log.error("北京农林--发送心跳异常" + (e.getMessage() == null ? "" : (":" + e.getMessage())), e); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void login(){ |
| | | ParamLogin pl = new ParamLogin() ; |
| | | pl.protocol = new ParamProtocol() ; |
| | | pl.auth = new ParamAuth() ; |
| | | pl.protocol.version = BjnlProtocol.ProtocolVersion ; |
| | | pl.protocol.protocolcode = BjnlProtocol.Protocolcode ; |
| | | pl.auth.apikey = apikey ; |
| | | pl.auth.secretkey = secretkey ; |
| | | |
| | | String json = JSON.toJSONString(pl) ; |
| | | byte[] bs = BjnlCommon.wrap(json) ; |
| | | try { |
| | | TcpConnect.output(bs); |
| | | } catch (Exception e) { |
| | | log.error(e.getMessage(), e); |
| | | } |
| | | } |
| | | private void heartbeat() throws Exception{ |
| | | try { |
| | | TcpConnect.output(BjnlProtocol.HeartBeat); |
| | | } catch (Exception e) { |
| | | log.error(e.getMessage(), e); |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl.deal; |
| | | |
| | | import com.dy.rtuMw3rd.tcp4Bjnl.protocol.Result; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/20 16:29 |
| | | * @Description |
| | | */ |
| | | @Slf4j |
| | | @Component() |
| | | public class BjnlDealer { |
| | | |
| | | public void logined(Result res){ |
| | | log.warn("北京农林--登录返回处理逻辑未实现"); |
| | | } |
| | | |
| | | public void receiveData(Result res){ |
| | | log.warn("北京农林--数据推送处理逻辑未实现"); |
| | | } |
| | | |
| | | public void controlRes(Result res){ |
| | | log.warn("北京农林--远程控制返回处理逻辑未实现"); |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl.protocol; |
| | | |
| | | import com.dy.common.util.ByteUtil; |
| | | |
| | | import java.nio.charset.StandardCharsets; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/18 15:06 |
| | | * @Description |
| | | */ |
| | | public class BjnlCommon { |
| | | public static byte[] wrap(String msg){ |
| | | byte[] bs = BjnlProtocol.FrameHeadBytes; |
| | | if(msg != null && msg.length() > 0){ |
| | | bs = ByteUtil.bytesMerge(bs, msg.getBytes(StandardCharsets.UTF_8)) ; |
| | | } |
| | | bs = ByteUtil.bytesMerge(bs, BjnlProtocol.FrameTailBytes) ; |
| | | return bs; |
| | | } |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl.protocol; |
| | | |
| | | import java.nio.charset.StandardCharsets; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/18 11:54 |
| | | * @Description |
| | | */ |
| | | public class BjnlProtocol { |
| | | public static final String ProtocolName = "beiJingNongLin" ;//北京市农林科学院智能装备技术研究中心 |
| | | public static final String ProtocolVersion = "1.0" ;//版本号 |
| | | public static final String Protocolcode = "v1.0" ;//协议号 |
| | | |
| | | public static final byte MinDataLength = 4 ;//数据最小长度(即帧头4个字节) |
| | | public static final byte[] FrameHeadBytes = new byte[]{(byte)0xCA, (byte)0xFE, (byte)0xBA, (byte)0xBE} ; |
| | | public static final byte[] FrameTailBytes = "&_#".getBytes(StandardCharsets.UTF_8) ; |
| | | |
| | | public static final String SuccessCode = "200" ; |
| | | public static final String ResultTypeAuth = "auth" ; |
| | | public static final String ResultTypeData = "data" ; |
| | | public static final String ResultTypeControl = "control" ; |
| | | |
| | | public static final byte[] HeartBeat = "ping".getBytes(StandardCharsets.UTF_8) ; |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl.protocol; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/18 15:13 |
| | | * @Description |
| | | */@Data |
| | | public class ParamAuth { |
| | | public String apikey ; // 验证key值 唯一不可更改 |
| | | public String secretkey; //验证key值 唯一不可更改 |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl.protocol; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/18 15:15 |
| | | * @Description |
| | | */ |
| | | @Data |
| | | public class ParamLogin { |
| | | public ParamProtocol protocol ; |
| | | public ParamAuth auth ; |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl.protocol; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/18 15:12 |
| | | * @Description |
| | | */ |
| | | @Data |
| | | public class ParamProtocol { |
| | | public String version ; |
| | | public String protocolcode ; |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl.protocol; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/18 16:31 |
| | | * @Description |
| | | */ |
| | | @Data |
| | | public class ResProtocol { |
| | | public String version ; |
| | | public String protocolcode ; |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl.protocol; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/18 16:32 |
| | | * @Description |
| | | */ |
| | | @Data |
| | | public class ResStatus { |
| | | public String code ; |
| | | public String msg ; |
| | | public String time ; |
| | | public String type ; |
| | | public String uuid ; |
| | | } |
New file |
| | |
| | | package com.dy.rtuMw3rd.tcp4Bjnl.protocol; |
| | | |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2025/3/18 16:36 |
| | | * @Description |
| | | */ |
| | | @Data |
| | | public class Result { |
| | | public ResProtocol protocol ; |
| | | public ResStatus status ; |
| | | public String data ; |
| | | } |
New file |
| | |
| | | logging: |
| | | charset: |
| | | console: UTF-8 |
| | | config: |
| | | classpath: log4j2.yml |
| | | spring: |
| | | devtools: |
| | | livereload: |
| | | enabled: false |
| | | |
| | | #web服务端口,tomcat默认是8080 |
| | | server: |
| | | port: 65530 |
| | | servlet: |
| | | context-path: /rtuMw3rd #web访问上下文路径 |
| | | |
New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <config> |
| | | <server name="第三方接入中间件" showStartInfo="true" company="http://www.dyjs.com"/> |
| | | |
| | | <!-- |
| | | flushDataFromSvInterval:获取access_token间隔(一小时:3600000),目前access_token的有效期通过返回的expire_in来传达,目前是7200秒(120分钟、两个小时)之内的值 |
| | | --> |
| | | <xjnk httpsBaseUrl="https://www.sshyun.com" |
| | | appid="f34e4ac6be4441a6b7d13790313f22d0" |
| | | secret="b691aef23bf944599963786862370346" |
| | | flushDataFromSvInterval="3600000" |
| | | ></xjnk> |
| | | |
| | | <bjnl ip="210.12.220.75" |
| | | port="15006" |
| | | connectTimeout="3000" |
| | | apikey="d3358a6a0270dbcd3017706c1062883fe6c0c45c" |
| | | secretkey="58cf2e5319ab4341c93724f2141b5305414ca87e" |
| | | heartBeatInterval = "120000" |
| | | ></bjnl> |
| | | </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/rtuMw3rd.log" filePattern="logs/rtuMw3rd-%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.rtuMw3rd; |
| | | |
| | | import org.junit.jupiter.api.Test; |
| | | import org.springframework.boot.test.context.SpringBootTest; |
| | | |
| | | @SpringBootTest |
| | | class PipIrrMwRtu3rdApplicationTests { |
| | | |
| | | @Test |
| | | void contextLoads() { |
| | | } |
| | | |
| | | } |
| | |
| | | |
| | | <modules> |
| | | <module>pipIrr-mw-rtu</module> |
| | | <module>pipIrr-mw-rtu3rd</module> |
| | | <module>pipIrr-mw-simulate-rtu</module> |
| | | <module>pipIrr-mw-simulate-rtu202404</module> |
| | | <module>pipIrr-mwTest-server</module> |
| | | <module>pipIrr-mwTest-client</module> |
| | | <module>pipIrr-mw-shzTest</module> |
| | | </modules> |
| | | |
| | | <dependencies> |