@@ -3,7 +3,6 @@ package protocol
33import (
44"log"
55"net"
6- "time"
76)
87
98// Implementation of the Protocol Gateway.
@@ -76,7 +75,13 @@ func (g *gateway) handleRxPacket(packet *Packet) {
7675
7776// Start link session
7877g .session .Add (1 )
79- go g .packetSender ()
78+ tx := make ([]byte , 512 )
79+ go g .packetSender (func () (p Packet , err error ) {
80+ // Publish data downstream received from upstream tcp server.
81+ n , err := g .uStream .Read (tx )
82+ p = Packet {command : publish , payload : tx [:n ]}
83+ return
84+ }, g .dropLink )
8085// log.Printf("Gateway: Connected to %v\n", dstStr)
8186g .state = Connected
8287g .txBuff <- Packet {command : connack }
@@ -88,51 +93,6 @@ func (g *gateway) handleRxPacket(packet *Packet) {
8893}
8994}
9095
91- // Publish data downstream received from upstream tcp server.
92- // We need to get an Ack before sending the next publish packet.
93- // Resend same publish packet after timeout, and kill link after 5 retries.
94- func (g * gateway ) packetSender () {
95- defer g .session .Done ()
96- sequenceTxFlag := false
97- retries := 0
98- tx := make ([]byte , 512 )
99- for {
100- nRx , err := g .uStream .Read (tx )
101- if err != nil {
102- if g .state == Connected {
103- log .Printf ("Error receiving upstream: %v. Disconnecting client\n " , err )
104- g .txBuff <- Packet {command : disconnect }
105- g .dropLink ()
106- }
107- return
108- }
109- p := Packet {command : publish , payload : tx [:nRx ]}
110- if sequenceTxFlag {
111- p .command |= 0x80
112- }
113- PUB_LOOP:
114- for {
115- g .txBuff <- p
116- select {
117- case ack , ok := <- g .acknowledgeEvent :
118- if ok && ack == sequenceTxFlag {
119- retries = 0
120- sequenceTxFlag = ! sequenceTxFlag
121- break PUB_LOOP // success
122- }
123- case <- time .After (time .Millisecond * 500 ):
124- retries ++
125- if retries >= 5 {
126- log .Println ("Too many downstream send retries. Disconnecting client" )
127- g .txBuff <- Packet {command : disconnect }
128- g .dropLink ()
129- return
130- }
131- }
132- }
133- }
134- }
135-
13696// End link session between upstream server and downstream client.
13797func (g * gateway ) dropLink () {
13898if g .uStream != nil {
0 commit comments