From 15114b1e524542358a61c5eef8ea9ef1da8ad116 Mon Sep 17 00:00:00 2001 From: rdkartono Date: Fri, 13 Dec 2024 14:37:42 +0700 Subject: [PATCH] pakai TCP Server listening --- src/Main.java | 93 +++++++++++++++++++++++++++++++++- src/ProtegeData/EventData.java | 44 ++++++++++++++++ 2 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 src/ProtegeData/EventData.java diff --git a/src/Main.java b/src/Main.java index fbebc8c..31eec2d 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,3 +1,4 @@ +import ProtegeData.EventData; import ProtegeData.TableID; import ProtegeData.User; import jakarta.xml.bind.JAXBContext; @@ -9,7 +10,11 @@ import org.tempuri.IService1; import org.tempuri.Service1; import jakarta.xml.ws.Holder; +import java.io.InputStream; +import java.io.OutputStream; import java.io.StringReader; +import java.net.ServerSocket; +import java.net.Socket; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -24,6 +29,7 @@ public class Main { static Holder ErrorMsg = new Holder<>(); static Holder Success = new Holder<>(); static IService1 basichttp; + static boolean isRunning = true; public static void main(String[] args) { Logger.info("ProtegeGX Java 17 Project"); @@ -35,14 +41,97 @@ public class Main { logon.setUserName(factory.createLogonUserName("admin")); logon.setPassword(factory.createLogonPassword("")); - GetVersion(); - GetUsers(4,3,4); + //GetVersion(); + //GetUsers(4,3,4); // LocalDate today = LocalDate.now(); // LocalDateTime startofDay = today.atStartOfDay(); // LocalDateTime endofDay = today.atTime(23,59,59); // DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"); // RunReport(6,4,0,200, formatter.format(startofDay),formatter.format(endofDay)); + + isRunning = true; + //new Thread(()-> CreateTCPServer(5000)).start(); + + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + Logger.info("Shutting down..."); + isRunning = false; + })); + + final String string = "PROTEGXEVENT,503,\n" + + " 2892\n" + + " 799\n" + + " User Master User (0:2053917549) (UN3) Granted Entry To PINTU EXIT (DR4) Access Level ALL DOOR (AL) (AL1) Reading Mode Card Input\n" + + " Utilisateur Master User (0:2053917549) (UN3) Entrée accordée à PINTU EXIT (DR4) niveau d'accès ALL DOOR (AL) (AL1) Mode de lecture Entrée carte\n" + + " 13-12-2024 13:23:45\n" + + " 13-12-2024 13:23:51\n" + + ""; + EventData event = EventData.Parse(string); + if (event!=null){ + Logger.info("Event: \n{}", event.toString()); + } else { + Logger.error("Invalid Event Data"); + } + + Logger.info("Press any key to exit..."); + + try{ + System.in.read(); + } catch (Exception e){ + Logger.error("Error: {}", e.getMessage()); + } + + isRunning = false; + + } + + + + private static void CreateTCPServer(int port){ + + try{ + ServerSocket server = new ServerSocket(port); + Logger.info("Server started at port: {}", port); + while (isRunning){ + Logger.info("Waiting for connection..."); + Socket client = server.accept(); + + new Thread(()->{ + Logger.info("Client connected: {}", client.getInetAddress().getHostAddress()); + try{ + InputStream in = client.getInputStream(); + OutputStream out = client.getOutputStream(); + while(isRunning){ + byte[] buffer = new byte[1024]; + int bytesRead = in.read(buffer); + if (bytesRead == -1) break; + String message = new String(buffer, 0, bytesRead); + + Logger.info("Message: {}", message); + EventData event = EventData.Parse(message); + if (event!=null){ + Logger.info("Event: \n{}", event.toString()); + } + } + + } catch (Exception e){ + Logger.error("Error: {}", e.getMessage()); + } + + try{ + client.close(); + Logger.info("Client disconnected"); + } catch (Exception e){ + Logger.error("Error: {}", e.getMessage()); + } + + }).start(); + } + server.close(); + Logger.info("Server closed"); + } catch (Exception e){ + Logger.error("Error: {}", e.getMessage()); + } } /** diff --git a/src/ProtegeData/EventData.java b/src/ProtegeData/EventData.java new file mode 100644 index 0000000..468a054 --- /dev/null +++ b/src/ProtegeData/EventData.java @@ -0,0 +1,44 @@ +package ProtegeData; + +import java.util.regex.Pattern; + +public class EventData { + + public String FirstName; + public String LastName; + public String CardNumber; + public int UserNode; + public String DoorName; + public int DoorNode; + public String FieldTime; + public String LoggedTime; + + @Override + public String toString(){ + return String.format("FirstName: %s\nLastName: %s\nCardNumber: %s\nUserNode: %d\nDoorName: %s\nDoorNode: %d\nFieldTime: %s\nLoggedTime: %s", FirstName, LastName, CardNumber, UserNode, DoorName, DoorNode, FieldTime, LoggedTime); + } + + /** + * create EventData object from string data using Regex + * @param data string data + * @return EventData object if valid, or null if invalid + */ + public static EventData Parse(String data){ + final String regex = "User (\\w*) (\\w*) \\(([:0-9]*)\\) \\(UN(\\d+)\\).*?To (.*?) \\(DR(\\d+)\\).*?.*?(.*?).*?(.*?)"; + final Pattern pattern = Pattern.compile(regex, Pattern.DOTALL); + final java.util.regex.Matcher matcher = pattern.matcher(data); + if (matcher.find()){ + EventData event = new EventData(); + event.FirstName = matcher.group(1); + event.LastName = matcher.group(2); + event.CardNumber = matcher.group(3); + event.UserNode = Integer.parseInt(matcher.group(4)); + event.DoorName = matcher.group(5); + event.DoorNode = Integer.parseInt(matcher.group(6)); + event.FieldTime = matcher.group(7); + event.LoggedTime = matcher.group(8); + return event; + } + return null; + } +}