new features 04/12/2024
This commit is contained in:
52
.idea/artifacts/SIPIntercom_jar.xml
generated
Normal file
52
.idea/artifacts/SIPIntercom_jar.xml
generated
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<component name="ArtifactManager">
|
||||||
|
<artifact type="jar" name="SIPIntercom:jar">
|
||||||
|
<output-path>$PROJECT_DIR$/out/artifacts/SIPIntercom_jar</output-path>
|
||||||
|
<root id="archive" name="SIPIntercom.jar">
|
||||||
|
<element id="module-output" name="SIPIntercom" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/tinylog/tinylog/1.3.6/tinylog-1.3.6.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/javalin/javalin/4.6.8/javalin-4.6.8.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/jetty-server/9.4.51.v20230217/jetty-server-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/javax/servlet/javax.servlet-api/3.1.0/javax.servlet-api-3.1.0.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/jetty-http/9.4.51.v20230217/jetty-http-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/jetty-util/9.4.51.v20230217/jetty-util-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/jetty-io/9.4.51.v20230217/jetty-io-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/jetty-webapp/9.4.51.v20230217/jetty-webapp-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/jetty-xml/9.4.51.v20230217/jetty-xml-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/jetty-servlet/9.4.51.v20230217/jetty-servlet-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/jetty-security/9.4.51.v20230217/jetty-security-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/jetty-util-ajax/9.4.51.v20230217/jetty-util-ajax-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/websocket/websocket-server/9.4.51.v20230217/websocket-server-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/websocket/websocket-common/9.4.51.v20230217/websocket-common-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/websocket/websocket-api/9.4.51.v20230217/websocket-api-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/websocket/websocket-client/9.4.51.v20230217/websocket-client-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/jetty-client/9.4.51.v20230217/jetty-client-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/eclipse/jetty/websocket/websocket-servlet/9.4.51.v20230217/websocket-servlet-9.4.51.v20230217.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.5.32/kotlin-stdlib-jdk8-1.5.32.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib/1.5.32/kotlin-stdlib-1.5.32.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/annotations/13.0/annotations-13.0.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-common/1.5.32/kotlin-stdlib-common-1.5.32.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.5.32/kotlin-stdlib-jdk7-1.5.32.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/net/java/dev/jna/jna/5.6.0/jna-5.6.0.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/corundumstudio/socketio/netty-socketio/2.0.12/netty-socketio-2.0.12.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-buffer/4.1.114.Final/netty-buffer-4.1.114.Final.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-common/4.1.114.Final/netty-common-4.1.114.Final.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-transport/4.1.114.Final/netty-transport-4.1.114.Final.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-resolver/4.1.114.Final/netty-resolver-4.1.114.Final.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-handler/4.1.114.Final/netty-handler-4.1.114.Final.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-transport-native-unix-common/4.1.114.Final/netty-transport-native-unix-common-4.1.114.Final.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-codec-http/4.1.114.Final/netty-codec-http-4.1.114.Final.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-codec/4.1.114.Final/netty-codec-4.1.114.Final.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/2.0.16/slf4j-api-2.0.16.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.18.1/jackson-core-2.18.1.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.18.1/jackson-databind-2.18.1.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.18.1/jackson-annotations-2.18.1.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-transport-native-epoll/4.1.114.Final/netty-transport-native-epoll-4.1.114.Final-linux-x86_64.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-transport-classes-epoll/4.1.114.Final/netty-transport-classes-epoll-4.1.114.Final.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/io/netty/netty-transport-native-epoll/4.1.114.Final/netty-transport-native-epoll-4.1.114.Final-linux-aarch_64.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/projectlombok/lombok/1.18.36/lombok-1.18.36.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.11.0/gson-2.11.0.jar" path-in-jar="/" />
|
||||||
|
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/google/errorprone/error_prone_annotations/2.27.0/error_prone_annotations-2.27.0.jar" path-in-jar="/" />
|
||||||
|
</root>
|
||||||
|
</artifact>
|
||||||
|
</component>
|
||||||
14
.idea/deployment.xml
generated
Normal file
14
.idea/deployment.xml
generated
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="PublishConfigData" serverName="192.168.10.35" remoteFilesAllowedToDisappearOnAutoupload="false">
|
||||||
|
<serverData>
|
||||||
|
<paths name="192.168.10.35">
|
||||||
|
<serverdata>
|
||||||
|
<mappings>
|
||||||
|
<mapping local="$PROJECT_DIR$" web="/" />
|
||||||
|
</mappings>
|
||||||
|
</serverdata>
|
||||||
|
</paths>
|
||||||
|
</serverData>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
25
.idea/libraries/corundumstudio_socketio_netty.xml
generated
Normal file
25
.idea/libraries/corundumstudio_socketio_netty.xml
generated
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<component name="libraryTable">
|
||||||
|
<library name="corundumstudio.socketio.netty" type="repository">
|
||||||
|
<properties maven-id="com.corundumstudio.socketio:netty-socketio:2.0.12" />
|
||||||
|
<CLASSES>
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/com/corundumstudio/socketio/netty-socketio/2.0.12/netty-socketio-2.0.12.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-buffer/4.1.114.Final/netty-buffer-4.1.114.Final.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-common/4.1.114.Final/netty-common-4.1.114.Final.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport/4.1.114.Final/netty-transport-4.1.114.Final.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-resolver/4.1.114.Final/netty-resolver-4.1.114.Final.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-handler/4.1.114.Final/netty-handler-4.1.114.Final.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport-native-unix-common/4.1.114.Final/netty-transport-native-unix-common-4.1.114.Final.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-codec-http/4.1.114.Final/netty-codec-http-4.1.114.Final.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-codec/4.1.114.Final/netty-codec-4.1.114.Final.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/2.0.16/slf4j-api-2.0.16.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.18.1/jackson-core-2.18.1.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.18.1/jackson-databind-2.18.1.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.18.1/jackson-annotations-2.18.1.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport-native-epoll/4.1.114.Final/netty-transport-native-epoll-4.1.114.Final-linux-x86_64.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport-classes-epoll/4.1.114.Final/netty-transport-classes-epoll-4.1.114.Final.jar!/" />
|
||||||
|
<root url="jar://$MAVEN_REPOSITORY$/io/netty/netty-transport-native-epoll/4.1.114.Final/netty-transport-native-epoll-4.1.114.Final-linux-aarch_64.jar!/" />
|
||||||
|
</CLASSES>
|
||||||
|
<JAVADOC />
|
||||||
|
<SOURCES />
|
||||||
|
</library>
|
||||||
|
</component>
|
||||||
14
.idea/webServers.xml
generated
Normal file
14
.idea/webServers.xml
generated
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="WebServers">
|
||||||
|
<option name="servers">
|
||||||
|
<webServer id="610211eb-605e-4cac-85d6-11044ffa9537" name="192.168.10.35">
|
||||||
|
<fileTransfer rootFolder="/home/pi" accessType="SFTP" host="192.168.10.35" port="22" sshConfigId="0f3a4fce-ffbb-4b34-8d8e-21a84edbfd18" sshConfig="pi@192.168.10.35:22 password">
|
||||||
|
<advancedOptions>
|
||||||
|
<advancedOptions dataProtectionLevel="Private" keepAliveTimeout="0" passiveMode="true" shareSSLContext="true" />
|
||||||
|
</advancedOptions>
|
||||||
|
</fileTransfer>
|
||||||
|
</webServer>
|
||||||
|
</option>
|
||||||
|
</component>
|
||||||
|
</project>
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
WebUsername=admin
|
WebUsername=admin
|
||||||
WebPassword=admin
|
WebPassword=admin
|
||||||
WebListenPort = 8080
|
WebListenPort = 8080
|
||||||
SipServer=100.64.0.3
|
SipServer=rdkartono.ddns.me
|
||||||
SipUsername=100
|
SipPort=5060
|
||||||
SipPassword=12345678
|
SipUsername=101
|
||||||
|
SipPassword=password101
|
||||||
@@ -15,5 +15,6 @@
|
|||||||
<orderEntry type="library" name="google.code.gson" level="project" />
|
<orderEntry type="library" name="google.code.gson" level="project" />
|
||||||
<orderEntry type="library" name="projectlombok.lombok" level="project" />
|
<orderEntry type="library" name="projectlombok.lombok" level="project" />
|
||||||
<orderEntry type="library" name="tinylog" level="project" />
|
<orderEntry type="library" name="tinylog" level="project" />
|
||||||
|
<orderEntry type="library" name="corundumstudio.socketio.netty" level="project" />
|
||||||
</component>
|
</component>
|
||||||
</module>
|
</module>
|
||||||
3
libs/META-INF/MANIFEST.MF
Normal file
3
libs/META-INF/MANIFEST.MF
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Main-Class: Main
|
||||||
|
|
||||||
377
src/Main.java
377
src/Main.java
@@ -1,25 +1,23 @@
|
|||||||
import SBC.GpioInput;
|
import SBC.*;
|
||||||
import SBC.GpioOutput;
|
|
||||||
import SBC.NanopiDuo2;
|
|
||||||
import SIP.SIP_Request;
|
import SIP.SIP_Request;
|
||||||
import SIP.SIP_Response;
|
import SIP.SIP_Response;
|
||||||
import SIP.jSIPClient;
|
import SIP.jSIPClient;
|
||||||
import SIP.javaSipEvents;
|
import SIP.javaSipEvents;
|
||||||
import Webpage.WebServer;
|
import Webpage.*;
|
||||||
import code.common;
|
import code.common;
|
||||||
|
import com.google.gson.JsonSyntaxException;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.text.MessageFormat;
|
import java.text.MessageFormat;
|
||||||
import java.util.Properties;
|
import java.util.*;
|
||||||
import java.util.Timer;
|
|
||||||
import java.util.TimerTask;
|
|
||||||
|
|
||||||
import static code.common.currentDir;
|
import static code.common.*;
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
private static jSIPClient client;
|
private static jSIPClient client;
|
||||||
private static WebServer webserver;
|
private static WebServer webserver;
|
||||||
|
private static SocketioServer socketioserver;
|
||||||
private static GpioInput callButton;
|
private static GpioInput callButton;
|
||||||
private static GpioInput hangupButton;
|
private static GpioInput hangupButton;
|
||||||
private static GpioOutput pilotLight;
|
private static GpioOutput pilotLight;
|
||||||
@@ -27,12 +25,21 @@ public class Main {
|
|||||||
private static GpioOutput callLight;
|
private static GpioOutput callLight;
|
||||||
private static GpioOutput Buzzer;
|
private static GpioOutput Buzzer;
|
||||||
private static Timer timer;
|
private static Timer timer;
|
||||||
|
private static Timer system_monitoring_timer;
|
||||||
private static TimerTask callLightTask;
|
private static TimerTask callLightTask;
|
||||||
private static TimerTask BuzzerTask;
|
private static TimerTask BuzzerTask;
|
||||||
private static SIP_Request incomingRequest;
|
private static SIP_Request incomingRequest;
|
||||||
private static SIP_Request oncallRequest;
|
private static SIP_Request oncallRequest;
|
||||||
private static SIP_Response incomingResponse;
|
private static SIP_Response incomingResponse;
|
||||||
private static SIP_Response oncallResponse;
|
private static SIP_Response oncallResponse;
|
||||||
|
private static String SipStatus = "Idle";
|
||||||
|
private static int cpuTemperature;
|
||||||
|
private static RamInformation ramInformation;
|
||||||
|
private static ProcessorStatus[] previousCpuInfo;
|
||||||
|
private static final Map<String, Integer> cpuUsage = new HashMap<>();
|
||||||
|
private static NetworkTransmitReceiveInfo[] previousNetworkInfo;
|
||||||
|
private static final Map<String, String> networkTX = new HashMap<>();
|
||||||
|
private static final Map<String, String> networkRX = new HashMap<>();
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
common.ExtractProperties(currentDir,"config.properties", false);
|
common.ExtractProperties(currentDir,"config.properties", false);
|
||||||
@@ -40,18 +47,6 @@ public class Main {
|
|||||||
|
|
||||||
// Timer Section
|
// Timer Section
|
||||||
timer = new Timer();
|
timer = new Timer();
|
||||||
callLightTask = new TimerTask() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (callLight!=null && callLight.isInitialized()) callLight.BlinkON(100);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
BuzzerTask = new TimerTask() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (Buzzer!=null && Buzzer.isInitialized()) Buzzer.BlinkON(500);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// SIP Section
|
// SIP Section
|
||||||
client = new jSIPClient(config);
|
client = new jSIPClient(config);
|
||||||
@@ -61,6 +56,7 @@ public class Main {
|
|||||||
Logger.info("Registering to SIP Server, Request: {}",req);
|
Logger.info("Registering to SIP Server, Request: {}",req);
|
||||||
Buzzer_Off();
|
Buzzer_Off();
|
||||||
callLight_Registering();
|
callLight_Registering();
|
||||||
|
SipStatus = "Registering";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -68,12 +64,16 @@ public class Main {
|
|||||||
Logger.info("Registered to SIP Server, Response: {}",resp);
|
Logger.info("Registered to SIP Server, Response: {}",resp);
|
||||||
Buzzer_Off();
|
Buzzer_Off();
|
||||||
callLight_Idle();
|
callLight_Idle();
|
||||||
|
Logger.info("Calling callLight idle from RegisterSuccesful");
|
||||||
|
SipStatus = "Idle";
|
||||||
|
CallTest("100");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void RegisterFailed(SIP_Response resp) {
|
public void RegisterFailed(SIP_Response resp) {
|
||||||
Logger.info("Failed to register to SIP Server, Response: {}",resp);
|
Logger.info("Failed to register to SIP Server, Response: {}",resp);
|
||||||
Buzzer_Off();
|
Buzzer_Off();
|
||||||
|
SipStatus = "Register Failed";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -85,6 +85,7 @@ public class Main {
|
|||||||
incomingResponse = resp;
|
incomingResponse = resp;
|
||||||
oncallRequest = null;
|
oncallRequest = null;
|
||||||
oncallResponse = null;
|
oncallResponse = null;
|
||||||
|
SipStatus = "Incoming Call from "+req.CallID;
|
||||||
//client.AcceptIncomingCall(req);
|
//client.AcceptIncomingCall(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,9 +93,11 @@ public class Main {
|
|||||||
public void RemoteHangUp(SIP_Request req) {
|
public void RemoteHangUp(SIP_Request req) {
|
||||||
Logger.info("Remote Hangup, Request: {}",req);
|
Logger.info("Remote Hangup, Request: {}",req);
|
||||||
callLight_Idle();
|
callLight_Idle();
|
||||||
|
Logger.info("Calling callLight idle from RemoteHangUp");
|
||||||
Buzzer_Off();
|
Buzzer_Off();
|
||||||
|
|
||||||
client.HangUp();
|
client.HangUp();
|
||||||
|
SipStatus = "Remote Hangup from "+req.CallID;
|
||||||
incomingRequest = null;
|
incomingRequest = null;
|
||||||
incomingResponse = null;
|
incomingResponse = null;
|
||||||
oncallRequest = null;
|
oncallRequest = null;
|
||||||
@@ -105,79 +108,144 @@ public class Main {
|
|||||||
@Override
|
@Override
|
||||||
public void Ringing(SIP_Response resp) {
|
public void Ringing(SIP_Response resp) {
|
||||||
Logger.info("Ringing, Response: {}",resp);
|
Logger.info("Ringing, Response: {}",resp);
|
||||||
|
SipStatus = "Incoming Call from "+resp.CallID;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void CalleePickup(SIP_Response resp) {
|
public void CalleePickup(SIP_Response resp) {
|
||||||
Logger.info("Callee Pickup, Response: {}",resp);
|
Logger.info("Callee Pickup, Response: {}",resp);
|
||||||
|
SipStatus = "Communication with "+resp.CallID;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ReconnectSIP();
|
client.Connect();
|
||||||
|
|
||||||
|
|
||||||
// Web Server Section
|
// Web Server Section
|
||||||
webserver = new WebServer(config);
|
webserver = new WebServer(config);
|
||||||
webserver.Start();
|
webserver.Start();
|
||||||
|
socketioserver = new SocketioServer("0.0.0.0", 9092);
|
||||||
|
socketioserver.Start();
|
||||||
|
socketioserver.setOnRequest(req ->{
|
||||||
|
// Ada request dari web
|
||||||
|
SocketioResponse resp;
|
||||||
|
if (networkLight!=null && networkLight.isInitialized()) networkLight.BlinkON(100);
|
||||||
|
|
||||||
|
switch(req.getRequest()){
|
||||||
|
case "setLogin":
|
||||||
|
try{
|
||||||
|
LoginSetting login = gson.fromJson(req.getData(), LoginSetting.class);
|
||||||
|
if (ValidString(login.Username) && ValidString(login.Password)){
|
||||||
|
config.setProperty("WebUsername", login.Username);
|
||||||
|
config.setProperty("WebPassword", login.Password);
|
||||||
|
if (SaveProperties(currentDir,"config.properties",config)){
|
||||||
|
resp = new SocketioResponse("success", "Login Setting");
|
||||||
|
} else throw new Exception("Failed to save properties");
|
||||||
|
} else throw new Exception("Invalid Username or Password");
|
||||||
|
} catch (JsonSyntaxException e){
|
||||||
|
resp = new SocketioResponse("error", "Invalid JSON");
|
||||||
|
} catch (Exception e){
|
||||||
|
resp = new SocketioResponse("error", e.getMessage());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "getLogin":
|
||||||
|
resp = SocketioResponse.fromLoginSetting("success", new LoginSetting(config.getProperty("WebUsername"), config.getProperty("WebPassword")));
|
||||||
|
break;
|
||||||
|
case "setSipSetting":
|
||||||
|
try{
|
||||||
|
SipSetting sip = gson.fromJson(req.getData(), SipSetting.class);
|
||||||
|
if (ValidString(sip.Server) && ValidString(sip.Username) && ValidString(sip.Password)){
|
||||||
|
config.setProperty("SipServer", sip.Server);
|
||||||
|
config.setProperty("SipPort", String.valueOf(sip.Port));
|
||||||
|
config.setProperty("SipUsername", sip.Username);
|
||||||
|
config.setProperty("SipPassword", sip.Password);
|
||||||
|
if (SaveProperties(currentDir,"config.properties",config)){
|
||||||
|
resp = new SocketioResponse("success", "SIP Setting");
|
||||||
|
} else throw new Exception("Failed to save properties");
|
||||||
|
} else throw new Exception("Invalid SIP Setting");
|
||||||
|
} catch (JsonSyntaxException e){
|
||||||
|
resp = new SocketioResponse("error", "Invalid JSON");
|
||||||
|
} catch (Exception e){
|
||||||
|
resp = new SocketioResponse("error", e.getMessage());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "getSipSetting":
|
||||||
|
resp = SocketioResponse.fromSipSetting("success", new SipSetting(config.getProperty("SipServer"), Integer.parseInt(config.getProperty("SipPort")), config.getProperty("SipUsername"), config.getProperty("SipPassword")));
|
||||||
|
break;
|
||||||
|
case "getSipStatus":
|
||||||
|
resp = new SocketioResponse("success", SipStatus);
|
||||||
|
break;
|
||||||
|
case "hangup":
|
||||||
|
if (incomingRequest!=null){
|
||||||
|
resp = new SocketioResponse("success", "Reject Incoming Call from "+incomingRequest.CallID);
|
||||||
|
hangupCall();
|
||||||
|
} else if (oncallRequest!=null){
|
||||||
|
resp = new SocketioResponse("success", "Hangup Call to "+oncallRequest.CallID);
|
||||||
|
hangupCall();
|
||||||
|
} else {
|
||||||
|
resp = new SocketioResponse("error", "No Call to Hangup");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "getRamInfo":
|
||||||
|
if (ramInformation!=null){
|
||||||
|
resp = SocketioResponse.fromRamInformation("success", ramInformation);
|
||||||
|
} else {
|
||||||
|
resp = new SocketioResponse("error", "Failed to get RAM Information");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "getCpuInfo":
|
||||||
|
if (cpuTemperature>0 && !cpuUsage.isEmpty()){
|
||||||
|
resp = SocketioResponse.fromCpuStatus("success", cpuTemperature, cpuUsage);
|
||||||
|
} else {
|
||||||
|
resp = new SocketioResponse("error", "Failed to get CPU Information");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "getNetworkInfo":
|
||||||
|
if (!networkTX.isEmpty() && !networkRX.isEmpty()){
|
||||||
|
resp = SocketioResponse.fromTxRxMap("success", networkTX, networkRX);
|
||||||
|
} else {
|
||||||
|
resp = new SocketioResponse("error", "Failed to get Network Information");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "call":
|
||||||
|
case "getDiskInfo":
|
||||||
|
resp = new SocketioResponse("error", "Not Implemented");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
resp = new SocketioResponse("error", "Invalid Request");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return resp;
|
||||||
|
});
|
||||||
|
|
||||||
// GPIO Section
|
// GPIO Section
|
||||||
|
// talk button = pin12
|
||||||
|
// hangup button = pin14
|
||||||
|
// Call light = pin 22
|
||||||
|
// Network light = pin 20
|
||||||
callButton = new GpioInput(NanopiDuo2.Pin12.gpionumber, true);
|
callButton = new GpioInput(NanopiDuo2.Pin12.gpionumber, true);
|
||||||
if (callButton.isInitialized()){
|
if (callButton.isInitialized()){
|
||||||
callButton.setOnLongPress(vv->{
|
callButton.setOnLongPress(vv->{
|
||||||
Logger.info("Call Button Long Pressed");
|
Logger.info("Call Button Long Pressed");
|
||||||
if (incomingRequest!=null && incomingResponse!=null){
|
pickupCall();
|
||||||
client.AcceptIncomingCall(incomingRequest);
|
|
||||||
callLight_OnCall();
|
|
||||||
Buzzer_OnCall();
|
|
||||||
oncallRequest = incomingRequest;
|
|
||||||
oncallResponse = incomingResponse;
|
|
||||||
incomingRequest = null;
|
|
||||||
incomingResponse = null;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
callButton.setOnShortPress(vv->{
|
callButton.setOnShortPress(vv->{
|
||||||
Logger.info("Call Button Short Pressed");
|
Logger.info("Call Button Short Pressed");
|
||||||
if (incomingRequest!=null && incomingResponse!=null){
|
pickupCall();
|
||||||
client.AcceptIncomingCall(incomingRequest);
|
|
||||||
callLight_OnCall();
|
|
||||||
Buzzer_OnCall();
|
|
||||||
oncallRequest = incomingRequest;
|
|
||||||
oncallResponse = incomingResponse;
|
|
||||||
incomingRequest = null;
|
|
||||||
incomingResponse = null;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
hangupButton = new GpioInput(NanopiDuo2.Pin14.gpionumber, true);
|
hangupButton = new GpioInput(NanopiDuo2.Pin14.gpionumber, true);
|
||||||
if (hangupButton.isInitialized()){
|
if (hangupButton.isInitialized()){
|
||||||
hangupButton.setOnShortPress(vv->{
|
hangupButton.setOnShortPress(vv->{
|
||||||
Logger.info("Hangup Button Short Pressed");
|
Logger.info("Hangup Button Short Pressed");
|
||||||
if (oncallRequest!=null || oncallResponse!=null){
|
hangupCall();
|
||||||
client.HangUp();
|
|
||||||
oncallResponse = null;
|
|
||||||
oncallRequest = null;
|
|
||||||
} else if (incomingRequest!=null || incomingResponse!=null){
|
|
||||||
client.RejectIncomingCall(incomingRequest);
|
|
||||||
incomingRequest = null;
|
|
||||||
incomingResponse = null;
|
|
||||||
}
|
|
||||||
callLight_Idle();
|
|
||||||
Buzzer_Off();
|
|
||||||
});
|
});
|
||||||
hangupButton.setOnLongPress(vv->{
|
hangupButton.setOnLongPress(vv->{
|
||||||
Logger.info("Hangup Button Long Pressed");
|
Logger.info("Hangup Button Long Pressed");
|
||||||
if (oncallRequest!=null || oncallResponse!=null){
|
hangupCall();
|
||||||
client.HangUp();
|
|
||||||
oncallResponse = null;
|
|
||||||
oncallRequest = null;
|
|
||||||
} else if (incomingRequest!=null || incomingResponse!=null){
|
|
||||||
client.RejectIncomingCall(incomingRequest);
|
|
||||||
incomingRequest = null;
|
|
||||||
incomingResponse = null;
|
|
||||||
}
|
|
||||||
callLight_Idle();
|
|
||||||
Buzzer_Off();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// belum ada pinout nya di PCB demo (04/12/2024)
|
||||||
pilotLight = new GpioOutput(NanopiDuo2.Pin16.gpionumber, true);
|
pilotLight = new GpioOutput(NanopiDuo2.Pin16.gpionumber, true);
|
||||||
if (pilotLight.isInitialized()){
|
if (pilotLight.isInitialized()){
|
||||||
timer.scheduleAtFixedRate(new TimerTask() {
|
timer.scheduleAtFixedRate(new TimerTask() {
|
||||||
@@ -187,27 +255,72 @@ public class Main {
|
|||||||
}
|
}
|
||||||
}, 0, 1000);
|
}, 0, 1000);
|
||||||
}
|
}
|
||||||
networkLight = new GpioOutput(NanopiDuo2.Pin18.gpionumber, true);
|
|
||||||
callLight = new GpioOutput(NanopiDuo2.Pin20.gpionumber, true);
|
networkLight = new GpioOutput(NanopiDuo2.Pin20.gpionumber, true);
|
||||||
Buzzer = new GpioOutput(NanopiDuo2.Pin22.gpionumber, true);
|
callLight = new GpioOutput(NanopiDuo2.Pin22.gpionumber, true);
|
||||||
|
|
||||||
|
// belum ada pinout nya di PCB demo (04/12/2024)
|
||||||
|
Buzzer = new GpioOutput(NanopiDuo2.Pin18.gpionumber, true);
|
||||||
|
|
||||||
|
// Start System monitoring
|
||||||
|
init_system_monitoring();
|
||||||
|
|
||||||
// Shutdown Hook
|
// Shutdown Hook
|
||||||
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
|
||||||
Logger.info("Shutting down SIPIntercom");
|
Logger.info("Shutting down SIPIntercom");
|
||||||
if (client!=null) client.Disconnect();
|
if (client!=null) client.Disconnect();
|
||||||
if (webserver!=null) webserver.Stop();
|
if (webserver!=null) webserver.Stop();
|
||||||
|
if (socketioserver!=null) socketioserver.Stop();
|
||||||
if (callButton!=null && callButton.isInitialized()) callButton.Close();
|
if (callButton!=null && callButton.isInitialized()) callButton.Close();
|
||||||
if (hangupButton!=null && hangupButton.isInitialized()) hangupButton.Close();
|
if (hangupButton!=null && hangupButton.isInitialized()) hangupButton.Close();
|
||||||
if (pilotLight!=null && pilotLight.isInitialized()) pilotLight.Close();
|
if (pilotLight!=null && pilotLight.isInitialized()) pilotLight.Close();
|
||||||
if (networkLight!=null && networkLight.isInitialized()) networkLight.Close();
|
if (networkLight!=null && networkLight.isInitialized()) networkLight.Close();
|
||||||
if (callLight!=null && callLight.isInitialized()) callLight.Close();
|
if (callLight!=null && callLight.isInitialized()) callLight.Close();
|
||||||
if (timer!=null) timer.cancel();
|
if (timer!=null) timer.cancel();
|
||||||
|
if (system_monitoring_timer!=null) system_monitoring_timer.cancel();
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hangup call
|
||||||
|
*/
|
||||||
|
private static void hangupCall() {
|
||||||
|
if (oncallRequest!=null || oncallResponse!=null){
|
||||||
|
client.HangUp();
|
||||||
|
oncallResponse = null;
|
||||||
|
oncallRequest = null;
|
||||||
|
} else if (incomingRequest!=null || incomingResponse!=null){
|
||||||
|
client.RejectIncomingCall(incomingRequest);
|
||||||
|
incomingRequest = null;
|
||||||
|
incomingResponse = null;
|
||||||
|
}
|
||||||
|
callLight_Idle();
|
||||||
|
Buzzer_Off();
|
||||||
|
SipStatus = "Idle";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pickup incoming call
|
||||||
|
*/
|
||||||
|
private static void pickupCall() {
|
||||||
|
if (incomingRequest!=null && incomingResponse!=null){
|
||||||
|
client.AcceptIncomingCall(incomingRequest);
|
||||||
|
callLight_OnCall();
|
||||||
|
Buzzer_OnCall();
|
||||||
|
oncallRequest = incomingRequest;
|
||||||
|
oncallResponse = incomingResponse;
|
||||||
|
incomingRequest = null;
|
||||||
|
incomingResponse = null;
|
||||||
|
SipStatus = "Communication with "+oncallRequest.CallID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private static String CreateSipCallNumber(String extension){
|
||||||
|
return MessageFormat.format("sip:{0}@{1}", extension, client.getServerAddress());
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private static void CallTest(String extension){
|
private static void CallTest(String extension){
|
||||||
String callnumber = MessageFormat.format("sip:{0}@{1}", extension, client.getServerAddress());
|
String callnumber = CreateSipCallNumber(extension);
|
||||||
if (client.Call(callnumber)){
|
if (client.Call(callnumber)){
|
||||||
Logger.info("Call to {} is successful",callnumber);
|
Logger.info("Call to {} is successful",callnumber);
|
||||||
try{
|
try{
|
||||||
@@ -240,27 +353,17 @@ public class Main {
|
|||||||
} else Logger.error("File not found: {}",ff.getAbsolutePath());
|
} else Logger.error("File not found: {}",ff.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ReconnectSIP(){
|
|
||||||
if (client.Connect()){
|
|
||||||
Logger.info("Connected to SIP Server");
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
Logger.error("Failed to connect to SIP Server");
|
|
||||||
try {
|
|
||||||
Thread.sleep(20*1000);
|
|
||||||
} catch (InterruptedException ignored) {
|
|
||||||
}
|
|
||||||
ReconnectSIP();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registering state, call light is blinking with 500ms interval
|
* Registering state, call light is blinking with 500ms interval
|
||||||
*/
|
*/
|
||||||
private static void callLight_Registering(){
|
private static void callLight_Registering(){
|
||||||
if (callLightTask!=null) callLightTask.cancel();
|
if (callLightTask!=null) {
|
||||||
|
callLightTask.cancel();
|
||||||
|
callLightTask = null;
|
||||||
|
}
|
||||||
if (timer!=null){
|
if (timer!=null){
|
||||||
timer.purge();
|
timer.purge();
|
||||||
|
callLightTask = CreateCallLightTask();
|
||||||
timer.scheduleAtFixedRate(callLightTask, 0, 500);
|
timer.scheduleAtFixedRate(callLightTask, 0, 500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -269,9 +372,13 @@ public class Main {
|
|||||||
* Idle state, call light is blinking with interval 3000ms
|
* Idle state, call light is blinking with interval 3000ms
|
||||||
*/
|
*/
|
||||||
private static void callLight_Idle(){
|
private static void callLight_Idle(){
|
||||||
if (callLightTask!=null) callLightTask.cancel();
|
if (callLightTask!=null) {
|
||||||
|
callLightTask.cancel();
|
||||||
|
callLightTask = null;
|
||||||
|
}
|
||||||
if (timer!=null){
|
if (timer!=null){
|
||||||
timer.purge();
|
timer.purge();
|
||||||
|
callLightTask = CreateCallLightTask();
|
||||||
timer.scheduleAtFixedRate(callLightTask, 0, 3000);
|
timer.scheduleAtFixedRate(callLightTask, 0, 3000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -280,9 +387,13 @@ public class Main {
|
|||||||
* Incoming call, call light is blinking with 1000ms interval
|
* Incoming call, call light is blinking with 1000ms interval
|
||||||
*/
|
*/
|
||||||
private static void callLight_IncomingCall(){
|
private static void callLight_IncomingCall(){
|
||||||
if (callLightTask!=null) callLightTask.cancel();
|
if (callLightTask!=null) {
|
||||||
|
callLightTask.cancel();
|
||||||
|
callLightTask = null;
|
||||||
|
}
|
||||||
if (timer!=null){
|
if (timer!=null){
|
||||||
timer.purge();
|
timer.purge();
|
||||||
|
callLightTask = CreateCallLightTask();
|
||||||
timer.scheduleAtFixedRate(callLightTask, 0, 1000);
|
timer.scheduleAtFixedRate(callLightTask, 0, 1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -291,7 +402,10 @@ public class Main {
|
|||||||
* On call, call light is on
|
* On call, call light is on
|
||||||
*/
|
*/
|
||||||
private static void callLight_OnCall(){
|
private static void callLight_OnCall(){
|
||||||
if (callLightTask!=null) callLightTask.cancel();
|
if (callLightTask!=null) {
|
||||||
|
callLightTask.cancel();
|
||||||
|
callLightTask = null;
|
||||||
|
}
|
||||||
if (timer!=null) timer.purge();
|
if (timer!=null) timer.purge();
|
||||||
callLight.SetValue(true);
|
callLight.SetValue(true);
|
||||||
}
|
}
|
||||||
@@ -300,9 +414,13 @@ public class Main {
|
|||||||
* Incoming call, buzzer is beeping with 1000ms interval
|
* Incoming call, buzzer is beeping with 1000ms interval
|
||||||
*/
|
*/
|
||||||
private static void Buzzer_IncomingCall(){
|
private static void Buzzer_IncomingCall(){
|
||||||
if (BuzzerTask!=null) BuzzerTask.cancel();
|
if (BuzzerTask!=null) {
|
||||||
|
BuzzerTask.cancel();
|
||||||
|
BuzzerTask = null;
|
||||||
|
}
|
||||||
if (timer!=null){
|
if (timer!=null){
|
||||||
timer.purge();
|
timer.purge();
|
||||||
|
BuzzerTask = CreateBuzzerTask();
|
||||||
timer.scheduleAtFixedRate(BuzzerTask, 0, 1000);
|
timer.scheduleAtFixedRate(BuzzerTask, 0, 1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -311,14 +429,97 @@ public class Main {
|
|||||||
* On-call, buzzer is off
|
* On-call, buzzer is off
|
||||||
*/
|
*/
|
||||||
private static void Buzzer_OnCall(){
|
private static void Buzzer_OnCall(){
|
||||||
if (BuzzerTask!=null) BuzzerTask.cancel();
|
if (BuzzerTask!=null) {
|
||||||
|
BuzzerTask.cancel();
|
||||||
|
BuzzerTask = null;
|
||||||
|
}
|
||||||
if (timer!=null) timer.purge();
|
if (timer!=null) timer.purge();
|
||||||
Buzzer.SetValue(false);
|
if (Buzzer!=null) Buzzer.SetValue(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void Buzzer_Off(){
|
private static void Buzzer_Off(){
|
||||||
if (BuzzerTask!=null) BuzzerTask.cancel();
|
if (BuzzerTask!=null) {
|
||||||
|
BuzzerTask.cancel();
|
||||||
|
BuzzerTask = null;
|
||||||
|
}
|
||||||
if (timer!=null) timer.purge();
|
if (timer!=null) timer.purge();
|
||||||
Buzzer.SetValue(false);
|
if (Buzzer!=null) Buzzer.SetValue(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static TimerTask CreateBuzzerTask(){
|
||||||
|
return new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (Buzzer!=null && Buzzer.isInitialized()) Buzzer.BlinkON(500);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static TimerTask CreateCallLightTask(){
|
||||||
|
return new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (callLight!=null && callLight.isInitialized()) callLight.BlinkON(100);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void init_system_monitoring(){
|
||||||
|
TimerTask tt = new TimerTask() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
cpuTemperature = SystemInformation.getCPUTemperature();
|
||||||
|
ramInformation = SystemInformation.getRAMInformation();
|
||||||
|
ProcessorStatus[] cpuinfo = SystemInformation.getProcStat();
|
||||||
|
if (cpuinfo.length>0){
|
||||||
|
if (previousCpuInfo==null || !Objects.equals(previousCpuInfo.length, cpuinfo.length)){
|
||||||
|
previousCpuInfo = cpuinfo;
|
||||||
|
} else {
|
||||||
|
for(int ii=0;ii<previousCpuInfo.length;ii++){
|
||||||
|
cpuUsage.put(cpuinfo[ii].name, cpuinfo[ii].cpu_usage(previousCpuInfo[ii]));
|
||||||
|
}
|
||||||
|
previousCpuInfo = cpuinfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NetworkTransmitReceiveInfo[] ntri = SystemInformation.getNetworkTransmitReceiveInfo();
|
||||||
|
if (ntri.length>0){
|
||||||
|
if (previousNetworkInfo==null || !Objects.equals(previousNetworkInfo.length, ntri.length)){
|
||||||
|
previousNetworkInfo = ntri;
|
||||||
|
} else {
|
||||||
|
for(int ii=0;ii<previousNetworkInfo.length;ii++){
|
||||||
|
double txspeed = ntri[ii].TxSpeed(previousNetworkInfo[ii], "B");
|
||||||
|
String txspeedstr;
|
||||||
|
if (txspeed < KB_threshold){
|
||||||
|
txspeedstr = String.format("%.0f B/s", txspeed);
|
||||||
|
} else if (txspeed < MB_threshold){
|
||||||
|
txspeedstr = String.format("%.1f KB/s", ntri[ii].TxSpeed(previousNetworkInfo[ii], "KB"));
|
||||||
|
} else if (txspeed < GB_threshold){
|
||||||
|
txspeedstr = String.format("%.1f MB/s", ntri[ii].TxSpeed(previousNetworkInfo[ii], "MB"));
|
||||||
|
} else {
|
||||||
|
txspeedstr = String.format("%.1f GB/s", ntri[ii].TxSpeed(previousNetworkInfo[ii], "GB"));
|
||||||
|
}
|
||||||
|
double rxspeed = ntri[ii].RxSpeed(previousNetworkInfo[ii], "B");
|
||||||
|
String rxspeedstr;
|
||||||
|
if (rxspeed < KB_threshold){
|
||||||
|
rxspeedstr = String.format("%.0f B/s", rxspeed);
|
||||||
|
} else if (rxspeed < MB_threshold){
|
||||||
|
rxspeedstr = String.format("%.1f KB/s", ntri[ii].RxSpeed(previousNetworkInfo[ii], "KB"));
|
||||||
|
} else if (rxspeed < GB_threshold){
|
||||||
|
rxspeedstr = String.format("%.1f MB/s", ntri[ii].RxSpeed(previousNetworkInfo[ii], "MB"));
|
||||||
|
} else {
|
||||||
|
rxspeedstr = String.format("%.1f GB/s", ntri[ii].RxSpeed(previousNetworkInfo[ii], "GB"));
|
||||||
|
}
|
||||||
|
networkTX.put(ntri[ii].name, txspeedstr);
|
||||||
|
networkRX.put(ntri[ii].name, rxspeedstr);
|
||||||
|
}
|
||||||
|
previousNetworkInfo = ntri;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
system_monitoring_timer = new Timer();
|
||||||
|
system_monitoring_timer.scheduleAtFixedRate(tt, 1000, 5000);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
8
src/SBC/CpuInfo.java
Normal file
8
src/SBC/CpuInfo.java
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
package SBC;
|
||||||
|
|
||||||
|
public class CpuInfo {
|
||||||
|
public int processorCount;
|
||||||
|
public String revision;
|
||||||
|
public String serial;
|
||||||
|
public String model;
|
||||||
|
}
|
||||||
88
src/SBC/NetworkTransmitReceiveInfo.java
Normal file
88
src/SBC/NetworkTransmitReceiveInfo.java
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
package SBC;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import static code.common.ValidString;
|
||||||
|
|
||||||
|
public class NetworkTransmitReceiveInfo {
|
||||||
|
public String name;
|
||||||
|
public long bytesReceived;
|
||||||
|
public long packetsReceived;
|
||||||
|
public long errorsReceived;
|
||||||
|
public long droppedReceived;
|
||||||
|
public long fifoReceived;
|
||||||
|
public long frameReceived;
|
||||||
|
public long compressedReceived;
|
||||||
|
public long multicastReceived;
|
||||||
|
public long bytesTransmitted;
|
||||||
|
public long packetsTransmitted;
|
||||||
|
public long errorsTransmitted;
|
||||||
|
public long droppedTransmitted;
|
||||||
|
public long fifoTransmitted;
|
||||||
|
public long collsTransmitted;
|
||||||
|
public long carrierTransmitted;
|
||||||
|
public long compressedTransmitted;
|
||||||
|
public long timetick;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the download speed
|
||||||
|
* @param prev Previous NetworkTransmitReceiveInfo
|
||||||
|
* @param unit Speed unit (KB, MB, GB)
|
||||||
|
* @return Download speed in {unit}/second
|
||||||
|
*/
|
||||||
|
public double RxSpeed(NetworkTransmitReceiveInfo prev, String unit){
|
||||||
|
if (prev!=null){
|
||||||
|
if (Objects.equals(prev.name, name)){
|
||||||
|
long timeDiff = timetick - prev.timetick;
|
||||||
|
if (timeDiff>0){
|
||||||
|
long bytesDiff = bytesReceived - prev.bytesReceived;
|
||||||
|
if (ValidString(unit)) unit = unit.toUpperCase();
|
||||||
|
Double speed = ConvertToUnit(unit, timeDiff, bytesDiff);
|
||||||
|
if (speed != null) return speed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private Double ConvertToUnit(String unit, long timeDiff, long bytesDiff) {
|
||||||
|
if (bytesDiff>0){
|
||||||
|
double speed = ((double) bytesDiff / timeDiff) * 1000;
|
||||||
|
switch (unit) {
|
||||||
|
case "KB" :
|
||||||
|
return (speed / 1024);
|
||||||
|
case "MB" :
|
||||||
|
return (speed / 1024 / 1024);
|
||||||
|
case "GB" :
|
||||||
|
return (speed / 1024 / 1024 / 1024);
|
||||||
|
default :
|
||||||
|
return speed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate the upload speed
|
||||||
|
* @param prev Previous NetworkTransmitReceiveInfo
|
||||||
|
* @param unit Speed unit (KB, MB, GB)
|
||||||
|
* @return Upload speed in {unit}/second
|
||||||
|
*/
|
||||||
|
public double TxSpeed(NetworkTransmitReceiveInfo prev, String unit){
|
||||||
|
if (prev!=null){
|
||||||
|
if (Objects.equals(prev.name, name)){
|
||||||
|
long timeDiff = timetick - prev.timetick;
|
||||||
|
if (timeDiff>0){
|
||||||
|
long bytesDiff = bytesTransmitted - prev.bytesTransmitted;
|
||||||
|
if (ValidString(unit)) unit = unit.toUpperCase();
|
||||||
|
Double speed = ConvertToUnit(unit, timeDiff, bytesDiff);
|
||||||
|
if (speed != null) return speed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
45
src/SBC/ProcessorStatus.java
Normal file
45
src/SBC/ProcessorStatus.java
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
package SBC;
|
||||||
|
|
||||||
|
public class ProcessorStatus {
|
||||||
|
public String name;
|
||||||
|
public int user;
|
||||||
|
public int nice;
|
||||||
|
public int system;
|
||||||
|
public int idle;
|
||||||
|
public int iowait;
|
||||||
|
public int irq;
|
||||||
|
public int softirq;
|
||||||
|
public int steal;
|
||||||
|
public int guest;
|
||||||
|
public int guest_nice;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate total CPU time
|
||||||
|
* @return Total CPU time
|
||||||
|
*/
|
||||||
|
public int total_time(){
|
||||||
|
return user + nice + system + idle + iowait + irq + softirq + steal + guest + guest_nice;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate idle CPU time
|
||||||
|
* @return Idle CPU time
|
||||||
|
*/
|
||||||
|
public int idle_time(){
|
||||||
|
return idle + iowait;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate CPU usage percentage
|
||||||
|
* @param prev Previous CPU information
|
||||||
|
* @return CPU usage percentage 0 - 100
|
||||||
|
*/
|
||||||
|
public int cpu_usage(ProcessorStatus prev){
|
||||||
|
if (prev!=null){
|
||||||
|
int total_diff = total_time() - prev.total_time();
|
||||||
|
int idle_diff = idle_time() - prev.idle_time();
|
||||||
|
return (int)(100.0 * (total_diff - idle_diff) / total_diff);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
12
src/SBC/RamInformation.java
Normal file
12
src/SBC/RamInformation.java
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package SBC;
|
||||||
|
|
||||||
|
public class RamInformation {
|
||||||
|
public int totalKB;
|
||||||
|
public int usedKB;
|
||||||
|
public int availableKB;
|
||||||
|
public int swapTotalKB;
|
||||||
|
public int swapFreeKB;
|
||||||
|
public double RamUsagePercentage(){
|
||||||
|
return (double) usedKB / totalKB * 100;
|
||||||
|
}
|
||||||
|
}
|
||||||
179
src/SBC/SystemInformation.java
Normal file
179
src/SBC/SystemInformation.java
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
package SBC;
|
||||||
|
|
||||||
|
import com.sun.jna.Platform;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
public class SystemInformation {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static int getCPUTemperature() {
|
||||||
|
if (Platform.isLinux()){
|
||||||
|
File ff = new File("/sys/class/thermal/thermal_zone0/temp");
|
||||||
|
if (ff.isFile() && ff.canRead()){
|
||||||
|
try{
|
||||||
|
String value = new String(Files.readAllBytes(ff.toPath())).trim();
|
||||||
|
return Integer.parseInt(value) / 1000;
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static NetworkTransmitReceiveInfo[] getNetworkTransmitReceiveInfo(){
|
||||||
|
if (Platform.isLinux()){
|
||||||
|
File ff = new File("/proc/net/dev");
|
||||||
|
if (ff.isFile() && ff.canRead()){
|
||||||
|
List<NetworkTransmitReceiveInfo> result = new ArrayList<>();
|
||||||
|
final Pattern pattern = Pattern.compile("\\s+(.*):\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)");
|
||||||
|
try{
|
||||||
|
String[] lines = Files.readAllLines(ff.toPath()).toArray(new String[0]);
|
||||||
|
for (String line : lines){
|
||||||
|
Matcher m = pattern.matcher(line);
|
||||||
|
if (m.find()){
|
||||||
|
NetworkTransmitReceiveInfo info = new NetworkTransmitReceiveInfo();
|
||||||
|
info.name = m.group(1).trim();
|
||||||
|
info.bytesReceived = Long.parseLong(m.group(2));
|
||||||
|
info.packetsReceived = Long.parseLong(m.group(3));
|
||||||
|
info.errorsReceived = Long.parseLong(m.group(4));
|
||||||
|
info.droppedReceived = Long.parseLong(m.group(5));
|
||||||
|
info.fifoReceived = Long.parseLong(m.group(6));
|
||||||
|
info.frameReceived = Long.parseLong(m.group(7));
|
||||||
|
info.compressedReceived = Long.parseLong(m.group(8));
|
||||||
|
info.multicastReceived = Long.parseLong(m.group(9));
|
||||||
|
info.bytesTransmitted = Long.parseLong(m.group(10));
|
||||||
|
info.packetsTransmitted = Long.parseLong(m.group(11));
|
||||||
|
info.errorsTransmitted = Long.parseLong(m.group(12));
|
||||||
|
info.droppedTransmitted = Long.parseLong(m.group(13));
|
||||||
|
info.fifoTransmitted = Long.parseLong(m.group(14));
|
||||||
|
info.collsTransmitted = Long.parseLong(m.group(15));
|
||||||
|
info.carrierTransmitted = Long.parseLong(m.group(16));
|
||||||
|
info.compressedTransmitted = Long.parseLong(m.group(17));
|
||||||
|
info.timetick = System.currentTimeMillis();
|
||||||
|
result.add(info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return result.toArray(new NetworkTransmitReceiveInfo[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new NetworkTransmitReceiveInfo[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CpuInfo getCPUInfo(){
|
||||||
|
CpuInfo result = new CpuInfo();
|
||||||
|
if (Platform.isLinux()){
|
||||||
|
File ff = new File("/proc/cpuinfo");
|
||||||
|
if (ff.isFile() && ff.canRead()){
|
||||||
|
final Pattern pattern = Pattern.compile( "\\s*(.*):\\s*(.*)");
|
||||||
|
try{
|
||||||
|
String[] lines = Files.readAllLines(ff.toPath()).toArray(new String[0]);
|
||||||
|
for (String line : lines){
|
||||||
|
Matcher m = pattern.matcher(line);
|
||||||
|
if (m.find()){
|
||||||
|
String key = m.group(1).trim();
|
||||||
|
String value = m.group(2).trim();
|
||||||
|
switch (key){
|
||||||
|
case "processor":
|
||||||
|
result.processorCount++;
|
||||||
|
break;
|
||||||
|
case "Revision":
|
||||||
|
result.revision = value;
|
||||||
|
break;
|
||||||
|
case "Serial":
|
||||||
|
result.serial = value;
|
||||||
|
break;
|
||||||
|
case "Model":
|
||||||
|
result.model = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ProcessorStatus[] getProcStat(){
|
||||||
|
if (Platform.isLinux()){
|
||||||
|
File ff = new File("/proc/stat");
|
||||||
|
if (ff.isFile() && ff.canRead()){
|
||||||
|
final Pattern pattern = Pattern.compile( "(cpu\\d?)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)");
|
||||||
|
List<ProcessorStatus> result = new ArrayList<>();
|
||||||
|
try{
|
||||||
|
String[] lines = Files.readAllLines(ff.toPath()).toArray(new String[0]);
|
||||||
|
for (String line : lines){
|
||||||
|
Matcher m = pattern.matcher(line);
|
||||||
|
if (m.find()){
|
||||||
|
ProcessorStatus info = new ProcessorStatus();
|
||||||
|
info.name = m.group(1).trim();
|
||||||
|
info.user = Integer.parseInt(m.group(2));
|
||||||
|
info.nice = Integer.parseInt(m.group(3));
|
||||||
|
info.system = Integer.parseInt(m.group(4));
|
||||||
|
info.idle = Integer.parseInt(m.group(5));
|
||||||
|
info.iowait = Integer.parseInt(m.group(6));
|
||||||
|
info.irq = Integer.parseInt(m.group(7));
|
||||||
|
info.softirq = Integer.parseInt(m.group(8));
|
||||||
|
info.steal = Integer.parseInt(m.group(9));
|
||||||
|
info.guest = Integer.parseInt(m.group(10));
|
||||||
|
info.guest_nice = Integer.parseInt(m.group(11));
|
||||||
|
result.add(info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toArray(new ProcessorStatus[0]);
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new ProcessorStatus[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static RamInformation getRAMInformation(){
|
||||||
|
|
||||||
|
RamInformation result = new RamInformation();
|
||||||
|
if (Platform.isLinux()){
|
||||||
|
File ff = new File("/proc/meminfo");
|
||||||
|
if (ff.isFile() && ff.canRead()){
|
||||||
|
final Pattern pattern = Pattern.compile("(.*):\\s+(\\d+).kB");
|
||||||
|
try{
|
||||||
|
String[] lines = Files.readAllLines(ff.toPath()).toArray(new String[0]);
|
||||||
|
for (String line : lines) {
|
||||||
|
Matcher m = pattern.matcher(line);
|
||||||
|
if (m.find()){
|
||||||
|
String key = m.group(1);
|
||||||
|
int value = Integer.parseInt(m.group(2));
|
||||||
|
switch (key){
|
||||||
|
case "MemTotal":
|
||||||
|
result.totalKB = value;
|
||||||
|
break;
|
||||||
|
case "MemAvailable":
|
||||||
|
result.availableKB = value;
|
||||||
|
break;
|
||||||
|
case "SwapTotal":
|
||||||
|
result.swapTotalKB = value;
|
||||||
|
break;
|
||||||
|
case "SwapFree":
|
||||||
|
result.swapFreeKB = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
|
result.usedKB = result.totalKB - result.availableKB;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -67,6 +67,7 @@ public class jSIPClient {
|
|||||||
cc.setDomain(serverAddress);
|
cc.setDomain(serverAddress);
|
||||||
cc.setUserPart(Username);
|
cc.setUserPart(Username);
|
||||||
cc.setPassword(Password);
|
cc.setPassword(Password);
|
||||||
|
cc.SetLocalInetAddress("0.0.0.0");
|
||||||
em = new EventManager(cc);
|
em = new EventManager(cc);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -616,9 +617,9 @@ public class jSIPClient {
|
|||||||
|
|
||||||
|
|
||||||
private void load_config(Properties prop) {
|
private void load_config(Properties prop) {
|
||||||
serverAddress = GetProperties_StringValue(prop,"SipServer","100.64.0.3");
|
serverAddress = GetProperties_StringValue(prop,"SipServer","rdkartono.ddns.me");
|
||||||
Username = GetProperties_StringValue(prop,"SipUsername","user1");
|
Username = GetProperties_StringValue(prop,"SipUsername","101");
|
||||||
Password = GetProperties_StringValue(prop,"SipPassword","12345678");
|
Password = GetProperties_StringValue(prop,"SipPassword","password101");
|
||||||
Logger.info("SipServer: "+serverAddress);
|
Logger.info("SipServer: "+serverAddress);
|
||||||
Logger.info("SipUsername: "+Username);
|
Logger.info("SipUsername: "+Username);
|
||||||
Logger.info("SipPassword: "+Password);
|
Logger.info("SipPassword: "+Password);
|
||||||
|
|||||||
10
src/Webpage/LoginSetting.java
Normal file
10
src/Webpage/LoginSetting.java
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package Webpage;
|
||||||
|
|
||||||
|
public class LoginSetting {
|
||||||
|
public String Username;
|
||||||
|
public String Password;
|
||||||
|
public LoginSetting(String username, String password){
|
||||||
|
Username = username;
|
||||||
|
Password = password;
|
||||||
|
}
|
||||||
|
}
|
||||||
15
src/Webpage/SipSetting.java
Normal file
15
src/Webpage/SipSetting.java
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package Webpage;
|
||||||
|
|
||||||
|
public class SipSetting {
|
||||||
|
public String Server;
|
||||||
|
public int Port;
|
||||||
|
public String Username;
|
||||||
|
public String Password;
|
||||||
|
|
||||||
|
public SipSetting(String server, int port, String username, String password){
|
||||||
|
this.Server = server;
|
||||||
|
this.Port = port;
|
||||||
|
this.Username = username;
|
||||||
|
this.Password = password;
|
||||||
|
}
|
||||||
|
}
|
||||||
26
src/Webpage/SocketioRequest.java
Normal file
26
src/Webpage/SocketioRequest.java
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package Webpage;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import static code.common.gson;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class SocketioRequest {
|
||||||
|
private final String request;
|
||||||
|
private final String data;
|
||||||
|
|
||||||
|
public SocketioRequest(){
|
||||||
|
request = "";
|
||||||
|
data = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public SocketioRequest(String request, String data){
|
||||||
|
this.request = request;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString(){
|
||||||
|
return gson.toJson(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
75
src/Webpage/SocketioResponse.java
Normal file
75
src/Webpage/SocketioResponse.java
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
package Webpage;
|
||||||
|
|
||||||
|
import SBC.RamInformation;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static code.common.gson;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class SocketioResponse {
|
||||||
|
private String response;
|
||||||
|
private String data;
|
||||||
|
|
||||||
|
public SocketioResponse(){
|
||||||
|
response = "";
|
||||||
|
data = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public SocketioResponse(String response, String data){
|
||||||
|
this.response = response;
|
||||||
|
this.data = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString(){
|
||||||
|
return gson.toJson(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SocketioResponse fromLoginSetting(String response, LoginSetting loginSetting){
|
||||||
|
SocketioResponse socketioResponse = new SocketioResponse();
|
||||||
|
socketioResponse.setResponse(response);
|
||||||
|
socketioResponse.setData(gson.toJson(loginSetting));
|
||||||
|
return socketioResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SocketioResponse fromSipSetting(String response, SipSetting sipSetting){
|
||||||
|
SocketioResponse socketioResponse = new SocketioResponse();
|
||||||
|
socketioResponse.setResponse(response);
|
||||||
|
socketioResponse.setData(gson.toJson(sipSetting));
|
||||||
|
return socketioResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SocketioResponse fromRamInformation(String response, RamInformation ramInformation){
|
||||||
|
SocketioResponse socketioResponse = new SocketioResponse();
|
||||||
|
socketioResponse.setResponse(response);
|
||||||
|
socketioResponse.setData(gson.toJson(ramInformation));
|
||||||
|
return socketioResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SocketioResponse fromCpuStatus(String response, int cpuTemperature, Map<String,Integer> cpuUsage){
|
||||||
|
SocketioResponse socketioResponse = new SocketioResponse();
|
||||||
|
socketioResponse.setResponse(response);
|
||||||
|
JsonObject jo = new JsonObject();
|
||||||
|
jo.addProperty("cpuTemperature", cpuTemperature);
|
||||||
|
jo.addProperty("cpuUsage", gson.toJson(cpuUsage));
|
||||||
|
socketioResponse.setData(jo.toString());
|
||||||
|
return socketioResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static SocketioResponse fromTxRxMap(String response, Map<String,String> txmap, Map<String,String> rxmap){
|
||||||
|
SocketioResponse socketioResponse = new SocketioResponse();
|
||||||
|
socketioResponse.setResponse(response);
|
||||||
|
JsonObject jo = new JsonObject();
|
||||||
|
jo.addProperty("txmap", gson.toJson(txmap));
|
||||||
|
jo.addProperty("rxmap", gson.toJson(rxmap));
|
||||||
|
socketioResponse.setData(jo.toString());
|
||||||
|
return socketioResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
56
src/Webpage/SocketioServer.java
Normal file
56
src/Webpage/SocketioServer.java
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
package Webpage;
|
||||||
|
|
||||||
|
import com.corundumstudio.socketio.Configuration;
|
||||||
|
import com.corundumstudio.socketio.SocketIONamespace;
|
||||||
|
import com.corundumstudio.socketio.SocketIOServer;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.pmw.tinylog.Logger;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
public class SocketioServer {
|
||||||
|
private final SocketIOServer server;
|
||||||
|
private @Setter Function<@NonNull SocketioRequest, @NonNull SocketioResponse> onRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create Socket.io Server
|
||||||
|
* @param localip Local Ip address to bind.<br/>if null or empty will default to 0.0.0.0
|
||||||
|
* @param listenport Local Port to bind.<br/>if invalid, will default to 9092
|
||||||
|
*/
|
||||||
|
public SocketioServer(String localip,int listenport){
|
||||||
|
if (localip==null || localip.isEmpty()) localip="0.0.0.0";
|
||||||
|
if (listenport<=0 || listenport>65535) listenport=9092;
|
||||||
|
Configuration config = new Configuration();
|
||||||
|
config.setHostname(localip);
|
||||||
|
config.setPort(listenport);
|
||||||
|
|
||||||
|
server = new SocketIOServer(config);
|
||||||
|
SocketIONamespace socketio = server.addNamespace("/socketio");
|
||||||
|
socketio.addConnectListener(client -> Logger.info("Client id={} remoteaddress={} Connected to /socketio: " , client.getSessionId(), client.getRemoteAddress()));
|
||||||
|
socketio.addDisconnectListener(client -> Logger.info("Client id={} remoteaddress={} Disconnected from /socketio: ", client.getSessionId(), client.getRemoteAddress()));
|
||||||
|
socketio.addEventListener("command", SocketioRequest.class, (client, data, ackRequest) -> {
|
||||||
|
Logger.info("Client id={} remoteaddress={} request: {}", client.getSessionId(), client.getRemoteAddress(), data);
|
||||||
|
if (onRequest!=null){
|
||||||
|
SocketioResponse response = onRequest.apply(data);
|
||||||
|
Logger.info("Client id={} remoteaddress={} response: {}", client.getSessionId(), client.getRemoteAddress(), response);
|
||||||
|
ackRequest.sendAckData(response);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the server
|
||||||
|
*/
|
||||||
|
public void Start(){
|
||||||
|
if (server!=null) server.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the server
|
||||||
|
*/
|
||||||
|
public void Stop(){
|
||||||
|
if (server!=null) server.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,6 +23,9 @@ public class common {
|
|||||||
public static final Path gpioPath = Paths.get("/sys/class/gpio") ;
|
public static final Path gpioPath = Paths.get("/sys/class/gpio") ;
|
||||||
public static final Path gpioExportPath = Paths.get("/sys/class/gpio/export");
|
public static final Path gpioExportPath = Paths.get("/sys/class/gpio/export");
|
||||||
public static final Path gpioUnexportPath = Paths.get("/sys/class/gpio/unexport");
|
public static final Path gpioUnexportPath = Paths.get("/sys/class/gpio/unexport");
|
||||||
|
public static final double KB_threshold = 1024.0;
|
||||||
|
public static final double MB_threshold = 1024.0 * 1024.0;
|
||||||
|
public static final double GB_threshold = 1024.0 * 1024.0 * 1024.0;
|
||||||
|
|
||||||
public static String GetProperties_StringValue(Properties prop, String key, String defaultavalue){
|
public static String GetProperties_StringValue(Properties prop, String key, String defaultavalue){
|
||||||
if (prop!=null){
|
if (prop!=null){
|
||||||
@@ -108,6 +111,19 @@ public class common {
|
|||||||
return prop;
|
return prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean SaveProperties(String directory, String filename, Properties prop){
|
||||||
|
try {
|
||||||
|
File file = new File(directory,filename);
|
||||||
|
file.createNewFile();
|
||||||
|
prop.store(Files.newOutputStream(file.toPath()),"");
|
||||||
|
Logger.info("Saved properties file: {}",filename);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
Logger.error("Failed to save properties file: {}",filename);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if String is not null and have value
|
* Check if String is not null and have value
|
||||||
* @param value string to check
|
* @param value string to check
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ import java.util.List;
|
|||||||
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import org.pmw.tinylog.Logger;
|
|
||||||
import peers.Config;
|
import peers.Config;
|
||||||
|
|
||||||
import peers.XmlConfig;
|
import peers.XmlConfig;
|
||||||
@@ -125,16 +124,7 @@ public class UserAgent {
|
|||||||
|
|
||||||
cseqCounter = 1;
|
cseqCounter = 1;
|
||||||
|
|
||||||
String buf = "starting user agent [" +
|
|
||||||
"myAddress: " +
|
|
||||||
config.getLocalInetAddress().getHostAddress() + ", " +
|
|
||||||
"sipPort: " +
|
|
||||||
config.getSipPort() + ", " +
|
|
||||||
"userpart: " +
|
|
||||||
config.getUserPart() + ", " +
|
|
||||||
"domain: " +
|
|
||||||
config.getDomain() + "]";
|
|
||||||
Logger.info(buf);
|
|
||||||
|
|
||||||
//transaction user
|
//transaction user
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import java.io.InputStreamReader;
|
|||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
|
|
||||||
|
import lombok.Setter;
|
||||||
import org.pmw.tinylog.Logger;
|
import org.pmw.tinylog.Logger;
|
||||||
import peers.Config;
|
import peers.Config;
|
||||||
|
|
||||||
@@ -47,10 +48,11 @@ public abstract class MessageReceiver implements Runnable {
|
|||||||
private boolean isListening;
|
private boolean isListening;
|
||||||
|
|
||||||
//private UAS uas;
|
//private UAS uas;
|
||||||
|
@Setter
|
||||||
private SipServerTransportUser sipServerTransportUser;
|
private SipServerTransportUser sipServerTransportUser;
|
||||||
private TransactionManager transactionManager;
|
private final TransactionManager transactionManager;
|
||||||
private TransportManager transportManager;
|
private final TransportManager transportManager;
|
||||||
private Config config;
|
private final Config config;
|
||||||
|
|
||||||
|
|
||||||
public MessageReceiver(int port, TransactionManager transactionManager,
|
public MessageReceiver(int port, TransactionManager transactionManager,
|
||||||
@@ -83,10 +85,7 @@ public abstract class MessageReceiver implements Runnable {
|
|||||||
} catch (UnsupportedEncodingException e) {
|
} catch (UnsupportedEncodingException e) {
|
||||||
Logger.error("unsupported encoding", e);
|
Logger.error("unsupported encoding", e);
|
||||||
}
|
}
|
||||||
if (RFC3261.DEFAULT_SIP_VERSION.equals(beginning)) {
|
return !RFC3261.DEFAULT_SIP_VERSION.equals(beginning);
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void processMessage(byte[] message, InetAddress sourceIp,
|
protected void processMessage(byte[] message, InetAddress sourceIp,
|
||||||
@@ -115,10 +114,7 @@ public abstract class MessageReceiver implements Runnable {
|
|||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
StringBuffer direction = new StringBuffer();
|
|
||||||
direction.append("RECEIVED from ").append(sourceIp.getHostAddress());
|
|
||||||
direction.append("/").append(sourcePort);
|
|
||||||
Logger.info(new String(message),direction.toString());
|
|
||||||
SipMessage sipMessage = null;
|
SipMessage sipMessage = null;
|
||||||
try {
|
try {
|
||||||
sipMessage = transportManager.sipParser.parse(
|
sipMessage = transportManager.sipParser.parse(
|
||||||
@@ -158,7 +154,7 @@ public abstract class MessageReceiver implements Runnable {
|
|||||||
SipHeaderParamName rportName = new SipHeaderParamName(
|
SipHeaderParamName rportName = new SipHeaderParamName(
|
||||||
RFC3261.PARAM_RPORT);
|
RFC3261.PARAM_RPORT);
|
||||||
String rport = topVia.getParam(rportName);
|
String rport = topVia.getParam(rportName);
|
||||||
if (rport != null && "".equals(rport)) {
|
if (rport != null && rport.isEmpty()) {
|
||||||
topVia.removeParam(rportName);
|
topVia.removeParam(rportName);
|
||||||
topVia.addParam(rportName, String.valueOf(sourcePort));
|
topVia.addParam(rportName, String.valueOf(sourcePort));
|
||||||
}
|
}
|
||||||
@@ -193,13 +189,4 @@ public abstract class MessageReceiver implements Runnable {
|
|||||||
return isListening;
|
return isListening;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSipServerTransportUser(
|
|
||||||
SipServerTransportUser sipServerTransportUser) {
|
|
||||||
this.sipServerTransportUser = sipServerTransportUser;
|
|
||||||
}
|
|
||||||
|
|
||||||
// public void setUas(UAS uas) {
|
|
||||||
// this.uas = uas;
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -329,7 +329,6 @@ public class TransportManager {
|
|||||||
}
|
}
|
||||||
datagramSocket.setSoTimeout(SOCKET_TIMEOUT);
|
datagramSocket.setSoTimeout(SOCKET_TIMEOUT);
|
||||||
datagramSockets.put(conn, datagramSocket);
|
datagramSockets.put(conn, datagramSocket);
|
||||||
Logger.info("added datagram socket " + conn);
|
|
||||||
}
|
}
|
||||||
socket = datagramSocket;
|
socket = datagramSocket;
|
||||||
messageSender = new UdpMessageSender(conn.getRemoteInetAddress(),
|
messageSender = new UdpMessageSender(conn.getRemoteInetAddress(),
|
||||||
@@ -409,7 +408,6 @@ public class TransportManager {
|
|||||||
}
|
}
|
||||||
sipPort = datagramSocket.getLocalPort();
|
sipPort = datagramSocket.getLocalPort();
|
||||||
datagramSockets.put(sipTransportConnection, datagramSocket);
|
datagramSockets.put(sipTransportConnection, datagramSocket);
|
||||||
Logger.info("added datagram socket " + sipTransportConnection);
|
|
||||||
}
|
}
|
||||||
messageReceiver = new UdpMessageReceiver(datagramSocket,
|
messageReceiver = new UdpMessageReceiver(datagramSocket,
|
||||||
transactionManager, this, config);
|
transactionManager, this, config);
|
||||||
@@ -420,8 +418,7 @@ public class TransportManager {
|
|||||||
//messageReceiver = new TcpMessageReceiver(port);
|
//messageReceiver = new TcpMessageReceiver(port);
|
||||||
}
|
}
|
||||||
messageReceivers.put(sipTransportConnection, messageReceiver);
|
messageReceivers.put(sipTransportConnection, messageReceiver);
|
||||||
Logger.info("added " + sipTransportConnection + ": " + messageReceiver
|
|
||||||
+ " to message receivers");
|
|
||||||
return messageReceiver;
|
return messageReceiver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,15 +44,11 @@ public class UdpMessageSender extends MessageSender {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void sendMessage(SipMessage sipMessage) {
|
public synchronized void sendMessage(SipMessage sipMessage) {
|
||||||
Logger.debug("UdpMessageSender.sendMessage");
|
if (sipMessage == null) {
|
||||||
if (sipMessage == null) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
byte[] buf = sipMessage.toString().getBytes();
|
byte[] buf = sipMessage.toString().getBytes();
|
||||||
sendBytes(buf);
|
sendBytes(buf);
|
||||||
String direction = "SENT to " + inetAddress.getHostAddress() +
|
|
||||||
"/" + port;
|
|
||||||
Logger.info(new String(buf), direction);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user