TCP/IP connection to the lock server is now established before encoding the keycard and closed after the encoding is done

This commit is contained in:
yurii 2025-08-21 19:26:42 +01:00
parent e6ff292706
commit 251afd6aeb
7 changed files with 38 additions and 26 deletions

View File

@ -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)

View File

@ -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 {

View File

@ -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 {

View File

@ -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 {

View File

@ -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)

27
main.go
View File

@ -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())

View File

@ -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