2 Commits d49c02ef5d ... d9da5a386c

Tác giả SHA1 Thông báo Ngày
  dujunchen d9da5a386c fix buffer split 1 tuần trước cách đây
  dujunchen 84613ac151 add buffer split 1 tuần trước cách đây

+ 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) {
 

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

@@ -124,14 +124,14 @@ 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
 
 	// 查找起始标记 0x7f 0x83 0x9d
 	for i := 0; i < len(data)-2; i++ {
-		if data[i] == 0x7f && data[i+1] == 0x83 && data[i+2] == 0x9d {
+		if data[i] == 0x7f && data[i+1] == 0x8e && data[i+2] == 0x9d {
 			startIdx = i
 			break
 		}