Browse Source

socket init

master
노승철 2 years ago
commit
098bd6a5ea
  1. 33
      .gitignore
  2. BIN
      .mvn/wrapper/maven-wrapper.jar
  3. 2
      .mvn/wrapper/maven-wrapper.properties
  4. 316
      mvnw
  5. 188
      mvnw.cmd
  6. 68
      pom.xml
  7. 13
      src/main/java/com/palnet/Application.java
  8. 45
      src/main/java/com/palnet/comn/collection/AuthCollection.java
  9. 70
      src/main/java/com/palnet/comn/collection/GPCollection.java
  10. 47
      src/main/java/com/palnet/comn/collection/GPDatabaseCollection.java
  11. 25
      src/main/java/com/palnet/comn/utils/ContextUtils.java
  12. 153
      src/main/java/com/palnet/comn/utils/DateUtils.java
  13. 80
      src/main/java/com/palnet/comn/utils/JsonUtils.java
  14. 61
      src/main/java/com/palnet/process/message/config/MessageConfig.java
  15. 31
      src/main/java/com/palnet/process/message/producer/MessageProducer.java
  16. 65
      src/main/java/com/palnet/process/model/GPDatabaseModel.java
  17. 15
      src/main/java/com/palnet/process/model/GPHistoryModel.java
  18. 70
      src/main/java/com/palnet/process/model/GPModel.java
  19. 112
      src/main/java/com/palnet/server/SocketServer.java
  20. 52
      src/main/java/com/palnet/server/codec/BigIntegerDecoder.java
  21. 39
      src/main/java/com/palnet/server/codec/SocketPayLoadDecoder.java
  22. 36
      src/main/java/com/palnet/server/codec/SocketPayLoadEncorder.java
  23. 22
      src/main/java/com/palnet/server/codec/SocketPayload.java
  24. 18
      src/main/java/com/palnet/server/codec/SocketPayloadResponse.java
  25. 26
      src/main/java/com/palnet/server/collection/ChannelCollection.java
  26. 137
      src/main/java/com/palnet/server/command/SocketCommand.java
  27. 1923
      src/main/java/com/palnet/server/encrptn/kisa/KISA_SEED_CBC.java
  28. 424
      src/main/java/com/palnet/server/encrptn/kisa/KISA_SHA256.java
  29. 100
      src/main/java/com/palnet/server/handler/SocketHandler.java
  30. 25
      src/main/java/com/palnet/server/initializer/SocketInitializer.java
  31. 27
      src/main/resources/application.yml
  32. 13
      src/test/java/com/palnet/PavSocketApplicationTests.java

33
.gitignore vendored

@ -0,0 +1,33 @@
HELP.md
target/
!.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/

BIN
.mvn/wrapper/maven-wrapper.jar vendored

Binary file not shown.

2
.mvn/wrapper/maven-wrapper.properties vendored

@ -0,0 +1,2 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.5/apache-maven-3.8.5-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar

316
mvnw vendored

@ -0,0 +1,316 @@
#!/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
#
# https://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.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven Start Up Batch script
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# M2_HOME - location of maven2's installed home dir
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /usr/local/etc/mavenrc ] ; then
. /usr/local/etc/mavenrc
fi
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="`/usr/libexec/java_home`"
else
export JAVA_HOME="/Library/Java/Home"
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
if [ -z "$M2_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
M2_HOME=`dirname "$PRG"`/..
# make it fully qualified
M2_HOME=`cd "$M2_HOME" && pwd`
cd "$saveddir"
# echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --unix "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$M2_HOME" ] &&
M2_HOME="`(cd "$M2_HOME"; pwd)`"
[ -n "$JAVA_HOME" ] &&
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=`which readlink`
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin ; then
javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else
javaExecutable="`readlink -f \"$javaExecutable\"`"
fi
javaHome="`dirname \"$javaExecutable\"`"
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
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"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="`\\unset -f command; \\command -v java`"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=`cd "$wdir/.."; pwd`
fi
# end of workaround
done
echo "${basedir}"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' < "$1")"
fi
}
BASE_DIR=`find_maven_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found .mvn/wrapper/maven-wrapper.jar"
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi
if [ -n "$MVNW_REPOURL" ]; then
jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
else
jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
fi
while IFS="=" read key value; do
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
esac
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $jarUrl"
fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
fi
if command -v wget > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl -o "$wrapperJarPath" "$jarUrl" -f
else
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download"
fi
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaClass=`cygpath --path --windows "$javaClass"`
fi
if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Compiling MavenWrapperDownloader.java ..."
fi
# Compiling the Java class
("$JAVA_HOME/bin/javac" "$javaClass")
fi
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
# Running the downloader
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Running MavenWrapperDownloader.java ..."
fi
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
if [ "$MVNW_VERBOSE" = true ]; then
echo $MAVEN_PROJECTBASEDIR
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --path --windows "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
$MAVEN_DEBUG_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" \
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

188
mvnw.cmd vendored

@ -0,0 +1,188 @@
@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 https://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 Maven Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% ^
%JVM_CONFIG_MAVEN_PROPS% ^
%MAVEN_OPTS% ^
%MAVEN_DEBUG_OPTS% ^
-classpath %WRAPPER_JAR% ^
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%"=="on" pause
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
cmd /C exit /B %ERROR_CODE%

68
pom.xml

@ -0,0 +1,68 @@
<?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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.palnet</groupId>
<artifactId>pav-socket</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>pav-socket</name>
<description>pav-socket</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.77.Final</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

13
src/main/java/com/palnet/Application.java

@ -0,0 +1,13 @@
package com.palnet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

45
src/main/java/com/palnet/comn/collection/AuthCollection.java

@ -0,0 +1,45 @@
package com.palnet.comn.collection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
public class AuthCollection {
private Logger logger = LoggerFactory.getLogger(getClass());
private static List<String> authkeyList = new ArrayList<String>();
public void reloadAuthkey() {
// 인증키 하드코딩 처리
authkeyList.add("1cc2e08e-0c5c-43b2-8d4d-cddd3de558e3");// 지텔인증키
authkeyList.add("35ea4080-a3f2-4e34-8361-78db06bac6fc");// PAL 인증키
// authkeyList.add(null)
}
public boolean checkAuthkey(String authKey) {
boolean result = false;
// logger.debug("authKey ::: " + authKey);
for(String key : authkeyList) {
// logger.debug("key ::: " + key);
if(authKey.equals(key)) {
result = true;
}
}
return result;
}
public static void main(String [] agrs) {
AuthCollection auth = new AuthCollection();
auth.reloadAuthkey();
System.out.println("1>>>>> " + auth.checkAuthkey("!234"));
System.out.println("2>>>>> " + auth.checkAuthkey("1cc2e08e-0c5c-43b2-8d4d-cddd3de558e3"));
}
}

70
src/main/java/com/palnet/comn/collection/GPCollection.java

@ -0,0 +1,70 @@
package com.palnet.comn.collection;
import com.palnet.comn.utils.ContextUtils;
import com.palnet.comn.utils.DateUtils;
import com.palnet.process.message.producer.MessageProducer;
import com.palnet.process.model.GPDatabaseModel;
import com.palnet.process.model.GPHistoryModel;
import com.palnet.process.model.GPModel;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import java.util.*;
/**
* 현재 움직이는 물체/비행체에 대한 정보를 전송하기 위해 저장하는 Collection
* @author kang
*
*/
@Slf4j
public class GPCollection {
private Logger logger = LoggerFactory.getLogger(getClass());
private static Map<String , String> identKeys = Collections.synchronizedMap(new HashMap<String, String>()); // 기체의 식별 번호
private MessageProducer messageProducer;
public GPCollection() {
this.messageProducer = (MessageProducer) ContextUtils.getBean("messageProducer");
}
// 받은 데이터 정보를 데이터구조에 맞게 저장 한다.
// 최초에 데이터를 수신한 경우 관제 ID , 관제시작 시간을 셋팅한다.
public void putData(List<GPModel> paramData) {
List<GPHistoryModel> historyList;
GPModel model = new GPModel();
for(GPModel data : paramData) {
data.setServerRcvDt(DateUtils.getCurrentTime()); //서버에서 받은 시간 넣기
// History Coordinates Settings
GPHistoryModel historyModel = new GPHistoryModel();
historyModel.setObjectId(data.getObjectId());
historyModel.setLat(data.getLat());
historyModel.setLng(data.getLng());
if (data.getPostionHistory() != null) {
historyList = data.getPostionHistory();
} else {
historyList = new ArrayList<>();
}
historyList.add(historyModel);
data.setPostionHistory(historyList);
/* Message Queue Server 전달 */
convertModel(model);
}
}
public void convertModel(GPModel model) {
GPDatabaseModel databaseModel = new GPDatabaseModel();
BeanUtils.copyProperties(model, databaseModel);
messageProducer.sendSocketData(databaseModel);
}
}

47
src/main/java/com/palnet/comn/collection/GPDatabaseCollection.java

@ -0,0 +1,47 @@
//package com.palnet.comn.collection;
//
//import com.palnet.comn.model.GPDatabaseModel;
//import com.palnet.comn.utils.BeanUtils;
//import com.palnet.server.message.producer.MessageProducer;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.util.concurrent.ConcurrentLinkedQueue;
//
///**
// * 전송된 원시데이터를 Database 에 넣기 위해 임시 저장해두는 Collection
// * @author kang
// *
// */
//public class GPDatabaseCollection {
//
// private Logger logger = LoggerFactory.getLogger(getClass());
//
// private static ConcurrentLinkedQueue<GPDatabaseModel> dataList = new ConcurrentLinkedQueue<GPDatabaseModel>();
// private MessageProducer messageProducer;
//
// public void putData(GPDatabaseModel paramData) {
// dataList.add(paramData);
//
// }
//
//// public void putListData(List<GPDatabaseModel> paramDataList) {
//// dataList.addAll(paramDataList);
//// }
//
// public ConcurrentLinkedQueue<GPDatabaseModel> getData(){
//
// return dataList;
// }
//
//// public static void main(String[] args) {
//// ConcurrentLinkedQueue<String> qe = new ConcurrentLinkedQueue<String>();
////
//// }
////
// public void messageSend(GPDatabaseModel model) {
// messageProducer = (MessageProducer) BeanUtils.getBean("kafkaProducer");
// messageProducer.send("sample-topic", model);
// }
//
//}

25
src/main/java/com/palnet/comn/utils/ContextUtils.java

@ -0,0 +1,25 @@
package com.palnet.comn.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class ContextUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
applicationContext = ctx;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static Object getBean(String beanName) {
return getApplicationContext().getBean(beanName);
}
}

153
src/main/java/com/palnet/comn/utils/DateUtils.java

@ -0,0 +1,153 @@
package com.palnet.comn.utils;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Date;
public class DateUtils {
public static String getCurrentTime(){
return new SimpleDateFormat("yyyyMMddHHmmss").format(System.currentTimeMillis());
}
public static String stringToFormat(String str) {
Date date = stringToDatetime(str);
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
}
public static Date stringToDatetime(String date) {
SimpleDateFormat transFormat = new SimpleDateFormat("yyyyMMddHHmmss");
Date result = null;
try {
if(date.length() == 14) {
result = transFormat.parse(date);
}
}catch(Exception e) {
e.printStackTrace();
}
return result;
}
public static Date stringToDate(String date) {
SimpleDateFormat transFormat = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat transFormat2 = new SimpleDateFormat("yyyyMMdd");
Date result = null;
try {
if(date.length() == 10) {
result = transFormat.parse(date);
}else if(date.length() == 8) {
result = transFormat2.parse(date);
}
}catch(Exception e) {
e.printStackTrace();
}
return result;
}
public static LocalDateTime stringToLocalDateTime(String date) {
DateTimeFormatter transFormat = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
LocalDateTime localDateTime = LocalDateTime.parse(date , transFormat);
return localDateTime;
}
public static LocalDateTime stringToLocalDate(String date) {
DateTimeFormatter transFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter DATEFORMATTER = new DateTimeFormatterBuilder().append(transFormat)
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter();
LocalDateTime localDateTime = LocalDateTime.parse(date , DATEFORMATTER);
return localDateTime;
}
public static Date nowDate() {
return new Date(System.currentTimeMillis());
}
public static long diffSecond(Date firstDate , Date secondDate) {
long diffDate = secondDate.getTime() - firstDate.getTime();
long diffTime = diffDate / (1000);
return diffTime;
}
public static long diffMinute(Date firstDate , Date secondDate) {
long diffDate = secondDate.getTime() - firstDate.getTime();
long diffTime = diffDate / (1000 * 60);
return diffTime;
}
// public static void main(String[] args) {
//
// Date firstDate = stringToDate("20210630142014");
//
// Date secondDate = stringToDate("20210630142914");
//
// LocalDateTime dateTime = stringToLocalDate("2021-07-20");
//
// System.out.println(">>>>" + dateTime);
//
//
// System.out.println("두 날짜의 차이 분: "+diffMinute(firstDate , secondDate));
//
// System.out.println(">>>" + stringToFormat("20210630142014"));
//
//
//
//
//
//// List<Map<String, Double>> list = new ArrayList<Map<String, Double>>();
////
////
//// for( double i= 0 ; i < 1000 ; i ++) {
//// Map<String, Double> position = new HashMap<String, Double>();
//// position.put("lat", 11111.0);
//// position.put("lng", 11111.0);
//// position.put("date", i);
//// list.add(position);
//// }
////
//// int limitSize = 1000;
//// if(list.size() < 1000) {
//// limitSize = list.size();
//// }
////
//// List<Map<String, Double>> lastThreeThings = list.subList(list.size() - limitSize, list.size());
////
//// //뒤집기
//// Collections.reverse(lastThreeThings);
////
//// for(Map<String , Double> data : lastThreeThings) {
////
////
//// System.out.println(data);
//// }
//
// }
}

80
src/main/java/com/palnet/comn/utils/JsonUtils.java

@ -0,0 +1,80 @@
package com.palnet.comn.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
@Slf4j
public class JsonUtils {
private static ObjectMapper getObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return mapper;
}
public static String toJson(Object object) {
String json = null;
try {
json = getObjectMapper().writeValueAsString(object);
} catch (JsonProcessingException e) {
log.error("", e);
}
return json;
}
public static <T> T fromJson(String val, Class<T> clazz){
T object = null;
try {
object = getObjectMapper().readValue(val, clazz);
} catch (IOException e) {
log.error("", e);
}
return object;
}
public static <T> T fromJson(byte[] bytes, Class<T> clazz){
T object = null;
try {
object = getObjectMapper().readValue(bytes, clazz);
} catch (IOException e) {
log.error("", e);
}
return object;
}
public static <T> T fromJson(String val, TypeReference<T> type){
T object = null;
try {
object = getObjectMapper().readValue(val, type);
} catch (IOException e) {
log.error("", e);
}
return object;
}
public static <T> T bytesToJson(byte[] bytes, TypeReference<T> type){
T object = null;
try {
object = getObjectMapper().readValue(bytes, type);
} catch (IOException e) {
log.error("", e);
}
return object;
}
}

61
src/main/java/com/palnet/process/message/config/MessageConfig.java

@ -0,0 +1,61 @@
package com.palnet.process.message.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
@Configuration
@Slf4j
public class MessageConfig {
private final Environment env;
public MessageConfig(Environment env) {
this.env = env;
}
@Bean
public CachingConnectionFactory cachingConnectionFactory() {
return new CachingConnectionFactory();
}
@Bean
public Jackson2JsonMessageConverter converter() {
return new Jackson2JsonMessageConverter();
}
@Bean
public TopicExchange droneExchange() {
return new TopicExchange(env.getProperty("message.dron.exchange-name"));
}
@Bean
public Queue droneQueue() {
return new Queue(env.getProperty("message.dron.queue-name"));
}
@Bean
public Binding droneBinding(Queue queue, TopicExchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with(env.getProperty("message.dron.routing-key"));
}
@Bean
public RabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory, Jackson2JsonMessageConverter converter) {
RabbitTemplate rabbitTemplate = new RabbitTemplate();
rabbitTemplate.setConnectionFactory(connectionFactory);
rabbitTemplate.setMessageConverter(converter);
return rabbitTemplate;
}
}

31
src/main/java/com/palnet/process/message/producer/MessageProducer.java

@ -0,0 +1,31 @@
package com.palnet.process.message.producer;
import com.palnet.process.model.GPDatabaseModel;
import com.palnet.process.model.GPModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.util.Objects;
@Component
@Slf4j
public class MessageProducer {
private final RabbitTemplate rabbitTemplate;
private final Environment env;
public MessageProducer(RabbitTemplate rabbitTemplate, Environment env) {
this.rabbitTemplate = rabbitTemplate;
this.env = env;
}
public void sendSocketData(GPDatabaseModel model) {
rabbitTemplate.convertAndSend(
Objects.requireNonNull(env.getProperty("message.drone.exchange-name")),
Objects.requireNonNull(env.getProperty("message.drone.routing-key")),
model);
}
}

65
src/main/java/com/palnet/process/model/GPDatabaseModel.java

@ -0,0 +1,65 @@
package com.palnet.process.model;
import lombok.Data;
@Data
public class GPDatabaseModel {
private String typeCd; // 01 : 최초 들어온 데이터 , 99 : 종료 시킬 데이터
private String messageType;
private String terminalId;
private Double moveDistance = 0.0;
private String moveDistanceType;
private String prodNumber;
private String controlId;
private String objectType;
private String objectId;
private Double lat = 0.0;
private Double lng = 0.0;
private String elevType;
private Double elev = 0.0;
private String speedType;
private Double speed = 0.0;
private Double betteryLevel = 0.0;
private Double betteryVoltage = 0.0;
private String dronStatus;
private Double heading = 0.0;
private String terminalRcvDt;
private String serverRcvDt;
private String controlStartDt;
private String controlEndDt;
private String areaTrnsYn;
private String endTypeCd; // 01: 일정시간 위치 정보가 들어오지 않는 경우 , 02 : 데이터 베이스에 종료 시점이 명시 되지 않은 경우
// 환경센서 필드
private Double sensorCo = 0.0;
private Double sensorSo2 = 0.0;
private Double sensorNo2 = 0.0;
private Double sensorO3 = 0.0;
private Double sensorDust = 0.0;
}

15
src/main/java/com/palnet/process/model/GPHistoryModel.java

@ -0,0 +1,15 @@
package com.palnet.process.model;
import lombok.Data;
@Data
public class GPHistoryModel {
private String objectId;
private Double lat = 0.0;
private Double lng = 0.0;
}

70
src/main/java/com/palnet/process/model/GPModel.java

@ -0,0 +1,70 @@
package com.palnet.process.model;
import lombok.Data;
import java.util.List;
@Data
public class GPModel {
private String typeCd; // 01 : 최초 들어온 데이터 , 99 : 종료 시킬 데이터
private String messageType;
private String terminalId;
private Double moveDistance = 0.0;
private String moveDistanceType;
private String controlId; // 처음 위치 데이터가 들어 왔을때 생성 함
private String objectType;
private String objectId;
private Double lat = 0.0;
private Double lng = 0.0;
private String elevType;
private Double elev = 0.0;
private String speedType;
private Double speed = 0.0;
private Double betteryLevel = 0.0;
private Double betteryVoltage = 0.0;
private String dronStatus;
private Double heading = 0.0;
private String terminalRcvDt;
private String serverRcvDt;
private String controlStartDt;
private String controlEndDt;
private String areaTrnsYn;
// 환경센서 필드
private Double sensorCo = 0.0;
private Double sensorSo2 = 0.0;
private Double sensorNo2 = 0.0;
private Double sensorO3 = 0.0;
private Double sensorDust = 0.0;
//최근 5건만 저장
private List<GPHistoryModel> recentPositionHistory;
// 전체 히스토리 저장
private List<GPHistoryModel> postionHistory;
}

112
src/main/java/com/palnet/server/SocketServer.java

@ -0,0 +1,112 @@
package com.palnet.server;
import com.palnet.server.initializer.SocketInitializer;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component
public class SocketServer {
private Logger logger = LoggerFactory.getLogger(getClass());
@Value("${netty.socket.port}")
private int port;
@Value("${netty.socket.thread.boss}")
private int threadBoss;
@Value("${netty.socket.thread.worker}")
private int threadWorker;
private Channel ch;
private EventLoopGroup bossGroup ;
private EventLoopGroup workerGroup ;
private ServerBootstrap b = new ServerBootstrap();
// @Autowired
// private AdsbClient client;
//
@PostConstruct
public void postConstruct(){
start();
}
@PreDestroy
public void preDestroy(){
stop();
}
public void start(){
try {
bossGroup = new NioEventLoopGroup(10);
workerGroup =new NioEventLoopGroup();
b.group(bossGroup , workerGroup) // bossGroup과 workerGroup은 NioEventLoopGroup의 인스턴스입니다.이 때 스레드 개수를 설정할 수 있음 각각 1, Runtime.getRuntime().availableProcessors() * 2로 설정했습니다.
.channel(NioServerSocketChannel.class)
// .handler(new LoggingHandler(LogLevel.valueOf(logBootstrap)))
// .handler(bootstrapHandler) // 채널이 활성화되면 소켓 서버와 소켓 클라이언트를 구동하게 되는 핸들러를 등록합니다.
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000)
.option(ChannelOption.SO_BACKLOG, 1000) // 동시에 수용할 수 있는 소켓 연결 요청 수입니다.
// .option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator(1024 , 1024 * 16 , 1024 * 1024))
.childOption(ChannelOption.TCP_NODELAY, false) // 반응속도를 높이기 위해 Nagle 알고리즘을 비활성화 합니다
.childOption(ChannelOption.SO_LINGER, 0) // 소켓이 close될 때 신뢰성있는 종료를 위해 4way-handshake가 발생하고 이때 TIME_WAIT로 리소스가 낭비됩니다. 이를 방지하기 위해 0으로 설정합니다.
.childOption(ChannelOption.SO_KEEPALIVE, false) // Keep-alive를 켭니다.
.childOption(ChannelOption.SO_REUSEADDR, false) // SO_LINGER설정이 있으면 안해도 되나 혹시나병(!)으로 TIME_WAIT걸린 포트를 재사용할 수 있도록 설정합니다.
.childHandler(new SocketInitializer());
connection();
// taskProcess();
// client.start();
logger.warn("====== [SOCKET SERVER] Start ====== ");
}catch (Exception e) {
logger.warn("====== [SOCKET SERVER] Fail ====== ");
logger.error(e.getMessage());
}
}
private void connection() {
//서버는 Listen상태로 기다려야하는데, 톰캣이 Timeout이 발생함
//이를 방지하기 위해 Thread로 처리한다.
new Thread(new Runnable() {
@Override
public void run() {
try {
ChannelFuture future = b.bind(port).sync();
future.channel().closeFuture().sync();
} catch (InterruptedException e) {
logger.error("InterruptedException", e);
}
}
}).start();
}
public void stop(){
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
logger.warn("====== [SOCKET SERVER] STOP ====== ");
}
}

52
src/main/java/com/palnet/server/codec/BigIntegerDecoder.java

@ -0,0 +1,52 @@
/*
* Copyright 2012 The Netty Project
*
* The Netty Project 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:
*
* https://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.
*/
package com.palnet.server.codec;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import java.math.BigInteger;
import java.util.List;
/**
* Decodes the binary representation of a {@link BigInteger} prepended
* with a magic number ('F' or 0x46) and a 32-bit integer length prefix into a
* {@link BigInteger} instance. For example, { 'F', 0, 0, 0, 1, 42 } will be
* decoded into new BigInteger("42").
*/
public class BigIntegerDecoder extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
System.out.println(">>>>>>>>>>>>>>>>>>>>>" + in.readableBytes());
if (in.isReadable()) {
byte[] bytes = new byte[in.readableBytes()];
int readerIndex = in.readerIndex();
in.getBytes(readerIndex, bytes);
System.out.println(">>>" + new String(bytes));
}
// Wait until the length prefix is available.
}
}

39
src/main/java/com/palnet/server/codec/SocketPayLoadDecoder.java

@ -0,0 +1,39 @@
package com.palnet.server.codec;
import com.palnet.comn.utils.JsonUtils;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
@Sharable
public class SocketPayLoadDecoder extends MessageToMessageDecoder<Object> {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
protected void decode(ChannelHandlerContext ctx, Object msg, List<Object> out){
// logger.info("[SocketPayLoadDecoder] Init 2 " );
SocketPayload payload = null;
try {
payload = JsonUtils.fromJson((String) msg, SocketPayload.class);
if(payload != null) {
out.add(payload);
}
}catch(Exception e) {
logger.info("MSG => " + msg );
logger.error(e.getMessage());
}
}
}

36
src/main/java/com/palnet/server/codec/SocketPayLoadEncorder.java

@ -0,0 +1,36 @@
package com.palnet.server.codec;
import com.palnet.comn.utils.JsonUtils;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageEncoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
@Sharable
public class SocketPayLoadEncorder extends MessageToMessageEncoder<SocketPayloadResponse> {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
protected void encode(ChannelHandlerContext ctx, SocketPayloadResponse msg, List<Object> out){
try {
out.add(JsonUtils.toJson(msg));
// logger.debug("[SocketPayLoadEncorder] Init 11111" );
logger.info("=== >>>>>>>>>>>>>>" , JsonUtils.toJson(msg));
}catch(Exception e) {
logger.info("MSG => " + msg );
logger.error(e.getMessage());
}
}
}

22
src/main/java/com/palnet/server/codec/SocketPayload.java

@ -0,0 +1,22 @@
package com.palnet.server.codec;
import lombok.Data;
import java.io.Serializable;
@Data
public class SocketPayload implements Serializable{
private static final long serialVersionUID = 1L;
private String authKey;
private String terminalId;
private String command;
private Object body;
}

18
src/main/java/com/palnet/server/codec/SocketPayloadResponse.java

@ -0,0 +1,18 @@
package com.palnet.server.codec;
import lombok.Data;
import java.io.Serializable;
@Data
public class SocketPayloadResponse implements Serializable{
private static final long serialVersionUID = 1L;
private String rspCode;
private String rspMessage;
}

26
src/main/java/com/palnet/server/collection/ChannelCollection.java

@ -0,0 +1,26 @@
package com.palnet.server.collection;
import io.netty.channel.Channel;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;
public class ChannelCollection {
private static final long serialVersionUID = 1L;
//접속 되어있는 모든 Channel
private static final ChannelGroup allChannels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
public void setAllChannels(Channel ch) {
allChannels.add(ch);
}
public ChannelGroup getAllChannels() {
return allChannels;
}
}

137
src/main/java/com/palnet/server/command/SocketCommand.java

@ -0,0 +1,137 @@
package com.palnet.server.command;
import com.palnet.comn.collection.GPCollection;
import com.palnet.process.model.GPModel;
import com.palnet.server.codec.SocketPayload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
public class SocketCommand {
private Logger logger = LoggerFactory.getLogger(getClass());
GPCollection collection = new GPCollection();
public void openSkyCollectionPut(SocketPayload payload) {
/** 전문 설정 ***/
String messageType = "OPENSKY";
String objectType = "FLIGHT";
List<LinkedHashMap<?,?>> resultList = new ArrayList<LinkedHashMap<?,?>>();
List<GPModel> dataList = new ArrayList<GPModel>();
logger.debug("BODY TYPE :: " + payload.getBody().getClass());
resultList = (ArrayList)payload.getBody();
GPModel model;
for(LinkedHashMap<?,?> obj : resultList) {
model = new GPModel();
model.setObjectType(objectType);
model.setMessageType(messageType);
model.setObjectId(obj.get("objectId").toString().trim());
model.setTerminalId(obj.get("terminalId").toString().trim());
model.setLat((Double)obj.get("lat"));
model.setLng((Double)obj.get("lng"));
model.setElev((Double)obj.get("elev"));
model.setTerminalRcvDt(obj.get("terminalRcvDt").toString().trim());
model.setSpeed((Double)obj.get("speed"));
model.setHeading((Double)obj.get("heading"));
model.setSpeedType((String)obj.get("speedType"));
model.setElevType((String)obj.get("elevType"));
model.setMoveDistanceType((String)obj.get("moveDistanceType"));
model.setMoveDistance((Double)obj.get("moveDistance"));
model.setBetteryLevel((Double)obj.get("betteryLevel"));
model.setBetteryVoltage((Double)obj.get("betteryVoltage"));
model.setDronStatus((String)obj.get("dronStatus"));
dataList.add(model);
}
collection.putData(dataList);
// logger.debug("SIZE :: " +collection.getData().size() );
}
/**
* 들어온 데이터를 collection넣는 작업을 한다.
* @param payload
*/
public void sandboxCollectionPut(SocketPayload payload) {
/** 전문 설정 ***/
String messageType = "LTEM";
String objectType = "DRON";
List<LinkedHashMap<?,?>> resultList = new ArrayList<LinkedHashMap<?,?>>();
List<GPModel> dataList = new ArrayList<GPModel>();
logger.debug("BODY TYPE :: " + payload.getBody().getClass());
resultList = (ArrayList)payload.getBody();
GPModel model;
for(LinkedHashMap<?,?> obj : resultList) {
//위,경도 좌표가 0으로 들어오는 것은 무시 처리
if((Double)obj.get("lat") > 0 && (Double)obj.get("lon") > 0) {
model = new GPModel();
// logger.debug(">>>>" + obj.toString());
model.setObjectType(objectType);
model.setMessageType(messageType);
model.setObjectId(obj.get("objectId").toString().trim());
model.setTerminalId(payload.getTerminalId());
if(obj.get("lat") != null) model.setLat(Double.valueOf(obj.get("lat").toString()));
if(obj.get("lon") != null) model.setLng(Double.valueOf(obj.get("lon").toString()));
if(obj.get("elev") != null) model.setElev(Double.valueOf(obj.get("elev").toString()));
model.setTerminalRcvDt(obj.get("terminalRcvDt").toString().trim());
if(obj.get("speed") != null) model.setSpeed(Double.valueOf(obj.get("speed").toString()));
if(obj.get("heading") != null) model.setHeading(Double.valueOf(obj.get("heading").toString()));
model.setSpeedType((String)obj.get("speedType"));
model.setElevType((String)obj.get("elevType"));
model.setMoveDistanceType((String)obj.get("moveDistanceType"));
if(obj.get("moveDistance") != null) model.setMoveDistance(Double.valueOf(obj.get("moveDistance").toString()));
if(obj.get("betteryLevel") != null) model.setBetteryLevel(Double.valueOf(obj.get("betteryLevel").toString()));
if(obj.get("betteryVoltage") != null) model.setBetteryVoltage(Double.valueOf(obj.get("betteryVoltage").toString()));
model.setDronStatus((String)obj.get("dronStatus"));
// 환경 데이터 필드 추가
if(obj.get("sensorCo") != null) model.setSensorCo(Double.valueOf(obj.get("sensorCo").toString()));
if(obj.get("sensorSo2") != null) model.setSensorSo2(Double.valueOf(obj.get("sensorSo2").toString()));
if(obj.get("sensorNo2") != null) model.setSensorNo2(Double.valueOf(obj.get("sensorNo2").toString()));
if(obj.get("sensorO3") != null) model.setSensorO3(Double.valueOf(obj.get("sensorO3").toString()));
if(obj.get("sensorDust") != null) model.setSensorDust(Double.valueOf(obj.get("sensorDust").toString()));
// TODO 환경 데이터 임의의 데이터로 수정 - 추후 제거(임시코드)
// if(model.getSensorCo() != null){
// model.setSensorCo(TempUtils.gradualData("co"));
// model.setSensorSo2(TempUtils.gradualData("so2"));
// model.setSensorNo2(TempUtils.gradualData("no2"));
// model.setSensorO3(TempUtils.gradualData("o3"));
// model.setSensorDust(TempUtils.gradualData("dust"));
// }
dataList.add(model);
}else {
logger.info("lat , lon No data ");
}
}
// collection.putData(dataList);
// logger.debug("SIZE :: " +collection.getData().size() );
}
}

1923
src/main/java/com/palnet/server/encrptn/kisa/KISA_SEED_CBC.java

File diff suppressed because it is too large Load Diff

424
src/main/java/com/palnet/server/encrptn/kisa/KISA_SHA256.java

@ -0,0 +1,424 @@
package com.palnet.server.encrptn.kisa;
public class KISA_SHA256 {
// DEFAULT : JAVA = BIG_ENDIAN
private static int ENDIAN = Common.BIG_ENDIAN;
private static final int SHA256_DIGEST_BLOCKLEN = 64;
private static final int SHA256_DIGEST_VALUELEN = 32;
private static final int SHA256_K[] =
{
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,
0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,
0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
};
private static final int ROTL_ULONG(int x, int n) {
return (x << n) | Common.URShift(x, 32 - n);
}
private static final int ROTR_ULONG(int x, int n) {
return Common.URShift(x, n) | (x << (32 - (n)));
}
private static final int ENDIAN_REVERSE_ULONG(int dwS) {
return ( (ROTL_ULONG((dwS), 8) & 0x00ff00ff) | (ROTL_ULONG((dwS), 24) & 0xff00ff00) );
}
private static final void BIG_D2B(int D, byte[] B, int B_offset) {
Common.int_to_byte_unit(B, B_offset, D, ENDIAN);
}
private static final int RR(int x, int n) { return ROTR_ULONG(x, n); }
private static final int SS(int x, int n) { return Common.URShift(x, n); }
private static final int Ch(int x, int y, int z) { return ((x & y) ^ ((~x) & z)); }
private static final int Maj(int x, int y, int z) { return ((x & y) ^ (x & z) ^ (y & z)); }
private static final int Sigma0(int x) { return (RR(x, 2) ^ RR(x, 13) ^ RR(x, 22)); }
private static final int Sigma1(int x) { return (RR(x, 6) ^ RR(x, 11) ^ RR(x, 25)); }
private static final int RHO0(int x) { return (RR(x, 7) ^ RR(x, 18) ^ SS(x, 3)); }
private static final int RHO1(int x) { return (RR(x, 17) ^ RR(x, 19) ^ SS(x, 10)); }
private static final int abcdefgh_a = 0;
private static final int abcdefgh_b = 1;
private static final int abcdefgh_c = 2;
private static final int abcdefgh_d = 3;
private static final int abcdefgh_e = 4;
private static final int abcdefgh_f = 5;
private static final int abcdefgh_g = 6;
private static final int abcdefgh_h = 7;
private static final void FF(int[] abcdefgh, int a, int b, int c, int d, int e, int f, int g, int h, int[] X, int j) {
long T1;
T1 = Common.intToUnsigned(abcdefgh[h]) + Common.intToUnsigned(Sigma1(abcdefgh[e])) + Common.intToUnsigned(Ch(abcdefgh[e], abcdefgh[f], abcdefgh[g])) + Common.intToUnsigned(SHA256_K[j]) + Common.intToUnsigned(X[j]);
abcdefgh[d] += T1;
abcdefgh[h] = (int)(T1 + Common.intToUnsigned(Sigma0(abcdefgh[a])) + Common.intToUnsigned(Maj(abcdefgh[a], abcdefgh[b], abcdefgh[c])));
}
private static final int GetData(byte[] x, int x_offset) {
return Common.byte_to_int(x, x_offset, ENDIAN);
}
//*********************************************************************************************************************************
// o SHA256_Transform() : 512 <EFBFBD><EFBFBD>Ʈ <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>޽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Է<EFBFBD> <EFBFBD>޾<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Լ<EFBFBD><EFBFBD>ν<EFBFBD>
// 4 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>(64 <EFBFBD>ܰ<EFBFBD>)<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD> 8<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(a, b, c, d, e, f, g, h)<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
// o <EFBFBD>Է<EFBFBD> : Message - <EFBFBD>Է<EFBFBD> <EFBFBD>޽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ChainVar - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// o <EFBFBD><EFBFBD><EFBFBD> :
//*********************************************************************************************************************************
private static void SHA256_Transform(byte[] Message, int[] ChainVar) {
int abcdefgh[] = new int[8];
int T1[] = new int[1];
int X[] = new int[64];
int j;
for (j = 0; j < 16; j++)
X[j] = GetData(Message, j*4);
for (j = 16; j < 64; j++)
X[j] = (int)(Common.intToUnsigned(RHO1(X[j - 2])) + Common.intToUnsigned(X[j - 7]) + Common.intToUnsigned(RHO0(X[j - 15])) + Common.intToUnsigned(X[j - 16]));
abcdefgh[abcdefgh_a] = ChainVar[0];
abcdefgh[abcdefgh_b] = ChainVar[1];
abcdefgh[abcdefgh_c] = ChainVar[2];
abcdefgh[abcdefgh_d] = ChainVar[3];
abcdefgh[abcdefgh_e] = ChainVar[4];
abcdefgh[abcdefgh_f] = ChainVar[5];
abcdefgh[abcdefgh_g] = ChainVar[6];
abcdefgh[abcdefgh_h] = ChainVar[7];
for (j = 0; j < 64; j += 8)
{
FF(abcdefgh, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, X, j + 0);
FF(abcdefgh, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, X, j + 1);
FF(abcdefgh, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, X, j + 2);
FF(abcdefgh, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, X, j + 3);
FF(abcdefgh, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, abcdefgh_d, X, j + 4);
FF(abcdefgh, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, abcdefgh_c, X, j + 5);
FF(abcdefgh, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, abcdefgh_b, X, j + 6);
FF(abcdefgh, abcdefgh_b, abcdefgh_c, abcdefgh_d, abcdefgh_e, abcdefgh_f, abcdefgh_g, abcdefgh_h, abcdefgh_a, X, j + 7);
}
ChainVar[0] += abcdefgh[abcdefgh_a];
ChainVar[1] += abcdefgh[abcdefgh_b];
ChainVar[2] += abcdefgh[abcdefgh_c];
ChainVar[3] += abcdefgh[abcdefgh_d];
ChainVar[4] += abcdefgh[abcdefgh_e];
ChainVar[5] += abcdefgh[abcdefgh_f];
ChainVar[6] += abcdefgh[abcdefgh_g];
ChainVar[7] += abcdefgh[abcdefgh_h];
}
/**
@brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʱ<EFBFBD>ȭ<EFBFBD>ϴ<EFBFBD> <EFBFBD>Լ<EFBFBD>
@param Info : SHA256_Process ȣ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü
*/
public static void SHA256_Init( SHA256_INFO Info ) {
Info.uChainVar[0] = 0x6a09e667;
Info.uChainVar[1] = 0xbb67ae85;
Info.uChainVar[2] = 0x3c6ef372;
Info.uChainVar[3] = 0xa54ff53a;
Info.uChainVar[4] = 0x510e527f;
Info.uChainVar[5] = 0x9b05688c;
Info.uChainVar[6] = 0x1f83d9ab;
Info.uChainVar[7] = 0x5be0cd19;
Info.uHighLength = Info.uLowLength = 0;
}
/**
@brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>̺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ʱ<EFBFBD>ȭ<EFBFBD>ϴ<EFBFBD> <EFBFBD>Լ<EFBFBD>
@param Info : SHA256_Init ȣ<EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <EFBFBD>ʱ<EFBFBD>ȭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.)
@param pszMessage : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Է<EFBFBD> <EFBFBD><EFBFBD>
@param inLen : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Է<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
public static void SHA256_Process( SHA256_INFO Info, byte[] pszMessage, int uDataLen ) {
int pszMessage_offset;
if((Info.uLowLength += (uDataLen << 3)) < 0) {
Info.uHighLength++;
}
Info.uHighLength += Common.URShift(uDataLen,29);
pszMessage_offset = 0;
while (uDataLen >= SHA256_DIGEST_BLOCKLEN) {
Common.arraycopy_offset(Info.szBuffer, 0, pszMessage, pszMessage_offset, SHA256_DIGEST_BLOCKLEN);
SHA256_Transform(Info.szBuffer, Info.uChainVar);
pszMessage_offset += SHA256_DIGEST_BLOCKLEN;
uDataLen -= SHA256_DIGEST_BLOCKLEN;
}
Common.arraycopy_offset(Info.szBuffer, 0, pszMessage, pszMessage_offset, uDataLen);
}
/**
@brief <EFBFBD>޽<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̱<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̱ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>޽<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <EFBFBD>Լ<EFBFBD>
@param Info : SHA256_Init ȣ<EFBFBD><EFBFBD><EFBFBD>Ͽ<EFBFBD> <EFBFBD>ʱ<EFBFBD>ȭ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>.)
@param pszDigest : <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD>
*/
public static void SHA256_Close( SHA256_INFO Info, byte[] pszDigest ) {
int i, Index;
Index = Common.URShift(Info.uLowLength, 3) % SHA256_DIGEST_BLOCKLEN;
Info.szBuffer[Index++] = (byte)0x80;
if (Index > SHA256_DIGEST_BLOCKLEN - 8) {
Common.arrayinit_offset(Info.szBuffer, Index, (byte)0, SHA256_DIGEST_BLOCKLEN - Index);
SHA256_Transform(Info.szBuffer, Info.uChainVar);
Common.arrayinit(Info.szBuffer, (byte)0, SHA256_DIGEST_BLOCKLEN - 8);
}
else {
Common.arrayinit_offset(Info.szBuffer, Index, (byte)0, SHA256_DIGEST_BLOCKLEN - Index - 8);
}
if(ENDIAN == Common.LITTLE_ENDIAN) {
Info.uLowLength = ENDIAN_REVERSE_ULONG(Info.uLowLength);
Info.uHighLength = ENDIAN_REVERSE_ULONG(Info.uHighLength);
}
Common.int_to_byte_unit(Info.szBuffer, ((int)(SHA256_DIGEST_BLOCKLEN / 4 - 2))*4, Info.uHighLength, ENDIAN);
Common.int_to_byte_unit(Info.szBuffer, ((int)(SHA256_DIGEST_BLOCKLEN / 4 - 1))*4, Info.uLowLength, ENDIAN);
SHA256_Transform(Info.szBuffer, Info.uChainVar);
for (i = 0; i < SHA256_DIGEST_VALUELEN; i += 4)
BIG_D2B((Info.uChainVar)[i / 4], pszDigest, i);
}
/**
@brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Է<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD> ó<EFBFBD><EFBFBD>
@param pszMessage : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Է<EFBFBD> <EFBFBD><EFBFBD>
@param pszDigest : <EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD>
@remarks <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SHA256_Init, SHA256_Process, SHA256_Close<EFBFBD><EFBFBD> ȣ<EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
*/
public static void SHA256_Encrpyt( byte[] pszMessage, int uPlainTextLen, byte[] pszDigest ) {
SHA256_INFO info = new SHA256_INFO();
SHA256_Init( info );
SHA256_Process( info, pszMessage, uPlainTextLen );
SHA256_Close( info, pszDigest );
}
public static class SHA256_INFO {
public int uChainVar[] = new int[SHA256_DIGEST_VALUELEN / 4];
public int uHighLength;
public int uLowLength;
public byte szBuffer[] = new byte[SHA256_DIGEST_BLOCKLEN];
}
public static class Common {
public static final int BIG_ENDIAN = 0;
public static final int LITTLE_ENDIAN = 1;
public static void arraycopy(byte[] dst, byte[] src, int length) {
for(int i=0; i<length; i++) {
dst[i] = src[i];
}
}
public static void arraycopy_offset(byte[] dst, int dst_offset, byte[] src, int src_offset, int length) {
for(int i=0; i<length; i++) {
dst[dst_offset+i] = src[src_offset+i];
}
}
public static void arrayinit(byte[] dst, byte value, int length) {
for(int i=0; i<length; i++) {
dst[i] = value;
}
}
public static void arrayinit_offset(byte[] dst, int dst_offset, byte value, int length) {
for(int i=0; i<length; i++) {
dst[dst_offset+i] = value;
}
}
public static void memcpy(int[] dst, byte[] src, int length, int ENDIAN) {
int iLen = length / 4;
for(int i=0; i<iLen; i++) {
byte_to_int(dst, i, src, i*4, ENDIAN);
}
}
public static void memcpy(int[] dst, int[] src, int src_offset, int length) {
int iLen = length / 4 + ((length % 4 != 0)?1:0);
for(int i=0; i<iLen; i++) {
dst[i] = src[src_offset+i];
}
}
public static void set_byte_for_int(int[] dst, int b_offset, byte value, int ENDIAN) {
if(ENDIAN == BIG_ENDIAN) {
int shift_value = (3-b_offset%4)*8;
int mask_value = 0x0ff << shift_value;
int mask_value2 = ~mask_value;
int value2 = (value&0x0ff) << shift_value;
dst[b_offset/4] = (dst[b_offset/4] & mask_value2) | (value2 & mask_value);
} else {
int shift_value = (b_offset%4)*8;
int mask_value = 0x0ff << shift_value;
int mask_value2 = ~mask_value;
int value2 = (value&0x0ff) << shift_value;
dst[b_offset/4] = (dst[b_offset/4] & mask_value2) | (value2 & mask_value);
}
}
public static byte get_byte_for_int(int[] src, int b_offset, int ENDIAN) {
if(ENDIAN == BIG_ENDIAN) {
int shift_value = (3-b_offset%4)*8;
int mask_value = 0x0ff << shift_value;
int value = (src[b_offset/4] & mask_value) >> shift_value;
return (byte)value;
} else {
int shift_value = (b_offset%4)*8;
int mask_value = 0x0ff << shift_value;
int value = (src[b_offset/4] & mask_value) >> shift_value;
return (byte)value;
}
}
public static byte[] get_bytes_for_ints(int[] src, int offset, int ENDIAN) {
int iLen = src.length-offset;
byte[] result = new byte[(iLen)*4];
for(int i=0; i<iLen; i++) {
int_to_byte(result, i*4, src, offset+i, ENDIAN);
}
return result;
}
public static void byte_to_int(int[] dst, int dst_offset, byte[] src, int src_offset, int ENDIAN) {
if(ENDIAN == BIG_ENDIAN) {
dst[dst_offset] = ((0x0ff&src[src_offset]) << 24) | ((0x0ff&src[src_offset+1]) << 16) | ((0x0ff&src[src_offset+2]) << 8) | ((0x0ff&src[src_offset+3]));
} else {
dst[dst_offset] = ((0x0ff&src[src_offset])) | ((0x0ff&src[src_offset+1]) << 8) | ((0x0ff&src[src_offset+2]) << 16) | ((0x0ff&src[src_offset+3]) << 24);
}
}
public static int byte_to_int(byte[] src, int src_offset, int ENDIAN) {
if(ENDIAN == BIG_ENDIAN) {
return ((0x0ff&src[src_offset]) << 24) | ((0x0ff&src[src_offset+1]) << 16) | ((0x0ff&src[src_offset+2]) << 8) | ((0x0ff&src[src_offset+3]));
} else {
return ((0x0ff&src[src_offset])) | ((0x0ff&src[src_offset+1]) << 8) | ((0x0ff&src[src_offset+2]) << 16) | ((0x0ff&src[src_offset+3]) << 24);
}
}
public static int byte_to_int_big_endian(byte[] src, int src_offset) {
return ((0x0ff&src[src_offset]) << 24) | ((0x0ff&src[src_offset+1]) << 16) | ((0x0ff&src[src_offset+2]) << 8) | ((0x0ff&src[src_offset+3]));
}
public static void int_to_byte(byte[] dst, int dst_offset, int[] src, int src_offset, int ENDIAN) {
int_to_byte_unit(dst, dst_offset, src[src_offset], ENDIAN);
}
public static void int_to_byte_unit(byte[] dst, int dst_offset, int src, int ENDIAN) {
if(ENDIAN == BIG_ENDIAN) {
dst[dst_offset] = (byte)((src>> 24) & 0x0ff);
dst[dst_offset+1] = (byte)((src >> 16) & 0x0ff);
dst[dst_offset+2] = (byte)((src >> 8) & 0x0ff);
dst[dst_offset+3] = (byte)((src) & 0x0ff);
} else {
dst[dst_offset] = (byte)((src) & 0x0ff);
dst[dst_offset+1] = (byte)((src >> 8) & 0x0ff);
dst[dst_offset+2] = (byte)((src >> 16) & 0x0ff);
dst[dst_offset+3] = (byte)((src >> 24) & 0x0ff);
}
}
public static void int_to_byte_unit_big_endian(byte[] dst, int dst_offset, int src) {
dst[dst_offset] = (byte)((src>> 24) & 0x0ff);
dst[dst_offset+1] = (byte)((src >> 16) & 0x0ff);
dst[dst_offset+2] = (byte)((src >> 8) & 0x0ff);
dst[dst_offset+3] = (byte)((src) & 0x0ff);
}
public static int URShift(int x, int n) {
if(n == 0)
return x;
if(n >= 32)
return 0;
int v = x >> n;
int v_mask = ~(0x80000000 >> (n-1));
return v & v_mask;
}
public static final long INT_RANGE_MAX = (long)Math.pow(2, 32);
public static long intToUnsigned(int x) {
if(x >= 0)
return x;
return x + INT_RANGE_MAX;
}
}
public static void main(String[] args)
{
byte pbData[] = {(byte)0x00, (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07,
(byte)0x08, (byte)0x09, (byte)0x0A, (byte)0x0B, (byte)0x0C, (byte)0x0D, (byte)0x0E, (byte)0x0F,
(byte)0x08, (byte)0x09, (byte)0x0A, (byte)0x0B, (byte)0x0C, (byte)0x0D, (byte)0x0E, (byte)0x0F,
(byte)0x00, (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07,
(byte)0x08, (byte)0x09, (byte)0x0A, (byte)0x0B, (byte)0x0C, (byte)0x0D, (byte)0x0E, (byte)0x0F,
(byte)0x08, (byte)0x09, (byte)0x0A, (byte)0x0B, (byte)0x0C, (byte)0x0D, (byte)0x0E, (byte)0x0F};
byte pbData1[] = {(byte)0x61};
byte pbCipher[] = new byte[32];
byte pbPlain[] = new byte[16];
System.out.print("[ Test SHA256 reference code ]"+"\n");
System.out.print("\n\n");
System.out.print("[ Test HASH mode ]"+"\n");
System.out.print("\n");
int Plaintext_length = 1;
for(int k=0; k<30; k++)
{
System.out.print("Plaintext\t: ");
for (int i=0; i<Plaintext_length; i++) System.out.print(Integer.toHexString(0xff&pbData[i])+" ");
System.out.print("\n");
// Encryption
SHA256_Encrpyt( pbData, Plaintext_length, pbCipher );
System.out.print("Ciphertext\t: ");
for (int i=0; i<32; i++) System.out.print(Integer.toHexString(0xff&pbCipher[i])+" ");
System.out.print("\n\n");
Plaintext_length++;
}
System.out.print("Plaintext\t: ");
for (int i=0; i<1; i++) System.out.print(Integer.toHexString(0xff&pbData1[i])+" ");
System.out.print("\n");
// Encryption
SHA256_Encrpyt( pbData1, 1, pbCipher );
System.out.print("Ciphertext\t: ");
for (int i=0; i<32; i++) System.out.print(Integer.toHexString(0xff&pbCipher[i])+" ");
System.out.print("\n\n");
}
}

100
src/main/java/com/palnet/server/handler/SocketHandler.java

@ -0,0 +1,100 @@
package com.palnet.server.handler;
import com.palnet.comn.collection.AuthCollection;
import com.palnet.comn.utils.JsonUtils;
import com.palnet.server.codec.SocketPayload;
import com.palnet.server.codec.SocketPayloadResponse;
import com.palnet.server.command.SocketCommand;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
public class SocketHandler extends SimpleChannelInboundHandler<SocketPayload> {
private Logger logger = LoggerFactory.getLogger(getClass());
private SocketCommand command = new SocketCommand();
private AuthCollection auth = new AuthCollection();
private SocketPayloadResponse res = new SocketPayloadResponse();
@Override
public void channelActive(ChannelHandlerContext ctx) {
auth.reloadAuthkey(); // 채널 활성화 되면 인증키 정보를 다시 불러옴
logger.debug("==================== [SocketHandler channelActive ] ==================== ");
ctx.writeAndFlush("Server Connection");
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, SocketPayload payload){
try {
logger.debug("==================== [SocketHandler channelRead0 ] ==================== ");
logger.debug("AUTH KEY :: ==== > " +payload.getAuthKey());
// logger.info(auth.checkAuthkey(payload.getAuthKey().toString().trim()));
if(StringUtils.isEmpty(payload.getAuthKey())) {
// 인증키가 없을 경우
logger.debug("AUTH : no key " );
res.setRspCode("-2000");
res.setRspMessage("inValidate AuthKey");
}else if(!auth.checkAuthkey(payload.getAuthKey().toString().trim())) {
// 인증키가 틀린 경우
logger.debug("AUTH : error key " );
logger.debug(payload.getAuthKey() );
// logger.info(auth.checkAuthkey(payload.getAuthKey().toString().trim()));
res.setRspCode("-2000");
res.setRspMessage("inValidate AuthKey");
}else{
logger.warn("MSG :: ==== > " + JsonUtils.toJson(payload));
switch(payload.getCommand().trim()) {
case "OPENSKY" :
command.openSkyCollectionPut(payload);
break;
case "SANDBOX":
command.sandboxCollectionPut(payload);
break;
default:
break;
}
res.setRspCode("0");
res.setRspMessage("SUCCESS");
}
}catch(Exception e) {
res.setRspCode("-9999");
res.setRspMessage("Etc error");
e.printStackTrace();
}finally {
logger.debug("res >>>" + JsonUtils.toJson(res));
ctx.writeAndFlush(res);
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
logger.info("=========== [exceptionCaught ] ====================");
res.setRspCode("-9999");
res.setRspMessage("Etc error");
ctx.writeAndFlush(res);
cause.printStackTrace();
ctx.close();
}
}

25
src/main/java/com/palnet/server/initializer/SocketInitializer.java

@ -0,0 +1,25 @@
package com.palnet.server.initializer;
import com.palnet.server.codec.SocketPayLoadDecoder;
import com.palnet.server.codec.SocketPayLoadEncorder;
import com.palnet.server.handler.SocketHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.json.JsonObjectDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.util.CharsetUtil;
public class SocketInitializer extends ChannelInitializer<SocketChannel>{
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline()
.addLast(new JsonObjectDecoder(655360))
.addLast(new StringDecoder(CharsetUtil.UTF_8), new StringEncoder(CharsetUtil.UTF_8))
.addLast(new SocketPayLoadDecoder() , new SocketPayLoadEncorder())
.addLast(new SocketHandler());
}
}

27
src/main/resources/application.yml

@ -0,0 +1,27 @@
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
netty:
task:
controlinfoTime: 2000
socket:
port: 8082
thread:
boss: 1
worker: 1
server:
port: 8182
message:
drone:
queue-name: drone.queue
exchange-name: drone.exchange
routing-key: drone.routing.#

13
src/test/java/com/palnet/PavSocketApplicationTests.java

@ -0,0 +1,13 @@
package com.palnet;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class PavSocketApplicationTests {
@Test
void contextLoads() {
}
}
Loading…
Cancel
Save