fix-reconnect
This commit is contained in:
parent
3b95cf5645
commit
197718b418
@ -26,6 +26,8 @@ import (
|
|||||||
// 创建SESSION 03 00 00 00
|
// 创建SESSION 03 00 00 00
|
||||||
type Config struct {
|
type Config struct {
|
||||||
DeviceId string
|
DeviceId string
|
||||||
|
DeviceType string
|
||||||
|
DeviceDesc string
|
||||||
AddrServer string
|
AddrServer string
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,13 +75,13 @@ func main() {
|
|||||||
Flags: []cli.Flag{
|
Flags: []cli.Flag{
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "log",
|
Name: "log",
|
||||||
Value: "log.txt",
|
Value: "goproxy.log",
|
||||||
Usage: "log file path",
|
Usage: "log file path",
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "conf",
|
Name: "conf",
|
||||||
Aliases: []string{"c"},
|
Aliases: []string{"c"},
|
||||||
Value: "./rttys.conf",
|
Value: "./goproxy.conf",
|
||||||
Usage: "config file to load",
|
Usage: "config file to load",
|
||||||
},
|
},
|
||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
@ -117,13 +119,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func runClient(c *cli.Context) {
|
func reConnect(dev *Device, cfg *Config) {
|
||||||
|
|
||||||
cfg := &Config{
|
|
||||||
DeviceId: "jmq",
|
|
||||||
AddrServer: "dev.xzrobot.com:9011",
|
|
||||||
}
|
|
||||||
|
|
||||||
tcpConn, err := createTcpConn(cfg.AddrServer)
|
tcpConn, err := createTcpConn(cfg.AddrServer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("TCP Connect Error! " + err.Error())
|
fmt.Println("TCP Connect Error! " + err.Error())
|
||||||
@ -131,17 +127,8 @@ func runClient(c *cli.Context) {
|
|||||||
}
|
}
|
||||||
fmt.Println(tcpConn.LocalAddr().String() + " : Client Connected")
|
fmt.Println(tcpConn.LocalAddr().String() + " : Client Connected")
|
||||||
|
|
||||||
dev := &Device{
|
dev.conn = tcpConn
|
||||||
id: cfg.DeviceId,
|
dev.closed = 0
|
||||||
category: "device",
|
|
||||||
conn: tcpConn,
|
|
||||||
create_time: time.Now().Unix(),
|
|
||||||
active: time.Now(),
|
|
||||||
registered: false,
|
|
||||||
closed: 0,
|
|
||||||
send: make(chan []byte, 100),
|
|
||||||
sessions: make(map[string]*Session),
|
|
||||||
}
|
|
||||||
go dev.readLoop()
|
go dev.readLoop()
|
||||||
go dev.writeLoop()
|
go dev.writeLoop()
|
||||||
|
|
||||||
@ -151,8 +138,61 @@ func runClient(c *cli.Context) {
|
|||||||
s[1] = []byte("desc") //desc
|
s[1] = []byte("desc") //desc
|
||||||
s[2] = []byte("token") //token
|
s[2] = []byte("token") //token
|
||||||
dev.WriteMsg(MSG_TYPE_REGISTER, bytes.Join(s, []byte{0}))
|
dev.WriteMsg(MSG_TYPE_REGISTER, bytes.Join(s, []byte{0}))
|
||||||
|
}
|
||||||
|
|
||||||
|
func runClient(c *cli.Context) {
|
||||||
|
|
||||||
|
cfg := &Config{
|
||||||
|
DeviceId: "jmq",
|
||||||
|
DeviceType: "device",
|
||||||
|
DeviceDesc: "jmq",
|
||||||
|
AddrServer: "dev.xzrobot.com:9011",
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
|
||||||
|
dev := &Device{
|
||||||
|
id: cfg.DeviceId,
|
||||||
|
category: cfg.DeviceType,
|
||||||
|
desc: cfg.DeviceDesc,
|
||||||
|
create_time: time.Now().Unix(),
|
||||||
|
active: time.Now(),
|
||||||
|
registered: false,
|
||||||
|
closed: 1,
|
||||||
|
send: make(chan []byte, 1024),
|
||||||
|
sessions: make(map[string]*Session),
|
||||||
|
}
|
||||||
|
|
||||||
|
// tcpConn, err := createTcpConn(cfg.AddrServer)
|
||||||
|
// if err != nil {
|
||||||
|
// fmt.Println("TCP Connect Error! " + err.Error())
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// fmt.Println(tcpConn.LocalAddr().String() + " : Client Connected")
|
||||||
|
|
||||||
|
// go dev.readLoop()
|
||||||
|
// go dev.writeLoop()
|
||||||
|
|
||||||
|
//registe
|
||||||
|
// s := make([][]byte, 3)
|
||||||
|
// s[0] = []byte("jmq") //id
|
||||||
|
// s[1] = []byte("desc") //desc
|
||||||
|
// s[2] = []byte("token") //token
|
||||||
|
// dev.WriteMsg(MSG_TYPE_REGISTER, bytes.Join(s, []byte{0}))
|
||||||
|
|
||||||
|
t := time.NewTicker(time.Second * 1)
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-t.C:
|
||||||
|
if dev.closed == 1 {
|
||||||
|
reConnect(dev, cfg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info().Msgf("main loop exit")
|
||||||
|
}
|
||||||
|
|
||||||
select {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dev *Device) WriteMsg(typ int, data []byte) {
|
func (dev *Device) WriteMsg(typ int, data []byte) {
|
||||||
@ -172,6 +212,7 @@ func (dev *Device) readLoop() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
if err != io.EOF && !strings.Contains(err.Error(), "use of closed network connection") {
|
if err != io.EOF && !strings.Contains(err.Error(), "use of closed network connection") {
|
||||||
log.Error().Msg(err.Error())
|
log.Error().Msg(err.Error())
|
||||||
|
dev.closed = 1
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -280,13 +321,13 @@ func (dev *Device) readLoop() {
|
|||||||
log.Error().Msgf("invalid msg type: %d", msg_type)
|
log.Error().Msgf("invalid msg type: %d", msg_type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dev *Device) writeLoop() {
|
func (dev *Device) writeLoop() {
|
||||||
ticker := time.NewTicker(time.Second)
|
|
||||||
|
|
||||||
defer dev.conn.Close()
|
defer dev.conn.Close()
|
||||||
|
defer log.Debug().Msgf("dev writeLoop finished")
|
||||||
|
|
||||||
|
ticker := time.NewTicker(time.Second)
|
||||||
|
|
||||||
ninactive := 0
|
ninactive := 0
|
||||||
lastHeartbeat := time.Now()
|
lastHeartbeat := time.Now()
|
||||||
@ -301,6 +342,7 @@ func (dev *Device) writeLoop() {
|
|||||||
_, err := dev.conn.Write(msg)
|
_, err := dev.conn.Write(msg)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Msg(err.Error())
|
log.Error().Msg(err.Error())
|
||||||
|
dev.closed = 1
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -314,6 +356,7 @@ func (dev *Device) writeLoop() {
|
|||||||
log.Error().Msgf("Inactive device in long time: %s", dev.id)
|
log.Error().Msgf("Inactive device in long time: %s", dev.id)
|
||||||
if ninactive > 3 {
|
if ninactive > 3 {
|
||||||
log.Error().Msgf("Inactive 3 times, now kill it: %s", dev.id)
|
log.Error().Msgf("Inactive 3 times, now kill it: %s", dev.id)
|
||||||
|
dev.closed = 1
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ninactive = ninactive + 1
|
ninactive = ninactive + 1
|
||||||
@ -322,7 +365,7 @@ func (dev *Device) writeLoop() {
|
|||||||
if now.Sub(lastHeartbeat) > HEART_BEAT_INTERVAL-1 {
|
if now.Sub(lastHeartbeat) > HEART_BEAT_INTERVAL-1 {
|
||||||
lastHeartbeat = now
|
lastHeartbeat = now
|
||||||
if len(dev.send) < 1 {
|
if len(dev.send) < 1 {
|
||||||
// log.Info().Msgf("Send Heartbeat Time: %d", time.Now().Unix())
|
log.Info().Msgf("Transmit Heartbeat Time: %d", time.Now().Unix())
|
||||||
dev.WriteMsg(MSG_TYPE_HEARTBEAT, []byte{})
|
dev.WriteMsg(MSG_TYPE_HEARTBEAT, []byte{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user