dujunchen il y a 3 mois
Parent
commit
d94e83dc39

+ 37 - 39
internal/app/ami/action/call.go

@@ -87,7 +87,7 @@ func HangupAllExcept(caller string) {
 
 // Hangup task
 func HangupTask(TaskName string) {
-
+	lfshook.NewLogger().Infof("HangupTask TaskName:%s ", TaskName)
 	taskInfo, ok := priority.RegistryTask.Get(TaskName)
 	if ok {
 		HangupAllLocalChan()
@@ -103,6 +103,8 @@ func InterruptRunningTask(toRunTask string) {
 	var taskName string
 	var ok bool
 
+	lfshook.NewLogger().Infof("InterruptRunningTask toRuntask=%s RunningTask:%s ", toRunTask, taskName)
+
 	if toRunTask != "PA" && toRunTask != "PAD-ICP" && toRunTask != "PAD-TMS" { // ignore C2C
 		taskName, task, ok = priority.RegistryTask.HighestPriorityRunningTask1()
 		if !ok {
@@ -115,17 +117,16 @@ func InterruptRunningTask(toRunTask string) {
 		}
 	}
 
-	lfshook.NewLogger().Infof("===InterruptRunningTask=toRuntask=%s==RunningTask:%s===chan:%s", toRunTask, taskName, task.RunChannel)
-
 	//same type return
 	if toRunTask == taskName {
 		if toRunTask == "PAD-ICP" || toRunTask == "PAD-TMS" || toRunTask == "PAD-OCC" {
 
+			//Auto Answer PAD-OCC one by one, clean the old confbridge and channels before answer a new PAD .
 			if toRunTask == "PAD-OCC" {
 				Hangup(task.RunChannel) //pad
 				ConfbridgeKick(task.ConfbridgeID, "all")
 				HangupIO() //io
-				lfshook.NewLogger().Infof("===InterruptRunningTask=ret==== ")
+				//lfshook.NewLogger().Infof("===InterruptRunningTask=ret==== ")
 			}
 			return
 		}
@@ -156,10 +157,12 @@ func InterruptRunningTask(toRunTask string) {
 	case "PAD-ICP", "PAD-TMS": // Interrupt PAD task running,
 		priority.InterruptedPad = "PAD-ICP"
 
-		lfshook.NewLogger().Infof("===InterruptRunningTask==hangup===PAD-ICP==%s==== ", task.RunType)
+		lfshook.NewLogger().Infof("InterruptRunningTask interrupt PAD-ICP/PAD-TMS ,Running type :%s !", task.RunType)
+
 		chans, err := CoreShowChannels()
 		if err != nil {
-			lfshook.NewLogger().Errorf("CoreShowChannels %+v", err)
+			lfshook.NewLogger().Infof("InterruptRunningTask CoreShowChannels err:%+v", err)
+			return
 		}
 
 		//1. Redirect the connected PAD to 0300,hangup the other pad channel
@@ -169,7 +172,8 @@ func InterruptRunningTask(toRunTask string) {
 				if ret.ConnectedLineNum == "<unknown>" { //redirect pad chanspy channel
 					err := Redirect(ret.Channel, "0300", "queues-icp-redirect", "", "PAD")
 					if err != nil {
-						lfshook.NewLogger().Errorf("Redirect %+v", err)
+						lfshook.NewLogger().Infof("InterruptRunningTask Redirect err:%+v", err)
+						return
 					}
 
 					number := strings.Split(strings.Split(ret.Channel, "-")[0], "/")[1]
@@ -183,7 +187,7 @@ func InterruptRunningTask(toRunTask string) {
 			//hangup pad call ICP channel
 			if utils.IsPAIU(ret.CallerIDNum) {
 				if utils.IsPAIU(ret.CallerIDNum) && ret.ChannelStateDesc == "Up" && utils.IsICP(ret.ConnectedLineNum) {
-					lfshook.NewLogger().Infof("===Hangup=Chan===%+v==== ", ret.Channel)
+					lfshook.NewLogger().Infof("Hangup PAD Channel :%+v", ret.Channel)
 					Hangup(ret.Channel)
 				}
 			}
@@ -192,7 +196,7 @@ func InterruptRunningTask(toRunTask string) {
 		priority.RegistryTask.StopAndUnregister("PAD-ICP")
 		priority.RegistryTask.StopAndUnregister("PAD-TMS")
 		//2. hangup task channel (ICP + PACU)
-		lfshook.NewLogger().Infof("===InterruptRunningTask=2. hangup task channel === ")
+		//lfshook.NewLogger().Infof("===InterruptRunningTask=2. hangup task channel === ")
 		HangupAllLocalChan()
 		HangupICP()
 
@@ -214,17 +218,18 @@ func InterruptRunningTask(toRunTask string) {
 
 			resCaller, err := QueueStatus("0301", "") // check OCC queue, get entries
 			if err != nil {
-				lfshook.NewLogger().Infof("===QueueStatus==%+v", err)
+				lfshook.NewLogger().Infof("QueueStatus err:%+v", err)
+				return
 			}
 			for _, caller := range resCaller.Entrys {
-				lfshook.NewLogger().Infof("===QueueStatus=entry=%+v", caller)
+				//lfshook.NewLogger().Infof("===QueueStatus=entry=%+v", caller)
 				time.Sleep(time.Millisecond * 50)
 				RedirectInQueue(caller.CallerIDNum, "0300", "queues-icp-redirect", caller.CallerIDNum) // redirect All PAD redirect to ICP queue
 			}
 
 			priority.RegistryTask.StopAndUnregister("PAD-OCC")
 			//2. Hangup connected PAD
-			lfshook.NewLogger().Infof("===InterruptRunningTask=Hangup connected PAD=== ")
+			//lfshook.NewLogger().Infof("===InterruptRunningTask=Hangup connected PAD=== ")
 			Hangup(task.RunChannel)
 
 			//3. Hangup OI & ICP
@@ -241,7 +246,7 @@ func InterruptRunningTask(toRunTask string) {
 		}
 
 	default:
-		lfshook.NewLogger().Infof("===InterruptRunningTask=default=== ")
+		lfshook.NewLogger().Infof("InterruptRunningTask goto default !")
 		//if !strings.Contains(priority.RunningPATaskChan, "0502@default") {
 		//	Hangup(priority.RunningPATaskChan)
 		//}
@@ -274,12 +279,13 @@ func HangupAllPACU() {
 func HangupAllLocalChan() {
 	chans, err := CoreShowChannels()
 	if err != nil {
-		lfshook.NewLogger().Errorf("CoreShowChannels %+v", err)
+		lfshook.NewLogger().Infof("CoreShowChannels %+v", err)
+		return
 	}
 
 	for _, ret := range chans {
 		if strings.Contains(ret.Channel, "Local") && !strings.Contains(ret.Channel, "0502@default") {
-			lfshook.NewLogger().Infof("HangupAllLocalChan=====hangup========= %+v", ret)
+			//lfshook.NewLogger().Infof("HangupAllLocalChan=====hangup========= %+v", ret)
 			Hangup(ret.Channel)
 		}
 	}
@@ -392,7 +398,7 @@ func ChanSpy(src, dst string, whisper, bargein bool) {
 // Redirect 转接
 func RedirectInQueue(channel, dst, dialrule, callerID string) (err error) {
 	//callerID := "redirect"
-	lfshook.NewLogger().Infof("redirect src %s to dst %s", channel, dst)
+	//lfshook.NewLogger().Infof("redirect src %s to dst %s", channel, dst)
 	if !utils.IsChannel(channel) {
 		//callerID = channel
 		if channel, err = GetChannelByExtenNotBridged(channel); err != nil {
@@ -409,7 +415,7 @@ func RedirectInQueue(channel, dst, dialrule, callerID string) (err error) {
 		"Priority": "1",
 		"async":    "true",
 	}
-	lfshook.NewLogger().Infof("redirect %+v", action)
+	lfshook.NewLogger().Infof("RedirectInQueue: %+v", action)
 	res, _, err := AminInstance.Send(action)
 	if err != nil {
 		lfshook.NewLogger().Error(err)
@@ -421,7 +427,7 @@ func RedirectInQueue(channel, dst, dialrule, callerID string) (err error) {
 // Redirect 转接
 func Redirect(channel, dst, dialrule, callerID, callerName string) (err error) {
 	//callerID := "redirect"
-	lfshook.NewLogger().Infof("redirect src %s to dst %s", channel, dst)
+	//lfshook.NewLogger().Infof("redirect src %s to dst %s", channel, dst)
 	if !utils.IsChannel(channel) {
 		callerID = channel
 		if channel, err = GetChannelByExten(channel); err != nil {
@@ -438,7 +444,7 @@ func Redirect(channel, dst, dialrule, callerID, callerName string) (err error) {
 		"Priority": "1",
 		"async":    "true",
 	}
-	lfshook.NewLogger().Infof("redirect %+v", action)
+	lfshook.NewLogger().Infof("Redirect: %+v", action)
 	res, _, err := AminInstance.Send(action)
 	if err != nil {
 		lfshook.NewLogger().Error(err)
@@ -449,12 +455,12 @@ func Redirect(channel, dst, dialrule, callerID, callerName string) (err error) {
 
 func SetPadTimer() {
 
-	toRunPadpriority := priority.GetPriorityByKey(priority.InterruptedPad) // 获取之前打断的报警优先级
+	toRunPadpriority := priority.GetPriorityByKey(priority.InterruptedPad) //Get PAD priori 获取之前打断的报警优先级
 	//toRunpriority := priority.GetPriorityByKey("PAD-ICP")
 
 	_, taskTmp, ok := priority.RegistryTask.HighestPriorityRunningTask()
 	if ok {
-		lfshook.NewLogger().Infof("==SetPadTimer====runing:%d==toRun:%d=", taskTmp.Priority, toRunPadpriority)
+		lfshook.NewLogger().Infof("PAD SetPadTimer runing priority:%d toRun priority:%d", taskTmp.Priority, toRunPadpriority)
 		if taskTmp.Priority < toRunPadpriority { //higher priority task running ,do not set timer
 			return
 		}
@@ -462,26 +468,26 @@ func SetPadTimer() {
 
 	res, err := QueueStatus("0300", "") // check OCC queue , if empty OCC-PAD start
 	if err != nil {
-		lfshook.NewLogger().Infof("===OCC-QueueStatus==%+v", err)
+		lfshook.NewLogger().Infof("QueueStatus err%+v", err)
 		return
 	}
 
 	if res.Calls != "0" {
 
-		lfshook.NewLogger().Infof("==SetPadTimer==QueueTimer===1====")
+		lfshook.NewLogger().Infof("PAD SetPadTimer Set QueueTimer timeout 30s !")
 		active.SetTimer = true
 		active.QueueTimer = time.AfterFunc(30*time.Second, func() { // check the PAD 30s timeout
 
 			res, err := QueueStatus("0301", "") // check OCC queue , if empty OCC-PAD start
 			if err != nil {
-				lfshook.NewLogger().Infof("===OCC-QueueStatus==%+v", err)
+				lfshook.NewLogger().Infof("OCC QueueStatus err:%+v", err)
 				return
 			}
 
 			if res.Calls == "0" { // OCC queue empty
 				resCaller, err := QueueStatus("0300", "") // check ICP queue, get entries
 				if err != nil {
-					lfshook.NewLogger().Infof("==ICP=QueueStatus==%+v", err)
+					lfshook.NewLogger().Infof("ICP QueueStatus err:%+v", err)
 					return
 				}
 				sort.Slice(resCaller.Entrys, func(i, j int) bool {
@@ -491,7 +497,7 @@ func SetPadTimer() {
 				for _, caller := range resCaller.Entrys {
 					priority.ICPAnswer = 0
 					//lfshook.NewLogger().Infof("====SetPadTimer==QueueTimer==2=")
-					lfshook.NewLogger().Infof("==SetPadTimer==Redirect to 0301 entry:%s=Pos:%s==", caller.CallerIDNum, caller.Position)
+					//lfshook.NewLogger().Infof("==SetPadTimer==Redirect to 0301 entry:%s=Pos:%s==", caller.CallerIDNum, caller.Position)
 					//order by pos
 					RedirectInQueue(caller.CallerIDNum, "0301", "queues-occ", caller.CallerIDNum) // redirect All ICP-PAD redirect to OCC queue
 					time.Sleep(time.Millisecond * 100)                                            //200 ms delay
@@ -514,7 +520,7 @@ func ConfbridgeKick(confnum, channel string) (res map[string]string, err error)
 	if err != nil {
 		return nil, err
 	}
-	lfshook.NewLogger().Infof("=======ConfbridgeKick==%+v", res)
+	lfshook.NewLogger().Infof("ConfbridgeKick res:%+v", res)
 
 	if res["Response"] != "Success" {
 		return nil, errors.New(res["Message"])
@@ -524,14 +530,12 @@ func ConfbridgeKick(confnum, channel string) (res map[string]string, err error)
 }
 
 func CPAConfbridgeKick(confnum string) (res map[string]string, err error) {
-	lfshook.NewLogger().Infof("=======CPAConfbridgeKick==%s", confnum)
 	chans, err := ConfbridgeList(confnum)
 	if err != nil {
 		return nil, errors.New(res["Message"])
 	}
 
 	for _, confChan := range chans {
-		lfshook.NewLogger().Infof("======CPAConfbridgeKick==1=%+v", confChan)
 		if !strings.Contains(confChan, "PJSIP/1481") {
 			ConfbridgeKick(confnum, confChan)
 		}
@@ -540,7 +544,6 @@ func CPAConfbridgeKick(confnum string) (res map[string]string, err error) {
 }
 
 func CPAConfbridgeReinvite(confID string) {
-	lfshook.NewLogger().Infof("=====CPAConfbridgeReinvite==")
 	time.Sleep(time.Millisecond * 500)
 	for _, ext := range Speakers {
 		ConfbridgeReinvite(ext, "call-speakers-cpa", confID)
@@ -548,14 +551,13 @@ func CPAConfbridgeReinvite(confID string) {
 }
 
 func EMGConfbridgeKick(confnum string) (res map[string]string, err error) {
-	lfshook.NewLogger().Infof("=====EMGConfbridgeKick==%s", confnum)
+
 	chans, err := ConfbridgeList(confnum)
 	if err != nil {
 		return nil, errors.New(res["Message"])
 	}
 
 	for _, confChan := range chans {
-		lfshook.NewLogger().Infof("====EMGConfbridgeKick==1=%+v", confChan)
 		if !strings.Contains(confChan, "0502@default") {
 			ConfbridgeKick(confnum, confChan)
 		}
@@ -564,13 +566,11 @@ func EMGConfbridgeKick(confnum string) (res map[string]string, err error) {
 }
 
 func EMGConfbridgeReinvite(confID string) {
-	lfshook.NewLogger().Infof("=======EMGConfbridgeReinvite==")
+
 	time.Sleep(time.Millisecond * 500)
 	for _, ext := range Speakers {
-		lfshook.NewLogger().Infof("====1===EMGConfbridgeReinvite==")
 		ConfbridgeReinvite(ext, "call-speakers-emg", confID)
 	}
-
 }
 
 func ConfbridgeList(confnum string) (chans []string, err error) {
@@ -584,12 +584,11 @@ func ConfbridgeList(confnum string) (chans []string, err error) {
 	if err != nil {
 		return nil, err
 	}
-	lfshook.NewLogger().Infof("===ConfbridgeList=res=%+v", res)
+	lfshook.NewLogger().Infof("ConfbridgeList res:%+v", res)
 
 	if res["Response"] == "Success" {
 		for _, event := range events {
 			if event.Data["Event"] == "ConfbridgeList" {
-				//lfshook.NewLogger().Infof("=======ConfbridgeList==%+v", event)
 				chans = append(chans, event.Data["Channel"])
 			}
 		}
@@ -600,9 +599,8 @@ func ConfbridgeList(confnum string) (chans []string, err error) {
 }
 
 func ConfbridgeReinvite(src, context, confID string) {
-	lfshook.NewLogger().Infof("========ConfbridgeReinvite=======ext:%s==conf:%s===========", src, confID)
 	if ExtenStatus(src) != "Idle" {
-		//lfshook.NewLogger().Infof("===============ext:%s==!Idle===========", src)
+		lfshook.NewLogger().Infof(" ConfbridgeReinvite ext:%s Not Idle !", src)
 		return
 	}
 

+ 2 - 2
internal/app/ami/action/channel.go

@@ -79,7 +79,7 @@ func GetChannelByExtenNotBridged(exten string) (channel string, err error) {
 	}
 
 	for _, event := range events {
-		lfshook.NewLogger().Infof("CoreShowChannels event Data %+v", event.Data)
+		//lfshook.NewLogger().Infof("CoreShowChannels event Data %+v", event.Data)
 		if event.Data["Event"] == "CoreShowChannel" && event.Data["CallerIDNum"] == exten {
 			channel = event.Data["Channel"]
 			lfshook.NewLogger().Infof("GetChannelByExten get channel %s", channel)
@@ -106,7 +106,7 @@ func GetExtenChan(exten string) (channel string, err error) {
 	}
 
 	for _, event := range events {
-		lfshook.NewLogger().Infof("CoreShowChannels event Data %+v", event.Data)
+		//	lfshook.NewLogger().Infof("CoreShowChannels event Data %+v", event.Data)
 		if event.Data["Event"] == "CoreShowChannel" && event.Data["ConnectedLineNum"] != exten && event.Data["CallerIDNum"] == exten {
 			channel = event.Data["Channel"]
 			lfshook.NewLogger().Infof("GetChannelByExten get channel %s", channel)

+ 33 - 33
internal/app/ami/action/index.go

@@ -33,13 +33,13 @@ func HandleAMI(event map[string]string) {
 			//PA interrupt PAD
 			switch event["Digit"] {
 			case "#":
-				lfshook.NewLogger().Infof("===PA interrupt PAD====== ")
-				
+				//lfshook.NewLogger().Infof("===PA interrupt PAD====== ")
+
 				InterruptRunningTask("PA")
-				
+
 			case "*": //Cab cab interrupt PAD
-				lfshook.NewLogger().Infof("===Cab cab interrupt PAD====== ")
-				
+				//lfshook.NewLogger().Infof("===Cab cab interrupt PAD====== ")
+
 				InterruptRunningTask("C2C")
 			}
 		}
@@ -57,7 +57,7 @@ func HandleAMI(event map[string]string) {
 
 				if priority.CheckPriority("ManuPa") {
 					//hangup others if priority is higher
-					lfshook.NewLogger().Infof("=====UserEvent===event======PA start=======")
+					lfshook.NewLogger().Infof("UserEvent event :PA start")
 					InterruptRunningTask("PA") //PA interrupt other
 
 				} else {
@@ -88,13 +88,13 @@ func HandleAMI(event map[string]string) {
 
 				taskName, _, ok := priority.RegistryTask.HighestPriorityRunningTask1()
 
-				lfshook.NewLogger().Infof("=======HighestPriorityRunningTask %+v", ok)
+				lfshook.NewLogger().Infof("HighestPriorityRunningTask get task :%+v", taskName)
 				if ok {
 					if taskName == "PAD-ICP" || taskName == "PAD-TMS" || taskName == "PA" {
 						InterruptRunningTask("C2C")
 
 					} else {
-						lfshook.NewLogger().Infof("========CabCab  hangup other one====caller %s", event["CallerIDNum"])
+						lfshook.NewLogger().Infof("CabCab  hangup other the one caller %s", event["CallerIDNum"])
 						if event["CallerIDNum"] == "2311" {
 							Hangup("2381")
 						} else {
@@ -104,7 +104,7 @@ func HandleAMI(event map[string]string) {
 				}
 
 			} else { // hangup caller; C2C start failed
-				lfshook.NewLogger().Infof("========CabCab  hangup caller====%s", event["CallerIDNum"])
+				lfshook.NewLogger().Infof("CabCab  hangup caller %s", event["CallerIDNum"])
 				Hangup(event["CallerIDNum"])
 			}
 			break
@@ -123,12 +123,12 @@ func HandleAMI(event map[string]string) {
 
 				if _, err := os.Stat(event["FILENAME"]); err == nil {
 					fileExists = true
-					lfshook.NewLogger().Infof("File found: %s", event["FILENAME"])
+					//lfshook.NewLogger().Infof("File found: %s", event["FILENAME"])
 					break
 				} else if os.IsNotExist(err) {
-					lfshook.NewLogger().Infof("File not found (attempt %d): %s", i+1, event["FILENAME"])
+					//lfshook.NewLogger().Infof("File not found (attempt %d): %s", i+1, event["FILENAME"])
 				} else {
-					lfshook.NewLogger().Infof("Error checking file: %v", err)
+					//lfshook.NewLogger().Infof("Error checking file: %v", err)
 				}
 			}
 
@@ -166,7 +166,7 @@ func HandleAMI(event map[string]string) {
 					file := strings.Replace(filepath, ".wav", "", -1)
 					DstFile = fmt.Sprintf("%s-encrypted.wav", file)
 
-					lfshook.NewLogger().Infof("Bin file====%s", DstFile)
+					//lfshook.NewLogger().Infof("Bin file====%s", DstFile)
 					err = utils.AudioFileEncode(DstFile, filepath)
 					if err != nil {
 						lfshook.NewLogger().Infof("Encode file: %s err: %+v", DstFile, err)
@@ -211,10 +211,10 @@ func HandleAMI(event map[string]string) {
 
 	case "Hangup":
 
-		lfshook.NewLogger().Infof("=========%s", event["Event"])
+		lfshook.NewLogger().Infof("%s", event["Event"])
 		//OCC answer PAD, hangup, redirect the next PAD to OCC
 		if utils.IsIO(event["CallerIDNum"]) && (event["ConnectedLineNum"] == "ano1" || event["ConnectedLineNum"] == "ano8") && event["Context"] == "default" {
-			lfshook.NewLogger().Infof("====Hangup OCC-PAD=====%+v", event)
+			lfshook.NewLogger().Infof("Hangup OCC-PAD event: %+v", event)
 
 			// OCC hangup detected, hangup other running channels
 			InterruptRunningTask("PAD-OCC")
@@ -244,12 +244,12 @@ func HandleAMI(event map[string]string) {
 			} else { //OCC queue is not empty
 
 				time.Sleep(time.Millisecond * 100) //wait io idle
-				lfshook.NewLogger().Infof("====Start OCC-PAD===next==%+v", res)
+				//lfshook.NewLogger().Infof("====Start OCC-PAD===next==%+v", res)
 				if active.ActivedCab == "1" && ExtenStatus("1411") == "Idle" { //check active and OCC status
 					time.Sleep(time.Second)
 					PADChan := ""
 					for _, chanEntry := range res.Entrys {
-						lfshook.NewLogger().Infof("====PAD answered by OCC1 pos:%s===chan:%s=", chanEntry.Position, chanEntry.Channel)
+						lfshook.NewLogger().Infof("PAD answered by OCC1 pos:%s chan:%s", chanEntry.Position, chanEntry.Channel)
 						if chanEntry.Position == "1" {
 							PADChan = chanEntry.Channel
 							break
@@ -264,14 +264,14 @@ func HandleAMI(event map[string]string) {
 
 						go Dial("0401", "0512", "pad-rule-pacus-occ", "ano1", "ano1", "1") // PACUs dial OCC1
 					} else {
-						lfshook.NewLogger().Infof("===OCC-QueueStatus==PADCchan NULL")
+						lfshook.NewLogger().Infof("OCC-QueueStatus PADCchan NULL")
 					}
 					break
 				} else if active.ActivedCab == "8" && ExtenStatus("1481") == "Idle" {
 					time.Sleep(time.Second)
 					PADChan := ""
 					for _, chanEntry := range res.Entrys {
-						lfshook.NewLogger().Infof("====PAD answered by OCC1 pos:%s===chan:%s=", chanEntry.Position, chanEntry.Channel)
+						lfshook.NewLogger().Infof("PAD answered by OCC1 pos:%s chan:%s", chanEntry.Position, chanEntry.Channel)
 						if chanEntry.Position == "1" {
 							PADChan = chanEntry.Channel
 							break
@@ -286,7 +286,7 @@ func HandleAMI(event map[string]string) {
 
 						go Dial("0401", "0512", "pad-rule-pacus-occ", "ano8", "ano8", "8") // PACUs dial OCC1
 					} else {
-						lfshook.NewLogger().Infof("===OCC-QueueStatus==PADCchan NULL")
+						lfshook.NewLogger().Infof("OCC QueueStatus PADCchan NULL")
 					}
 					break
 				}
@@ -297,13 +297,13 @@ func HandleAMI(event map[string]string) {
 
 			number := strings.Split(strings.Split(event["Channel"], "-")[0], "/")[1]
 
-			lfshook.NewLogger().Infof("===hangup PAD =======================%s", number)
+			//lfshook.NewLogger().Infof("===hangup PAD =======================%s", number)
 
 			if utils.IsPAIU(number) {
 				res, _ := QueueStatus("0300", "")  // check ICP queue ,if empty PAD end
 				res1, _ := QueueStatus("0301", "") // check OCC queue ,if empty PAD end
 
-				lfshook.NewLogger().Infof("==calls:%s===calls1:%s====", res.Calls, res1.Calls)
+				lfshook.NewLogger().Infof("ICP Queue calls:%s  OCC Queue calls:%s", res.Calls, res1.Calls)
 				if res.Calls == "0" && res1.Calls == "0" {
 
 					if priority.PADStart == 1 {
@@ -366,7 +366,7 @@ func HandleAMI(event map[string]string) {
 
 			ICPQueue, err := QueueStatus("0300", "") // check ICP queue, get entries
 			if err != nil {
-				lfshook.NewLogger().Infof("==ICP=QueueStatus==%+v", err)
+				lfshook.NewLogger().Infof("ICP QueueStatus err:%+v", err)
 				return
 			}
 
@@ -376,13 +376,13 @@ func HandleAMI(event map[string]string) {
 				time.Sleep(time.Millisecond * 500) //wait high priority task start
 				_, taskTmp, ok := priority.RegistryTask.HighestPriorityRunningTask()
 				if ok {
-					lfshook.NewLogger().Infof("=1==QueueCallerJoin===runing:%d=====toRun:=%d==Status:%s", taskTmp, toRunpriority, event["ChannelStateDesc"])
+					//lfshook.NewLogger().Infof("=1==QueueCallerJoin===runing:%d=====toRun:=%d==Status:%s", taskTmp, toRunpriority, event["ChannelStateDesc"])
 					if taskTmp.Priority < toRunpriority { //higher priority task running ,do not set timer
 						break
 					}
 				}
 
-				lfshook.NewLogger().Infof("==2=QueueCallerJoin===runing:%d=====toRun:=%d==Status:%s", taskTmp, toRunpriority, event["ChannelStateDesc"])
+				//lfshook.NewLogger().Infof("==2=QueueCallerJoin===runing:%d=====toRun:=%d==Status:%s", taskTmp, toRunpriority, event["ChannelStateDesc"])
 
 				//if (priority.RunningTypePriority > toRunpriority || priority.RunningTypePriority == 0) && event["ChannelStateDesc"] != "Up" {
 				active.SetTimer = true
@@ -390,14 +390,14 @@ func HandleAMI(event map[string]string) {
 
 					res, err := QueueStatus("0301", "") // check OCC queue , if empty OCC-PAD start
 					if err != nil {
-						lfshook.NewLogger().Infof("===OCC-QueueStatus==%+v", err)
+						lfshook.NewLogger().Infof("OCC QueueStatus err:%+v", err)
 						return
 					}
 
 					if res.Calls == "0" { // OCC queue empty
 						resCaller, err := QueueStatus("0300", "") // check ICP queue, get entries
 						if err != nil {
-							lfshook.NewLogger().Infof("==ICP=QueueStatus==%+v", err)
+							lfshook.NewLogger().Infof("ICP QueueStatus err:%+v", err)
 							return
 						}
 						sort.Slice(resCaller.Entrys, func(i, j int) bool {
@@ -406,8 +406,8 @@ func HandleAMI(event map[string]string) {
 
 						for _, caller := range resCaller.Entrys {
 							priority.ICPAnswer = 0
-							lfshook.NewLogger().Infof("====QueueCallerJoin==QueueTimer===%s", event["Event"])
-							lfshook.NewLogger().Infof("====Redirect to 0301 entry:%s=Pos:%s==", caller.CallerIDNum, caller.Position)
+							//lfshook.NewLogger().Infof("====QueueCallerJoin==QueueTimer===%s", event["Event"])
+							lfshook.NewLogger().Infof("Redirect to 0301 extension:%s Pos:%s", caller.CallerIDNum, caller.Position)
 							//order by pos
 							RedirectInQueue(caller.CallerIDNum, "0301", "queues-occ", caller.CallerIDNum) // redirect All ICP-PAD redirect to OCC queue
 							time.Sleep(time.Millisecond * 100)                                            //200 ms delay
@@ -908,7 +908,7 @@ func HandleAMI(event map[string]string) {
 
 		} else if utils.IsICP(event["CallerIDNum"]) && utils.IsICP(event["ConnectedLineNum"]) && event["DialStatus"] == "NOANSWER" {
 
-			lfshook.NewLogger().Infof("===%s======%s", event["Event"], event["DialStatus"])
+			//lfshook.NewLogger().Infof("===%s======%s", event["Event"], event["DialStatus"])
 
 			time.Sleep(time.Millisecond * 300)
 
@@ -947,7 +947,7 @@ func HandleAMI(event map[string]string) {
 		}
 
 	case "BridgeEnter": // TMS-ICP answer PAD; PACU connect ICP
-		lfshook.NewLogger().Infof("=========event:%s   callerid:%s", event["Event"], event["CallerIDNum"])
+		//lfshook.NewLogger().Infof("=========event:%s   callerid:%s", event["Event"], event["CallerIDNum"])
 
 		//PAD-OCC start
 		if utils.IsIO(event["CallerIDNum"]) && utils.IsPAIU(event["ConnectedLineNum"]) {
@@ -958,7 +958,7 @@ func HandleAMI(event map[string]string) {
 		}
 
 		if utils.IsPACU(event["CallerIDNum"]) && utils.IsPAIU(event["CallerIDName"]) { //ICP and PACU connected
-			lfshook.NewLogger().Infof("====BridgeEnter==IN action===%s===ID:%s   Name:%s", event["Event"], event["CallerIDNum"], event["CallerIDName"])
+			//lfshook.NewLogger().Infof("====BridgeEnter==IN action===%s===ID:%s   Name:%s", event["Event"], event["CallerIDNum"], event["CallerIDName"])
 			alstatus.AlarmStatus(event["CallerIDName"], "connect") // Alarm connected
 
 			//=============================
@@ -983,7 +983,6 @@ func HandleAMI(event map[string]string) {
 			}
 
 		} else if utils.IsPAIU(event["CallerIDNum"]) && event["Exten"] == "0405" { // PAD connect ICP-TMS;PACU not available
-			lfshook.NewLogger().Infof("====send pad status=====")
 
 			//=============================
 			task := priority.TaskInfo{
@@ -1030,6 +1029,7 @@ func StartAMI(connectOKCallBack func(), handleEvents []func(event map[string]str
 			connectOKCallBack()
 		} else {
 			lfshook.NewLogger().Errorf("ami connect failure %+v", payload)
+			active.Master = false
 		}
 	})
 	AminInstance.Connect()

+ 1 - 1
internal/app/ami/action/playback.go

@@ -38,7 +38,7 @@ func PlaybackPacu(filename string, count int, delay int, PaType string) (err err
 		"Variable": Para,
 	}
 
-	lfshook.NewLogger().Logger.Infof("===action : %+v", action)
+	lfshook.NewLogger().Logger.Infof("PlaybackPacu action : %+v", action)
 
 	res, _, err := AminInstance.Send(action)
 	if err != nil {

+ 15 - 28
internal/app/index.go

@@ -12,13 +12,17 @@ import (
 )
 
 func StartApp() {
-	//init mysql
-	//mysql.CreateDBInstance()
+	//init asterisk
+	if !utils.CheckAsterisk() {
+		lfshook.NewLogger().Infof("Check asterisk , if not running , run cmd /usr/sbin/asterisk !")
+		utils.ExecCmdAsync("/usr/sbin/asterisk")
+		time.Sleep(3 * time.Second)
+	}
 
 	//Get cab number acording to IP
-	SetMasterCabNum()
+	socket.SetMasterCabNum()
 
-	lfshook.NewLogger().Infof("=================cab number:%s========Master:%+v===", active.CabNum, active.Master)
+	lfshook.NewLogger().Infof("Get cab number:%s  Master:%+v", active.CabNum, active.Master)
 
 	//init the active status
 	//active.ActivedCab = ""
@@ -33,10 +37,12 @@ func StartApp() {
 	go stc.StartStcConnection(socket.Conn8, "8")
 
 	//启动连接到Master服务器,检查Master是否在线
-	//if active.CabNum == "8" {
-	//	socket.ConnectedMaster = false
-	//	go stc.StartConnectionToSipServer(socket.ConnToMaster)
-	//}
+	if active.CabNum == "1" {
+		go stc.StartConnectionToSipServer(socket.ConnToSlave)
+	} else {
+		go stc.RecvFromSipServer()
+	}
+
 	// 启动其他服务...
 	// 启动 AMI
 	go func() {
@@ -47,25 +53,6 @@ func StartApp() {
 
 	//refresh extension status
 	time.Sleep(3 * time.Second)
-	utils.ExecCmdAsync("/usr/sbin/asterisk", "-rx", "reload")
-}
 
-// Get eth0 IP
-func SetMasterCabNum() {
-
-	ext, err := socket.IsIPExists("10.0.11.11")
-	if err != nil {
-		lfshook.NewLogger().Infof("Check IP :%+v", err)
-	}
-	// Init cab number and master role
-	if !ext {
-		active.CabNum = "8"
-		active.Master = false
-	} else {
-		active.CabNum = "1"
-		active.Master = true
-	}
-
-	active.CabNum = "1"
-	active.Master = true
+	utils.ExecCmdAsync("/usr/sbin/asterisk", "-rx", "reload")
 }

+ 2 - 2
internal/app/stc/active/index.go

@@ -28,10 +28,10 @@ func NotifyPaiu(Exten, Action string) {
 		url = fmt.Sprintf("http://10.0.24.%s/api/sipphone?action=hangup", Exten[2:])
 	}
 
-	lfshook.NewLogger().Logger.Infof("======Notify PAIU Alarm====:%+v ", url)
+	lfshook.NewLogger().Logger.Infof("Notify PAD URL:%+v ", url)
 	resp, err := http.Get(url)
 	if err != nil {
-		lfshook.NewLogger().Logger.Infof("======Notify PAIU Alarm====:%+v ", err)
+		//lfshook.NewLogger().Logger.Infof("======Notify PAIU Alarm====:%+v ", err)
 		return
 	}
 	defer resp.Body.Close()

+ 43 - 77
internal/app/stc/broadcast/stc-broadcast.go

@@ -55,13 +55,13 @@ func HandleStcCmd(ctx context.Context, conn net.Conn) {
 func processPacket(packet []byte) {
 
 	if len(packet) < 6 {
-		fmt.Println("Invalid packet length")
+		lfshook.NewLogger().Logger.Infof("Get data wrong length from STC !")
 		return
 	}
 
 	//for recv data log debug
 	if packet[5] != 0x03 && packet[5] != 0x0c && packet[5] != 0x01 {
-		lfshook.NewLogger().Logger.Infof("Get data from STC ===============:%x", packet)
+		lfshook.NewLogger().Logger.Infof("Get data from STC:%x", packet)
 	}
 
 	//check if the cmd type is avtive
@@ -72,7 +72,7 @@ func processPacket(packet []byte) {
 
 	//check if Master role
 	if !active.Master {
-		lfshook.NewLogger().Logger.Infof("=========Not Master Role Ignore data=============")
+		//lfshook.NewLogger().Logger.Infof("=========Not Master Role Ignore data=============")
 		return
 	}
 
@@ -139,7 +139,11 @@ func processPacket(packet []byte) {
 		}
 	case 0x0e: //TMS answer PAD
 		if priority.CheckPriority("PAD-TMS") {
-			action.InterruptRunningTask("PAD-TMS") //PAD-TMS interrupt other
+
+			//Before Answer PAD
+			if packet[8] == 0x01 {
+				action.InterruptRunningTask("PAD-TMS") //PAD-ICP interrupt other
+			}
 
 			AlarmHandleTMS(packet)
 
@@ -159,22 +163,25 @@ func processPacket(packet []byte) {
 	//	RecordStorageConf(packet[8:]) // RCD setting
 
 	case 0x0d: // ICP answer PAD
-		if priority.CheckPriority("PAD-TMS") {
+		if priority.CheckPriority("PAD-ICP") {
 
-			action.InterruptRunningTask("PAD-TMS") //PAD-ICP interrupt other
+			//Before Answer PAD
+			if packet[8] == 0x01 {
+				action.InterruptRunningTask("PAD-ICP") //PAD-ICP interrupt other
+			}
 
 			if active.SetTimer {
 				active.QueueTimer.Stop()
 				active.SetTimer = false
 			}
 
-			AlarmHandleICP(packet) 
-
-			//AlarmHandleTMS(packet)
+			AlarmHandleICP(packet)
 		} else {
-			alstatus.PaStatus("", "PAD-TMS", "refuse")
+			alstatus.PaStatus("", "PAD-ICP", "refuse")
 		}
 
+	case 0xf1: //Set remote master
+
 		//default:
 		//fmt.Printf("Unknown command: %x\n", packet[5])
 	}
@@ -201,42 +208,43 @@ func StationAnn(data []byte) (err error) {
 func Active(data [2]byte) {
 
 	//var info model.Sysinfo
-	//active.Actived = true
 	Signal := int(data[0])
-	Master := int(data[1])
-	//lfshook.NewLogger().Logger.Infof("Active data : %x", Signal)
 
-	if !active.Master && active.CabNum == "8" { //slave role , check the Master data from STC
-		if Master == 8 {
-			active.Master = true
+	//check asterisk available
+	if active.Master { // master true
+		if !utils.CheckAsterisk() { //check asterisk not available and set master false
+			active.Master = false
+
+			utils.ExecCmd("/etc/init.d/asterisk", "stop")
 		}
-	} else if !active.Master && active.CabNum == "1" {
-		if Master == 1 {
-			active.Master = true
+	} else { // master false, check and start asterisk
+
+		//Master == false
+		if !utils.CheckAsterisk() {
+			if active.CabNum == "8" {
+				utils.ExecCmd("/etc/init.d/asterisk", "start")
+			}
 		}
-	}
 
-	if active.Master && !utils.IsAsteriskOn() {
-		utils.ExecCmd("/etc/init.d/asterisk", "start")
-	} else if !active.Master && utils.IsAsteriskOn() {
-		utils.ExecCmd("/etc/init.d/asterisk", "stop")
+		//Master == false  cab == 1
+		if active.CabNum == "1" {
+			if utils.CheckAsterisk() {
+				utils.ExecCmd("/etc/init.d/asterisk", "stop")
+			}
+		}
 	}
 
 	switch Signal {
 	case 0:
-
-		//lfshook.NewLogger().Logger.Infof("=================Inactive==================")
 		active.ActivedCab = ""
 		action.InActiveHangup()
 
 	case 1:
 		active.ActivedCab = "1"
-		//lfshook.NewLogger().Logger.Infof("=================active===MC1===============")
 
 	case 8:
 
 		active.ActivedCab = "8"
-		//lfshook.NewLogger().Logger.Infof("=================active===MC8===============")
 	}
 }
 
@@ -274,7 +282,7 @@ func EmgMsg(data []byte) {
 // 停止指定类型广播
 func AnnStop(data [4]byte) {
 
-	lfshook.NewLogger().Logger.Infof("=========AnnStop Type  %x", data[0])
+	//lfshook.NewLogger().Logger.Infof("=========AnnStop Type  %x", data[0])
 
 	switch data[0] {
 	case 0x03:
@@ -403,7 +411,7 @@ func AlarmHandleICP(data []byte) {
 			alstatus.PaStatus("", "PAD", "start")
 			priority.PADStart = 1
 		}
-		lfshook.NewLogger().Logger.Infof("================ICP Answer PAD================:%s ", exten)
+		lfshook.NewLogger().Logger.Infof("================ ICP Answer PAD ================:%s ", exten)
 		if active.ActivedCab == "1" {
 			action.Dial("0402", "0511", "pad-rule-pacus", "ani1", exten, "1") // PACUs dial ICP1
 			//goto ami event ConfbridgeJoin, ICP answer PAD
@@ -425,11 +433,12 @@ func AlarmHandleICP(data []byte) {
 
 	case 0x03: //hangup
 		//NotifyPaiu(exten, "hangup")
-		lfshook.NewLogger().Logger.Infof("=============STC== Hangup PAD=============== ")
+		lfshook.NewLogger().Logger.Infof("============ Hangup PAD-ICP =============== ")
 		action.Hangup(exten) //Pad
 		//action.HangupICP()
 
-		action.InterruptRunningTask("")
+		action.HangupTask("PAD-ICP")
+
 	}
 }
 
@@ -468,7 +477,7 @@ func AlarmHandleTMS(data []byte) {
 			priority.PADStart = 1
 		}
 		priority.ICPAnswer = 1
-		lfshook.NewLogger().Logger.Infof("================TMS Answer PAD:%s===PACU:%s==========", exten, PacuNum)
+		lfshook.NewLogger().Logger.Infof("==============TMS Answer PAD Exten:%s PACU:%s==========", exten, PacuNum)
 		if action.ExtenStatus(PacuNum) == "Idle" {
 			if active.ActivedCab == "1" {
 				action.Dial("0403", PacuNum, "default", PacuNum, exten, "1") // PACU dial ICP1
@@ -492,8 +501,7 @@ func AlarmHandleTMS(data []byte) {
 	case 0x03: //hangup
 		//NotifyPaiu(exten, "hangup")
 		action.Hangup(exten) //Pad
-		action.HangupAllLocalChan()
-		action.HangupICP()
+		action.HangupTask("PAD-ICP")
 	}
 }
 
@@ -506,45 +514,3 @@ func AlarmHoldResetAll(handler byte) {
 	//hangup running task
 	action.InterruptRunningTask("AlarmHoldResetAll") //Reset PAD ALL
 }
-
-/*
-func RecordStorageConf(data []byte) {
-
-	var info model.RcdConf
-
-	info.PadRcdEnable = strconv.Itoa(int(data[0]))
-	info.PadRcdStorageDays = strconv.Itoa(int(data[1]))
-	info.PaRcdStorageDays = strconv.Itoa(int(data[2]))
-	info.CpaRcdStorageDays = strconv.Itoa(int(data[3]))
-
-	info.PadRcdDelDays = strconv.Itoa(int(data[4]))
-	info.PaRcdDelDays = strconv.Itoa(int(data[5]))
-	info.CpaRcdDelDays = strconv.Itoa(int(data[6]))
-	//info.OpaRcdStorageDays = int(data[7])
-	//info.OpaRcdDelDays = int(data[8])
-
-	//lfshook.NewLogger().Infof("=============Set record Conf : %+v", info)
-
-	filePath := "/etc/asterisk/recording.conf"
-	_, err := os.Stat(filePath)
-	if err != nil {
-		logrus.Error(err)
-		return
-	}
-	iniFile, err := ini.Load(filePath)
-	if err != nil {
-		logrus.Error(err)
-		return
-	}
-
-	iniFile.Section("general").Key("PADRCD").SetValue(info.PadRcdEnable)
-	iniFile.Section("general").Key("PADRCDDAYS").SetValue(info.PadRcdStorageDays)
-	iniFile.Section("general").Key("PARCDDAYS").SetValue(info.PaRcdStorageDays)
-	iniFile.Section("general").Key("CPARCDDAYS").SetValue(info.CpaRcdStorageDays)
-	iniFile.Section("general").Key("PADRCDDELDAYS").SetValue(info.PadRcdDelDays)
-	iniFile.Section("general").Key("PARCDDELDAYS").SetValue(info.PaRcdDelDays)
-	iniFile.Section("general").Key("CPARCDDELDAYS").SetValue(info.CpaRcdDelDays)
-	iniFile.SaveTo(filePath)
-
-}
-*/

+ 76 - 30
internal/app/stc/index.go

@@ -3,6 +3,7 @@ package stc
 import (
 	"context"
 	"fmt"
+	"io"
 	"net"
 	"pbx-api-gin/internal/app/stc/active"
 	"pbx-api-gin/internal/app/stc/broadcast"
@@ -164,7 +165,6 @@ func CreateConnection(RemoteCab string) (net.Conn, error) {
 	}
 }
 
-/*
 func StartConnectionToSipServer(conn net.Conn) {
 
 	var connMux sync.Mutex // 保护 conn 的读写
@@ -176,14 +176,14 @@ func StartConnectionToSipServer(conn net.Conn) {
 		conn1, err = CreateConnectionSipServer()
 		if err != nil || conn1 == nil {
 			time.Sleep(2 * time.Second)
-			lfshook.NewLogger().Logger.Infof("===========Reconnecting==Sip Server=======")
+			//lfshook.NewLogger().Logger.Infof("===========Reconnecting==Sip Server=======")
 			continue
 		}
 
 		connMux.Lock()
 		oldConn := conn
 
-		socket.ConnToMaster = conn1
+		socket.ConnToSlave = conn1
 
 		connMux.Unlock()
 
@@ -201,7 +201,7 @@ func StartConnectionToSipServer(conn net.Conn) {
 			defer func() {
 				cancel()
 			}()
-			SendheartbeatToSipServer(ctx, conn1) // 改造 Sendheartbeat 接收 ctx
+			SendToRemoteMaster(ctx, conn1) // 改造 Sendheartbeat 接收 ctx
 		}()
 
 		// 等待连接断开(监听连接状态)
@@ -213,27 +213,21 @@ func StartConnectionToSipServer(conn net.Conn) {
 
 		lfshook.NewLogger().Logger.Info("Reconnecting in 1 second...")
 		time.Sleep(time.Second) // 重连前等待
-
-		//check connected Master tag; connection err change to Master role ,exit
-		//if socket.ConnectedMaster {
-		//	active.Master = true
-		//	return
-		//}
 	}
 }
-*/
+
 // 连接Master sipserver
 func CreateConnectionSipServer() (net.Conn, error) {
 	dialer := &net.Dialer{
-		LocalAddr: &net.TCPAddr{IP: net.ParseIP("0.0.0.0"), Port: socket.LocalPort8}, // 固定本地端口
+		LocalAddr: &net.TCPAddr{IP: net.ParseIP("0.0.0.0"), Port: socket.LocalServerPort}, // 固定本地端口
 		Control:   controlTCPConn,
 		Timeout:   5 * time.Second,
 	}
 
-	DialAddr := fmt.Sprintf("%s:%d", socket.RemoteAddr, socket.LocalPort) // Connect to Cab1 Sip server
+	DialAddr := fmt.Sprintf("%s:%d", socket.RemoteAddr8, socket.LocalServerPort) // Connect to Cab8 Sip server
 	conn, err := dialer.Dial("tcp", DialAddr)
 	if err != nil {
-		//lfshook.NewLogger().Logger.Infof("========Connect server err :%+v", err)
+		//lfshook.NewLogger().Logger.Infof("========Connect SIP server err :%+v", err)
 		return nil, err
 	}
 	lfshook.NewLogger().Logger.Infof("Connect SIP Server success :%s:%d", socket.RemoteAddr, socket.LocalPort)
@@ -287,13 +281,67 @@ func Sendheartbeat(ctx context.Context, conn net.Conn) {
 	}
 }
 
-func SendheartbeatToSipServer(ctx context.Context, conn net.Conn) {
-	var count uint8
+// cab == 8
+func RecvFromSipServer() {
+	listener, err := net.Listen("tcp", "0.0.0.0:10000")
+	if err != nil {
+		lfshook.NewLogger().Logger.Infof("Sever Listen cab1 err:%+v", err)
+	}
+	defer listener.Close()
+
+	for {
+		conn, err := listener.Accept() //blocked wait connection
+		if err != nil {
+			lfshook.NewLogger().Logger.Infof("Sever accept cab1 err:%+v", err)
+			continue
+		}
+
+		// 启动 goroutine 处理每个连接(支持并发)
+		//go HandleConnection(conn)
+		//clientAddr := conn.RemoteAddr().String()
+
+		buf := make([]byte, 1024)
+		for {
+			n, err := conn.Read(buf)
+			if n > 0 {
+				//安全截取实际读到的字节
+				data := buf[:n]
+
+				//Set master = true
+				if data[8] == 0x01 && data[5] == 0xf1 {
+					active.Master = true
+					return // set to master , stop recv
+				} else if data[8] == 0x00 && data[5] == 0xf1 {
+					active.Master = false
+				}
+				//lfshook.NewLogger().Logger.Infof("Client  received %d bytes: hex=%x", n, data)
+			}
+
+			if err == io.EOF {
+				//lfshook.NewLogger().Logger.Infof("Client %s 连接正常关闭", clientAddr)
+				break
+			}
+			if err != nil {
+				// 忽略临时错误(如 timeout),但记录非临时错误
+				if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
+					continue // 可选:超时后继续读(需配合 SetReadDeadline)
+				}
+				//lfshook.NewLogger().Logger.Infof("addr:%s read error: %+v", clientAddr, err)
+				break
+			}
+		}
+		lfshook.NewLogger().Logger.Infof("Connection closed from cab1 set Master = true !")
+		active.Master = true
+		return
+	}
+}
+
+func SendToRemoteMaster(ctx context.Context, conn net.Conn) {
 
 	protocol := msgdata.NewProtocol()
-	protocol.MessageID = 0x21
-	protocol.DataLength = 0x04
-	protocol.Data = make([]byte, 4)
+	protocol.MessageID = 0xf1 //check master data type
+	protocol.DataLength = 0x02
+	protocol.Data = make([]byte, 2)
 
 	// 初始化协议...
 	ticker := time.NewTicker(2 * time.Second)
@@ -302,31 +350,29 @@ func SendheartbeatToSipServer(ctx context.Context, conn net.Conn) {
 	for {
 		select {
 		case <-ctx.Done():
-			//lfshook.NewLogger().Logger.Infof("Sendheartbeat===ctx==ret======")
 			return
 
 		case <-ticker.C:
-			count++
-			protocol.Data[0] = count
+
+			//set master data
+			if active.Master {
+				protocol.Data[0] = 0 //set remote master false
+			} else {
+				protocol.Data[0] = 1 //set remote master true
+			}
+
 			// 编码并发送数据...
 			encoded, err := protocol.Encode()
 			if err != nil {
-				//fmt.Printf("encode err : %v\n", err)
 				return
 			}
+
 			if conn != nil {
 				_, err = conn.Write(encoded)
 				if err != nil {
-					//fmt.Printf("Send hearbeat err: %v\n", err)
 					conn.Close()
 					return // 触发重连
 				}
-
-				//Set connected Master tag
-				if !socket.ConnectedMaster {
-					socket.ConnectedMaster = true
-				}
-				//lfshook.NewLogger().Logger.Infof("Sendheartbeat===send ======%x", encoded)
 			}
 		}
 	}

+ 3 - 4
internal/app/stc/priority/index.go

@@ -5,7 +5,6 @@ import (
 	"pbx-api-gin/pkg/lfshook"
 	"strconv"
 
-	"github.com/sirupsen/logrus"
 	"gopkg.in/ini.v1"
 )
 
@@ -55,12 +54,12 @@ func GetPriority() {
 
 	_, err := os.Stat(filePath)
 	if err != nil {
-		logrus.Error(err)
+		lfshook.NewLogger().Logger.Infof("GetPriority err :%+v", err)
 		return
 	}
 	iniFile, err := ini.Load(filePath)
 	if err != nil {
-		logrus.Error(err)
+		lfshook.NewLogger().Logger.Infof("GetPriority err :%+v", err)
 		return
 	}
 
@@ -124,7 +123,7 @@ func CheckPriority(runType string) bool {
 
 	runingtaskName, taskRuning, ok := RegistryTask.HighestPriorityRunningTask()
 	if ok {
-		lfshook.NewLogger().Logger.Infof("=====CheckPriority runType:%s======SpecialVoice:%d===toRunpriority:%d==runingtaskpri:%d===", runType, SpecialVoice, toRunpriority, taskRuning.Priority)
+		lfshook.NewLogger().Logger.Infof("CheckPriority runType:%s SpecialVoice:%d toRunpriority:%d runingpriority:%d ", runType, SpecialVoice, toRunpriority, taskRuning.Priority)
 		//if the running task priority is lowwer
 		if toRunpriority < taskRuning.Priority && toRunpriority != 0 {
 			return true

+ 1 - 2
internal/app/stc/priority/task.go

@@ -1,7 +1,6 @@
 package priority
 
 import (
-	"pbx-api-gin/pkg/lfshook"
 	"sync"
 )
 
@@ -124,6 +123,6 @@ func (r *TaskRegistry) HighestPriorityRunningTask1() (string, TaskInfo, bool) {
 		}
 	}
 
-	lfshook.NewLogger().Infof("====HighestPriorityRunningTask1 ret=====%s", best.RunType)
+	//lfshook.NewLogger().Infof("====HighestPriorityRunningTask1 ret=====%s", best.RunType)
 	return bestKey, best, found
 }

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

@@ -179,7 +179,7 @@ func OccPad(operation string) {
 		return
 	}
 
-	lfshook.NewLogger().Logger.Infof("===OCC-PAD========action:%s", operation)
+	lfshook.NewLogger().Logger.Infof("OCC-PAD send status:%s", operation)
 	protocol := msgdata.NewProtocol()
 	protocol.MessageID = 0x2A
 	protocol.DataLength = 0x04

+ 61 - 14
internal/app/stc/socket/index.go

@@ -3,48 +3,95 @@ package socket
 import (
 	"fmt"
 	"net"
+	"pbx-api-gin/internal/app/stc/active"
+	"pbx-api-gin/pkg/lfshook"
+	"time"
 )
 
 var Conn net.Conn
 var Conn8 net.Conn
 
-var ConnToMaster net.Conn
+var ConnToSlave net.Conn
 
 const RemotePort = 10100
 const LocalPort = 10201
 const LocalPort8 = 10202
 
-//const RemoteAddr8 = "192.168.17.14"
+const LocalServerPort = 10000
 
 const RemoteAddr = "10.0.11.11"
 
 const RemoteAddr8 = "10.0.11.81"
 
-var ConnectedMaster bool
-
 func IsIPExists(targetIP string) (bool, error) {
 	// 解析目标 IP
+	//lfshook.NewLogger().Logger.Infof("========targetIP=========%s", targetIP)
 	ip := net.ParseIP(targetIP)
 	if ip == nil {
 		return false, fmt.Errorf("invalid IP address: %s", targetIP)
 	}
 
-	// 获取所有网络接口的地址
-	addrs, err := net.InterfaceAddrs()
+	interfaces, err := net.Interfaces()
 	if err != nil {
 		return false, err
 	}
 
-	// 遍历每个接口地址
-	for _, addr := range addrs {
-		// 只处理 IP 网络类型地址 (*net.IPNet)
-		if ipnet, ok := addr.(*net.IPNet); ok {
-			// 检查该网段是否包含目标 IP
-			if ipnet.Contains(ip) {
-				return true, nil
+	for _, iface := range interfaces {
+		addrs, err := iface.Addrs()
+		if err != nil {
+			continue // 忽略无法读取地址的接口
+		}
+		for _, addr := range addrs {
+			if ipnet, ok := addr.(*net.IPNet); ok && ipnet.IP != nil {
+				// 精确匹配 IP(忽略掩码,只看地址本身是否一致)
+				if ipnet.IP.Equal(ip) ||
+					(ip.To4() != nil && ipnet.IP.To4() != nil && ipnet.IP.To4().Equal(ip.To4())) {
+					return true, nil
+				}
 			}
 		}
 	}
-
 	return false, nil
 }
+
+// Get eth0 IP
+func SetMasterCabNum() {
+
+	count := 0
+
+getIP:
+	ext1, err := IsIPExists("10.0.11.11")
+	if err != nil {
+		lfshook.NewLogger().Infof("Check IP 10.0.11.11 err :%+v", err)
+	}
+	// Init cab1 number and master role
+	if ext1 {
+		active.CabNum = "1"
+		active.Master = true
+		return
+	}
+
+	ext8, err := IsIPExists("10.0.11.81")
+	if err != nil {
+		lfshook.NewLogger().Infof("Check IP 10.0.11.81 err:%+v", err)
+	}
+	// Init cab8 number and master role
+	if ext8 {
+		active.CabNum = "8"
+		active.Master = false
+		return
+	}
+
+	if !(ext1 || ext8) {
+		if count < 5 {
+			count++
+			time.Sleep(time.Second * 2)
+			goto getIP
+		}
+		lfshook.NewLogger().Infof("Can not get device IP ! Set Cabnum=1  Master=true by default .")
+
+		active.CabNum = "1"
+		active.Master = true
+	}
+
+}

+ 2 - 2
pkg/utils/cmd.go

@@ -8,7 +8,7 @@ import (
 	"time"
 )
 
-//ExecCmdAsync 执行指定命令
+// ExecCmdAsync 执行指定命令
 func ExecCmdAsync(cmdName string, arg ...string) (stdOut, errOut string, err error) {
 	cmd := exec.Command(cmdName, arg...)
 	var stdout, stderr bytes.Buffer
@@ -28,7 +28,7 @@ func ExecCmdAsync(cmdName string, arg ...string) (stdOut, errOut string, err err
 	return outStr, errStr, err
 }
 
-//ExecCmd 执行指定命令
+// ExecCmd 执行指定命令
 func ExecCmd(cmdName string, arg ...string) (stdOut, errOut string, err error) {
 	cmd := exec.Command(cmdName, arg...)
 	var stdout, stderr bytes.Buffer

+ 38 - 4
pkg/utils/utils.go

@@ -4,6 +4,7 @@ import (
 	"flag"
 	"fmt"
 	"math/rand"
+	"net"
 	"os"
 	"strings"
 	"time"
@@ -173,9 +174,42 @@ func IndexOf(sliceID []string, value string) int {
 	return -1
 }
 
-func IsAsteriskOn() bool {
-	//res, _, _ := ExecCmd("ps", "-e", "|grep asterisk")
+func CheckAsterisk() bool {
+	target := "127.0.0.1:5060"
+	conn, err := net.DialTimeout("udp", target, 1*time.Second)
+	if err != nil {
+		return false
+	}
+	defer conn.Close()
+
+	// 构造最小 SIP OPTIONS 请求(RFC 3261)
+	req := "OPTIONS sip:test@" + target + " SIP/2.0\r\n" +
+		"Via: SIP/2.0/UDP 127.0.0.1:5061;branch=z9hG4bK123456\r\n" +
+		"Max-Forwards: 70\r\n" +
+		"To: <sip:test@" + target + ">\r\n" +
+		"From: <sip:probe@127.0.0.1>;tag=abc123\r\n" +
+		"Call-ID: 123456789@127.0.0.1\r\n" +
+		"CSeq: 1 OPTIONS\r\n" +
+		"Contact: <sip:probe@127.0.0.1:5061>\r\n" +
+		"Accept: application/sdp\r\n" +
+		"Content-Length: 0\r\n\r\n"
+
+	_, err = conn.Write([]byte(req))
+	if err != nil {
+		return false
+	}
+
+	//lfshook.NewLogger().Logger.Infof("=====CheckAsterisk req====:%+v ", string(req))
+
+	conn.SetReadDeadline(time.Now().Add(1 * time.Second))
+	buf := make([]byte, 2048)
+	n, err := conn.Read(buf)
+	if err != nil || n == 0 {
+		return false
+	}
+	resp := string(buf[:n])
+
+	//lfshook.NewLogger().Logger.Infof("=====CheckAsterisk response====:%+v ", resp)
 
-	//return res != ""
-	return true
+	return strings.HasPrefix(resp, "SIP/2.0")
 }