Bladeren bron

add buffer split

dujunchen 1 week geleden
bovenliggende
commit
84613ac151
2 gewijzigde bestanden met toevoegingen van 70 en 2 verwijderingen
  1. 69 1
      internal/app/stc/broadcast/stc-broadcast.go
  2. 1 1
      internal/app/stc/data/msgdata.go

+ 69 - 1
internal/app/stc/broadcast/stc-broadcast.go

@@ -1,7 +1,9 @@
 package broadcast
 
 import (
+	"bytes"
 	"fmt"
+	"io"
 	"net"
 	"pbx-api-gin/internal/app/ami/action"
 	"pbx-api-gin/internal/app/ami/model"
@@ -14,6 +16,72 @@ import (
 
 var Pacus = []string{"2111", "2121", "2131", "2141", "2151", "2161", "2171", "2181"}
 
+func HandleStcCmd(conn net.Conn) {
+	var buf bytes.Buffer // 用于累积未处理完的数据流
+	tmp := make([]byte, 1024)
+
+	for {
+		n, err := conn.Read(tmp)
+		if err != nil {
+			if err != io.EOF {
+				fmt.Println("Error reading from server:", err)
+			}
+			return
+		}
+
+		// 将新读取的数据追加到缓冲区
+		buf.Write(tmp[:n])
+
+		// 尝试从缓冲区中提取完整数据包
+		for {
+			packet, err := msgdata.ExtractPacket(&buf)
+			if err != nil {
+				break // 没有完整包或出错,等待更多数据
+			}
+			// 成功提取一个包,进行处理
+			go processPacket(packet) // 使用 goroutine 避免阻塞接收
+		}
+	}
+}
+
+// 处理单个数据包(原 switch 逻辑迁移过来)
+func processPacket(packet []byte) {
+	if len(packet) < 6 {
+		fmt.Println("Invalid packet length")
+		return
+	}
+
+	lfshook.NewLogger().Logger.Infof("Get data from STC ===============:%x", packet)
+
+	switch packet[5] {
+	case 0x01: // heartbeat
+		// handle heartbeat
+	case 0x02: // STN
+		StationAnn(packet)
+	case 0x03: // ACTIVE
+		Active([1]byte{packet[8]})
+	case 0x05: // SPC
+		SpecialAnn(packet)
+	case 0x06: // EMG
+		EmgMsg(packet)
+	case 0x07: // STOP
+		AnnStop([4]byte{packet[8], packet[9], packet[10], packet[11]})
+	case 0x08: // DCS
+		DcsAnn(packet)
+	case 0x09: // SELF CHECK
+		SelfCheck(packet)
+	case 0x0a:
+		AlarmHandle(packet)
+	case 0x0b:
+		AlarmResetAll()
+	case 0x0c:
+		RecordStorageConf(packet[8:])
+	default:
+		fmt.Printf("Unknown command: %x\n", packet[5])
+	}
+}
+
+/*
 func HandleStcCmd(conn net.Conn) {
 
 	for {
@@ -62,7 +130,7 @@ func HandleStcCmd(conn net.Conn) {
 		}
 	}
 }
-
+*/
 // STN , 自动报站广播
 func StationAnn(data []byte) (err error) {
 

+ 1 - 1
internal/app/stc/data/msgdata.go

@@ -124,7 +124,7 @@ func SubstrByRune(s string, start, length int) string {
 }
 
 // extractPacket 从 buffer 中提取第一个完整数据包
-func extractPacket(buf *bytes.Buffer) ([]byte, error) {
+func ExtractPacket(buf *bytes.Buffer) ([]byte, error) {
 	data := buf.Bytes()
 	startIdx := -1
 	endIdx := -1