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:
parent
e6ff292706
commit
251afd6aeb
@ -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
|
// 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"
|
const funcName = "AssaLockServer.LockSequence"
|
||||||
|
|
||||||
|
conn, err := InitializeServerConnection(lock.encoderAddr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
|
||||||
resp, err := sendHeartbeatToServer(conn)
|
resp, err := sendHeartbeatToServer(conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("[%s] heartbeat failed: %v", funcName, err)
|
return fmt.Errorf("[%s] heartbeat failed: %v", funcName, err)
|
||||||
|
@ -35,7 +35,7 @@ var (
|
|||||||
type (
|
type (
|
||||||
LockServer interface {
|
LockServer interface {
|
||||||
BuildCommand(doorReq DoorCardRequest, checkIn, checkOut time.Time) error
|
BuildCommand(doorReq DoorCardRequest, checkIn, checkOut time.Time) error
|
||||||
LockSequence(conn net.Conn) error
|
LockSequence() error
|
||||||
}
|
}
|
||||||
|
|
||||||
AssaLockServer struct {
|
AssaLockServer struct {
|
||||||
|
@ -53,8 +53,15 @@ func (lock *OmniLockServer) BuildCommand(doorReq DoorCardRequest, checkIn, check
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Starts link to the Omnitec lock server and perform key encoding
|
// 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"
|
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
|
// Start the link with the lock server
|
||||||
regs, err := lock.linkStart(conn)
|
regs, err := lock.linkStart(conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -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
|
// 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
|
const timeout = 10 * time.Second
|
||||||
var (
|
var (
|
||||||
resp []byte
|
resp []byte
|
||||||
reader = bufio.NewReader(conn)
|
|
||||||
drained = 0 // count of stale frames consumed across waits
|
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
|
// 1. Send ENQ
|
||||||
log.Infof("Sending ENQ")
|
log.Infof("Sending ENQ")
|
||||||
if _, e := conn.Write([]byte{ENQ}); e != nil {
|
if _, e := conn.Write([]byte{ENQ}); e != nil {
|
||||||
|
@ -4,7 +4,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"time"
|
"time"
|
||||||
@ -36,7 +35,7 @@ func (lock *TLJLockServer) BuildCommand(doorReq DoorCardRequest, checkIn, checkO
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lock *TLJLockServer) LockSequence(conn net.Conn) error {
|
func (lock *TLJLockServer) LockSequence() error {
|
||||||
log.Infof("Sending command: %q", lock.command)
|
log.Infof("Sending command: %q", lock.command)
|
||||||
client := &http.Client{Timeout: 10 * time.Second}
|
client := &http.Client{Timeout: 10 * time.Second}
|
||||||
resp, err := client.Get(lock.command)
|
resp, err := client.Get(lock.command)
|
||||||
|
27
main.go
27
main.go
@ -6,7 +6,6 @@ import (
|
|||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
@ -30,7 +29,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
buildVersion = "1.0.12"
|
buildVersion = "1.0.13"
|
||||||
serviceName = "hardlink"
|
serviceName = "hardlink"
|
||||||
customLayout = "2006-01-02 15:04:05 -0700"
|
customLayout = "2006-01-02 15:04:05 -0700"
|
||||||
transactionUrl = "http://127.0.0.1:18181/start-transaction/"
|
transactionUrl = "http://127.0.0.1:18181/start-transaction/"
|
||||||
@ -53,14 +52,12 @@ type configRec struct {
|
|||||||
// App holds shared resources.
|
// App holds shared resources.
|
||||||
type App struct {
|
type App struct {
|
||||||
dispPort *serial.Port
|
dispPort *serial.Port
|
||||||
lockConn net.Conn
|
|
||||||
lockserver lockserver.LockServer
|
lockserver lockserver.LockServer
|
||||||
}
|
}
|
||||||
|
|
||||||
func newApp(dispPort *serial.Port, lockConn net.Conn, config configRec) *App {
|
func newApp(dispPort *serial.Port, config configRec) *App {
|
||||||
return &App{
|
return &App{
|
||||||
dispPort: dispPort,
|
dispPort: dispPort,
|
||||||
lockConn: lockConn,
|
|
||||||
lockserver: lockserver.NewLockServer(config.LockType, config.EncoderAddress, fatalError),
|
lockserver: lockserver.NewLockServer(config.LockType, config.EncoderAddress, fatalError),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -70,8 +67,6 @@ func main() {
|
|||||||
config := readConfig()
|
config := readConfig()
|
||||||
printer.Layout = readTicketLayout()
|
printer.Layout = readTicketLayout()
|
||||||
printer.PrinterName = config.PrinterName
|
printer.PrinterName = config.PrinterName
|
||||||
|
|
||||||
var lockConn net.Conn
|
|
||||||
lockserver.Cert = config.Cert
|
lockserver.Cert = config.Cert
|
||||||
lockserver.LockServerURL = config.LockserverUrl
|
lockserver.LockServerURL = config.LockserverUrl
|
||||||
|
|
||||||
@ -103,25 +98,19 @@ func main() {
|
|||||||
}
|
}
|
||||||
log.Infof("Dispenser initialized on port %s, %s", config.DispenserPort, status)
|
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) {
|
switch strings.ToLower(config.LockType) {
|
||||||
case lockserver.TLJ:
|
case lockserver.TLJ:
|
||||||
|
|
||||||
default:
|
default:
|
||||||
lockConn, err = lockserver.InitializeServerConnection(config.LockserverUrl)
|
lockConn, err := lockserver.InitializeServerConnection(config.LockserverUrl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fatalError(err)
|
fatalError(err)
|
||||||
}
|
}
|
||||||
defer lockConn.Close()
|
log.Infof("Connectting to lock server at %s", config.LockserverUrl)
|
||||||
log.Infof("Connected 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 {
|
if config.IsPayment {
|
||||||
startClient := func() (*exec.Cmd, error) {
|
startClient := func() (*exec.Cmd, error) {
|
||||||
cmd := exec.Command("./ChipDNAClient/ChipDnaClient.exe")
|
cmd := exec.Command("./ChipDNAClient/ChipDnaClient.exe")
|
||||||
@ -181,7 +170,7 @@ func main() {
|
|||||||
|
|
||||||
// Create App and wire routes
|
// Create App and wire routes
|
||||||
// dispHandle := &serial.Port{} // Placeholder, replace with actual dispenser handle
|
// dispHandle := &serial.Port{} // Placeholder, replace with actual dispenser handle
|
||||||
app := newApp(dispHandle, lockConn, config)
|
app := newApp(dispHandle, config)
|
||||||
|
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
setUpRoutes(app, mux)
|
setUpRoutes(app, mux)
|
||||||
@ -389,7 +378,7 @@ func (app *App) issueDoorCard(w http.ResponseWriter, r *http.Request) {
|
|||||||
app.lockserver.BuildCommand(doorReq, checkIn, checkOut)
|
app.lockserver.BuildCommand(doorReq, checkIn, checkOut)
|
||||||
|
|
||||||
// lock server sequence
|
// lock server sequence
|
||||||
err = app.lockserver.LockSequence(app.lockConn)
|
err = app.lockserver.LockSequence()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logging.Error(serviceName, err.Error(), "Key encoding", string(op), "", "", 0)
|
logging.Error(serviceName, err.Error(), "Key encoding", string(op), "", "", 0)
|
||||||
writeError(w, http.StatusBadGateway, err.Error())
|
writeError(w, http.StatusBadGateway, err.Error())
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
builtVersion is a const in main.go
|
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
|
#### 1.0.12 - 11 August 2024
|
||||||
added delay before checking dispenser status
|
added delay before checking dispenser status
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user