Bläddra i källkod

PAD alarm finish

dujunchen 1 vecka sedan
förälder
incheckning
d49c02ef5d

+ 9 - 9
internal/app/ami/action/call.go

@@ -51,16 +51,16 @@ func ChanSpy(src, dst string, whisper, bargein bool) {
 	lfshook.NewLogger().Infof("chan spy src:%s dst:%s", src, dst)
 
 	channel := fmt.Sprintf("%s/%s", utils.DialPrefix, dst)
-	data := fmt.Sprintf("%s/%s,q,E", utils.DialPrefix, src)
-
-	if whisper {
-		data = fmt.Sprintf("%s,w", data)
-	}
-
-	if bargein {
-		data = fmt.Sprintf("%s,B", data)
-	}
+	data := fmt.Sprintf("%s/%s,qBE", utils.DialPrefix, src)
+	/*
+		if whisper {
+			data = fmt.Sprintf("%s,w", data)
+		}
 
+		if bargein {
+			data = fmt.Sprintf("%s,B", data)
+		}
+	*/
 	action := map[string]string{
 		"Action":      "Originate",
 		"Channel":     channel, // 不存在的通话

+ 5 - 2
internal/app/ami/action/index.go

@@ -70,8 +70,10 @@ func HandleAMI(event map[string]string, conn net.Conn) {
 			}
 		}
 	case "BridgeEnter":
-		lfshook.NewLogger().Infof("=========%s====%s", event["Event"], event["CallerIDNum"])
+		lfshook.NewLogger().Infof("====BridgeEnter=====%s====%s", event["Event"], event["CallerIDNum"])
 		if utils.IsPAIU(event["CallerIDNum"]) {
+			lfshook.NewLogger().Infof("====BridgeEnter=====%s====%s", event["Event"], event["CallerIDNum"])
+			alstatus.AlarmStatus(event["CallerIDNum"], "connect", conn) // Alarm connected
 
 			switch string(event["CallerIDNum"][2]) { // connect the pacu to pad acording to the pad number
 			case "1":
@@ -91,8 +93,9 @@ func HandleAMI(event map[string]string, conn net.Conn) {
 			case "8":
 				ChanSpy(event["CallerIDNum"], pacu8, false, true) //connect pacu to pad
 			}
-			alstatus.AlarmStatus(event["CallerIDNum"], "connect", conn) // Alarm connected
+
 		}
+
 	}
 }
 

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

@@ -8,6 +8,8 @@ import (
 	"pbx-api-gin/internal/app/mysql"
 	msgdata "pbx-api-gin/internal/app/stc/data"
 	"pbx-api-gin/pkg/lfshook"
+	"sync"
+	"time"
 )
 
 var Pacus = []string{"2111", "2121", "2131", "2141", "2151", "2161", "2171", "2181"}
@@ -207,6 +209,17 @@ func SelfCheck(data []byte) {
 	}
 }
 
+// 全局变量:记录正在抑制的 exten
+var (
+	suppressedExts = sync.Map{} // map[string]struct{},值存在即表示被抑制
+	suppressionMu  sync.Mutex   // 保护初始化和清理操作(可选)
+)
+
+// suppressKey 生成用于抑制的 key(可以根据需求扩展)
+func suppressKey(exten string, handler byte) string {
+	return fmt.Sprintf("%s_h%x", exten, handler)
+}
+
 // ICP操作乘客报警(根据激活信息判断转到1车还是8车================)
 func AlarmHandle(data []byte) {
 	handler := data[8]
@@ -215,6 +228,29 @@ func AlarmHandle(data []byte) {
 	pos := data[13]
 	exten := fmt.Sprintf("24%c%c", carr, pos)
 
+	lfshook.NewLogger().Logger.Infof("================ICP Answer PAD================:%s ", exten)
+	key := suppressKey(exten, handler)
+
+	// 只对 handler == 0x01 做 2 秒去重
+	if handler == 0x01 {
+		if _, loaded := suppressedExts.LoadOrStore(key, struct{}{}); loaded {
+			lfshook.NewLogger().Logger.Infof("Suppressed duplicate ICP Alarm (handler=0x01) for exten: %s within 2 seconds", exten)
+			return // 已存在,说明在2秒窗口期内,直接丢弃
+		}
+
+		// 设置2秒后删除该 key,允许下次通过
+		time.AfterFunc(4*time.Second, func() {
+			suppressedExts.Delete(key)
+			lfshook.NewLogger().Logger.Debugf("Suppression released for key: %s", key)
+		})
+	}
+
+	// 设置2秒后删除该 key,允许下次通过
+	time.AfterFunc(1*time.Second, func() {
+		suppressedExts.Delete(key)
+		lfshook.NewLogger().Logger.Debugf("Suppression released for key: %s", key)
+	})
+
 	switch handler {
 	case 0x01: //answer(ICP+Alarm+PACU)
 
@@ -225,7 +261,7 @@ func AlarmHandle(data []byte) {
 		//invite PACU join in
 		//action.Hangup("PACU")
 		//action.ChanSpy("PACU", exten, false, true)
-		lfshook.NewLogger().Logger.Infof("================ICP Answer PAD================:%s ", exten)
+
 	case 0x04: //answer(ICP+Alarm+PACU)
 
 		err := action.RedirectInQueue(exten, "0401", "ano-rule", "1") // 1车OCC接听

+ 44 - 0
internal/app/stc/data/msgdata.go

@@ -122,3 +122,47 @@ func SubstrByRune(s string, start, length int) string {
 	}
 	return string(runes[start:end])
 }
+
+// extractPacket 从 buffer 中提取第一个完整数据包
+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 {
+			startIdx = i
+			break
+		}
+	}
+
+	if startIdx == -1 {
+		// 没找到起始标记,清掉前面无用数据(防止 OOM)
+		if buf.Len() > 1024 {
+			buf.Next(buf.Len() - 10) // 保留最后10字节继续查找
+		}
+		return nil, fmt.Errorf("no start marker found")
+	}
+
+	// 从起始位置开始查找结束标记 0xFE
+	for i := startIdx; i < len(data); i++ {
+		if data[i] == 0xFE {
+			endIdx = i
+			break
+		}
+	}
+
+	if endIdx == -1 {
+		return nil, fmt.Errorf("no end marker found")
+	}
+
+	// 提取完整包 [startIdx 到 endIdx]
+	packet := make([]byte, endIdx-startIdx+1)
+	copy(packet, data[startIdx:endIdx+1])
+
+	// 从 buffer 中删除已处理的数据
+	buf.Next(endIdx + 1)
+
+	return packet, nil
+}

+ 1 - 1
internal/app/stc/sendstatus/status.go

@@ -43,7 +43,7 @@ func AlarmStatus(exten string, status string, conn net.Conn) {
 
 	case "dial": //dial
 		protocol.Data[2] = 0x02
-
+		return
 	case "queue": //PAD alarm
 		protocol.Data[2] = 0x03