浏览代码

监听tcp连接

chengqian 5 月之前
父节点
当前提交
2f7e013a21

+ 2 - 2
server/config.yaml

@@ -211,12 +211,12 @@ tencent-cos:
     path-prefix: github.com/flipped-aurora/gin-vue-admin/server
 zap:
     level: info
-    prefix: '[github.com/flipped-aurora/gin-vue-admin/server]'
+    prefix: '[GVA]'
     format: console
     director: log
     encode-level: LowercaseColorLevelEncoder
     stacktrace-key: stacktrace
     max-age: 0
     show-line: true
-    log-in-console: true
+    log-in-console: false
 

+ 1 - 2
server/config/config.go

@@ -23,8 +23,7 @@ type Server struct {
 	TencentCOS TencentCOS `mapstructure:"tencent-cos" json:"tencent-cos" yaml:"tencent-cos"`
 	AwsS3      AwsS3      `mapstructure:"aws-s3" json:"aws-s3" yaml:"aws-s3"`
 
-	Excel  Excel  `mapstructure:"excel" json:"excel" yaml:"excel"`
-	Logrus Logrus `mapstructure:"logger" json:"logger" yaml:"logger"`
+	Excel Excel `mapstructure:"excel" json:"excel" yaml:"excel"`
 
 	// 跨域配置
 	Cors CORS `mapstructure:"cors" json:"cors" yaml:"cors"`

+ 15 - 0
server/dao/dev_screens.go

@@ -75,3 +75,18 @@ func QueryScreensToDetail(id uint) (screensList []Screens, err error) {
 	err = db.Where("project_id = ?", id).Find(&screensList).Error
 	return
 }
+
+func QueryAllScreens() (screensList []Screens, err error) {
+	err = global.GVA_DB.Model(&Screens{}).Find(&screensList).Error
+	return
+}
+
+func QueryScreensBySn(sn string) (screen Screens, err error) {
+	err = global.GVA_DB.Model(&Screens{}).Where("sn = ?", sn).Find(&screen).Error
+	return
+}
+
+func UpdateScreensStatusBySn(sn string, status int) (err error) {
+	err = global.GVA_DB.Model(&Screens{}).Where("sn = ?", sn).Update("status", status).Error
+	return
+}

+ 4 - 0
server/main.go

@@ -6,6 +6,7 @@ import (
 	"server/core"
 	"server/global"
 	"server/initialize"
+	"server/service/tcp"
 )
 
 //go:generate go env -w GO111MODULE=on
@@ -34,5 +35,8 @@ func main() {
 		db, _ := global.GVA_DB.DB()
 		defer db.Close()
 	}
+	//tcp.InitDevices()
+	go tcp.ListenTcp()
+	go tcp.IsOnline()
 	core.RunWindowsServer()
 }

+ 49 - 188
server/service/tcp/deviceMgr.go

@@ -1,10 +1,11 @@
 package tcp
 
 import (
-	"encoding/hex"
 	"fmt"
+	"go.uber.org/zap"
 	"net"
 	"server/dao"
+	"server/global"
 	"time"
 )
 
@@ -15,22 +16,18 @@ var (
 type Device struct {
 	Info     dao.Screens
 	Conn     net.Conn
+	IsLogin  bool
 	LastTime time.Time
 }
 
 // 实例所有设备
-//func InitDevices() {
-//	// 将数据库中的设备全部离线
-//	devs, _ := deviceDao.QueryAllScreens()
-//	for _, screen := range devs {
-//		if screen.Status != 0 {
-//			screen.Status = 0
-//			now := time.Now()
-//			screen.LastOfflineTime = &now
-//		}
-//		Devices[screen.Sn] = &Device{Info: screen}
-//	}
-//}
+func InitDevices() {
+	//// 将数据库中的设备全部离线
+	//screens, _ := dao.QueryAllScreens()
+	//for _, screen := range screens {
+	//	Devices[screen.Sn] = &Device{Info: screen}
+	//}
+}
 
 func (s *Device) Start(conn net.Conn) {
 	s.Conn = conn
@@ -46,184 +43,48 @@ func (s *Device) Process() {
 		n, err := s.Conn.Read(buf)
 		if err != nil {
 			// 从客户端读取数据的过程中发生错误 这里如果没读到可以视为设备离线了
-			//logger.Error.Errorf("read from client failed [离线了], err:%v", err)
-
+			global.GVA_LOG.Error("read err,dev offLine")
 			break
 		}
-		data := hex.EncodeToString(buf[:n])
-		fmt.Println("读取:", data)
-		//if !strings.Contains(strings.ToLower(data), "fe5c4b89") {
-		//	continue
-		//}
-		//switch data[16:18] {
-		//case "61":
-		//	// fe5c4b89 2a000000 62 00000000 17000000 31 23 32303233(年) 3035(月) 3135(日) 3031(星期) 3038(时) 3334(分) 3135(秒) 23 303630(心跳包时间) 23 ffff
-		//	//目前登录只做查找设备的操作 (假登录)
-		//	buffer := protocol.AuthDataPack{}.AuthLogin()
-		//	// 通过sn 查设备是否存在 不存在return 存在就保存con 和 info
-		//	_, err := deviceDao.QueryScreenBySn(data[34:50])
-		//	if errors.Is(err, gorm.ErrRecordNotFound) {
-		//		logger.Logger.Errorf("Process[case '61'] SN not found \n")
-		//		break
-		//	}
-		//	s.Conn.Write(buffer.Bytes())
-		//case "91":
-		//	dev := Devices[data[34:50]]
-		//	if dev.Info.Status == 0 {
-		//		state := 1
-		//		//上线 则修改数据库上线时间
-		//		err := Dev.UpdateScreensStatusAndOnline(dev.Info.Sn, state)
-		//		if err != nil {
-		//			logger.Logger.Error("Process[case '91'] UpdateScreensStatusAndOnline err", zap.Error(err))
-		//			continue
-		//		}
-		//		dev.Info.Status = 1
-		//		now := time.Now()
-		//		dev.Info.LastOnlineTime = &now
-		//		logger.Logger.Debugf("设备 [%v] 上线", dev.Info.ScreensName) // 登录
-		//	}
-		//	dev.Conn = s.Conn
-		//	dev.LastTime = time.Now()
-		//	logger.Logger.Debugf("设备 [%v] 心跳", dev.Info.ScreensName)
-		//default:
-		//	fmt.Println("读取:", data)
-		//}
-	}
-}
+		data := string(buf[:n])
+		fmt.Println("读取", string(buf[:n]))
+		if data[2:7] == "login" {
+			s.Conn.Write([]byte("login:successful"))
+		}
 
-//func IsOnline() {
-//	t := time.NewTicker(1 * time.Minute) //每分钟
-//	for {
-//		select {
-//		case <-t.C:
-//			for _, device := range Devices {
-//				//符合条件
-//				if (time.Now().Add(-5*time.Minute).After(device.LastTime) || device.LastTime.IsZero()) && device.Info.Status != 0 {
-//					//修改数据库和内存
-//					//离线
-//					state := 0
-//					err := Dev.UpdateScreensStatusAndOffline(device.Info.Sn, state)
-//					if err != nil {
-//						logger.Logger.Error("[Handle] UpdateScreensStatus err", zap.Error(err))
-//						continue
-//					}
-//					device.Info.Status = 0
-//					now := time.Now()
-//					device.Info.LastOfflineTime = &now
-//					logger.Logger.Debugf("设备 [%v] 离线了...", device.Info.ScreensName)
-//				}
-//			}
-//		}
-//	}
-//}
+		if data[2:11] == "heartbeat" { //默认一分钟发一次心跳
+			s.LastTime = time.Now()
+			if !s.IsLogin {
+				screen, _ := dao.QueryScreensBySn(data[20:44])
+				s.Info = screen
+				s.IsLogin = true
+				Devices[data[20:44]] = s
+				_ = dao.UpdateScreensStatusBySn(s.Info.Sn, 1)
+			} //更新上次发送心跳时间
+			global.GVA_LOG.Info("设备心跳", zap.String("ScreensName", s.Info.ScreensName))
+		}
 
-//func (s *Device) SwitchScreen(onOff int) error {
-//	if s.Conn == nil {
-//		return errors.New("connection is nil")
-//	}
-//	pack := protocol.SwitchDataPack{Type: 0x52} //熄屏
-//	if onOff == 1 {
-//		pack = protocol.SwitchDataPack{Type: 0x51} //亮屏
-//	}
-//	buf := pack.SwitchScreens() //获取开关屏指令
-//	_, err := s.Conn.Write(buf.Bytes())
-//	if err != nil {
-//		logger.Logger.Errorf("SwitchScreen write failed, err:%v", err)
-//		return err
-//	}
-//	return nil
-//}
-//
-//func (s *Device) SendInternalCode(content []promodel.InternalCodeContent) error {
-//	if s.Conn == nil {
-//		return errors.New("connection is nil")
-//	}
-//	pack := protocol.InternalCodeDataPack{}
-//	//获取要写入连接的字节数组
-//	buf := pack.SendInternalCode(content)
-//	_, err := s.Conn.Write(buf.Bytes())
-//	if err != nil {
-//		logger.Logger.Errorf("SendInternalCode write failed, err:%v", err)
-//		return err
-//	}
-//
-//	return nil
-//}
-//
-//func (s *Device) VoiceBroad(broad string) error {
-//	if s.Conn == nil {
-//		return errors.New("connection is nil")
-//	}
-//	pack := protocol.VoiceBroadDataPack{}
-//	buf := pack.VoiceBroad(broad)
-//	_, err := s.Conn.Write(buf.Bytes())
-//	if err != nil {
-//		logger.Logger.Errorf("VoiceBroad write failed, err:%v", err)
-//		return err
-//	}
-//	return nil
-//}
-//
-//func (s *Device) SetBrightness(bright byte) error {
-//	if s.Conn == nil {
-//		return errors.New("connection is nil")
-//	}
-//	pack := protocol.SetBrightnessDataPack{}
-//	buf := pack.SetBrightness(bright)
-//	_, err := s.Conn.Write(buf.Bytes())
-//	if err != nil {
-//		logger.Logger.Errorf("SetBrightness write failed, err:%v", err)
-//		return err
-//	}
-//	return nil
-//}
-//
-//func SwitchScreen(sn string, onOff int) error {
-//	device := Devices[sn]
-//	err := device.SwitchScreen(onOff)
-//	if err != nil {
-//		return err
-//	}
-//	return nil
-//}
-//
-//func SendInternalCode(sn string, content []promodel.InternalCodeContent) error {
-//	device := Devices[sn]
-//	err := device.SendInternalCode(content)
-//	if err != nil {
-//		return err
-//	}
-//	return nil
-//}
-//
-//func VoiceBroad(sn string, broad string) error {
-//	device := Devices[sn]
-//	err := device.VoiceBroad(broad)
-//	if err != nil {
-//		return err
-//	}
-//	return nil
-//}
-//
-//func SetBrightness(sn string, bright int) error {
-//	device := Devices[sn]
-//	err := device.SetBrightness(brightnessMap[bright])
-//	if err != nil {
-//		return err
-//	}
-//	return nil
-//}
+	}
+}
 
-var brightnessMap = map[int]byte{
-	0:   0x19,
-	10:  0x18,
-	20:  0x16,
-	30:  0x14,
-	40:  0x12,
-	50:  0x10,
-	60:  0x08,
-	70:  0x06,
-	80:  0x04,
-	90:  0x02,
-	100: 0x00,
+func IsOnline() {
+	t := time.NewTicker(1 * time.Minute) //每分钟
+	for {
+		select {
+		case <-t.C:
+			for _, device := range Devices {
+				//符合条件
+				if time.Now().Add(-2*time.Minute).After(device.LastTime) || device.LastTime.IsZero() {
+					state := 0
+					err := dao.UpdateScreensStatusBySn(device.Info.Sn, state)
+					delete(Devices, device.Info.Sn)
+					if err != nil {
+						continue
+					}
+					device.Info.Status = 0
+					global.GVA_LOG.Info("设备离线了", zap.String("ScreensName", device.Info.ScreensName))
+				}
+			}
+		}
+	}
 }

+ 2 - 6
server/service/tcp/tcp.go

@@ -17,7 +17,6 @@ func ListenTcp() {
 	for {
 		listen, err = net.Listen("tcp", "0.0.0.0:9200")
 		if err != nil {
-			//logger.Logger.Errorf("Listen failed, err: %v. Retrying in 5 seconds...", err)
 			global.GVA_LOG.Error("Listen failed, Retrying in 5 seconds...", zap.Error(err))
 			time.Sleep(5 * time.Second) // 休眠一段时间后重试
 			continue
@@ -30,7 +29,6 @@ func ListenTcp() {
 	for {
 		conn, err := listen.Accept()
 		if err != nil {
-			//logger.Logger.Errorf("Accept failed, err:%v", err)
 			global.GVA_LOG.Error("Accept failed,", zap.Error(err))
 			continue
 		}
@@ -43,8 +41,7 @@ func ListenTcp() {
 }
 
 func CheckConn(conn net.Conn, tracker *ConnectionTracker) error {
-	//logger.Logger.Debugf("StartDevice addr:%s", conn.RemoteAddr().String())
-	global.GVA_LOG.Debug("StartDevice addr:", zap.Any("data", conn.RemoteAddr().String()))
+	global.GVA_LOG.Debug("StartDevice", zap.String("addr", conn.RemoteAddr().String()))
 	arr := strings.Split(conn.RemoteAddr().String(), ":")
 	ip := arr[0]
 	// 记录连接
@@ -52,8 +49,7 @@ func CheckConn(conn net.Conn, tracker *ConnectionTracker) error {
 
 	// 检查是否为恶意连接
 	if tracker.isMalicious(ip) {
-		//logger.Logger.Debugf("恶意连接检测到 ip: %s\n", ip)
-		global.GVA_LOG.Debug("")
+		global.GVA_LOG.Debug("恶意连接检测到", zap.String("ip", ip))
 		return errors.New("connection is Malicious")
 	}
 	device := Device{}

+ 6 - 2
web/src/view/devicesAdmin/screens/screens.vue

@@ -71,7 +71,7 @@
         />
         <el-table-column
           label="sn"
-          :width="150"
+          :width="220"
           prop="sn"
         />
         <el-table-column
@@ -164,7 +164,7 @@
               <el-form-item
                 label="设备Sn:"
                 :inline="false"
-                prop="Sn"
+                prop="sn"
               >
                 <el-input v-model="screensInfo.sn" />
               </el-form-item>
@@ -262,6 +262,10 @@ const rules = ref({
   projectId: [
     { required: true, message: '请选择归属项目', trigger: 'blur' },
     // { min: 5, message: '最低5位字符', trigger: 'blur' }
+  ],
+  sn: [
+    { required: true, message: '请输入设备sn', trigger: 'blur' },
+    // { min: 5, message: '最低5位字符', trigger: 'blur' }
   ]
 })