first commit

master
hwf452 3 years ago
parent 32250e12e0
commit ceda26c075

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="settings.editor.selected.configurable" value="reference.projectsettings.compiler.javacompiler" />
</component>
</project>

@ -0,0 +1,10 @@
# Getting Started
### Reference Documentation
For further reference, please consider the following sections:
* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)
* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.5.3/maven-plugin/reference/html/)
* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.5.3/maven-plugin/reference/html/#build-image)

Binary file not shown.

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile default="true" name="Default" enabled="true" />
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="mqtt_java_maven" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel>
<module name="mqtt_java_maven" target="1.8" />
</bytecodeTargetLevel>
</component>
<component name="JavacSettings">
<option name="ADDITIONAL_OPTIONS_OVERRIDE">
<module name="mqtt_java_maven" options="-parameters" />
</option>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
</component>
</project>

@ -0,0 +1,36 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
<option name="TOP_LEVEL_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="INNER_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="METHOD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
</value>
</option>
<option name="FIELD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="IGNORE_DEPRECATED" value="false" />
<option name="IGNORE_JAVADOC_PERIOD" value="true" />
<option name="IGNORE_DUPLICATED_THROWS" value="false" />
<option name="IGNORE_POINT_TO_ITSELF" value="false" />
<option name="myAdditionalJavadocTags" value="date" />
</inspection_tool>
</profile>
</component>

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="http://maven.aliyun.com/nexus/content/groups/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: ch.qos.logback:logback-classic:1.2.4">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.2.4/logback-classic-1.2.4.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.2.4/logback-classic-1.2.4-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.2.4/logback-classic-1.2.4-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: ch.qos.logback:logback-core:1.2.4">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.2.4/logback-core-1.2.4.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.2.4/logback-core-1.2.4-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.2.4/logback-core-1.2.4-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.github.kittinunf.fuel:fuel:2.3.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/github/kittinunf/fuel/fuel/2.3.1/fuel-2.3.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/github/kittinunf/fuel/fuel/2.3.1/fuel-2.3.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/github/kittinunf/fuel/fuel/2.3.1/fuel-2.3.1-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.github.kittinunf.fuel:fuel-gson:2.3.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/github/kittinunf/fuel/fuel-gson/2.3.1/fuel-gson-2.3.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/github/kittinunf/fuel/fuel-gson/2.3.1/fuel-gson-2.3.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/github/kittinunf/fuel/fuel-gson/2.3.1/fuel-gson-2.3.1-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.github.kittinunf.result:result:3.1.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/github/kittinunf/result/result/3.1.0/result-3.1.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/github/kittinunf/result/result/3.1.0/result-3.1.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/github/kittinunf/result/result/3.1.0/result-3.1.0-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.google.code.gson:gson:2.8.7">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.8.7/gson-2.8.7.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.8.7/gson-2.8.7-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.8.7/gson-2.8.7-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.jayway.jsonpath:json-path:2.5.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/jayway/jsonpath/json-path/2.5.0/json-path-2.5.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/jayway/jsonpath/json-path/2.5.0/json-path-2.5.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/jayway/jsonpath/json-path/2.5.0/json-path-2.5.0-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: commons-codec:commons-codec:1.15">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.15/commons-codec-1.15.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.15/commons-codec-1.15-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.15/commons-codec-1.15-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: commons-io:commons-io:2.7">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/commons-io/commons-io/2.7/commons-io-2.7.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/commons-io/commons-io/2.7/commons-io-2.7-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/commons-io/commons-io/2.7/commons-io-2.7-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: jakarta.activation:jakarta.activation-api:1.2.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/jakarta/xml/bind/jakarta.xml.bind-api/2.3.3/jakarta.xml.bind-api-2.3.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/jakarta/xml/bind/jakarta.xml.bind-api/2.3.3/jakarta.xml.bind-api-2.3.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/jakarta/xml/bind/jakarta.xml.bind-api/2.3.3/jakarta.xml.bind-api-2.3.3-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: net.bytebuddy:byte-buddy:1.10.22">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy/1.10.22/byte-buddy-1.10.22.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy/1.10.22/byte-buddy-1.10.22-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy/1.10.22/byte-buddy-1.10.22-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: net.bytebuddy:byte-buddy-agent:1.10.22">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy-agent/1.10.22/byte-buddy-agent-1.10.22.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy-agent/1.10.22/byte-buddy-agent-1.10.22-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy-agent/1.10.22/byte-buddy-agent-1.10.22-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: net.minidev:accessors-smart:2.4.7">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/net/minidev/accessors-smart/2.4.7/accessors-smart-2.4.7.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/net/minidev/accessors-smart/2.4.7/accessors-smart-2.4.7-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/net/minidev/accessors-smart/2.4.7/accessors-smart-2.4.7-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: net.minidev:json-smart:2.4.7">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/net/minidev/json-smart/2.4.7/json-smart-2.4.7.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/net/minidev/json-smart/2.4.7/json-smart-2.4.7-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/net/minidev/json-smart/2.4.7/json-smart-2.4.7-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.apache.httpcomponents:httpclient:4.5.13">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.13/httpclient-4.5.13-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.apache.httpcomponents:httpcore:4.4.13">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpcore/4.4.13/httpcore-4.4.13-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.apache.logging.log4j:log4j-api:2.14.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.14.1/log4j-api-2.14.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.14.1/log4j-api-2.14.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.14.1/log4j-api-2.14.1-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.14.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-to-slf4j/2.14.1/log4j-to-slf4j-2.14.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-to-slf4j/2.14.1/log4j-to-slf4j-2.14.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-to-slf4j/2.14.1/log4j-to-slf4j-2.14.1-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.apiguardian:apiguardian-api:1.1.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apiguardian/apiguardian-api/1.1.0/apiguardian-api-1.1.0-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.assertj:assertj-core:3.19.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/assertj/assertj-core/3.19.0/assertj-core-3.19.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/assertj/assertj-core/3.19.0/assertj-core-3.19.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/assertj/assertj-core/3.19.0/assertj-core-3.19.0-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.bouncycastle:bcpkix-jdk15on:1.47">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/bouncycastle/bcpkix-jdk15on/1.47/bcpkix-jdk15on-1.47.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/bouncycastle/bcpkix-jdk15on/1.47/bcpkix-jdk15on-1.47-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/bouncycastle/bcpkix-jdk15on/1.47/bcpkix-jdk15on-1.47-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.bouncycastle:bcprov-jdk15on:1.47">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/bouncycastle/bcprov-jdk15on/1.47/bcprov-jdk15on-1.47.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/bouncycastle/bcprov-jdk15on/1.47/bcprov-jdk15on-1.47-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/bouncycastle/bcprov-jdk15on/1.47/bcprov-jdk15on-1.47-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/eclipse/paho/org.eclipse.paho.client.mqttv3/1.2.0/org.eclipse.paho.client.mqttv3-1.2.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/eclipse/paho/org.eclipse.paho.client.mqttv3/1.2.0/org.eclipse.paho.client.mqttv3-1.2.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/eclipse/paho/org.eclipse.paho.client.mqttv3/1.2.0/org.eclipse.paho.client.mqttv3-1.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.hamcrest:hamcrest:2.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest/2.2/hamcrest-2.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest/2.2/hamcrest-2.2-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.jetbrains:annotations:13.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.jetbrains.kotlin:kotlin-stdlib:1.5.21">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.5.21/kotlin-stdlib-1.5.21.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.5.21/kotlin-stdlib-1.5.21-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.5.21/kotlin-stdlib-1.5.21-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.jetbrains.kotlin:kotlin-stdlib-common:1.5.21">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.21/kotlin-stdlib-common-1.5.21.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.21/kotlin-stdlib-common-1.5.21-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.21/kotlin-stdlib-common-1.5.21-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.junit.jupiter:junit-jupiter:5.7.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter/5.7.2/junit-jupiter-5.7.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter/5.7.2/junit-jupiter-5.7.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter/5.7.2/junit-jupiter-5.7.2-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-api/5.7.2/junit-jupiter-api-5.7.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-api/5.7.2/junit-jupiter-api-5.7.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-api/5.7.2/junit-jupiter-api-5.7.2-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.junit.jupiter:junit-jupiter-engine:5.7.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-engine/5.7.2/junit-jupiter-engine-5.7.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-engine/5.7.2/junit-jupiter-engine-5.7.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-engine/5.7.2/junit-jupiter-engine-5.7.2-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.junit.jupiter:junit-jupiter-params:5.7.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-params/5.7.2/junit-jupiter-params-5.7.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-params/5.7.2/junit-jupiter-params-5.7.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/jupiter/junit-jupiter-params/5.7.2/junit-jupiter-params-5.7.2-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.junit.platform:junit-platform-commons:1.7.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-commons/1.7.2/junit-platform-commons-1.7.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-commons/1.7.2/junit-platform-commons-1.7.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-commons/1.7.2/junit-platform-commons-1.7.2-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.junit.platform:junit-platform-engine:1.7.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-engine/1.7.2/junit-platform-engine-1.7.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-engine/1.7.2/junit-platform-engine-1.7.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/junit/platform/junit-platform-engine/1.7.2/junit-platform-engine-1.7.2-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.mockito:mockito-core:3.9.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/mockito/mockito-core/3.9.0/mockito-core-3.9.0-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.mockito:mockito-junit-jupiter:3.9.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/mockito/mockito-junit-jupiter/3.9.0/mockito-junit-jupiter-3.9.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/mockito/mockito-junit-jupiter/3.9.0/mockito-junit-jupiter-3.9.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/mockito/mockito-junit-jupiter/3.9.0/mockito-junit-jupiter-3.9.0-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.objenesis:objenesis:3.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/objenesis/objenesis/3.2/objenesis-3.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/objenesis/objenesis/3.2/objenesis-3.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/objenesis/objenesis/3.2/objenesis-3.2-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.opentest4j:opentest4j:1.2.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.ow2.asm:asm:9.1">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/ow2/asm/asm/9.1/asm-9.1.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/ow2/asm/asm/9.1/asm-9.1-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/ow2/asm/asm/9.1/asm-9.1-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.projectlombok:lombok:1.18.26">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.26/lombok-1.18.26.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.26/lombok-1.18.26-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.26/lombok-1.18.26-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.skyscreamer:jsonassert:1.5.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.slf4j:jul-to-slf4j:1.7.32">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.32/jul-to-slf4j-1.7.32.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.32/jul-to-slf4j-1.7.32-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.32/jul-to-slf4j-1.7.32-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.slf4j:slf4j-api:1.7.32">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework.boot:spring-boot:2.5.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/2.5.3/spring-boot-2.5.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/2.5.3/spring-boot-2.5.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/2.5.3/spring-boot-2.5.3-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.5.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/2.5.3/spring-boot-autoconfigure-2.5.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/2.5.3/spring-boot-autoconfigure-2.5.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/2.5.3/spring-boot-autoconfigure-2.5.3-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework.boot:spring-boot-starter:2.5.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/2.5.3/spring-boot-starter-2.5.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/2.5.3/spring-boot-starter-2.5.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/2.5.3/spring-boot-starter-2.5.3-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework.boot:spring-boot-starter-logging:2.5.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/2.5.3/spring-boot-starter-logging-2.5.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/2.5.3/spring-boot-starter-logging-2.5.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/2.5.3/spring-boot-starter-logging-2.5.3-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework.boot:spring-boot-starter-test:2.5.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-test/2.5.3/spring-boot-starter-test-2.5.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-test/2.5.3/spring-boot-starter-test-2.5.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-test/2.5.3/spring-boot-starter-test-2.5.3-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework.boot:spring-boot-test:2.5.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-test/2.5.3/spring-boot-test-2.5.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-test/2.5.3/spring-boot-test-2.5.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-test/2.5.3/spring-boot-test-2.5.3-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.5.3">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-test-autoconfigure/2.5.3/spring-boot-test-autoconfigure-2.5.3.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-test-autoconfigure/2.5.3/spring-boot-test-autoconfigure-2.5.3-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-test-autoconfigure/2.5.3/spring-boot-test-autoconfigure-2.5.3-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework:spring-aop:5.3.9">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/5.3.9/spring-aop-5.3.9.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/5.3.9/spring-aop-5.3.9-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/5.3.9/spring-aop-5.3.9-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework:spring-beans:5.3.9">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/5.3.9/spring-beans-5.3.9.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/5.3.9/spring-beans-5.3.9-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/5.3.9/spring-beans-5.3.9-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework:spring-context:5.3.9">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.3.9/spring-context-5.3.9.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.3.9/spring-context-5.3.9-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.3.9/spring-context-5.3.9-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework:spring-core:5.3.9">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.3.9/spring-core-5.3.9.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.3.9/spring-core-5.3.9-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.3.9/spring-core-5.3.9-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework:spring-expression:5.3.9">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/5.3.9/spring-expression-5.3.9.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/5.3.9/spring-expression-5.3.9-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/5.3.9/spring-expression-5.3.9-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework:spring-jcl:5.3.9">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jcl/5.3.9/spring-jcl-5.3.9.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jcl/5.3.9/spring-jcl-5.3.9-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jcl/5.3.9/spring-jcl-5.3.9-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.springframework:spring-test:5.3.9">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-test/5.3.9/spring-test-5.3.9.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-test/5.3.9/spring-test-5.3.9-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-test/5.3.9/spring-test-5.3.9-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.xmlunit:xmlunit-core:2.8.2">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/xmlunit/xmlunit-core/2.8.2/xmlunit-core-2.8.2.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/xmlunit/xmlunit-core/2.8.2/xmlunit-core-2.8.2-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/xmlunit/xmlunit-core/2.8.2/xmlunit-core-2.8.2-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,13 @@
<component name="libraryTable">
<library name="Maven: org.yaml:snakeyaml:1.28">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.28/snakeyaml-1.28.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.28/snakeyaml-1.28-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.28/snakeyaml-1.28-sources.jar!/" />
</SOURCES>
</library>
</component>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaScriptSettings">
<option name="languageLevel" value="ES6" />
</component>
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/mqtt_java_maven.iml" filepath="$PROJECT_DIR$/.idea/mqtt_java_maven.iml" />
</modules>
</component>
</project>

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="Spring" name="Spring">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.5.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.4" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.4" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.14.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.14.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.32" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.28" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.5.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.5.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.5.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.4.7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:2.4.7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:9.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.32" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.19.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.9.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.10.22" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.22" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:3.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.9.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.3.9" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.8.2" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpcore:4.4.13" level="project" />
<orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.47" level="project" />
<orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.47" level="project" />
<orderEntry type="library" name="Maven: com.github.kittinunf.fuel:fuel-gson:2.3.1" level="project" />
<orderEntry type="library" name="Maven: com.github.kittinunf.fuel:fuel:2.3.1" level="project" />
<orderEntry type="library" name="Maven: com.github.kittinunf.result:result:3.1.0" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.jetbrains.kotlin:kotlin-stdlib:1.5.21" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.jetbrains:annotations:13.0" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.jetbrains.kotlin:kotlin-stdlib-common:1.5.21" level="project" />
<orderEntry type="library" name="Maven: org.apache.httpcomponents:httpclient:4.5.13" level="project" />
<orderEntry type="library" name="Maven: commons-codec:commons-codec:1.15" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.7" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.26" level="project" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.8.7" level="project" />
</component>
</module>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

@ -0,0 +1,305 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="BranchesTreeState">
<expand>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="LOCAL_ROOT" type="e8cecc67:BranchNodeDescriptor" />
</path>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
</path>
<path>
<item name="ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="REMOTE_ROOT" type="e8cecc67:BranchNodeDescriptor" />
<item name="GROUP_NODE:origin" type="e8cecc67:BranchNodeDescriptor" />
</path>
</expand>
<select />
</component>
<component name="ChangeListManager">
<list default="true" id="d7804f8a-9d8b-4c59-8c74-f1ddb3b3f92e" name="Default Changelist" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="package-info" />
<option value="Class" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$/.." />
</component>
<component name="ProjectId" id="1w0w5wXLxvQY3VNFnoRf3kOhAfI" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="RequestMappingsPanelOrder0" value="0" />
<property name="RequestMappingsPanelOrder1" value="1" />
<property name="RequestMappingsPanelWidth0" value="75" />
<property name="RequestMappingsPanelWidth1" value="75" />
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="aspect.path.notification.shown" value="true" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="node.js.detected.package.eslint" value="true" />
<property name="node.js.detected.package.tslint" value="true" />
<property name="node.js.path.for.package.eslint" value="project" />
<property name="node.js.path.for.package.tslint" value="project" />
<property name="node.js.selected.package.eslint" value="(autodetect)" />
<property name="node.js.selected.package.tslint" value="(autodetect)" />
<property name="project.structure.last.edited" value="SDKs" />
<property name="project.structure.proportion" value="0.0" />
<property name="project.structure.side.proportion" value="0.2" />
<property name="settings.editor.selected.configurable" value="MavenSettings" />
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/src/main/resources/ssl2" />
<recent name="$PROJECT_DIR$/src/main/resources/ssl1" />
<recent name="$PROJECT_DIR$/src/main/resources/ssl" />
<recent name="$PROJECT_DIR$" />
<recent name="C:\Users\yyf\IdeaProjects\mqtt01\src\main\java\com\rehome\mqtt01\v1" />
</key>
</component>
<component name="RunManager" selected="Application.ForIterator">
<configuration name="AppSend" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="com.rehome.mqtt01.rsa.AppSend" />
<module name="mqtt_java_maven" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.rehome.mqtt01.rsa.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="ForIterator" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="com.rehome.mqtt01.ForIterator" />
<module name="mqtt_java_maven" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.rehome.mqtt01.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="RSAAndroid" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="com.rehome.mqtt01.rsa.RSAAndroid" />
<module name="mqtt_java_maven" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.rehome.mqtt01.rsa.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="RSAUtil" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="com.rehome.mqtt01.rsa.RSAUtil" />
<module name="mqtt_java_maven" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.rehome.mqtt01.rsa.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="RSAUtils" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="com.rehome.mqtt01.rsa.RSAUtils" />
<module name="mqtt_java_maven" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.rehome.mqtt01.rsa.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration name="Mqtt01Application" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
<module name="mqtt_java_maven" />
<option name="SPRING_BOOT_MAIN_CLASS" value="com.rehome.mqtt01.Mqtt01Application" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<recent_temporary>
<list>
<item itemvalue="Application.ForIterator" />
<item itemvalue="Application.RSAUtils" />
<item itemvalue="Application.RSAUtil" />
<item itemvalue="Application.RSAAndroid" />
<item itemvalue="Application.AppSend" />
</list>
</recent_temporary>
</component>
<component name="SpellCheckerSettings" BundledDictionaries="0" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" Dictionaries="0" CorrectionsLimit="5" DefaultDictionary="application-level" UseSingleDictionary="true" />
<component name="SshConsoleOptionsProvider">
<option name="myEncoding" value="UTF-8" />
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="d7804f8a-9d8b-4c59-8c74-f1ddb3b3f92e" name="Default Changelist" comment="" />
<created>1627608635806</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1627608635806</updated>
<workItem from="1627608637300" duration="1037000" />
<workItem from="1627609920999" duration="134000" />
<workItem from="1627610855018" duration="5016000" />
<workItem from="1627693822042" duration="33000" />
<workItem from="1627693979612" duration="152000" />
<workItem from="1627694378737" duration="109000" />
<workItem from="1627719596210" duration="10000" />
<workItem from="1627723071218" duration="8000" />
<workItem from="1627723450455" duration="311000" />
<workItem from="1627723799383" duration="242000" />
<workItem from="1627724080278" duration="180000" />
<workItem from="1627724297578" duration="87000" />
<workItem from="1627724618391" duration="113000" />
<workItem from="1627724762893" duration="92000" />
<workItem from="1627869885616" duration="220000" />
<workItem from="1627870844979" duration="19000" />
<workItem from="1627870904189" duration="102000" />
<workItem from="1627871502423" duration="23000" />
<workItem from="1627876708487" duration="8598000" />
<workItem from="1627952649041" duration="9475000" />
<workItem from="1627963138856" duration="87000" />
<workItem from="1627963299946" duration="24000" />
<workItem from="1627963575788" duration="796000" />
<workItem from="1628058415128" duration="6285000" />
<workItem from="1628141998943" duration="13192000" />
<workItem from="1628156755676" duration="11000" />
<workItem from="1628170040785" duration="541000" />
<workItem from="1628170721317" duration="158000" />
<workItem from="1628174232624" duration="294000" />
<workItem from="1628175744171" duration="492000" />
<workItem from="1628176620551" duration="10000" />
<workItem from="1628242476668" duration="200000" />
<workItem from="1628265758264" duration="506000" />
<workItem from="1628344306421" duration="969000" />
<workItem from="1628345586258" duration="497000" />
<workItem from="1628346250137" duration="1426000" />
<workItem from="1628347932835" duration="50000" />
<workItem from="1628348174895" duration="2000" />
<workItem from="1628427600185" duration="635000" />
<workItem from="1628515420168" duration="2805000" />
<workItem from="1628606282648" duration="931000" />
<workItem from="1628607461118" duration="22000" />
<workItem from="1628644945294" duration="53000" />
<workItem from="1628645024503" duration="12000" />
<workItem from="1628692980701" duration="1959000" />
<workItem from="1628695070621" duration="24000" />
<workItem from="1628750192764" duration="9000" />
<workItem from="1628750238673" duration="3467000" />
<workItem from="1628818427667" duration="25421000" />
<workItem from="1628924528403" duration="1320000" />
<workItem from="1628926649735" duration="14000" />
<workItem from="1628926670115" duration="163000" />
<workItem from="1628926863876" duration="147000" />
<workItem from="1628927014811" duration="222000" />
<workItem from="1629084008411" duration="7000" />
<workItem from="1658286280223" duration="1011000" />
<workItem from="1659509134770" duration="2150000" />
<workItem from="1686623547337" duration="4692000" />
<workItem from="1686642908304" duration="389000" />
<workItem from="1686645870779" duration="803000" />
<workItem from="1686706086786" duration="4824000" />
<workItem from="1688017896038" duration="562000" />
<workItem from="1688373059002" duration="1303000" />
<workItem from="1688375567655" duration="757000" />
<workItem from="1689038299912" duration="875000" />
<workItem from="1689643885746" duration="462000" />
<workItem from="1689652871058" duration="7240000" />
<workItem from="1689672164935" duration="117000" />
<workItem from="1689677310597" duration="886000" />
<workItem from="1689736660157" duration="2013000" />
<workItem from="1690279070536" duration="327000" />
<workItem from="1690333376181" duration="370000" />
<workItem from="1690356990340" duration="1422000" />
<workItem from="1690439661665" duration="2305000" />
<workItem from="1692152001425" duration="3565000" />
<workItem from="1692237766013" duration="831000" />
<workItem from="1692239173276" duration="68000" />
</task>
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="2" />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
<option name="oldMeFiltersMigrated" value="true" />
</component>
<component name="WindowStateProjectService">
<state x="876" y="338" key="#com.intellij.fileTypes.FileTypeChooser" timestamp="1692152234957">
<screen x="0" y="25" width="1920" height="1016" />
</state>
<state x="876" y="338" key="#com.intellij.fileTypes.FileTypeChooser/0.25.1920.1016@0.25.1920.1016" timestamp="1692152234957" />
<state width="1521" height="160" key="GridCell.Tab.0.bottom" timestamp="1692239243837">
<screen x="0" y="25" width="1920" height="1016" />
</state>
<state width="1521" height="160" key="GridCell.Tab.0.bottom/0.25.1920.1016@0.25.1920.1016" timestamp="1692239243837" />
<state width="1521" height="160" key="GridCell.Tab.0.center" timestamp="1692239243836">
<screen x="0" y="25" width="1920" height="1016" />
</state>
<state width="1521" height="160" key="GridCell.Tab.0.center/0.25.1920.1016@0.25.1920.1016" timestamp="1692239243836" />
<state width="1521" height="160" key="GridCell.Tab.0.left" timestamp="1692239243835">
<screen x="0" y="25" width="1920" height="1016" />
</state>
<state width="1521" height="160" key="GridCell.Tab.0.left/0.25.1920.1016@0.25.1920.1016" timestamp="1692239243835" />
<state width="1521" height="160" key="GridCell.Tab.0.right" timestamp="1692239243836">
<screen x="0" y="25" width="1920" height="1016" />
</state>
<state width="1521" height="160" key="GridCell.Tab.0.right/0.25.1920.1016@0.25.1920.1016" timestamp="1692239243836" />
<state x="675" y="191" key="Maven.ArtifactSearchDialog" timestamp="1692153801492">
<screen x="0" y="25" width="1920" height="1016" />
</state>
<state x="675" y="191" key="Maven.ArtifactSearchDialog/0.25.1920.1016@0.25.1920.1016" timestamp="1692153801492" />
<state x="625" y="111" key="SettingsEditor" timestamp="1690357965355">
<screen x="0" y="25" width="1920" height="1016" />
</state>
<state x="625" y="111" key="SettingsEditor/0.25.1920.1016@0.25.1920.1016" timestamp="1690357965355" />
<state x="599" y="138" key="com.intellij.openapi.editor.actions.MultiplePasteAction$ClipboardContentChooser" timestamp="1689668841184">
<screen x="0" y="25" width="1920" height="1016" />
</state>
<state x="599" y="138" key="com.intellij.openapi.editor.actions.MultiplePasteAction$ClipboardContentChooser/0.25.1920.1016@0.25.1920.1016" timestamp="1689668841184" />
</component>
</project>

@ -0,0 +1,118 @@
/*
* Copyright 2007-present the original author or authors.
*
* Licensed 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.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import java.util.Properties;
public class MavenWrapperDownloader {
private static final String WRAPPER_VERSION = "0.5.6";
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
* use instead of the default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
".mvn/wrapper/maven-wrapper.properties";
/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH =
".mvn/wrapper/maven-wrapper.jar";
/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
public static void main(String args[]) {
System.out.println("- Downloader started");
File baseDirectory = new File(args[0]);
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if (mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
} catch (IOException e) {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if (mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
// Ignore ...
}
}
}
System.out.println("- Downloading from: " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if (!outputFile.getParentFile().exists()) {
if (!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}
}
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
try {
downloadFileFromURL(url, outputFile);
System.out.println("Done");
System.exit(0);
} catch (Throwable e) {
System.out.println("- Error downloading");
e.printStackTrace();
System.exit(1);
}
}
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
String username = System.getenv("MVNW_USERNAME");
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
URL website = new URL(urlString);
ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(destination);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();
}
}

Binary file not shown.

@ -0,0 +1,2 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAvur5N8+LcHizZWj7zXZuhUesy48hxhPo781iVM9XdL9ywa8p
kEJ9yN6qBjk/RAnUu1SnRgPB5L2zmN3jQhZX/sW2BIOx7I5kDMnTPKsvbPtJOWOs
nYVjUWnNHBAmPILe9wd2SdkmGvOGn4cqn308xfuzSGZbbbeR6nmZHthZgHBJf9DI
xVYJj2wbE03WQ7PjA+3/CUI3O3ACNSZl5qtN51g3ZITuscghAsg6/OIZa4UYuK/G
SOfSP0f/427rOVIobXptuMYnSSIQyXxr/AO7gGOCZfTcR81pzsMcRU/t1KcI1aAu
JhvaSdWiKUjO89xv+CDvf9xKp/KlBWJjwvzOiQIDAQABAoIBAQCr52NTT3tcYDIY
A7mGvTayp2D9QPnGIrNBCQubFb7HjoLDxvaDwHsF3Qf25qECoF999bFQJ530WqNV
56TzIq9E5b0Iv5P7ThLkOO4M2I6xcGn0VL1ecHaHHd7jf98N6UDd6UgnInFfHxt+
lPRZ+yg3lHVPoWp9lia6m5a14VRlgiUH8yeBXrh6+C1GJ8BfL7qVdyOK98fXJPQ2
ldalM4EeYqcWwOeHLvtnJNHjGgnBEbPkBBha5eEtk0Gmbiiikb41plFLEgz0HNbU
Z8pJTk2WXO6qnFRYU60eu+3naTnZBn70RT7bDJyITHM8RoIeEswyWF6mXAZNbKwW
CK21WaohAoGBAPasBmJvQUdxuq10ebmVrEkR29b745ktteZhk7Zsb2B6yR3sg68t
17/tq/FJoIYsYgEZu9Kafzyucd4nlFsR+JNOaKGJjvZpGx6XwDgoeEBmEcN6ug+k
Zshavtezh1c8EZvjvAmkEwIyq1x+8C00ujSqBrK4NfBBcEnKv1f3yroNAoGBAMYj
NK41xwslu7wdgD4kFx/lli6sA3nZ7MPOL0YE0rcBbDADTCACufUsHp4NrtNuN9Vn
MqWJVTWUfv0ImSNAebVL49fAu2CRsB3FWrgRmLnbZSaPxDRzH/IXO/6Er5GHIj7D
56bWGEFgNVG/peubatOkXJu5PnDHjTRATKEZRzNtAoGAa6lRcA0W9NPSono/1pxZ
AdtllEOEZwroZZEZI3nYcsekmAbuwrrDe+WEMl/sTCN68vgEXjtIZXfOAyRLQCRr
1f9W84pSd4IQcB3Tq68eLR1fi245XzJmGfRhb0vQOmbhWKThIWQXV9I9sLVGprRo
wSukmMSF5kLpe4ueUAq61NECgYB6CDzt/xk0eG0EE3dkzn2fm5u/6xnI9ruobVkY
Wugc5rdnauB75rH5ms7QscS3W+7vdLvw0IC2m1sLJTyMRa2wR6lwvLerZo9+Bos1
S0ExVzsZYPqLA0ztofnFbJtlmkExPx9x1fLicQrl6o+aaQKGj3iqQJGAjKcfQ2ru
3c7IkQKBgDZfEzNBLbH+lr73FKoSJpH5bu/gEqt8m72vWlZiY1ozOUmK3qnQI0MI
DQ/M77DTJ+nw4uRePzoivuhR8ElWJbW4QEwUIkDFH2WHYkl6lWGFOBYAVxqCiXWB
iDa3fKx25ggV3GkjKl7Ct3ToNzP94qxbxLsJTCjBLNUxuIOJZfQd
-----END RSA PRIVATE KEY-----

@ -0,0 +1,21 @@
-----BEGIN CERTIFICATE-----
MIIDhTCCAm0CCQCGLmLZ4MiwvjANBgkqhkiG9w0BAQUFADCBtjELMAkGA1UEBhMC
Q04xEjAQBgNVBAgMCUd1YW5nZG9uZzEPMA0GA1UEBwwGWmh1aGFpMSUwIwYDVQQK
DBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQLDBREb21haW4g
VmFsaWRhdGVkIFNTTDEdMBsGA1UEAwwUVHJ1c3RBc2lhIFRMUyBSU0EgQ0ExHTAb
BgkqhkiG9w0BCQEWDmh3ZjQ1M0AxNjMuY29tMB4XDTIxMDgwNTEyMzY1NVoXDTMx
MDgwMzEyMzY1NVowUjELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCUd1YW5nZG9uZzEP
MA0GA1UEBwwGWmh1aGFpMQ0wCwYDVQQKDARFTVFYMQ8wDQYDVQQDDAZjbGllbnQw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+6vk3z4tweLNlaPvNdm6F
R6zLjyHGE+jvzWJUz1d0v3LBrymQQn3I3qoGOT9ECdS7VKdGA8HkvbOY3eNCFlf+
xbYEg7HsjmQMydM8qy9s+0k5Y6ydhWNRac0cECY8gt73B3ZJ2SYa84afhyqffTzF
+7NIZlttt5HqeZke2FmAcEl/0MjFVgmPbBsTTdZDs+MD7f8JQjc7cAI1JmXmq03n
WDdkhO6xyCECyDr84hlrhRi4r8ZI59I/R//jbus5Uihtem24xidJIhDJfGv8A7uA
Y4Jl9NxHzWnOwxxFT+3UpwjVoC4mG9pJ1aIpSM7z3G/4IO9/3Eqn8qUFYmPC/M6J
AgMBAAEwDQYJKoZIhvcNAQEFBQADggEBADI5aypoagVc74HMrQ19xvAYkhXqvDfg
L+xwD7XdUz0smL41psyYVgd7tWOIUGarMuMIqvzIXw4nDdWeuskGSi4As9rO8Aha
Ms2k3nayXd7Bl8Wc0fkPJPf3g+POWyFX1dTi+2lgB1vNqJlf0rnmuWaA+2kS9b2V
yUf+fFOf4Oe7KsPsYF/PWpa2+9wE5zGktiEOgXq2CDgUVH9c7Z/6uGQs0YRP1ZmP
ErRwxzYi18De8M7kt9hbjUngi7V4WenX++xEQdXio9ZauKZGnIDtvpvAQykf74h7
JneS1tGeTWHZVs6kwM7pb3zl6VRlOI3Tno9RJQBIdGLbNPHe/hA/Tcw=
-----END CERTIFICATE-----

Binary file not shown.

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="Spring" name="Spring">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="jdk" jdkName="1.8" jdkType="JavaSDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.5.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.5.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.4" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.4" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.14.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.14.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.32" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.9" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.28" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.5.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.5.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.5.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.4.7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:2.4.7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:9.1" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.32" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.19.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.9.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.10.22" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.22" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:3.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.9.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.3.9" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.8.2" level="project" />
<orderEntry type="library" name="Maven: org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0" level="project" />
</component>
</module>

310
mqtt_java_maven/mvnw vendored

@ -0,0 +1,310 @@
#!/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 /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="`which 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/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
else
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.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"
else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$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 \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

@ -0,0 +1,182 @@
@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 "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\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/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
FOR /F "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%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.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 "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\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%
exit /B %ERROR_CODE%

@ -0,0 +1,23 @@
-----BEGIN CERTIFICATE-----
MIID6jCCAtICCQDZhZupRjNreTANBgkqhkiG9w0BAQsFADCBtjELMAkGA1UEBhMC
Q04xEjAQBgNVBAgMCUd1YW5nZG9uZzEPMA0GA1UEBwwGWmh1aGFpMSUwIwYDVQQK
DBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMR0wGwYDVQQLDBREb21haW4g
VmFsaWRhdGVkIFNTTDEdMBsGA1UEAwwUVHJ1c3RBc2lhIFRMUyBSU0EgQ0ExHTAb
BgkqhkiG9w0BCQEWDmh3ZjQ1M0AxNjMuY29tMB4XDTIxMDgwNTEyMjk1MFoXDTMx
MDgwMzEyMjk1MFowgbYxCzAJBgNVBAYTAkNOMRIwEAYDVQQIDAlHdWFuZ2Rvbmcx
DzANBgNVBAcMBlpodWhhaTElMCMGA1UECgwcVHJ1c3RBc2lhIFRlY2hub2xvZ2ll
cywgSW5jLjEdMBsGA1UECwwURG9tYWluIFZhbGlkYXRlZCBTU0wxHTAbBgNVBAMM
FFRydXN0QXNpYSBUTFMgUlNBIENBMR0wGwYJKoZIhvcNAQkBFg5od2Y0NTNAMTYz
LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALqCs/p1Acvqdkhp
zZGpr70bBU6w3VNURZQPFqtAmJwDz1sbhA4ek+aWUJz7aGqHv80EYsIaGmbZoaA1
0/n5SfgQjaojD7syT7JRDaqBjCujvZ+4YRpeihcapRdAwnUf9iN87P27gh0GGaMS
Q+aKMOdgChKBN8dBK+EZWx1CfFEyzOCuxajumN+jSNHLBJop55MB0jxQ2PldBV7Z
mcKLtPpZTE1+PIsjowy8hhkaaLBtNn6+mPbG6b6iFqK6M7m1k412jsQIcO5D7l+b
Wwa9Fn0sODgnYkxLf5jZkXPhHFoRmCCvHMnZsdT1LIfXNfZOxjS4TfQEIjLtEZi5
0c7x38sCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAmBLFoFMLUYsJ5MXlTRO4BjER
jI9Yw1x8vPewbICBHqiI974HBWlYFFHoFTmbvJx6f1bP4dF93hrme/0Vj5/lXAsu
UB+jRnJvHuk7f8kkRV3GEA5qC2PqZpLYRk/CBEYxEKkDhtxNXHIkcujjwbs8RBo6
7WCxqnzFWDL+FiYP82TFWJcZOGdG/bo8a70C8+qRdUFpuMj1X4nQjt+QDhPGV5WW
VmIFM1JNMEtE+2W4kmYFm1FKrCgckuGzNR30CS1wDZ/V/FHf4q1JZtO07GLm1Fgf
99mwd8+uCqBJZ/AKYZ+tYDcTurgrDDeQGLdWhfqow04akk2KKztpRAXgcdWecQ==
-----END CERTIFICATE-----

@ -0,0 +1,80 @@
<?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.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.rehome</groupId>
<artifactId>mqtt_java_maven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mqtt_java_maven</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.13</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId>
<version>1.47</version>
</dependency>
<dependency>
<groupId>com.github.kittinunf.fuel</groupId>
<artifactId>fuel-gson</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.26</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,102 @@
package com.rehome.mqtt01;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ForIterator {
public static void main(String[] args) {
//delete();
//delete1();
//delete2();
//delete3();
//delete4();
delete5();
}
public static void delete() {
List<String> list = new ArrayList<>(4);
list.add("a");
list.add("ab");
list.add("abc");
list.add("abcd");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (item.contains("a")) {
// 删除元素
iterator.remove();
}
}
System.out.println(list);
}
public static void delete1() {
List<String> list = new ArrayList<>(4);
list.add("a");
list.add("ab");
list.add("abc");
list.add("abcd");
for (int i = 0; i < list.size(); i++) {
if (list.get(i).contains("a")) {
list.remove(i);
}
}
System.out.println(list);
}
public static void delete2() {
List<String> list = new ArrayList<>(4);
list.add("a");
list.add("ab");
list.add("abc");
list.add("abcd");
for (String str : list) {
if (str.contains("a")) {
list.remove(str);
}
}
System.out.println(list);
}
public static void delete3() {
ArrayList<String> list = new ArrayList<>();
list.add("111");
list.add("222");
list.add("333");
System.out.println(new Gson().toJson(list));
for (String i : list) {
list.remove("222");
}
System.out.println(new Gson().toJson(list));
}
public static void delete4() {
ArrayList<String> list = new ArrayList<>();
list.add("111");
list.add("222");
list.add("333");
System.out.println(new Gson().toJson(list));
Iterator<String> it = list.iterator();
while (it.hasNext()){
String next = it.next();
//if外使用list的remove方法还是会报错的
if(next.equals("222")){
it.remove();//这里使用的是迭代器里面的remove方法
// 当然如果使用list的remove方法在此删除质地感元素的话是成功的比如list.remove("222")
}
}
System.out.println(new Gson().toJson(list));
}
public static void delete5() {
ArrayList<String> list = new ArrayList<>();
list.add("111");
list.add("222");
list.add("333");
System.out.println(new Gson().toJson(list));
//list.removeIf(s -> s.equals("222");
list.removeIf(item -> item.equals("222"));
System.out.println(new Gson().toJson(list));
}
}

@ -0,0 +1,15 @@
package com.rehome.mqtt01;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@SpringBootApplication
public class Mqtt01Application {
public static void main(String[] args) {
SpringApplication.run(Mqtt01Application.class, args);
}
}

@ -0,0 +1,155 @@
package com.rehome.mqtt01.rsa;
/**
* @author huangwenfei
* @version v1.0.0.0
* Created DateTime 2021-07-31 14:52
* @description: mqtt 线
*/
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class AppSend {
/**
* ip
*/
private final String HOST = "tcp://39.101.173.20:1883";
/**
*
*/
private final String topic = "app_send";
/**
* 线
*/
private String clientid = "v1_server_app_send";
private MqttClient client;
private MqttConnectOptions options;
/**
* MQTT
*/
private final String userName = "admin";
/**
* MQTT
*/
private final String passWord = "public";
/**
*
* 0<=1
* 1>=1
* 2=1
*/
private int qos = 2;
// 推送消息
private MqttMessage message;
//定时器
private Timer timer;
public AppSend() {
// host为主机名clientid即连接MQTT的客户端ID一般以唯一标识符表示MemoryPersistence设置clientid的保存形式默认为以内存保存
try {
client = new MqttClient(HOST, clientid, new MemoryPersistence());
// MQTT的连接设置
options = new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(true);
// 设置连接的用户名
options.setUserName(userName);
// 设置连接的密码
options.setPassword(passWord.toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线但这个方法并没有重连的机制
options.setKeepAliveInterval(20);
// 发布目的消息对象
message = new MqttMessage();
// 设置回调
client.setCallback(new MqttCallback() {
public void connectionLost(Throwable cause) {
System.out.println("connectionLost---------");
stop();//关闭
//start();//重新连接
}
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println("***** get message start *****");
System.out.println(new Date());
System.out.println("topic:" + topic);
System.out.println("Qos:" + message.getQos());
System.out.println("message:" + new String(message.getPayload()));
System.out.println("***** get message end *****");
System.out.println();
}
public void deliveryComplete(IMqttDeliveryToken token) {
System.out.println("deliveryComplete---------" + token.isComplete());
}
});
} catch (MqttException e) {
e.printStackTrace();
}
}
public void start() {
try {
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------设定要指定任务--------");
message.setQos(qos);
message.setRetained(true);
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = "message from server->:"+clientid+"->:"+sd.format(new Date());
try {
String messageEn =RSAAndroid.encryptByPrivateKeyForSpiltStr(time, RSAAndroid.privateRsaKey);
message.setPayload(messageEn.getBytes());
//判断拦截状态,这里注意一下,如果没有这个判断,是非常坑的
if (!client.isConnected()) {
System.out.println("***** 没有连接到服务器 *****");
System.out.println("***** client to connect *****");
// 重新连接
client.connect(options);
}
if (client.isConnected()) {//连接成功,跳出连接
System.out.println("***** connect success *****");
System.out.println(time);
System.out.println(messageEn);
// 发布消息
client.publish(topic, message);
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}, 10000,10000);
// 设定指定的时间time,此处为10000毫秒
} catch (Exception e) {
e.printStackTrace();
}
}
public void stop() {
try {
// 断开连接
client.disconnect();
// 关闭客户端
client.close();
} catch (MqttException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// 推送消息
AppSend appSend = new AppSend();
appSend.start();
}
}

@ -0,0 +1,107 @@
package com.rehome.mqtt01.rsa;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
public class AppServer {
/**
* ip
*/
public static final String MQTT_BROKER_HOST = "tcp://39.101.173.20:1883";
/**
*
*/
public static final String MQTT_CLIENT_ID = "AppServer_01";
/**
*
*/
public static final String USERNAME = "admin";
/**
*
*/
public static final String PASSWORD = "public";
/**
*
*/
public static final String TOPIC_FILTER = "app_push";
private volatile static MqttClient mqttClient;
private static MqttConnectOptions options;
private static int qos = 2;
public static void main(String[] args) {
try {
// host为主机名clientid即连接MQTT的客户端ID一般以客户端唯一标识符表示
// MemoryPersistence设置clientid的保存形式默认为以内存保存
mqttClient = new MqttClient(MQTT_BROKER_HOST, MQTT_CLIENT_ID, new MemoryPersistence());
// 配置参数信息
options = new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录
// 这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(true);
// 设置用户名
options.setUserName(USERNAME);
// 设置密码
options.setPassword(PASSWORD.toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线但这个方法并没有重连的机制
options.setKeepAliveInterval(20);
//断线重连
options.setAutomaticReconnect(true);
// 连接
mqttClient.connect(options);
// 订阅
mqttClient.subscribe(TOPIC_FILTER,qos);
// 设置回调
mqttClient.setCallback(new MqttCallbackExtended(){
@Override
public void connectionLost(Throwable throwable) {
System.out.println("connectionLost");
try {
mqttClient.reconnect();
} catch (MqttException e) {
e.printStackTrace();
}
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
System.out.println("topic:"+s);
System.out.println("Qos:"+mqttMessage.getQos());
System.out.println("message RSA:"+new String(mqttMessage.getPayload()));
try {
String messageDe = RSAAndroid.decryptByPrivateKeyForSpiltStr(new String(mqttMessage.getPayload()), RSAAndroid.privateRsaKey);
System.out.println("message content:"+messageDe);
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
System.out.println("deliveryComplete---------"+ iMqttDeliveryToken.isComplete());
}
@Override
public void connectComplete(boolean b, String s) {
//连接成功后调用
try {
mqttClient.subscribe(TOPIC_FILTER,qos);//具体订阅代码
} catch (MqttException e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -0,0 +1,154 @@
package com.rehome.mqtt01.rsa;
/**
* @author huangwenfei
* @version v1.0.0.0
* Created DateTime 2021-07-31 14:52
* @description: mqtt 线
*/
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class MqttRSAPublishServer {
/**
* ip
*/
private final String HOST = "tcp://39.101.173.20:1883";
/**
*
*/
private final String topic = "app";
/**
* 线
*/
private String clientid = "v1_server_rsa_002";
private MqttClient client;
private MqttConnectOptions options;
/**
* MQTT
*/
private final String userName = "admin";
/**
* MQTT
*/
private final String passWord = "public";
/**
*
* 0<=1
* 1>=1
* 2=1
*/
private int qos = 2;
// 推送消息
private MqttMessage message;
//定时器
private Timer timer;
public MqttRSAPublishServer() {
// host为主机名clientid即连接MQTT的客户端ID一般以唯一标识符表示MemoryPersistence设置clientid的保存形式默认为以内存保存
try {
client = new MqttClient(HOST, clientid, new MemoryPersistence());
// MQTT的连接设置
options = new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(true);
// 设置连接的用户名
options.setUserName(userName);
// 设置连接的密码
options.setPassword(passWord.toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线但这个方法并没有重连的机制
options.setKeepAliveInterval(20);
// 发布目的消息对象
message = new MqttMessage();
// 设置回调
client.setCallback(new MqttCallback() {
public void connectionLost(Throwable cause) {
System.out.println("connectionLost---------");
stop();//关闭
//start();//重新连接
}
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println("***** get message start *****");
System.out.println(new Date());
System.out.println("topic:" + topic);
System.out.println("Qos:" + message.getQos());
System.out.println("message:" + new String(message.getPayload()));
System.out.println("***** get message end *****");
System.out.println();
}
public void deliveryComplete(IMqttDeliveryToken token) {
System.out.println("deliveryComplete---------" + token.isComplete());
}
});
} catch (MqttException e) {
e.printStackTrace();
}
}
public void start() {
try {
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------设定要指定任务--------");
message.setQos(qos);
message.setRetained(true);
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = "message from server->:"+clientid+"->:"+sd.format(new Date());
try {
String messageEn =RSAAndroid.encryptByPrivateKeyForSpiltStr(time, RSAAndroid.privateRsaKey);
message.setPayload(messageEn.getBytes());
//判断拦截状态,这里注意一下,如果没有这个判断,是非常坑的
if (!client.isConnected()) {
System.out.println("***** 没有连接到服务器 *****");
System.out.println("***** client to connect *****");
// 重新连接
client.connect(options);
}
if (client.isConnected()) {//连接成功,跳出连接
System.out.println("***** connect success *****");
System.out.println(time);
System.out.println(messageEn);
// 发布消息
client.publish(topic, message);
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
}, 10000,10000);
// 设定指定的时间time,此处为10000毫秒
} catch (Exception e) {
e.printStackTrace();
}
}
public void stop() {
try {
// 断开连接
client.disconnect();
// 关闭客户端
client.close();
} catch (MqttException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// 推送消息
MqttRSAPublishServer mqttPublishServer = new MqttRSAPublishServer();
mqttPublishServer.start();
}
}

@ -0,0 +1,545 @@
package com.rehome.mqtt01.rsa;
/**
* @ Author : huangwenfei
* @ Date : Created in 2021/8/11 10:44
* @ Version : $1.0.0.0
* @ Description:
*/
import org.apache.commons.codec.binary.Base64;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.List;
import javax.crypto.Cipher;
public class RSAAndroid {
private static String TAG = "RSAAndroid";
public static final String RSA = "RSA";// 非对称加密密钥算法
//public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding";//加密填充方式
public static final String ECB_PKCS1_PADDING = "RSA";//加密填充方式 RSA/None/PKCS1Padding
public static final int DEFAULT_KEY_SIZE = 2048;//秘钥默认长度
public static final byte[] DEFAULT_SPLIT = "#PART#".getBytes(); // 当要加密的内容超过bufferSize则采用partSplit进行分块加密
public static final int DEFAULT_BUFFERSIZE = (DEFAULT_KEY_SIZE / 8) - 11;// 当前秘钥支持加密的最大字节数
public static String publicRsaKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmMLyJw1CAl25lnDgEeYZvOps+1pSi93Q39djEniGNo5uUKVEkqDIayTli2zreX10HqT2jTtDN9APtwuEhWazP/VgOXoWsztbtZtSwJGM6Eg0R9zDCbKyQt5Qhg3jkTrXrvrGn7j/ZP56VNWELv/i5dsRCTccr1MeIyxjOC2pojCOsrTN4HZzgBj+GEUKPRLcKOiPfOsoP7HgkAua82vTOIgWpqIp+1PIfcjjCqzOsSv5PQnGP75+flIXtz75OKo/9hX9zl5JHNcH3SC6nS8Czii9E292XIsBtKdQijvNMn+YcmKFo6mZOUXHdO506NoKkxRny5fbKiPf/oqTA7Zx5QIDAQAB";
public static String privateRsaKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYwvInDUICXbmWcOAR5hm86mz7WlKL3dDf12MSeIY2jm5QpUSSoMhrJOWLbOt5fXQepPaNO0M30A+3C4SFZrM/9WA5ehazO1u1m1LAkYzoSDRH3MMJsrJC3lCGDeOROteu+safuP9k/npU1YQu/+Ll2xEJNxyvUx4jLGM4LamiMI6ytM3gdnOAGP4YRQo9Etwo6I986yg/seCQC5rza9M4iBamoin7U8h9yOMKrM6xK/k9CcY/vn5+Uhe3Pvk4qj/2Ff3OXkkc1wfdILqdLwLOKL0Tb3ZciwG0p1CKO80yf5hyYoWjqZk5Rcd07nTo2gqTFGfLl9sqI9/+ipMDtnHlAgMBAAECggEATJd5yCC6lusdMRO5FOBUyUaUi9X2i1AU+RZKAynQySvSnbavUgExW58tRCHBUrGW9gJp59ft1N8J8hHhSO18NDY4H7laBlVdnwmYjRqtFo2VQO6sD4G8JRDION5f2iIxn/b2fYDI9H8vILfJRbNgtTSILyGlzTYUZzhLKxCh+8IsN96Nic8wa5COd1vZZmdhf2y8TG8clFWmozaScNSAATx7y+8XLVWjjWiIRZ6xQvx0uQPUParc9KihXXTKR2pA22yPIdz+U4MGD4kC0eczlcFKZ/dYv9e7OIGgnJfT0idSCu7nYb1pxJ1LxD9fS6IScNTF5dSe0OIL98e+XdyoAQKBgQDRep+5cW4iAKrEMH+djmcXAkoMiYtNVtnu0efLE8dP6vjYytQi368X9SdcASbfrQ31eEZmr/xQnlUF8oyHGkI38YS8dpAHzQcrkP3BljbbzB/3gJZaUdghGsDrK0xAJIzzmFKQpeKnGtr23vxUgaGrNsCYvQ0eQ7+5056KXS4r5QKBgQC6r8xtRSaje6L4WIydjWvYywsmRO0Of0aJLMDA/Wt2MWhHfh7ba9oI1cKGN80ap7xB2a9lQLgpv+C53wNtE5SpvjxsikAj96nUMMhGy9ojXrUith6HQhiINETz6Shnznd+AyrXP6KI/RpfA5nkDB5nrJxODwtYLP467IL7Cv7OAQKBgQCl4KxKdH/5fP28jYsAgJsxpSZt9xzQCU5Zxu396ZOSvUaApVyGoQpNtluMh3z48lhzYOKevgzW6gn5w69z7F8zXZT2iAxVoQ1kelP2z7RxKJrHqpNkwhqbXEwX7RlcUZUr8BqxYCqymJl7k+fMIzqaEalBSbLxnEReKi0I8/Bz4QKBgHK4b0ZCtVDHPEmimJ6E9l4dv/c/afF7swu+zaCK2ouiJvOwBCRQbYb6XPR/u/GCXASXUdpF4CX/vIhcDE3uN2/r8FO+zVWM7vbvF1OyF5WesG7pPW9e5ZZlkG3WvLa1wOZV6fCmMSo/ZwI2Q05JSDHrd43cXttLotrw1jiQ9C4BAoGBAKi4SOoOVQ5J5HQCDkBwPbG1AOLHFinzfoDl26GF/8Hy7fmmd1JiRTFldQp/A9VTAABz3sVYmMB92HSIaJhuDMoYJNI2Cf/cZifsv7vUL8cbLn+lPsKsebiuB0m0g4P2qLwLfegfNGEgA7lA5HIz3SELqbdp3iuqJeQl1fsJqD74";
public static byte[] decryptBASE64(String key) throws Exception {
return Base64.decodeBase64(key);
}
public static String encryptBASE64(byte[] key) throws Exception {
return Base64.encodeBase64String(key);
}
/**
* RSA
*
* @param keyLength 5122048
* 1024
* @return
*/
public static KeyPair generateRSAKeyPair(int keyLength) {
try {
KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA);
kpg.initialize(keyLength);
return kpg.genKeyPair();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
/**
*
*
* @param data
*/
public static byte[] encryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {
// 得到公钥
byte[] decoded = Base64.decodeBase64(publicKey);
RSAPublicKey keyPublic = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
// 加密数据
Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
cp.init(Cipher.ENCRYPT_MODE, keyPublic);
return cp.doFinal(data);
}
/**
*
*
* @param data
* @param privateKey
* @return byte[]
*/
public static byte[] encryptByPrivateKey(byte[] data, byte[] privateKey) throws Exception {
// 得到私钥
byte[] decoded = Base64.decodeBase64(privateKey);
RSAPrivateKey keyPrivate = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
// 数据加密
Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
cipher.init(Cipher.ENCRYPT_MODE, keyPrivate);
return cipher.doFinal(data);
}
/**
*
*
* @param data
* @param publicKey
* @return byte[]
*/
public static byte[] decryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {
// 得到公钥
byte[] decoded = Base64.decodeBase64(publicKey);
RSAPublicKey keyPublic = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
// 数据解密
Cipher cipher = Cipher.getInstance(ECB_PKCS1_PADDING);
cipher.init(Cipher.DECRYPT_MODE, keyPublic);
return cipher.doFinal(data);
}
/**
* 使
*/
public static byte[] decryptByPrivateKey(byte[] encrypted, byte[] privateKey) throws Exception {
// 得到私钥
byte[] decoded = Base64.decodeBase64(privateKey);
RSAPrivateKey keyPrivate = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
// 解密数据
Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING);
cp.init(Cipher.DECRYPT_MODE, keyPrivate);
byte[] arr = cp.doFinal(encrypted);
return arr;
}
/**
*
*/
public static byte[] encryptByPublicKeyForSpilt(byte[] data, byte[] publicKey) throws Exception {
int dataLen = data.length;
if (dataLen <= DEFAULT_BUFFERSIZE) {
return encryptByPublicKey(data, publicKey);
}
List<Byte> allBytes = new ArrayList<Byte>(2048);
int bufIndex = 0;
int subDataLoop = 0;
byte[] buf = new byte[DEFAULT_BUFFERSIZE];
for (int i = 0; i < dataLen; i++) {
buf[bufIndex] = data[i];
if (++bufIndex == DEFAULT_BUFFERSIZE || i == dataLen - 1) {
subDataLoop++;
if (subDataLoop != 1) {
for (byte b : DEFAULT_SPLIT) {
allBytes.add(b);
}
}
byte[] encryptBytes = encryptByPublicKey(buf, publicKey);
for (byte b : encryptBytes) {
allBytes.add(b);
}
bufIndex = 0;
if (i == dataLen - 1) {
buf = null;
} else {
buf = new byte[Math.min(DEFAULT_BUFFERSIZE, dataLen - i - 1)];
}
}
}
byte[] bytes = new byte[allBytes.size()];
{
int i = 0;
for (Byte b : allBytes) {
bytes[i++] = b.byteValue();
}
}
return bytes;
}
/**
* 使
*
* @param data
* @param privateKey
*/
public static byte[] encryptByPrivateKeyForSpilt(byte[] data, byte[] privateKey) throws Exception {
int dataLen = data.length;
if (dataLen <= DEFAULT_BUFFERSIZE) {
return encryptByPrivateKey(data, privateKey);
}
List<Byte> allBytes = new ArrayList<Byte>(2048);
int bufIndex = 0;
int subDataLoop = 0;
byte[] buf = new byte[DEFAULT_BUFFERSIZE];
for (int i = 0; i < dataLen; i++) {
buf[bufIndex] = data[i];
if (++bufIndex == DEFAULT_BUFFERSIZE || i == dataLen - 1) {
subDataLoop++;
if (subDataLoop != 1) {
for (byte b : DEFAULT_SPLIT) {
allBytes.add(b);
}
}
byte[] encryptBytes = encryptByPrivateKey(buf, privateKey);
for (byte b : encryptBytes) {
allBytes.add(b);
}
bufIndex = 0;
if (i == dataLen - 1) {
buf = null;
} else {
buf = new byte[Math.min(DEFAULT_BUFFERSIZE, dataLen - i - 1)];
}
}
}
byte[] bytes = new byte[allBytes.size()];
{
int i = 0;
for (Byte b : allBytes) {
bytes[i++] = b.byteValue();
}
}
return bytes;
}
/**
*
*
* @param encrypted
* @param publicKey
*/
public static byte[] decryptByPublicKeyForSpilt(byte[] encrypted, byte[] publicKey) throws Exception {
int splitLen = DEFAULT_SPLIT.length;
if (splitLen <= 0) {
return decryptByPublicKey(encrypted, publicKey);
}
int dataLen = encrypted.length;
List<Byte> allBytes = new ArrayList<Byte>(1024);
int latestStartIndex = 0;
for (int i = 0; i < dataLen; i++) {
byte bt = encrypted[i];
boolean isMatchSplit = false;
if (i == dataLen - 1) {
// 到data的最后了
byte[] part = new byte[dataLen - latestStartIndex];
System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);
byte[] decryptPart = decryptByPublicKey(part, publicKey);
for (byte b : decryptPart) {
allBytes.add(b);
}
latestStartIndex = i + splitLen;
i = latestStartIndex - 1;
} else if (bt == DEFAULT_SPLIT[0]) {
// 这个是以split[0]开头
if (splitLen > 1) {
if (i + splitLen < dataLen) {
// 没有超出data的范围
for (int j = 1; j < splitLen; j++) {
if (DEFAULT_SPLIT[j] != encrypted[i + j]) {
break;
}
if (j == splitLen - 1) {
// 验证到split的最后一位都没有break则表明已经确认是split段
isMatchSplit = true;
}
}
}
} else {
// split只有一位则已经匹配了
isMatchSplit = true;
}
}
if (isMatchSplit) {
byte[] part = new byte[i - latestStartIndex];
System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);
byte[] decryptPart = decryptByPublicKey(part, publicKey);
for (byte b : decryptPart) {
allBytes.add(b);
}
latestStartIndex = i + splitLen;
i = latestStartIndex - 1;
}
}
byte[] bytes = new byte[allBytes.size()];
{
int i = 0;
for (Byte b : allBytes) {
bytes[i++] = b.byteValue();
}
}
return bytes;
}
/**
* 使
*/
public static byte[] decryptByPrivateKeyForSpilt(byte[] encrypted, byte[] privateKey) throws Exception {
int splitLen = DEFAULT_SPLIT.length;
if (splitLen <= 0) {
return decryptByPrivateKey(encrypted, privateKey);
}
int dataLen = encrypted.length;
List<Byte> allBytes = new ArrayList<Byte>(1024);
int latestStartIndex = 0;
for (int i = 0; i < dataLen; i++) {
byte bt = encrypted[i];
boolean isMatchSplit = false;
if (i == dataLen - 1) {
// 到data的最后了
byte[] part = new byte[dataLen - latestStartIndex];
System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);
byte[] decryptPart = decryptByPrivateKey(part, privateKey);
for (byte b : decryptPart) {
allBytes.add(b);
}
latestStartIndex = i + splitLen;
i = latestStartIndex - 1;
} else if (bt == DEFAULT_SPLIT[0]) {
// 这个是以split[0]开头
if (splitLen > 1) {
if (i + splitLen < dataLen) {
// 没有超出data的范围
for (int j = 1; j < splitLen; j++) {
if (DEFAULT_SPLIT[j] != encrypted[i + j]) {
break;
}
if (j == splitLen - 1) {
// 验证到split的最后一位都没有break则表明已经确认是split段
isMatchSplit = true;
}
}
}
} else {
// split只有一位则已经匹配了
isMatchSplit = true;
}
}
if (isMatchSplit) {
byte[] part = new byte[i - latestStartIndex];
System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);
byte[] decryptPart = decryptByPrivateKey(part, privateKey);
for (byte b : decryptPart) {
allBytes.add(b);
}
latestStartIndex = i + splitLen;
i = latestStartIndex - 1;
}
}
byte[] bytes = new byte[allBytes.size()];
{
int i = 0;
for (Byte b : allBytes) {
bytes[i++] = b.byteValue();
}
}
return bytes;
}
/**
*
*/
public static String encryptByPublicKeyForSpiltStr(String data, String publicKey) throws Exception {
byte[] encryptBytes = encryptByPublicKeyForSpilt(data.getBytes(StandardCharsets.UTF_8), publicKey.getBytes());
return encryptBASE64(encryptBytes);
}
/**
* 使
*
* @param data
* @param privateKey
*/
public static String encryptByPrivateKeyForSpiltStr(String data, String privateKey) throws Exception {
byte[] encryptBytes = encryptByPrivateKeyForSpilt(data.getBytes(StandardCharsets.UTF_8), privateKey.getBytes());
return encryptBASE64(encryptBytes);
}
/**
*
*
* @param encrypted
* @param publicKey
*/
public static String decryptByPublicKeyForSpiltStr(String encrypted, String publicKey) throws Exception {
byte[] decryptBytes = decryptByPublicKeyForSpilt(decryptBASE64(encrypted), publicKey.getBytes());
return new String(decryptBytes,StandardCharsets.UTF_8);
}
/**
* 使
*/
public static String decryptByPrivateKeyForSpiltStr(String encrypted, String privateKey) throws Exception {
byte[] decryptBytes = decryptByPrivateKeyForSpilt(decryptBASE64(encrypted), privateKey.getBytes());
return new String(decryptBytes,StandardCharsets.UTF_8);
}
public static void testEncrypt0(String content) {
//生成秘钥对
KeyPair keyPair = RSAAndroid.generateRSAKeyPair(RSAAndroid.DEFAULT_KEY_SIZE);
//公钥
PublicKey publicKey = keyPair.getPublic();
//私钥
PrivateKey privateKey = keyPair.getPrivate();
try {
System.out.println("公钥:" + encryptBASE64(publicKey.getEncoded()));
System.out.println("私钥:" + encryptBASE64(privateKey.getEncoded()));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void testEncrypt1(String content) {
//生成秘钥对
KeyPair keyPair = RSAAndroid.generateRSAKeyPair(RSAAndroid.DEFAULT_KEY_SIZE);
//公钥
PublicKey publicKey = keyPair.getPublic();
//私钥
PrivateKey privateKey = keyPair.getPrivate();
long start;
long end;
byte[] encryptBytes = new byte[0];
byte[] decryptBytes = new byte[0];
String encryStr, decryStr;
try {
System.out.println("公钥:" + encryptBASE64(RSAAndroid.publicRsaKey.getBytes()));
//公钥加密
start = System.currentTimeMillis();
encryptBytes = RSAAndroid.encryptByPublicKeyForSpilt(content.getBytes(StandardCharsets.UTF_8), RSAAndroid.publicRsaKey.getBytes());
System.out.println("testEncrypt: 公钥加密 encryptBytes:" + encryptBytes);
end = System.currentTimeMillis();
System.out.println("公钥加密耗时 cost time---->" + (end - start));
//encryStr = BASE64Encoder.encode(encryptBytes);
encryStr = encryptBASE64(encryptBytes);
// Log.e(TAG, "加密后json数据 --1-->" + encryStr);
System.out.println("加密后json数据长度 --1-->" + encryStr.length());
System.out.println("testEncrypt: encryStr:" + encryStr);
//私钥解密
System.out.println("私钥:" + encryptBASE64(RSAAndroid.privateRsaKey.getBytes()));
start = System.currentTimeMillis();
decryptBytes = RSAAndroid.decryptByPrivateKeyForSpilt(decryptBASE64(encryStr), RSAAndroid.privateRsaKey.getBytes());
decryStr = new String(decryptBytes);
System.out.println("testEncrypt: 私钥解密 decryStr:" + decryStr);
end = System.currentTimeMillis();
System.out.println("私钥解密耗时 cost time---->" + (end - start));
System.out.println("解密后json数据 --1-->" + decryStr);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void testEncrypt2(String content) {
//生成秘钥对
KeyPair keyPair = RSAAndroid.generateRSAKeyPair(RSAAndroid.DEFAULT_KEY_SIZE);
//公钥
PublicKey publicKey = keyPair.getPublic();
//私钥
PrivateKey privateKey = keyPair.getPrivate();
long start;
long end;
byte[] encryptBytes = new byte[0];
byte[] decryptBytes = new byte[0];
String encryStr, decryStr;
try {
//私钥加密
start = System.currentTimeMillis();
encryptBytes = RSAAndroid.encryptByPrivateKeyForSpilt(content.getBytes(StandardCharsets.UTF_8), RSAAndroid.privateRsaKey.getBytes());
end = System.currentTimeMillis();
System.out.println("私钥加密密耗时 cost time---->" + (end - start));
encryStr = encryptBASE64(encryptBytes);
// Log.e(TAG, "加密后json数据 --2-->" + encryStr);
System.out.println("加密后json数据长度 --2-->" + encryStr.length());
System.out.println("testEncrypt: 私钥加密密 encryStr:" + encryStr);
//公钥解密
start = System.currentTimeMillis();
decryptBytes = RSAAndroid.decryptByPublicKeyForSpilt(decryptBASE64(encryStr), RSAAndroid.publicRsaKey.getBytes());
decryStr = new String(decryptBytes);
System.out.println("testEncrypt: 公钥解密 decryStr:" + decryStr);
end = System.currentTimeMillis();
System.out.println("公钥解密耗时 cost time---->" + (end - start));
System.out.println("解密后json数据 --2-->" + decryStr);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void testEncrypt3(String content) {
long start;
long end;
String encryStr, decryStr;
try {
//公钥加密
System.out.println("公钥:" + RSAAndroid.publicRsaKey);
start = System.currentTimeMillis();
encryStr = RSAAndroid.encryptByPublicKeyForSpiltStr(content, RSAAndroid.publicRsaKey);
end = System.currentTimeMillis();
System.out.println("公钥加密耗时 cost time---->" + (end - start));
System.out.println("加密后json数据长度 --1-->" + encryStr.length());
System.out.println("testEncrypt: 公钥加密 encryStr:" + encryStr);
//私钥解密
System.out.println("私钥:" + RSAAndroid.privateRsaKey);
start = System.currentTimeMillis();
encryStr = "X6Ad0LpiBP7ze/cEgwGkYS53zG5ozY1Nrk2HzrrGlWqFZdyrmYihc1Fo3pjxxfOJi60zkZXguPt197vdtf2NHjtBCamvGt8DYhvfGUFP0YSod11GckQQaUslUkwPjQKTGJ46Kdy7Y2gMKK7EdEabEmTPl/XIT9fDFX/nMWgAutcQ15Gq5FRwWQH7sSVNF5bjrxxBs7Q/JwsCsU+xl0LraifUf+1O6NzCHc4ll7dmWq6EGORjaSVYka8ItuI4hhVWffcrOhY1vDqjFkY+Mzac9ppgk1nc5StMMNGyPC4OYsLkqZa5h8acK8YhSi7dpj58Lo/yJWqMmewiGDSskrcFXCNQQVJUI10H9WmD3b//98jW6cq3awLqmpoZmjuN3fm8vx1KPOCEZs2GlM7/wCEUMabV7O5EsTtRf+6pqHYTPzZfxt2lXEEJviktjguG1WI71nwg+1XyIx5tn818XiYvs0L02hi3sWpQkk/NJ4QaE3LziuCMrgDU/GcFzYLybU627yAPPPLjB9wVZGefwUdWjMtY5AzPMBa9eNjsMaHAGe2zbnopafuouwsjH+uEZd2rzT3Uacb7+pNjl94XiB/0Xhwl1n5bi6HbT3aY2jC6YbKqCp5XQaLCbuefaRVCLC6pOHmNX6NKni98/bYKQ6XfhDoA56gJAEVsAaj/a6vpzVIMsej5zDI=";
decryStr = RSAAndroid.decryptByPrivateKeyForSpiltStr(encryStr, RSAAndroid.privateRsaKey);
end = System.currentTimeMillis();
System.out.println("私钥解密耗时 cost time---->" + (end - start));
System.out.println("解密后json数据长度 --1-->" + decryStr.length());
System.out.println("testEncrypt: 私钥解密 decryStr:" + decryStr);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void testEncrypt4(String content) {
long start;
long end;
String encryStr, decryStr;
try {
System.out.println("公钥:" + RSAAndroid.publicRsaKey);
//私钥加密
start = System.currentTimeMillis();
encryStr = RSAAndroid.encryptByPrivateKeyForSpiltStr(content, RSAAndroid.privateRsaKey);
end = System.currentTimeMillis();
System.out.println("私钥加密密耗时 cost time---->" + (end - start));
System.out.println("加密后json数据长度 --2-->" + encryStr.length());
System.out.println("testEncrypt: 私钥加密 encryStr:" + encryStr);
//公钥解密
System.out.println("私钥:" + RSAAndroid.privateRsaKey);
start = System.currentTimeMillis();
decryStr = RSAAndroid.decryptByPublicKeyForSpiltStr(encryStr, RSAAndroid.publicRsaKey);
end = System.currentTimeMillis();
System.out.println("公钥解密耗时 cost time---->" + (end - start));
System.out.println("解密后json数据 --2-->" + decryStr);
System.out.println("testEncrypt: 公钥解密 decryStr:" + decryStr);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//RSAAndroid.testEncrypt3("8月8日晚东京国立竞技场的奥运圣火熄灭场内电子屏上打出了“ARIGATO”日语“谢谢”的罗马字。57年前的那一夜东京奥运会闭幕式大屏上留下的是“SAYONARA”日语“再见”罗马字。从告别到感谢本届奥运会对日本而言原本是一场赌上国运的体育盛事而现实却朝着与理想相反的方向一路狂奔。8月8日晚东京国立竞技场的奥运圣火熄灭场内电子屏上打出了“ARIGATO”日语“谢谢”的罗马字。57年前的那一夜东京奥运会闭幕式大屏上留下的是“SAYONARA”日语“再见”罗马字。从告别到感谢本届奥运会对日本而言原本是一场赌上国运的体育盛事而现实却朝着与理想相反的方向一路狂奔。8月8日晚东京国立竞技场的奥运圣火熄灭场内电子屏上打出了“ARIGATO”日语“谢谢”的罗马字。57年前的那一夜东京奥运会闭幕式大屏上留下的是“SAYONARA”日语“再见”罗马字。从告别到感谢本届奥运会对日本而言原本是一场赌上国运的体育盛事而现实却朝着与理想相反的方向一路狂奔。8月8日晚东京国立竞技场的奥运圣火熄灭场内电子屏上打出了“ARIGATO”日语“谢谢”的罗马字。57年前的那一夜东京奥运会闭幕式大屏上留下的是“SAYONARA”日语“再见”罗马字。从告别到感谢本届奥运会对日本而言原本是一场赌上国运的体育盛事而现实却朝着与理想相反的方向一路狂奔。8月8日晚东京国立竞技场的奥运圣火熄灭场内电子屏上打出了“ARIGATO”日语“谢谢”的罗马字。57年前的那一夜东京奥运会闭幕式大屏上留下的是“SAYONARA”日语“再见”罗马字。从告别到感谢本届奥运会对日本而言原本是一场赌上国运的体育盛事而现实却朝着与理想相反的方向一路狂奔。8月8日晚东京国立竞技场的奥运圣火熄灭场内电子屏上打出了“ARIGATO”日语“谢谢”的罗马字。57年前的那一夜东京奥运会闭幕式大屏上留下的是“SAYONARA”日语“再见”罗马字。从告别到感谢本届奥运会对日本而言原本是一场赌上国运的体育盛事而现实却朝着与理想相反的方向一路狂奔。8月8日晚东京国立竞技场的奥运圣火熄灭场内电子屏上打出了“ARIGATO”日语“谢谢”的罗马字。57年前的那一夜东京奥运会闭幕式大屏上留下的是“SAYONARA”日语“再见”罗马字。从告别到感谢本届奥运会对日本而言原本是一场赌上国运的体育盛事而现实却朝着与理想相反的方向一路狂奔。8月8日晚东京国立竞技场的奥运圣火熄灭场内电子屏上打出了“ARIGATO”日语“谢谢”的罗马字。57年前的那一夜东京奥运会闭幕式大屏上留下的是“SAYONARA”日语“再见”罗马字。从告别到感谢本届奥运会对日本而言原本是一场赌上国运的体育盛事而现实却朝着与理想相反的方向一路狂奔。8月8日晚东京国立竞技场的奥运圣火熄灭场内电子屏上打出了“ARIGATO”日语“谢谢”的罗马字。57年前的那一夜东京奥运会闭幕式大屏上留下的是“SAYONARA”日语“再见”罗马字。从告别到感谢本届奥运会对日本而言原本是一场赌上国运的体育盛事而现实却朝着与理想相反的方向一路狂奔。8月8日晚东京国立竞技场的奥运圣火熄灭场内电子屏上打出了“ARIGATO”日语“谢谢”的罗马字。57年前的那一夜东京奥运会闭幕式大屏上留下的是“SAYONARA”日语“再见”罗马字。从告别到感谢本届奥运会对日本而言原本是一场赌上国运的体育盛事而现实却朝着与理想相反的方向一路狂奔。8月8日晚东京国立竞技场的奥运圣火熄灭场内电子屏上打出了“ARIGATO”日语“谢谢”的罗马字。57年前的那一夜东京奥运会闭幕式大屏上留下的是“SAYONARA”日语“再见”罗马字。从告别到感谢本届奥运会对日本而言原本是一场赌上国运的体育盛事而现实却朝着与理想相反的方向一路狂奔。");
RSAAndroid.testEncrypt0("123");
}
}

@ -0,0 +1,116 @@
package com.rehome.mqtt01.rsa;
/**
* @ Author : huangwenfei
* @ Date : Created in 2021/8/9 9:29
* @ Version : $1.0.0.0
* @ Description:
*/
import javax.crypto.Cipher;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class RSAEncrypt {
private static Map<Integer, String> keyMap = new HashMap<Integer, String>(); //用于封装随机产生的公钥与私钥
public static String publicRsaKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmK/MMFq+agBpVaSN0R2r0vtuvaA7A4t/WM+Q3G1l1SFNCSUkfv5IlZ7hoJYudSfi+fKpFg3k9HEgeBN2uKkqLxggteTLB7ymqNtZCv3sI3YkMOGu2HxY2w8o4wRQbgr1WOiBr0hBsZ3gyvNzUZ4GH8zY/JCruKzTa5dhxp3ciAMfsXKo6yMCVj1/hwTYxrpR7pJdMSAG92DZjl8Q+fzYxZOul4Lt5eNDq6Tq3J7YE3iO/RBITQPEdxB8B1PhincQB6JOXwKRJZrNhD3mgH4O07+GXSXlj0FLGz4TdcBI3DepPbLmli1ogE57r0MlAslEu0iojmIiOvFlJ7p+qOS2VQIDAQAB";
public static String privateRsaKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCYr8wwWr5qAGlVpI3RHavS+269oDsDi39Yz5DcbWXVIU0JJSR+/kiVnuGgli51J+L58qkWDeT0cSB4E3a4qSovGCC15MsHvKao21kK/ewjdiQw4a7YfFjbDyjjBFBuCvVY6IGvSEGxneDK83NRngYfzNj8kKu4rNNrl2HGndyIAx+xcqjrIwJWPX+HBNjGulHukl0xIAb3YNmOXxD5/NjFk66Xgu3l40OrpOrcntgTeI79EEhNA8R3EHwHU+GKdxAHok5fApElms2EPeaAfg7Tv4ZdJeWPQUsbPhN1wEjcN6k9suaWLWiATnuvQyUCyUS7SKiOYiI68WUnun6o5LZVAgMBAAECggEAfaK521fvsn1gLy5V2yoVBmgJeVLs/D++q68vvZDu5+6c2teLLkvCIgs4ENFCrPgDFjQL2a/ZIyIq22L4n33izhmGYOVAAr/CStMic574vT0rDmXFXzECVE4nEJWuML4nn97BRx+nnqUQIS8tRo1G8Me4DCpmgnEDDlbkB3BB1E+kGKvO7mo/y3KzjjAUCSIBh92TNZ4IPvcU99yR2UF4wY/7uc3bBCO2ZBSFRv7RyWBDQK/gvAWStYGOQPLQL9frRAG9a/L7lfMkhQAazxUpv17hgQVXuMP4cEnDhMpjEfNatwgIMQppDYoSSoIHZUKpRSauNEEi63Yfbl/X8HiowQKBgQDoXHiY64+a5O3oD7A/vsUWOE1yULZJM8pMwlZfNXcdBYdj51eS3/2ii8LZEu0sQ9Kcz30uHgI0dNCAQWNDJqNKFKV3KONFYm+5EQaCigNkOkoOqjbQXFWqVEyCzb9xPFxdJm1N04JvbtOK67sPVexJrhq2gm0gQGpSR/R9sIhr+QKBgQCoOFA6FhwwsuWBQ4e+WSK6Sw1ZwdNNOwXCYSM+DLPnsf4erqSKE+hLecg4Emvfl9lO5/5dQz808SYrSm402wVFsqrNLV3M5uvL/zWusDXnQdmmOPHVKuO5EBQnh9YeI3BUQRxMo1LdFCluWqxCVzj9QU3x6zkid0fCnWQzFKHcPQKBgQC8seOJo7ox+nks/BiQG7bnjX9vNxZhKfq+DQ+hL8T0P3osakFW2CmcJ81rBRCv4sAVcfZhTiNSQA7WKMOYU7dFQLECrKSrwv2hl67msXeBnEhp0lbDLEixEtYzXyx5o6AKUVtwWTRSk/icl0SIdql1SDsPPamrCESPXzmwHH0c2QKBgGQ9CjFSs4GhWHjqUJzwaG0yA8aUZOEEZq4pS+LRlvJdcdu+nXVZ33X6H4CqGXWm+mq2ey//vk5B1Ei/lWQRjta1XGneuqI6iA+LB+YMQlKHPrZ6AEDRydig6CGWI9TZsTnDgqV4PQxX00ha54Kwjtj6bQPW8rjC8xPYzbhSdxDRAoGBALX3qVbywgAyeR3aaRFwlUMZZPc96Gaye0Ol53jRJDbEzBwetYiEhypjroNLmB/B/baCXXyMwJ7FZVQiG4VBwhYhqIEjNa+sZ5MDn6D5OM2ZFlq/Xii44+FHuZiz8WxTZ3G5S4hxASTVWae5Q/Is/ZROw+fgw1oA/W2osIYMrMVR";
public static void main(String[] args) throws Exception {
//生成公钥和私钥
genKeyPair();
//加密字符串
String message = "由于项目要用到非对称加密解密签名校验什么的于是参考《Java加密解密的艺术》写一个RSA进行加密解密签名及校验的Demo代码很简单特此分享";
// System.out.println("随机生成的公钥为:" + keyMap.get(0));
// System.out.println("随机生成的私钥为:" + keyMap.get(1));
// String messageEn = encrypt(message,keyMap.get(0));
// System.out.println(message + "\t加密后的字符串为:" + messageEn);
// String messageDe = decrypt(messageEn,keyMap.get(1));
// System.out.println("还原后的字符串为:" + messageDe);
//String messageEn = encrypt(message,publicRsaKey);
String messageEn = "YHUqrn0UPYqkvUPDzuM/DUR/7H+R05aPbtinAwrnWv/kU2Gt1NBvDOwXOUt6YBiv1ogTrk1k1xbw1YlN8PQ7eSvM0dtcEpRtRS7zT7bSDu3sQWofOwleuuJFQxX88uCy1ZfmP+QrS+iXREfpHOmCRylpyEBNQAJttPbDZYQUAJrAdjycmiXgac2IaWefs5IaKWiCjMm0c0ZJ3FYXSrz98Mn89lX63Z/rPgqm/QdHaNlkJ2cTW559Z3x1nRTGYLUb4emjmtk9tDjAvBnNjSvga4/ozPXl7lLoWNgK3z2GwIsgR9t20C2GfozRZtAC6SCf3IT17rc2nHxTy9YdByr9UA==";
System.out.println(message + "\t加密后的字符串为:" + messageEn);
String messageDe = decrypt(messageEn,privateRsaKey);
System.out.println("还原后的字符串为:" + messageDe);
}
/**
*
* @throws NoSuchAlgorithmException
*/
public static void genKeyPair() throws NoSuchAlgorithmException {
// KeyPairGenerator类用于生成公钥和私钥对基于RSA算法生成对象
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
// 初始化密钥对生成器密钥大小为96-1024位
keyPairGen.initialize(2048,new SecureRandom());
// 生成一个密钥对保存在keyPair中
KeyPair keyPair = keyPairGen.generateKeyPair();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到私钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 得到公钥
String publicKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded());
String privateKeyStr = Base64.getEncoder().encodeToString(privateKey.getEncoded());
String publicKeyString = Base64.getEncoder().encodeToString(publicKey.getEncoded());
// 得到私钥字符串
String privateKeyString = Base64.getEncoder().encodeToString(privateKey.getEncoded());
// 将公钥和私钥保存到Map
keyMap.put(0,publicKeyString); //0表示公钥
keyMap.put(1,privateKeyString); //1表示私钥
}
/**
* RSA
*
* @param str
*
* @param publicKey
*
* @return
* @throws Exception
*
*/
public static String encrypt( String str, String publicKey ) throws Exception{
//base64编码的公钥
byte[] decoded = Base64.getDecoder().decode(publicKey);
RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
//RSA加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
String outStr = Base64.getEncoder().encodeToString(cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)));
return outStr;
}
/**
* RSA
*
* @param str
*
* @param privateKey
*
* @return
* @throws Exception
*
*/
public static String decrypt(String str, String privateKey) throws Exception{
//64位解码加密后的字符串
byte[] inputByte = Base64.getDecoder().decode(str.getBytes(StandardCharsets.UTF_8));
//base64编码的私钥
byte[] decoded = Base64.getDecoder().decode(privateKey.getBytes(StandardCharsets.UTF_8));
RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
//RSA解密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, priKey);
String outStr = new String(cipher.doFinal(inputByte));
return outStr;
}
}

@ -0,0 +1,171 @@
package com.rehome.mqtt01.rsa;
import lombok.extern.slf4j.Slf4j;
import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class RSAUtil {
public static final String KEY_ALGORITHM = "RSA";
private static final String PUBLIC_KEY = "RSAPublicKey";
private static final String PRIVATE_KEY = "RSAPrivateKey";
//RSA最大加密明文大小
private static final int MAX_ENCRYPT_BLOCK = 117;
//RSA最大解密密文大小
private static final int MAX_DECRYPT_BLOCK = 128;
//java默认加密填充方式 RSA/None/PKCS1Padding
public static final String ECB_None_PKCS1_PADDING = "RSA/None/PKCS1Padding";
// // 1024 bits 的 RSA 密钥对,最大加密明文大小
// private static final int MAX_ENCRYPT_BLOCK = 117;
//
// // 1024 bits 的 RSA 密钥对,最大解密密文大小
// private static final int MAX_DECRYPT_BLOCK = 128;
// 生成密钥对
public static Map<String, Object> initKey(int keysize) throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
// 设置密钥对的 bit 数,越大越安全
keyPairGen.initialize(keysize);
KeyPair keyPair = keyPairGen.generateKeyPair();
// 获取公钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 获取私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
Map<String, Object> keyMap = new HashMap<>(2);
keyMap.put(PUBLIC_KEY, publicKey);
keyMap.put(PRIVATE_KEY, privateKey);
return keyMap;
}
// 获取公钥字符串
public static String getPublicKeyStr(Map<String, Object> keyMap) {
// 获得 map 中的公钥对象,转为 key 对象
Key key = (Key) keyMap.get(PUBLIC_KEY);
// 编码返回字符串
return encryptBASE64(key.getEncoded());
}
// 获取私钥字符串
public static String getPrivateKeyStr(Map<String, Object> keyMap) {
// 获得 map 中的私钥对象,转为 key 对象
Key key = (Key) keyMap.get(PRIVATE_KEY);
// 编码返回字符串
return encryptBASE64(key.getEncoded());
}
// 获取公钥
public static PublicKey getPublicKey(String publicKeyString) throws NoSuchAlgorithmException, InvalidKeySpecException {
byte[] publicKeyByte = Base64.getDecoder().decode(publicKeyString);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyByte);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
return keyFactory.generatePublic(keySpec);
}
// 获取私钥
public static PrivateKey getPrivateKey(String privateKeyString) throws Exception {
byte[] privateKeyByte = Base64.getDecoder().decode(privateKeyString);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyByte);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
return keyFactory.generatePrivate(keySpec);
}
/**
* BASE64
*
* @param key
* @return
*/
public static String encryptBASE64(byte[] key) {
return new String(Base64.getEncoder().encode(key));
}
/**
* BASE64
*
* @param key
* @return
*/
public static byte[] decryptBASE64(String key) {
return Base64.getDecoder().decode(key);
}
/**
*
*
* @param text
* @param publicKeyStr
* @return
*/
public static String encrypt(String text, String publicKeyStr) {
try {
log.info("明文字符串为:[{}]", text);
Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
cipher.init(Cipher.ENCRYPT_MODE, getPublicKey(publicKeyStr));
byte[] tempBytes = cipher.doFinal(text.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(tempBytes);
} catch (Exception e) {
throw new RuntimeException("加密字符串[" + text + "]时遇到异常", e);
}
}
/**
*
*
* @param secretText
* @param privateKeyStr
* @return
*/
public static String decrypt(String secretText, String privateKeyStr) {
try {
// 生成私钥
Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
cipher.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKeyStr));
// 密文解码
byte[] secretTextDecoded = Base64.getDecoder().decode(secretText.getBytes("UTF-8"));
byte[] tempBytes = cipher.doFinal(secretTextDecoded);
return new String(tempBytes);
} catch (Exception e) {
throw new RuntimeException("解密字符串[" + secretText + "]时遇到异常", e);
}
}
public static void main(String[] args) throws Exception {
Map<String, Object> keyMap;
String cipherText;
// 原始明文
String content = "春江潮水连海平,海上明月共潮生。滟滟随波千万里,何处春江无月明。";
// 生成密钥对
keyMap = initKey(2048);
String publicKey = getPublicKeyStr(keyMap);
log.info("公钥:[{}],长度:[{}]", publicKey, publicKey.length());
String privateKey = getPrivateKeyStr(keyMap);
log.info("私钥:[{}],长度:[{}]", privateKey, privateKey.length());
// 加密
cipherText = encrypt(content, publicKey);
log.info("加密后的密文:[{}],长度:[{}]", cipherText, cipherText.length());
// 解密
String plainText = decrypt(cipherText, privateKey);
log.info("解密后明文:[{}]", plainText);
}
}

@ -0,0 +1,463 @@
package com.rehome.mqtt01.rsa;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import javax.crypto.Cipher;
public class RSAUtils {
/**RSA算法*/
public static final String RSA = "RSA";
private static final String PUBLIC_KEY = "RSAPublicKey";
private static final String PRIVATE_KEY = "RSAPrivateKey";
public static final int DEFAULT_KEY_SIZE = 2048;//秘钥默认长度
//RSA最大加密明文大小 1024位是117 算法 最大加密明文大小 = 1024(bit) / 8 - 11(byte) = 117 byte 最大加密明文大小 = 2048(bit) / 8 - 11(byte) = 245 byte
//private static final int MAX_ENCRYPT_BLOCK = 245;
private static final int MAX_ENCRYPT_BLOCK = (DEFAULT_KEY_SIZE / 8) - 11;
//RSA最大解密密文大小 1024位是128 2048位是 256 依此类推
//private static final int MAX_DECRYPT_BLOCK = 256;
private static final int MAX_DECRYPT_BLOCK = DEFAULT_KEY_SIZE / 8;
//java默认加密填充方式 RSA 对应安卓 RSA/None/PKCS1Padding
public static final String ECB_None_PKCS1_PADDING = "RSA";
//安卓手机加密填充方式用 RSA/None/PKCS1Padding
//public static final String ECB_None_PKCS1_PADDING = "RSA/None/PKCS1Padding";
//C# RSA格式转JAVA格式 通用RSA
// public static final String public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvz3ouaHLt2/KpVEahoFAsslxlIGyM6iRX9nmsiix9vE8HTBY3sjRSEMXB1IoZh/AZ8TLvkAJBIaPpPxweMoYcNvkbmSMv7+s2USTu+IEY0nGIVa4oJivaIz+ed6sRoQg7YXJzJoEojWQNlhK3QEJhgDH1ozYRJfTUD8IsexdNsXaCmlXEMN/a99sg8GXuuZqw4IaJcGqWgpKN5FpHIfok+3q6Av7nuG5JVtg3UPNUZP7lxyCQE4GT+UAXm1I2styr1sJkskHCs13266JBW3HCIwf3U1EZsZrpT7WHGPdih3ySymRGjPJfYo+yqKk1C0lC6BpQ7RnZiZC2vHaGClUGQIDAQAB";
// public static final String private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC/Pei5ocu3b8qlURqGgUCyyXGUgbIzqJFf2eayKLH28TwdMFjeyNFIQxcHUihmH8BnxMu+QAkEho+k/HB4yhhw2+RuZIy/v6zZRJO74gRjScYhVrigmK9ojP553qxGhCDthcnMmgSiNZA2WErdAQmGAMfWjNhEl9NQPwix7F02xdoKaVcQw39r32yDwZe65mrDgholwapaCko3kWkch+iT7eroC/ue4bklW2DdQ81Rk/uXHIJATgZP5QBebUjay3KvWwmSyQcKzXfbrokFbccIjB/dTURmxmulPtYcY92KHfJLKZEaM8l9ij7KoqTULSULoGlDtGdmJkLa8doYKVQZAgMBAAECggEBAKXKVuovELt7B9Pfhr5aaStVpciX01Qja7wL3IpQ609ofLPVSQYCVCRwPROUrv8xwYx0OCk7vFWXDgp66kpc8WlNyC/HrZlB4ugMIoL8As/Mkh4u3yoik9ZwfOBMIU+UljM0C+j7EM9K3jWuv1/u2UG5hYVDXu3ALWpg6vnMLlcfGGN9nrZTckt/sVOcclSrVSxIsFSWM35jBPXq9w+uNErS1D/mVqikcO8HI3NDdowins4HHPbXuIx+cloXnsbmpAjGpbYOs166vElvIyohfb0zM+bCuG6oBI26Eit5XpVx/rvjZNNN43lLk4JGhp1XF0IHh4n9JWH2T5Hmi4i7HZ0CgYEAz30VodORsFvct67vijo4R/JLGgHmqUMbmdWq8O4NVaiWzeb65tZZr/KZSzq+A9nxsGYG6oMYkKL3qws6sIBB3r/L24Nrq29+Tvws1L0rVEdRnO2npReahfSTdfroL1/yZ4FcI8S6GkBm5Ehtw5Qecj6ouomifAXjEYtKWrAtxfsCgYEA6/Rl+CIXVYthgFPouyBK5AxGD5NsKPDyG3yf8/V7q0AyzggEQCE0w+MbnRes1w3k9URHlvbbrcW7WJgEAVVKbJRs5IfEqV3ijO8LoVMu7MwVWxKw0GBVDYAe3Y/v6bzIjWEy0a46d+pGdsrixAafZY1Bdpqm8Jfjez4CRCA99fsCgYAqkdlMWGH9svs33HZc/9DoQffSoC048QHKsCHgSJcHyg0WtZsonTXNeZKl8qlllOOXc3dbygXSNv1lZGpoKAhbsTIcGXyPsdJSVj7EbwNiyTcfYUsR/iO/9AwFGrNkdOUBA3NqC0S7ehciIxISHGOawOxRSUfC9lo+ETvyG09o3QKBgAx/KjNlItU+B5DzYL0gbbb8S22hwjW85SW9iP8zvjQIt2ggFpGK8K97RMgiK95L9xdiYWRGeMYQVebQTk3/xWxQxB+qbSkHNut98aC+thqGiI8FQ2YV5AtOANR9PhikDf8m6bkfQCt/tfGutynoq+KGA7STZkoR0VOCqj4PcxinAoGATXGeSxQow9sXhJrYtZ7VJ+uKNUJDSlBw0ki4dr05TNS6PphhMkiIMQKfJT6vV/VrDNIr9DC+tX36wZnDSOMD1vTdJqbpIUT9hBDuIPuQ8KKyDsEcbFUTvr4S9BZK47sdXLqaAZdYOPSG5Dc3aVMIW3vkxWnLf+ieoImUO64aglM=";
public static final String public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnRh8MAqfpBZffouPsU3hToRZl3soo2ntYU4psQtc72QOvnprQ6Ua6UBY0WqemCJF/KxQ8p+vY7/r5eZ97Fw7Sq40PQTNKvyxFQuMGRAO8xTahSn2/79KViq7mVVLm2UAH8QaFmq7rJJbkCif3I1yiFMqzOF41ak231GF8eD62gr9+DFLiR1UKjv+/qXG4UjFQM6pa0cD1kAOsoYz0dSQlHFMbOaVf+VEWxSqFjKPiep6bYoViTlMRkdLqbUbHr/xk67C8lGqWO7wnB32T0+fYwnFWF952OJ9kov9oSnvOFXa+NwlAe7m2hZtFnW/NoBX1WxkQ6zTTTxJb8sRNft7qQIDAQAB";
public static final String private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCdGHwwCp+kFl9+i4+xTeFOhFmXeyijae1hTimxC1zvZA6+emtDpRrpQFjRap6YIkX8rFDyn69jv+vl5n3sXDtKrjQ9BM0q/LEVC4wZEA7zFNqFKfb/v0pWKruZVUubZQAfxBoWaruskluQKJ/cjXKIUyrM4XjVqTbfUYXx4PraCv34MUuJHVQqO/7+pcbhSMVAzqlrRwPWQA6yhjPR1JCUcUxs5pV/5URbFKoWMo+J6nptihWJOUxGR0uptRsev/GTrsLyUapY7vCcHfZPT59jCcVYX3nY4n2Si/2hKe84Vdr43CUB7ubaFm0Wdb82gFfVbGRDrNNNPElvyxE1+3upAgMBAAECggEAOcphHRc7ZRSp6paStMoOoWDEyJoQ+BSms84aPjwM4y/u0JmeThM11CrMwbU0RIkPMAV//dFKpypaMIfbOREw6qctJmlWxIKS7kgCMNIcfcXlIWmvqKOJSCuOObkMCE1ef1EXu7ll8vUgY+bd8DfEs2vM6fPkDM2kFwEZgkKeZYlkFcLLy8V701seLtNzbPaqAUa44S6m0DVH7gojad8+Ni/XsdNzSrd8Y2930M8LVZoOTLrwskJaF2v/WvjM3blOtHxLqDfXfD4uRm12b1SNzPx2djlL6vNptwbpYAtPOYol8W0LxJH2AHbTrUFv/KJdyuD4NVGSnGpYtWzD7QQetQKBgQDLqfaiq0uHQerAc3M30pOZSDF8PtiBd1jdqFoOVhuADkp4LPXm54s5evEi2r3tl4x8cAvUo6WaxDlG3IFO0POLcZY+Xf2sMhwMAxiwWqLVRGirjr6QAfnmWAToqqyh8brxNti4MC3X/yudrd6x/VJ1lQ3Pooiihf4Ir74QuY7wqwKBgQDFdwbFou07bQmxCElgC5MF78Aevn5JzsniGU2RhpxG7ajf2T9n6AjtVfvYLy6iYsfLm6RGC2uofBjMgL920ePXBSDv0fk1UEVoR/vCtspyCLBVXELdSS5DCnux1F15vKAJZQyODGyEv0d8h97qKRaq14EW75e9vPx4ahxXgaiM+wKBgGE0AonK9aZdmJw3veMDtvxuj2e8WvsXqitIwYqcIE3zBCntU4PcOP+7JMG84u816JAvrgXUASMnyip+7ZxfcA26rbmghIUd+XLmO29YIuVk3AwdeegjeVEt61Hcu74jMFUWF0N5gzfXCsscA/Cxdhy2gjv6V/oxt3gP4Mf8uDM3AoGAJMVhcXRBkQtg/qJ4Z3ZATp6yvAblJYFofr4Pf8X9XAftpqGh+QtwfiHA4CUJHhwe8H9vO8vspFdXlt1yygGT1/qQg5gqPA9SnXSqITxAvrN3gq3HlcWG490T462UKpNBif5TNDCEFMQ536q9jAVSv0WaOFctfpuuuA2qcXEnnfkCgYEAuFWzis7ICtcZTr8CZOC7FeVL6URzI1akwRlHDHRUrNRCTf47HGUG9bCC6N+v6ex7TD2XlaB0g3U9XXjYRyk9T2AWfgzPvgvw7H+tI9r+9yyDlUbb2pvaKdVQIgCnJ6Hg7Qw7MuwzjEiXLF7HMy5CFnrVnHAjYrNe1Gqgo0v3rsY=";
//湛江运行巡检
//public static final String public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhpRgDGj3dk8kaNnnQIJ6YjbaEDBYEzDkv3qR3a55odU4/fJ3LFtGQfHM7LzQ3bpYaC8cZiYAu0ByPENW0G7HzVmxPfKdbLZtrRe+9kH8Fm+M2B26/XZd9QfT9+F2NQtFq68UA6yV5Z4wvxDjp2ZEzVjd+6ODQHuxf5JzySyWtgg844sHdB47iSdC06PnDfjLGMp3AtYeCbQH1mNOjuV44vbiccoTP3gCLnm9BS9Ez4F0fM04kTnCLpOdphJub341gUUnuoFbo+CGrnM5NfwXnw1MUkl5H25BHwK4So/L9DwbBsktiFOuzC8L4DuWvJJSLZnKXIXmPGoRVqTe5zCMkQIDAQAB";
//public static final String private_key = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCGlGAMaPd2TyRo2edAgnpiNtoQMFgTMOS/epHdrnmh1Tj98ncsW0ZB8czsvNDdulhoLxxmJgC7QHI8Q1bQbsfNWbE98p1stm2tF772QfwWb4zYHbr9dl31B9P34XY1C0WrrxQDrJXlnjC/EOOnZkTNWN37o4NAe7F/knPJLJa2CDzjiwd0HjuJJ0LTo+cN+MsYyncC1h4JtAfWY06O5Xji9uJxyhM/eAIueb0FL0TPgXR8zTiROcIuk52mEm5vfjWBRSe6gVuj4Iauczk1/BefDUxSSXkfbkEfArhKj8v0PBsGyS2IU67MLwvgO5a8klItmcpcheY8ahFWpN7nMIyRAgMBAAECggEAPkrplnTzrlh9subByrNacKGRGBM4gVGNYDAc2m6LMGRgp/MWRHrPL3D7+MyBJVC+4SKFU6bdic8P0WMeCQZuB1gv2Uu2oH5kj81A//2U8NGbcOF6Dx496VBBRiifLXhVPF2itvyouYsaZyYrKe4FhMNQpMyP0UYv56vjWkgATqsbFmx2K8FLSGwpBvYys57gy4Evtep0yLTel6E4mnkQVdfTXnA7zylMn5Xz6Mk8u6H6o+Zhfxugw8/+CS9cDSCNxX0ZN8xgqONNtrHpAsM+AWbHuim89HnoVq2RrkHVnjCTXd2IG2Hs+lO7t7GYk3bqLwlpaupmR4rnOI+R+Rf3TQKBgQDpnMAY9l5Ro+r+SR7UjN+tSMBBX3S764NTAE0kNUSB3iBQnuLY60ziqbEbAupSFBnbkshWIVGaKdN6szH9lpoMSEyEWrN/EYY46WxFC6MT4iqvtl3Trqu/7h0DrjWsSY9e8ja8Zpv0lb7B8IEUiydeTfdkA+oTu4igz8gRs+BpuwKBgQCTegnoVlf15fLx8Czeo54YouHnD5fxzx5svsvXIFarMcQ89UMcUw/gBh3QGvx4BS6DUctitzmAeTQkQVtjVQZ3gNTMwILcB4NWibHursnsWQB6BIcRbww9FSIpARXPbXS2FbqjN+3aS8REEVJrIOPP2PQ62SeQSnA/eZBy1DjIIwKBgD4prtg1nq18v8hAbsrCXba/mCENJIPozH4mo2BSKFOiZtjtHpH4MvJRk0YLxYxnuuW5rkN1BEDQhmytCE1haMaB6pKBjCfw4tV8D4pj6VYeJZuyHE96uEsPMntLPQ8GV/c83qHNcAxqWGNE+yQbTzOB7aWYgQ4VJescvzEuuzWHAoGAZiUQ16t2IQqzyn7flRUeW1H1xWQ3iXQ7TnaYGNh9LvW5Rb9aTDP7ut6Bp7IJS9fK74mnpSfi2+kXBEWAVrx9TigdO/ParytE/JtCcl793IWInvqj0p9niqcokd3+jTzyqWtDaelDBP+VYM/elfSh1UQfZOMjU/064bwBIId9DKECgYBYXBe6oU7QiMYxa3YwAi9CcY9HXX6HRF4MpzOsOQ8wer8uJi6ca2th+jssz4SMeYZHnb7Ae+aORD7X+LefVuQiolwigAeTFgDihveb6WgxkKMarbqO8Ww7+laoGQjHvMQMTSkzt6KyhzeNu3F7Ma5HZkfCqwPAHzTOunGWUosRvg==";
public static byte[] decryptBASE64(String key) throws Exception {
return Base64.getDecoder().decode(key.getBytes());
}
public static String encryptBASE64(byte[] key) throws Exception {
return Base64.getEncoder().encodeToString(key);
}
/**
* <br>
*
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptByPrivateKey(byte[] data, String key)
throws Exception {
// 对密钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对数据解密
Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
*
* @param encryptedData
* @param privateKey
* @return
* @throws Exception
*/
public static byte[] decryptByPrivateKeyLongText(byte[] encryptedData, String privateKey) throws Exception {
byte[] keyBytes = decryptBASE64(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
cipher.init(Cipher.DECRYPT_MODE, privateK);
int inputLen = encryptedData.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段解密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
byte[] decryptedData = out.toByteArray();
out.close();
return decryptedData;
}
/**
* <br>
*
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptByPublicKey(byte[] data, String key)
throws Exception {
// 对密钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得公钥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对数据解密
Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
cipher.init(Cipher.DECRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**
*
* @param encryptedData
* @param publicKey
* @return
* @throws Exception
*/
public static byte[] decryptByPublicKeyLongText(byte[] encryptedData, String publicKey) throws Exception {
byte[] keyBytes = decryptBASE64(publicKey);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
Key publicK = keyFactory.generatePublic(x509KeySpec);
Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
cipher.init(Cipher.DECRYPT_MODE, publicK);
int inputLen = encryptedData.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段解密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
byte[] decryptedData = out.toByteArray();
out.close();
return decryptedData;
}
/**
* <br>
*
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKey(byte[] data, String key)
throws Exception {
// 对公钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得公钥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对数据加密
Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/**
*
* @param data
* @param publicKey
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKeyLongText(byte[] data, String publicKey) throws Exception {
byte[] keyBytes = decryptBASE64(publicKey);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
Key publicK = keyFactory.generatePublic(x509KeySpec);
// 对数据加密
Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
cipher.init(Cipher.ENCRYPT_MODE, publicK);
int inputLen = data.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
} else {
cache = cipher.doFinal(data, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_ENCRYPT_BLOCK;
}
byte[] encryptedData = out.toByteArray();
out.close();
return encryptedData;
}
/**
* <br>
*
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data, String key)
throws Exception {
// 对密钥解密
byte[] keyBytes = decryptBASE64(key);
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 对数据加密
Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
*
* @param data
* @param privateKey
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKeyLongText(byte[] data, String privateKey) throws Exception {
byte[] keyBytes = decryptBASE64(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance(ECB_None_PKCS1_PADDING);
cipher.init(Cipher.ENCRYPT_MODE, privateK);
int inputLen = data.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
} else {
cache = cipher.doFinal(data, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_ENCRYPT_BLOCK;
}
byte[] encryptedData = out.toByteArray();
out.close();
return encryptedData;
}
/**
*
*
* @param keyMap
* @return
* @throws Exception
*/
public static String getPrivateKey(Map<String, Object> keyMap)
throws Exception {
Key key = (Key) keyMap.get(PRIVATE_KEY);
return encryptBASE64(key.getEncoded());
}
/**
*
*
* @param keyMap
* @return
* @throws Exception
*/
public static String getPublicKey(Map<String, Object> keyMap)
throws Exception {
Key key = (Key) keyMap.get(PUBLIC_KEY);
return encryptBASE64(key.getEncoded());
}
/**
*
*
* @return
* @throws Exception
*/
public static Map<String, Object> initKey() throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator
.getInstance(RSA);
keyPairGen.initialize(DEFAULT_KEY_SIZE);
KeyPair keyPair = keyPairGen.generateKeyPair();
// 公钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
Map<String, Object> keyMap = new HashMap<String, Object>(2);
keyMap.put(PUBLIC_KEY, publicKey);
keyMap.put(PRIVATE_KEY, privateKey);
return keyMap;
}
public static void main(String[] args) {
try {
Map<String, Object> key = RSAUtils.initKey();
String publicKey = RSAUtils.getPublicKey(key);
String privateKey = RSAUtils.getPrivateKey(key);
//String signbypub = RSAUtils.encryptBASE64(RSAUtils.encryptByPublicKeyLongText("310482".getBytes(),RSAUtils.public_key));
String text = "JAVA利用RSA加密算法的长度限制问题解决方案注意 RSA加密明文最大长度117字节解密要求密文最大长度为128字节所以在加密和解密的过程中需要分块进行。 RSA加密对明文的长度是有限制的JAVA利用RSA加密算法的长度限制问题解决方案注意 RSA加密明文最大长度117字节解密要求密文最大长度为128字节所以在加密和解密的过程中需要分块进行。 RSA加密对明文的长度是有限制的JAVA利用RSA加密算法的长度限制问题解决方案注意 RSA加密明文最大长度117字节解密要求密文最大长度为128字节所以在加密和解密的过程中需要分块进行。 RSA加密对明文的长度是有限制的。JAVA利用RSA加密算法的长度限制问题解决方案注意 RSA加密明文最大长度117字节解密要求密文最大长度为128字节所以在加密和解密的过程中需要分块进行。 RSA加密对明文的长度是有限制的JAVA利用RSA加密算法的长度限制问题解决方案注意 RSA加密明文最大长度117字节解密要求密文最大长度为128字节所以在加密和解密的过程中需要分块进行。 RSA加密对明文的长度是有限制的JAVA利用RSA加密算法的长度限制问题解决方案注意 RSA加密明文最大长度117字节解密要求密文最大长度为128字节所以在加密和解密的过程中需要分块进行。 RSA加密对明文的长度是有限制的.JAVA利用RSA加密算法的长度限制问题解决方案注意 RSA加密明文最大长度117字节解密要求密文最大长度为128字节所以在加密和解密的过程中需要分块进行。 RSA加密对明文的长度是有限制的JAVA利用RSA加密算法的长度限制问题解决方案注意 RSA加密明文最大长度117字节解密要求密文最大长度为128字节所以在加密和解密的过程中需要分块进行。 RSA加密对明文的长度是有限制的JAVA利用RSA加密算法的长度限制问题解决方案注意 RSA加密明文最大长度117字节解密要求密文最大长度为128字节所以在加密和解密的过程中需要分块进行。 RSA加密对明文的长度是有限制的";
String signbypub = RSAUtils.encryptBASE64(RSAUtils.encryptByPublicKeyLongText(text.getBytes(StandardCharsets.UTF_8),RSAUtils.public_key));
//String signbypub ="GAMWcUb/Sv2QL/z8Uo1yA0907QCiZjTVLc6+wTqdM/XvRiX3RjgVeIfe0KK0H+4jnw658HTQZEVQJ4+o5SCccgJHyCJNwtYE0ZgaX0rRY/XUhqQJUDFJ/Ie2e12k+8aJzMcIBxV/rQJUSF+7cy1g5h78b4I3A3ckqWeGX1e3DXLt0kSPkmJ4yb6nMLJ+C1s6aj4vc17NnpSvlPCeY1p7GIy+P4OJjUD2RMeIY8bTRXceiGZQESJKtOjuhrVhpbw5v8EhZU/VRwNhI6Wq1apNAtM/dUfdGuLtat9txA+oWoBW+Q+UUVSu9a6wm9lfenjrXrk7ko/9qu7SvbB9OAVmi3ozzlphsZAcg/5RUYE+ePqdCkidrE+/n/Jf/dU2HapBPix9/qmjFeZdakHedV9mDyPcYBJe9IBRBkDruwrn/PTitDuOCrCV15ZPw5JaW2DEf+HIyobZaZ60HndYI/YU7dFVbha7EqF7lJt791zPfgYZyp0ftVyUb9K+ZKaxp2xia1VAZfq2oCRkQJa9+G2ACCpqkKGHjBZswhdkcvvQkPtYn3APaAORFmvW3vjMARLHAzTP2H4qyzgvLue1otmzHz7OfIxQqoodx89lasQEdilTFCIqzSbeIZB+3yb/WjvwgTVDw3ZGRm3Sm/C+Id5Y/dwPwn8aM1OTeXTNV0nijIkFFGXaMSPCKKzXTH4L+SDzITbruAOWvIZYnCOpJnEQx555y548clApDRvYws1DT7CruHJ22ik9hI1W8irb7C/lzJsmwQHXcxYaK+seEZIR02hv5Gb6TPQLAxPIiO0DOARVF+fMDR+w7tWDTyMruZH4+iYUsK7F4F3TmufBtiHlPKnGjSscfdHoMqDdNjzQodh2B+NN+ZzD/5CAjNq7LRx4umkZ3PHGP82Y1XJtn6cGgyyv8ofPYQqkGKag9rSiSMs9O3cT524cSN/zBkWiyMaTp3VyS1nK+q/EEBO2J7mfBN6hkjx6+mCjGF6yDFbO3mb5Ry3+WqN88fi4k9V/N3eWI2tDQMeMmd43qJr+Lm037hYW4nkUkyHL9eOyiGHk0/KTrnOFM5wvPsPWoaOSHKfUehD9bFGvWevBZAqaR2qMbchmo3ruQh62Z13chpP2MTO+v3YqBPziPeJP3wH2d2VofanzG0Ka6MEgT32RF84HwFAsmqKS6YEipwtjVaMS76UvZc1hhhXbO2lFLpatBb06Y3imgUng3ZNa0exXXE8gcZuY3n8hPkl0iw+vH40cm07ZwokCtrYs98mPwoQGmGc99T2UripJzPt2lN9BKmu5nFxVs5skunKg5yMvgclvNxzznpjkuf7zocpoRBNyQiT2hr7ZoltHYmP+2KdFlSiRcy1uLqYugttyflWmCrDt6OvkfLPrDfVrBS9Pevq/PDxRwaLYqhmAPrD0L5bV+IeXkmupMYoJ3McbiV/+otU3pYdHdoK5i78VjucxOLIrYSxsGXEOuphbzMopwwynlf3KDMndY2CSa+aVsthsF3Ogm5NHtqIKpjJ1rdHj/5TaQWZlFC2VQfli4sRVlGmcM9Ys46QiNm/qOP/+VCc2FjhIry5IqcLs2rizYbZXD6Tv/WEXzL/pHcl+/9zdS8kgtQSKjTCSehngy0cLDhTv7D02vh+XOV4K0tgDUuBgkQfnODQ4+IMXmeUonP6xb+hvaiscTBczgNyzPhwP2AwcDkBWa2E=";
byte[] decodeByte = RSAUtils.decryptBASE64(signbypub);
String decodeStr = new String(RSAUtils.decryptByPrivateKeyLongText(decodeByte,RSAUtils.private_key));
System.out.println("-----------公钥------------");
System.out.println(publicKey);
System.out.println("长度:"+publicKey.length());
System.out.println("-----------私钥------------");
System.out.println(privateKey);
System.out.println("长度:"+privateKey.length());
System.out.println("-----------公钥加密------------");
System.out.println(signbypub);
System.out.println("长度:"+signbypub.length());
System.out.println("-----------私钥解密------------");
System.out.println(decodeStr);
System.out.println("长度:"+decodeStr.length());
System.out.println(MAX_ENCRYPT_BLOCK);
System.out.println(MAX_DECRYPT_BLOCK);
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -0,0 +1,4 @@
package com.rehome.mqtt01.rsa;
public class RSAUtilsJavaToDotNet {
}

@ -0,0 +1,175 @@
package com.rehome.mqtt01.ssl;
/**
* @author huangwenfei
* @version v1.0.0.0
* Created DateTime 2021-07-31 14:52
* @description: mqtt 线
*/
import org.apache.commons.io.FileUtils;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.io.File;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class MqttSSLPublishServer {
/**
* ip
*/
private final String HOST = "ssl://39.101.173.20:8883";
/**
*
*/
private final String topic = "push";
/**
* 线
*/
private String clientid = "v1_server_ssl_002";
private MqttClient client;
private MqttConnectOptions options;
/**
* MQTT
*/
private final String userName = "admin";
/**
* MQTT
*/
private final String passWord = "public";
/**
*
* 0<=1
* 1>=1
* 2=1
*/
private int qos = 2;
// 推送消息
private MqttMessage message;
//定时器
private Timer timer;
public MqttSSLPublishServer() {
// host为主机名clientid即连接MQTT的客户端ID一般以唯一标识符表示MemoryPersistence设置clientid的保存形式默认为以内存保存
try {
client = new MqttClient(HOST, clientid, new MemoryPersistence());
// MQTT的连接设置
options = new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(true);
// 设置连接的用户名
options.setUserName(userName);
// 设置连接的密码
options.setPassword(passWord.toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线但这个方法并没有重连的机制
options.setKeepAliveInterval(20);
//双向验证
InputStream inputStream1 = MqttSSLPublishServer.class.getClassLoader().getResourceAsStream("ssl_two_dir/client.pem");
InputStream inputStream2 = MqttSSLPublishServer.class.getClassLoader().getResourceAsStream("ssl_two_dir/client.key");
InputStream inputStream3 = MqttSSLPublishServer.class.getClassLoader().getResourceAsStream("ssl_two_dir/my_root_ca.pem");
File caClientFile = new File("client.pem");
File keyClientFile = new File("client.key");
File caServerFile = new File("my_root_ca.pem");
// 使用common-io的工具类即可转换
FileUtils.copyToFile(inputStream1,caClientFile);
// 使用common-io的工具类即可转换
FileUtils.copyToFile(inputStream2,keyClientFile);
// 使用common-io的工具类即可转换
FileUtils.copyToFile(inputStream3,caServerFile);
System.err.println("path4" + caClientFile.getAbsolutePath());
System.err.println("path4" + keyClientFile.getAbsolutePath());
System.err.println("path4" + caServerFile.getAbsolutePath());
options.setSocketFactory(SslUtil.getSocketFactory(caServerFile.getAbsolutePath(),
caClientFile.getAbsolutePath(), keyClientFile.getAbsolutePath(), ""));
// 发布目的消息对象
message = new MqttMessage();
// 设置回调
client.setCallback(new MqttCallback() {
public void connectionLost(Throwable cause) {
System.out.println("connectionLost---------");
stop();//关闭
}
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println("***** get message start *****");
System.out.println(new Date());
System.out.println("topic:" + topic);
System.out.println("Qos:" + message.getQos());
System.out.println("message:" + new String(message.getPayload()));
System.out.println("***** get message end *****");
System.out.println();
}
public void deliveryComplete(IMqttDeliveryToken token) {
System.out.println("deliveryComplete---------" + token.isComplete());
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public void start() {
try {
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------设定要指定任务--------");
message.setQos(qos);
message.setRetained(true);
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = "message from server->:"+clientid+"->:"+sd.format(new Date());
message.setPayload(time.getBytes());
try {
//判断拦截状态,这里注意一下,如果没有这个判断,是非常坑的
if (!client.isConnected()) {
System.out.println("***** 没有连接到服务器 *****");
System.out.println("***** client to connect *****");
// 重新连接
client.connect(options);
}
if (client.isConnected()) {//连接成功,跳出连接
System.out.println("***** connect success *****");
System.out.println(time);
// 发布消息
client.publish(topic, message);
}
} catch (MqttException e1) {
e1.printStackTrace();
}
}
}, 10000,10000);
// 设定指定的时间time,此处为10000毫秒
} catch (Exception e) {
e.printStackTrace();
}
}
public void stop() {
try {
// 断开连接
client.disconnect();
// 关闭客户端
client.close();
} catch (MqttException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// 推送消息
MqttSSLPublishServer mqttPublishServer = new MqttSSLPublishServer();
mqttPublishServer.start();
}
}

@ -0,0 +1,487 @@
package com.rehome.mqtt01.ssl;
import org.apache.commons.io.FileUtils;
import org.apache.http.util.TextUtils;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.util.ClassUtils;
import org.springframework.util.ResourceUtils;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimerTask;
import java.util.Timer;
public class MqttSslAsyncClient extends JFrame implements ActionListener {
private JPanel contentPane;
private Font useFont = new Font("微软雅黑", Font.BOLD, 12);
private JFormattedTextField frmserverIP;
private JFormattedTextField username;
private JButton button_connect;
private JButton button_disconnect;
private JFormattedTextField toptic_input;
private JFormattedTextField toptic_titile;
private JFormattedTextField send_msg_text;
private JLabel err_infoText;
private JComboBox<String> comboBox;
private JButton sendbutton;
private JTextArea msgtextArea;
private String brokerIP;
private String clientId;
private String msgContent;
private String msgSendContent;
private String sub_topic, pub_topic;
private Boolean isSubject = false;
private Boolean isConnetc = false;
private Timer timer;
/**
*
* 0<=1
* 1>=1
* 2=1
*/
private int qos = 0;
private MqttAsyncClient sampleClient;
private MqttConnectOptions connOpts;
private String infoList = "";
private JButton subbutton;
private JButton noSubbutton;
/**
* MQTT
*/
private final String userName = "admin";
/**
* MQTT
*/
private final String passWord = "public";
public MqttSslAsyncClient() {
// 设置窗体大小位置
setBounds(100, 100, 484, 439);
setTitle("MQTT客户端");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(null);
setContentPane(contentPane);
//添加控件
JLabel lblMqtt = new JLabel("MQTT服务器地址:");
lblMqtt.setFont(useFont);
lblMqtt.setBounds(30, 10, 109, 15);
contentPane.add(lblMqtt);
frmserverIP = new JFormattedTextField();
frmserverIP.setText("ssl://192.168.2.111:8883");
frmserverIP.setBounds(139, 7, 258, 21);
contentPane.add(frmserverIP);
JLabel lblNewLabel = new JLabel("用户名:");
lblNewLabel.setFont(useFont);
lblNewLabel.setBounds(40, 41, 54, 15);
contentPane.add(lblNewLabel);
username = new JFormattedTextField();
username.setText("v1_server_timemqtt_ssl");
username.setBounds(139, 38, 199, 21);
contentPane.add(username);
button_connect = new JButton("连 接");
button_connect.setBounds(30, 66, 93, 23);
button_connect.setFont(useFont);
button_connect.addActionListener(this);
button_connect.setActionCommand("connect");
contentPane.add(button_connect);
button_disconnect = new JButton("断 开");
button_disconnect.setEnabled(false);
button_disconnect.setFont(useFont);
button_disconnect.addActionListener(this);
button_disconnect.setActionCommand("disconnect");
button_disconnect.setBounds(263, 66, 93, 23);
contentPane.add(button_disconnect);
JLabel label = new JLabel("订阅主题:");
label.setBounds(40, 111, 83, 15);
label.setFont(useFont);
contentPane.add(label);
toptic_input = new JFormattedTextField();
toptic_input.setText("push");
toptic_input.setBounds(100, 108, 99, 21);
contentPane.add(toptic_input);
JSeparator separator = new JSeparator();
separator.setBackground(Color.GREEN);
separator.setBounds(30, 99, 367, 2);
contentPane.add(separator);
subbutton = new JButton("订 阅");
subbutton.setFont(useFont);
subbutton.addActionListener(this);
subbutton.setActionCommand("sub");
subbutton.setBounds(193, 107, 83, 23);
contentPane.add(subbutton);
noSubbutton = new JButton("取消订阅");
noSubbutton.setFont(useFont);
noSubbutton.addActionListener(this);
noSubbutton.setActionCommand("noSub");
noSubbutton.setBounds(276, 107, 83, 23);
noSubbutton.setEnabled(false);
contentPane.add(noSubbutton);
JSeparator separator_1 = new JSeparator();
separator_1.setBounds(30, 139, 367, 2);
contentPane.add(separator_1);
JLabel label_1 = new JLabel("发布消息");
label_1.setFont(useFont);
label_1.setBounds(40, 151, 60, 15);
contentPane.add(label_1);
JLabel label_2 = new JLabel("主题");
label_2.setFont(useFont);
label_2.setBounds(104, 151, 30, 15);
contentPane.add(label_2);
toptic_titile = new JFormattedTextField();
toptic_titile.setText("push");
toptic_titile.setBounds(139, 148, 99, 21);
contentPane.add(toptic_titile);
JLabel label_3 = new JLabel("服务质量");
label_3.setFont(useFont);
label_3.setBounds(248, 151, 64, 15);
contentPane.add(label_3);
comboBox = new JComboBox<String>();
comboBox.setBounds(305, 148, 64, 21);
comboBox.addItem("0");
comboBox.addItem("1");
comboBox.addItem("2");
comboBox.setSelectedItem("2");
contentPane.add(comboBox);
JLabel label_send = new JLabel("发布的消息内容");
label_send.setFont(useFont);
label_send.setBounds(40, 181, 100, 15);
contentPane.add(label_send);
send_msg_text = new JFormattedTextField();
send_msg_text.setText("MQTT客户端 发送消息 -->");
send_msg_text.setBounds(140, 179, 220, 21);
contentPane.add(send_msg_text);
sendbutton = new JButton("发 送");
sendbutton.setBounds(46, 378, 93, 23);
sendbutton.addActionListener(this);
sendbutton.setActionCommand("send");
contentPane.add(sendbutton);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(40, 219, 316, 149);
contentPane.add(scrollPane);
msgtextArea = new JTextArea();
scrollPane.setViewportView(msgtextArea);
err_infoText = new JLabel("");
err_infoText.setForeground(Color.RED);
err_infoText.setBounds(134, 69, 131, 15);
err_infoText.setFont(useFont);
contentPane.add(err_infoText);
JButton btnClear = new JButton("clear");
btnClear.setBounds(209, 378, 93, 23);
btnClear.addActionListener(this);
btnClear.setActionCommand("clear");
contentPane.add(btnClear);
}
private void start() {
try {
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------设定要指定任务--------");
if (isConnetc == true) {
try {
//判断拦截状态,这里注意一下,如果没有这个判断,是非常坑的
if (!sampleClient.isConnected()) {
System.out.println("***** 没有连接到服务器 *****");
System.out.println("***** client to connect *****");
// 重新连接
sampleClient.connect(connOpts);
}
if (sampleClient.isConnected()) {//连接成功,跳出连接
System.out.println("***** connect success *****");
System.out.println("Connected");
err_infoText.setText("已连接");
button_disconnect.setEnabled(true);
button_connect.setEnabled(false);
if (isSubject == true) {
try {
sampleClient.subscribe(sub_topic, qos);
subbutton.setEnabled(false);
noSubbutton.setEnabled(true);
} catch (MqttException e1) {
e1.printStackTrace();
}
}
}
} catch (MqttException e1) {
e1.printStackTrace();
}
}
}
}, 10000,10000);// 设定指定的时间time,此处为10000毫秒
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
String qosString = comboBox.getSelectedItem().toString();
qos = Integer.valueOf(qosString);
if (command.equals("connect")) {
MemoryPersistence persistence = new MemoryPersistence();
try {
brokerIP = frmserverIP.getText();
clientId = username.getText();
if (TextUtils.isEmpty(brokerIP)) {
err_infoText.setText("输入服务器地址");
return;
}
if (TextUtils.isEmpty(clientId)) {
err_infoText.setText("输入ID");
return;
}
sampleClient = new MqttAsyncClient(brokerIP, clientId, persistence);
connOpts = new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录这里设置为true表示每次连接到服务器都以新的身份连接
connOpts.setCleanSession(true);
// 设置连接的用户名
connOpts.setUserName(userName);
// 设置连接的密码
connOpts.setPassword(passWord.toCharArray());
// 设置超时时间 单位为秒
connOpts.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线但这个方法并没有重连的机制
connOpts.setKeepAliveInterval(20);
System.out.println("Connecting to broker: " + brokerIP);
//服务端单向验证
// Resource caClientResource = new ClassPathResource("ssl/client.crt");
// Resource keyClientResource = new ClassPathResource("ssl/client.key");
// Resource caServerResource = new ClassPathResource("ssl/my_root_ca.pem");
//
// System.err.println("path4" + caClientResource.getFile().getAbsolutePath());
// System.err.println("path4" + keyClientResource.getFile().getAbsolutePath());
// System.err.println("path4" + caServerResource.getFile().getAbsolutePath());
//connOpts.setSocketFactory(SslUtil.getSocketFactorySingleByCrt(caServerResource.getFile().getAbsolutePath()));
//connOpts.setSocketFactory(SslUtil.getSocketFactorySingleByPem(caServerResource.getFile().getAbsolutePath()));
//双向验证
InputStream inputStream1 = MqttSslAsyncClient.class.getClassLoader().getResourceAsStream("ssl/client.pem");
InputStream inputStream2 = MqttSslAsyncClient.class.getClassLoader().getResourceAsStream("ssl/client.key");
InputStream inputStream3 = MqttSslAsyncClient.class.getClassLoader().getResourceAsStream("ssl/my_root_ca.pem");
File caClientFile = new File("client.pem");
File keyClientFile = new File("client.key");
File caServerFile = new File("my_root_ca.pem");
// 使用common-io的工具类即可转换
FileUtils.copyToFile(inputStream1,caClientFile);
// 使用common-io的工具类即可转换
FileUtils.copyToFile(inputStream2,keyClientFile);
// 使用common-io的工具类即可转换
FileUtils.copyToFile(inputStream3,caServerFile);
System.err.println("path4" + caClientFile.getAbsolutePath());
System.err.println("path4" + keyClientFile.getAbsolutePath());
System.err.println("path4" + caServerFile.getAbsolutePath());
connOpts.setSocketFactory(SslUtil.getSocketFactory(caServerFile.getAbsolutePath(),
caClientFile.getAbsolutePath(), keyClientFile.getAbsolutePath(), ""));
sampleClient.connect(connOpts);
System.out.println("Connected");
err_infoText.setText("已连接");
button_disconnect.setEnabled(true);
button_connect.setEnabled(false);
isConnetc = true;
sampleClient.setCallback(new MqttCallback() {
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
String msg = new String(message.getPayload());
System.out.println("接收消息主题 : " + topic);
System.out.println("接收消息Qos : " + message.getQos());
System.out.println("接收消息内容 : " + message.toString());
System.out.println("接收消息id : " + message.getId());
String info = message.toString();
infoList += info + "\n";
msgtextArea.setText(infoList);
}
@Override
public void deliveryComplete(IMqttDeliveryToken arg0) {
System.out.println("deliveryComplete---------" + arg0.isComplete());
}
@Override
public void connectionLost(Throwable err) {
// 断开连接
try {
sampleClient.disconnect();
// 关闭客户端
sampleClient.close();
} catch (MqttException mqttException) {
mqttException.printStackTrace();
}
err_infoText.setText("连接丢失");
button_connect.setEnabled(true);
button_disconnect.setEnabled(false);
System.out.println("连接丢失");
System.out.println(err.getMessage());
}
});
} catch (MqttException me) {
System.out.println("reason " + me.getReasonCode());
System.out.println("msg " + me.getMessage());
System.out.println("loc " + me.getLocalizedMessage());
System.out.println("cause " + me.getCause());
System.out.println("excep " + me);
err_infoText.setText("hi:" + me.getMessage());
button_disconnect.setEnabled(false);
button_connect.setEnabled(true);
me.printStackTrace();
} catch (Exception exception) {
exception.printStackTrace();
}
} else if (command.equals("sub")) {
sub_topic = toptic_input.getText();
if (TextUtils.isEmpty(sub_topic)) {
err_infoText.setText("输入订阅主题");
return;
}
try {
sampleClient.subscribe(sub_topic, qos);
subbutton.setEnabled(false);
noSubbutton.setEnabled(true);
isSubject = true;
toptic_input.setEnabled(false);
} catch (MqttException e1) {
e1.printStackTrace();
}
} else if (command.equals("noSub")) {
sub_topic = toptic_input.getText();
if (TextUtils.isEmpty(sub_topic)) {
err_infoText.setText("输入订阅主题");
return;
}
try {
sampleClient.unsubscribe(sub_topic);
subbutton.setEnabled(true);
noSubbutton.setEnabled(false);
isSubject = false;
toptic_input.setEnabled(true);
} catch (MqttException e1) {
e1.printStackTrace();
}
} else if (command.equals("send")) {
pub_topic = toptic_titile.getText();
msgSendContent = send_msg_text.getText();
if (TextUtils.isEmpty(pub_topic)) {
err_infoText.setText("输入发送主题");
return;
}
if (TextUtils.isEmpty(msgSendContent)) {
err_infoText.setText("输入消息内容");
return;
}
MqttMessage message = new MqttMessage(msgSendContent.getBytes());
message.setQos(qos);
try {
sampleClient.publish(pub_topic, message);
} catch (MqttException e1) {
e1.printStackTrace();
err_infoText.setText(e1.getMessage());
}
} else if (command.equals("clear")) {
msgtextArea.setText("");
infoList = "";
} else if (command.equals("disconnect")) {
if (sampleClient != null) {
try {
// 断开连接
sampleClient.disconnect();
// 关闭客户端
sampleClient.close();
button_connect.setEnabled(true);
button_disconnect.setEnabled(false);
subbutton.setEnabled(true);
noSubbutton.setEnabled(false);
toptic_input.setEnabled(true);
isConnetc = false;
err_infoText.setText("已断开");
isSubject = false;
} catch (MqttException e1) {
e1.printStackTrace();
}
}
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MqttSslAsyncClient frame = new MqttSslAsyncClient();
frame.setVisible(true);
frame.start();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save