From cbafc3e0c3566c619c6cc5b40fbcfb07594f5d4d Mon Sep 17 00:00:00 2001 From: premultiply <4681172+premultiply@users.noreply.github.com> Date: Sat, 14 Sep 2024 14:38:02 +0200 Subject: [PATCH] Ocpp: generate globally unique transaction ids (#15951) --- charger/ocpp/connector.go | 5 ++--- charger/ocpp/connector_core.go | 27 ++------------------------- charger/ocpp/cs.go | 12 +++++++++++- charger/ocpp/instance.go | 1 + 4 files changed, 16 insertions(+), 29 deletions(-) diff --git a/charger/ocpp/connector.go b/charger/ocpp/connector.go index 461e716d6..862b3f02c 100644 --- a/charger/ocpp/connector.go +++ b/charger/ocpp/connector.go @@ -29,9 +29,8 @@ type Connector struct { meterUpdated time.Time measurements map[types.Measurand]types.SampledValue - txnCount int // change initial value to the last known global transaction. Needs persistence - txnId int - idTag string + txnId int + idTag string remoteIdTag string } diff --git a/charger/ocpp/connector_core.go b/charger/ocpp/connector_core.go index 66ddd38e6..df0d38d2d 100644 --- a/charger/ocpp/connector_core.go +++ b/charger/ocpp/connector_core.go @@ -64,7 +64,7 @@ func (conn *Connector) MeterValues(request *core.MeterValuesRequest) (*core.Mete (conn.status.Status == core.ChargePointStatusCharging || conn.status.Status == core.ChargePointStatusSuspendedEV || conn.status.Status == core.ChargePointStatusSuspendedEVSE) { - conn.log.DEBUG.Printf("hijacking transaction: %d", *request.TransactionId) + conn.log.DEBUG.Printf("recovered transaction: %d", *request.TransactionId) conn.txnId = *request.TransactionId } @@ -91,19 +91,7 @@ func (conn *Connector) StartTransaction(request *core.StartTransactionRequest) ( conn.mu.Lock() defer conn.mu.Unlock() - // expired request - if request.Timestamp != nil && conn.clock.Since(request.Timestamp.Time) > Timeout { - res := &core.StartTransactionConfirmation{ - IdTagInfo: &types.IdTagInfo{ - Status: types.AuthorizationStatusExpired, // reject - }, - } - - return res, nil - } - - conn.txnCount++ - conn.txnId = conn.txnCount + conn.txnId = instance.NewTransactionID() conn.idTag = request.IdTag res := &core.StartTransactionConfirmation{ @@ -140,17 +128,6 @@ func (conn *Connector) StopTransaction(request *core.StopTransactionRequest) (*c conn.mu.Lock() defer conn.mu.Unlock() - // expired request - if request.Timestamp != nil && conn.clock.Since(request.Timestamp.Time) > Timeout { - res := &core.StopTransactionConfirmation{ - IdTagInfo: &types.IdTagInfo{ - Status: types.AuthorizationStatusExpired, // reject - }, - } - - return res, nil - } - conn.txnId = 0 conn.idTag = "" diff --git a/charger/ocpp/cs.go b/charger/ocpp/cs.go index 70e0d1986..72be4ac00 100644 --- a/charger/ocpp/cs.go +++ b/charger/ocpp/cs.go @@ -13,7 +13,8 @@ type CS struct { mu sync.Mutex log *util.Logger ocpp16.CentralSystem - cps map[string]*CP + cps map[string]*CP + txnId int } // Register registers a charge point with the central system. @@ -106,3 +107,12 @@ func (cs *CS) ChargePointDisconnected(chargePoint ocpp16.ChargePointConnection) cp.connect(false) } } + +// NewTransactionID returns a CS-wide unique transactionId +func (cs *CS) NewTransactionID() int { + cs.mu.Lock() + defer cs.mu.Unlock() + + cs.txnId++ + return cs.txnId +} diff --git a/charger/ocpp/instance.go b/charger/ocpp/instance.go index 4220fc50c..ec6315f13 100644 --- a/charger/ocpp/instance.go +++ b/charger/ocpp/instance.go @@ -42,6 +42,7 @@ func Instance() *CS { log: log, cps: make(map[string]*CP), CentralSystem: cs, + txnId: int(time.Now().UTC().Unix()), } ocppj.SetLogger(instance)