@@ -3,6 +3,7 @@ package concentratord
3
3
import (
4
4
"context"
5
5
"sync"
6
+ "time"
6
7
7
8
"github.com/go-zeromq/zmq4"
8
9
"github.com/gofrs/uuid"
@@ -28,12 +29,16 @@ type Backend struct {
28
29
subscribeEventChan chan events.Subscribe
29
30
disconnectChan chan lorawan.EUI64
30
31
32
+ eventURL string
33
+ commandURL string
34
+
35
+ gatewayID lorawan.EUI64
36
+
31
37
crcCheck bool
32
38
}
33
39
34
40
// NewBackend creates a new Backend.
35
41
func NewBackend (conf config.Config ) (* Backend , error ) {
36
- var err error
37
42
log .WithFields (log.Fields {
38
43
"event_url" : conf .Backend .Concentratord .EventURL ,
39
44
"command_url" : conf .Backend .Concentratord .CommandURL ,
@@ -48,34 +53,70 @@ func NewBackend(conf config.Config) (*Backend, error) {
48
53
gatewayStatsChan : make (chan gw.GatewayStats , 1 ),
49
54
subscribeEventChan : make (chan events.Subscribe , 1 ),
50
55
56
+ eventURL : conf .Backend .Concentratord .EventURL ,
57
+ commandURL : conf .Backend .Concentratord .CommandURL ,
58
+
51
59
crcCheck : conf .Backend .Concentratord .CRCCheck ,
52
60
}
53
61
54
- err = b .eventSock .Dial (conf .Backend .Concentratord .EventURL )
62
+ b .dialEventSockLoop ()
63
+ b .dialCommandSockLoop ()
64
+
65
+ b .subscribeEventChan <- events.Subscribe {Subscribe : true , GatewayID : b .gatewayID }
66
+
67
+ go b .eventLoop ()
68
+
69
+ return & b , nil
70
+ }
71
+
72
+ func (b * Backend ) dialEventSock () error {
73
+ err := b .eventSock .Dial (b .eventURL )
55
74
if err != nil {
56
- return nil , errors .Wrap (err , "dial event api url error" )
75
+ return errors .Wrap (err , "dial event api url error" )
57
76
}
58
77
59
78
err = b .eventSock .SetOption (zmq4 .OptionSubscribe , "" )
60
79
if err != nil {
61
- return nil , errors .Wrap (err , "set event option error" )
80
+ return errors .Wrap (err , "set event option error" )
62
81
}
63
82
64
- err = b .commandSock .Dial (conf .Backend .Concentratord .CommandURL )
83
+ return nil
84
+ }
85
+
86
+ func (b * Backend ) dialCommandSock () error {
87
+ err := b .commandSock .Dial (b .commandURL )
65
88
if err != nil {
66
- return nil , errors .Wrap (err , "dial command api url error" )
89
+ return errors .Wrap (err , "dial command api url error" )
67
90
}
68
91
69
- gatewayID , err : = b .getGatewayID ()
92
+ b . gatewayID , err = b .getGatewayID ()
70
93
if err != nil {
71
- return nil , errors .Wrap (err , "get gateway id error" )
94
+ return errors .Wrap (err , "get gateway id error" )
72
95
}
73
96
74
- b .subscribeEventChan <- events.Subscribe {Subscribe : true , GatewayID : gatewayID }
97
+ return nil
98
+ }
75
99
76
- go b .eventLoop ()
100
+ func (b * Backend ) dialCommandSockLoop () {
101
+ for {
102
+ if err := b .dialCommandSock (); err != nil {
103
+ log .WithError (err ).Error ("backend/concentratord: command socket dial error" )
104
+ time .Sleep (time .Second )
105
+ continue
106
+ }
107
+ break
108
+ }
109
+ }
77
110
78
- return & b , nil
111
+ func (b * Backend ) dialEventSockLoop () {
112
+ for {
113
+ if err := b .dialEventSock (); err != nil {
114
+ log .WithError (err ).Error ("backend/concentratord: event socket dial error" )
115
+ time .Sleep (time .Second )
116
+ continue
117
+ }
118
+ break
119
+ }
79
120
}
80
121
81
122
func (b * Backend ) getGatewayID () (lorawan.EUI64 , error ) {
@@ -182,11 +223,13 @@ func (b *Backend) commandRequest(command string, v proto.Message) ([]byte, error
182
223
183
224
msg := zmq4 .NewMsgFrom ([]byte (command ), bb )
184
225
if err = b .commandSock .SendMulti (msg ); err != nil {
226
+ b .dialCommandSock ()
185
227
return nil , errors .Wrap (err , "send command request error" )
186
228
}
187
229
188
230
reply , err := b .commandSock .Recv ()
189
231
if err != nil {
232
+ b .dialCommandSock ()
190
233
return nil , errors .Wrap (err , "receive command request reply error" )
191
234
}
192
235
@@ -197,7 +240,8 @@ func (b *Backend) eventLoop() {
197
240
for {
198
241
msg , err := b .eventSock .Recv ()
199
242
if err != nil {
200
- log .WithError (err ).Fatal ("backend/concentratord: receive event message error" )
243
+ log .WithError (err ).Error ("backend/concentratord: receive event message error" )
244
+ b .dialEventSockLoop ()
201
245
continue
202
246
}
203
247
0 commit comments