Skip to content

Commit 95cfe45

Browse files
authored
Add serial to address mappings cache to Keba listener for making simple messages routable via serial (#546)
#429 introduced a bug when KEBA was configured using serial number. The TCH :OK messages received from KEBA could not be routed to the subscriber since they don't contain serial numbers. This PR adds a serial<->address cache to the listener for maintaining this mapping and hence make the OK responses routable.
1 parent e057599 commit 95cfe45

File tree

4 files changed

+24
-7
lines changed

4 files changed

+24
-7
lines changed

charger/keba.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ func NewKebaFromConfig(other map[string]interface{}) (api.Charger, error) {
5858
func NewKeba(uri, serial string, rfid RFID, timeout time.Duration) (api.Charger, error) {
5959
log := util.NewLogger("keba")
6060

61-
var err error
6261
if keba.Instance == nil {
62+
var err error
6363
keba.Instance, err = keba.New(log)
6464
if err != nil {
6565
return nil, err
@@ -68,7 +68,7 @@ func NewKeba(uri, serial string, rfid RFID, timeout time.Duration) (api.Charger,
6868

6969
// add default port
7070
conn := util.DefaultPort(uri, keba.Port)
71-
sender, err := keba.NewSender(uri)
71+
sender, err := keba.NewSender(log, conn)
7272

7373
c := &Keba{
7474
log: log,

charger/keba/listener.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ type Listener struct {
4040
log *util.Logger
4141
conn *net.UDPConn
4242
clients map[string]chan<- UDPMsg
43+
cache map[string]string
4344
}
4445

4546
// New creates a UDP listener that clients can subscribe to
@@ -58,14 +59,15 @@ func New(log *util.Logger) (*Listener, error) {
5859
log: log,
5960
conn: conn,
6061
clients: make(map[string]chan<- UDPMsg),
62+
cache: make(map[string]string),
6163
}
6264

6365
go l.listen()
6466

6567
return l, nil
6668
}
6769

68-
// Subscribe adds a client address and message channel
70+
// Subscribe adds a client address or serial and message channel to the list of subscribers
6971
func (l *Listener) Subscribe(addr string, c chan<- UDPMsg) {
7072
l.mux.Lock()
7173
defer l.mux.Unlock()
@@ -94,7 +96,7 @@ func (l *Listener) listen() {
9496
if body != OK {
9597
var report Report
9698
if err := json.Unmarshal([]byte(body), &report); err != nil {
97-
l.log.WARN.Printf("listener: %v", err)
99+
l.log.WARN.Printf("recv: invalid message: %v", err)
98100
continue
99101
}
100102

@@ -105,15 +107,25 @@ func (l *Listener) listen() {
105107
}
106108
}
107109

108-
// addrMatches checks if either message sender or serial matched given addr
110+
// addrMatches checks if either message sender or serial matches given addr
109111
func (l *Listener) addrMatches(addr string, msg UDPMsg) bool {
110112
switch {
111113
case addr == Any:
112114
return true
115+
113116
case addr == msg.Addr:
114117
return true
118+
119+
// simple response like TCH :OK where cached serial for sender address matches
120+
case l.cache[addr] == msg.Addr:
121+
return true
122+
123+
// report response with matching serial
115124
case msg.Report != nil && addr == msg.Report.Serial:
125+
// cache address for serial to make simple TCH :OK messages routable using serial
126+
l.cache[msg.Report.Serial] = msg.Addr
116127
return true
128+
117129
default:
118130
return false
119131
}

charger/keba/sender.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ import (
1010

1111
// Sender is a KEBA UDP sender
1212
type Sender struct {
13+
log *util.Logger
14+
addr string
1315
conn *net.UDPConn
1416
}
1517

1618
// NewSender creates KEBA UDP sender
17-
func NewSender(addr string) (*Sender, error) {
19+
func NewSender(log *util.Logger, addr string) (*Sender, error) {
1820
addr = util.DefaultPort(addr, Port)
1921
raddr, err := net.ResolveUDPAddr("udp", addr)
2022

@@ -24,6 +26,8 @@ func NewSender(addr string) (*Sender, error) {
2426
}
2527

2628
c := &Sender{
29+
log: log,
30+
addr: addr,
2731
conn: conn,
2832
}
2933

@@ -32,6 +36,7 @@ func NewSender(addr string) (*Sender, error) {
3236

3337
// Send msg to receiver
3438
func (c *Sender) Send(msg string) error {
39+
c.log.TRACE.Printf("send to %s %v", c.addr, msg)
3540
_, err := io.Copy(c.conn, strings.NewReader(msg))
3641
return err
3742
}

detect/keba.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func (h *KEBAHandler) Test(log *util.Logger, ip string) []interface{} {
5050
resC := make(chan keba.UDPMsg)
5151
h.listener.Subscribe(ip, resC)
5252

53-
sender, err := keba.NewSender(ip)
53+
sender, err := keba.NewSender(log, ip)
5454
if err != nil {
5555
log.ERROR.Println("keba:", err)
5656
return nil

0 commit comments

Comments
 (0)