From 251afd6aebd68af2c78c97930d6a3c6cca41adf7 Mon Sep 17 00:00:00 2001 From: yurii Date: Thu, 21 Aug 2025 19:26:42 +0100 Subject: [PATCH] TCP/IP connection to the lock server is now established before encoding the keycard and closed after the encoding is done --- lockserver/assalockserver.go | 9 ++++++++- lockserver/lockservercommon.go | 2 +- lockserver/omnilockserver.go | 9 ++++++++- lockserver/saltolockserver.go | 11 +++++++++-- lockserver/tljlockserver.go | 3 +-- main.go | 27 ++++++++------------------- release notes.md | 3 +++ 7 files changed, 38 insertions(+), 26 deletions(-) diff --git a/lockserver/assalockserver.go b/lockserver/assalockserver.go index 5fad505..c56464e 100644 --- a/lockserver/assalockserver.go +++ b/lockserver/assalockserver.go @@ -19,8 +19,15 @@ func (lock *AssaLockServer) BuildCommand(doorReq DoorCardRequest, checkIn, check } // Checks heart beat of the Assa Abloy lock server and perform key encoding -func (lock *AssaLockServer) LockSequence(conn net.Conn) error { +func (lock *AssaLockServer) LockSequence() error { const funcName = "AssaLockServer.LockSequence" + + conn, err := InitializeServerConnection(lock.encoderAddr) + if err != nil { + return err + } + defer conn.Close() + resp, err := sendHeartbeatToServer(conn) if err != nil { return fmt.Errorf("[%s] heartbeat failed: %v", funcName, err) diff --git a/lockserver/lockservercommon.go b/lockserver/lockservercommon.go index d0049c6..f0d5116 100644 --- a/lockserver/lockservercommon.go +++ b/lockserver/lockservercommon.go @@ -35,7 +35,7 @@ var ( type ( LockServer interface { BuildCommand(doorReq DoorCardRequest, checkIn, checkOut time.Time) error - LockSequence(conn net.Conn) error + LockSequence() error } AssaLockServer struct { diff --git a/lockserver/omnilockserver.go b/lockserver/omnilockserver.go index 396462a..a973b24 100644 --- a/lockserver/omnilockserver.go +++ b/lockserver/omnilockserver.go @@ -53,8 +53,15 @@ func (lock *OmniLockServer) BuildCommand(doorReq DoorCardRequest, checkIn, check } // Starts link to the Omnitec lock server and perform key encoding -func (lock *OmniLockServer) LockSequence(conn net.Conn) error { +func (lock *OmniLockServer) LockSequence() error { const funcName = "OmniLockServer.LockSequence" + + conn, err := net.Dial("tcp", lock.encoderAddr) + if err != nil { + return err + } + defer conn.Close() + // Start the link with the lock server regs, err := lock.linkStart(conn) if err != nil { diff --git a/lockserver/saltolockserver.go b/lockserver/saltolockserver.go index 5e99861..0b19773 100644 --- a/lockserver/saltolockserver.go +++ b/lockserver/saltolockserver.go @@ -139,14 +139,21 @@ func (lock *SaltoLockServer) waitForAck(conn net.Conn, reader *bufio.Reader, tim } // LockSequence performs the full ENQ/ACK handshake and command exchange -func (lock *SaltoLockServer) LockSequence(conn net.Conn) error { +func (lock *SaltoLockServer) LockSequence() error { const timeout = 10 * time.Second var ( resp []byte - reader = bufio.NewReader(conn) drained = 0 // count of stale frames consumed across waits ) + conn, err := InitializeServerConnection(lock.encoderAddr) + if err != nil { + return err + } + defer conn.Close() + + reader := bufio.NewReader(conn) + // 1. Send ENQ log.Infof("Sending ENQ") if _, e := conn.Write([]byte{ENQ}); e != nil { diff --git a/lockserver/tljlockserver.go b/lockserver/tljlockserver.go index 6349283..95a73ba 100644 --- a/lockserver/tljlockserver.go +++ b/lockserver/tljlockserver.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "io/ioutil" - "net" "net/http" "net/url" "time" @@ -36,7 +35,7 @@ func (lock *TLJLockServer) BuildCommand(doorReq DoorCardRequest, checkIn, checkO return nil } -func (lock *TLJLockServer) LockSequence(conn net.Conn) error { +func (lock *TLJLockServer) LockSequence() error { log.Infof("Sending command: %q", lock.command) client := &http.Client{Timeout: 10 * time.Second} resp, err := client.Get(lock.command) diff --git a/main.go b/main.go index fc7a8a2..dcd8550 100644 --- a/main.go +++ b/main.go @@ -6,7 +6,6 @@ import ( "encoding/xml" "fmt" "io" - "net" "net/http" "os" "os/exec" @@ -30,7 +29,7 @@ import ( ) const ( - buildVersion = "1.0.12" + buildVersion = "1.0.13" serviceName = "hardlink" customLayout = "2006-01-02 15:04:05 -0700" transactionUrl = "http://127.0.0.1:18181/start-transaction/" @@ -53,14 +52,12 @@ type configRec struct { // App holds shared resources. type App struct { dispPort *serial.Port - lockConn net.Conn lockserver lockserver.LockServer } -func newApp(dispPort *serial.Port, lockConn net.Conn, config configRec) *App { +func newApp(dispPort *serial.Port, config configRec) *App { return &App{ dispPort: dispPort, - lockConn: lockConn, lockserver: lockserver.NewLockServer(config.LockType, config.EncoderAddress, fatalError), } } @@ -70,8 +67,6 @@ func main() { config := readConfig() printer.Layout = readTicketLayout() printer.PrinterName = config.PrinterName - - var lockConn net.Conn lockserver.Cert = config.Cert lockserver.LockServerURL = config.LockserverUrl @@ -103,25 +98,19 @@ func main() { } log.Infof("Dispenser initialized on port %s, %s", config.DispenserPort, status) - // Initialize lock-server connection once + // Test lock-server connection switch strings.ToLower(config.LockType) { case lockserver.TLJ: default: - lockConn, err = lockserver.InitializeServerConnection(config.LockserverUrl) + lockConn, err := lockserver.InitializeServerConnection(config.LockserverUrl) if err != nil { fatalError(err) } - defer lockConn.Close() - log.Infof("Connected to lock server at %s", config.LockserverUrl) + log.Infof("Connectting to lock server at %s", config.LockserverUrl) + lockConn.Close() } - // db, err := payment.InitMSSQL(config.dbport, config.dbname, config.dbuser, config.dbpassword) - // if err != nil { - // fatalError(fmt.Errorf("DB init failed: %v", err)) - // } - // defer db.Close() - if config.IsPayment { startClient := func() (*exec.Cmd, error) { cmd := exec.Command("./ChipDNAClient/ChipDnaClient.exe") @@ -181,7 +170,7 @@ func main() { // Create App and wire routes // dispHandle := &serial.Port{} // Placeholder, replace with actual dispenser handle - app := newApp(dispHandle, lockConn, config) + app := newApp(dispHandle, config) mux := http.NewServeMux() setUpRoutes(app, mux) @@ -389,7 +378,7 @@ func (app *App) issueDoorCard(w http.ResponseWriter, r *http.Request) { app.lockserver.BuildCommand(doorReq, checkIn, checkOut) // lock server sequence - err = app.lockserver.LockSequence(app.lockConn) + err = app.lockserver.LockSequence() if err != nil { logging.Error(serviceName, err.Error(), "Key encoding", string(op), "", "", 0) writeError(w, http.StatusBadGateway, err.Error()) diff --git a/release notes.md b/release notes.md index 681be8a..9227238 100644 --- a/release notes.md +++ b/release notes.md @@ -2,6 +2,9 @@ builtVersion is a const in main.go +#### 1.0.13 - 21 August 2025 +TCP/IP connection to the lock server is now established before encoding the keycard and closedafter the encoding is done. + #### 1.0.12 - 11 August 2024 added delay before checking dispenser status