|
@@ -4,12 +4,10 @@ import (
|
|
|
"context"
|
|
|
"dlt645-server/protocol"
|
|
|
"fmt"
|
|
|
- "github.com/gogf/gf/container/gmap"
|
|
|
"github.com/gogf/gf/net/gtcp"
|
|
|
"github.com/gogf/gf/os/glog"
|
|
|
gatewayV2 "sparrow-sdk/v2"
|
|
|
"sync"
|
|
|
- "time"
|
|
|
)
|
|
|
|
|
|
type Server struct {
|
|
@@ -18,10 +16,8 @@ type Server struct {
|
|
|
ctx context.Context
|
|
|
addr string
|
|
|
port int
|
|
|
- clients *gmap.HashMap
|
|
|
grMu sync.Mutex
|
|
|
grWG sync.WaitGroup
|
|
|
- grRunning bool
|
|
|
message protocol.Message
|
|
|
gateWay *gatewayV2.Gateway
|
|
|
}
|
|
@@ -38,11 +34,8 @@ func NewServer(ctx context.Context, addr string, port int, gw *gatewayV2.Gateway
|
|
|
|
|
|
func (s *Server) Start() error {
|
|
|
glog.Printf("服务端启动[%s:%d]", s.addr, s.port)
|
|
|
- server := gtcp.NewServer(fmt.Sprintf("%s:%d", s.addr, s.port), s.handleConnect)
|
|
|
+ server := gtcp.NewServer(fmt.Sprintf("%s:%d", s.addr, s.port), s.onClientConnect)
|
|
|
s.server = server
|
|
|
- s.grMu.Lock()
|
|
|
- s.grRunning = true
|
|
|
- s.grMu.Unlock()
|
|
|
return s.server.Run()
|
|
|
}
|
|
|
|
|
@@ -50,33 +43,15 @@ func (s *Server) Stop() {
|
|
|
s.server.Close()
|
|
|
}
|
|
|
|
|
|
-func (s *Server) handleConnect(conn *gtcp.Conn) {
|
|
|
- s.startGoRoutine(func() {
|
|
|
- s.createClient(conn)
|
|
|
- s.grWG.Done()
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Server) startGoRoutine(f func()) {
|
|
|
- s.grMu.Lock()
|
|
|
- if s.grRunning {
|
|
|
- s.grWG.Add(1)
|
|
|
- go f()
|
|
|
- }
|
|
|
- s.grMu.Unlock()
|
|
|
-}
|
|
|
-
|
|
|
-func (s *Server) createClient(conn *gtcp.Conn) *Client {
|
|
|
- c := &Client{
|
|
|
- srv: s,
|
|
|
- done: make(chan struct{}),
|
|
|
- conn: conn,
|
|
|
- closeHandler: func(id string, c *Client) {
|
|
|
- glog.Debugf("客户端断开:%s", id)
|
|
|
- },
|
|
|
+func (s *Server) onClientConnect(conn *gtcp.Conn) {
|
|
|
+ glog.Debugf("新的设备接入:%s", conn.RemoteAddr())
|
|
|
+ c := NewClient(s, conn)
|
|
|
+ c.closeHandler = func(id string, c *Client) {
|
|
|
+ glog.Debugf("客户端断开:%s", id)
|
|
|
}
|
|
|
-
|
|
|
ctx := new(protocol.PacketContext)
|
|
|
+ data := new(protocol.Data)
|
|
|
+ go c.ReadLoop(ctx, data)
|
|
|
|
|
|
addressChan := make(chan struct{}, 1)
|
|
|
avChan := make(chan struct{}, 1)
|
|
@@ -88,51 +63,23 @@ func (s *Server) createClient(conn *gtcp.Conn) *Client {
|
|
|
powerChan := make(chan struct{}, 1)
|
|
|
|
|
|
addressChan <- struct{}{}
|
|
|
- s.startGoRoutine(func() {
|
|
|
- go c.SendGetAddress(ctx, addressChan, avChan)
|
|
|
- })
|
|
|
-
|
|
|
- s.startGoRoutine(func() {
|
|
|
- c.GetActivePower(ctx, powerChan)
|
|
|
- })
|
|
|
-
|
|
|
- s.startGoRoutine(func() {
|
|
|
- c.ReadLoop(ctx)
|
|
|
- })
|
|
|
-
|
|
|
- time.Sleep(1 * time.Second)
|
|
|
- s.startGoRoutine(func() {
|
|
|
- c.GetAV(ctx, avChan, aiChan)
|
|
|
- })
|
|
|
-
|
|
|
- time.Sleep(1 * time.Second)
|
|
|
- s.startGoRoutine(func() {
|
|
|
- c.GetAI(ctx, aiChan, bvChan)
|
|
|
- })
|
|
|
-
|
|
|
- time.Sleep(1 * time.Second)
|
|
|
- s.startGoRoutine(func() {
|
|
|
- c.GetBV(ctx, bvChan, biChan)
|
|
|
- })
|
|
|
-
|
|
|
- time.Sleep(1 * time.Second)
|
|
|
- s.startGoRoutine(func() {
|
|
|
- c.GetBI(ctx, biChan, cvChan)
|
|
|
- })
|
|
|
- time.Sleep(1 * time.Second)
|
|
|
- s.startGoRoutine(func() {
|
|
|
- c.GetCV(ctx, cvChan, ciChan)
|
|
|
- })
|
|
|
-
|
|
|
- time.Sleep(1 * time.Second)
|
|
|
- s.startGoRoutine(func() {
|
|
|
- c.GetCI(ctx, ciChan, powerChan)
|
|
|
- })
|
|
|
- return c
|
|
|
-}
|
|
|
|
|
|
-func (s *Server) removeClient(gatewayId uint16) {
|
|
|
- s.clients.Remove(gatewayId)
|
|
|
+ go c.SendGetAddress(ctx, addressChan, avChan)
|
|
|
+
|
|
|
+ go c.GetActivePower(ctx, powerChan)
|
|
|
+
|
|
|
+ go c.GetAV(ctx, avChan, aiChan)
|
|
|
+
|
|
|
+ go c.GetAI(ctx, aiChan, bvChan)
|
|
|
+
|
|
|
+ go c.GetBV(ctx, bvChan, biChan)
|
|
|
+
|
|
|
+ go c.GetBI(ctx, biChan, cvChan)
|
|
|
+
|
|
|
+ go c.GetCV(ctx, cvChan, ciChan)
|
|
|
+
|
|
|
+ go c.GetCI(ctx, ciChan, powerChan)
|
|
|
+
|
|
|
}
|
|
|
|
|
|
func (s *Server) ReportStatus(subId string, data interface{}) error {
|