dujunchen 1 月之前
父節點
當前提交
5cee75053c
共有 5 個文件被更改,包括 114 次插入92 次删除
  1. 15 14
      internal/app/ami/action/index.go
  2. 10 6
      internal/app/index.go
  3. 78 65
      internal/app/stc/broadcast/stc-broadcast.go
  4. 0 2
      pkg/utils/file.go
  5. 11 5
      pkg/utils/utils.go

+ 15 - 14
internal/app/ami/action/index.go

@@ -196,12 +196,13 @@ func HandleAMI(event map[string]string) {
 						_, caller, callee := utils.GetPadInfo(event["FILENAME"])
 
 						carNum := int(caller[2] - '0')
+						//carNum := 4
 						//trainInfo = fmt.Sprintf("TrainNumber %s  CarNumber %s ", active.TrainNum, active.TrainInfoMap[active.TrainNum][int(caller[2])])
-						lfshook.NewLogger().Infof("Train info===caller[2]==========:%c===============", carNum)
+						//lfshook.NewLogger().Infof("Train info carNum===caller[2]==========:%d===============", carNum)
 
 						trainInfo = fmt.Sprintf("TrainNumber %s  CarNumber %s ", active.TrainNum, active.TrainInfoMap[active.TrainNum][carNum])
 
-						lfshook.NewLogger().Infof("Train info=============%s===============", trainInfo)
+						//lfshook.NewLogger().Infof("Train info=============%s===============", trainInfo)
 
 						if len(caller) == 4 && len(caller) > 0 {
 							utils.Logger.Printf("Train Information: %s, MessageType: PAD , LocationCode: %c, Connected: %s, RecordFileName:%s", trainInfo, caller[3], callee, DstFile)
@@ -209,27 +210,27 @@ func HandleAMI(event map[string]string) {
 							utils.Logger.Printf("Train Information: %s, MessageType: PAD , RecordFileName:%s . Can not get caller and callee  !", trainInfo, DstFile)
 						}
 
-					} else if strings.Contains(event["FILENAME"], "PA") {
-						_, caller, _ := utils.GetPadInfo(event["FILENAME"])
-						utils.Logger.Printf("Train Information:%s , MessageType: PA, Caller: %s, RecordFileName: %s", trainInfo, caller, DstFile)
 					} else if strings.Contains(event["FILENAME"], "C2C") {
 						_, caller, _ := utils.GetPadInfo(event["FILENAME"])
-						utils.Logger.Printf("Train Information:%s , MessageType: CabCab, Caller: %s, RecordFileName: %s", trainInfo, caller, DstFile)
+						utils.Logger.Printf("Train Information: %s , MessageType: CabCab, Caller: %s, RecordFileName: %s", trainInfo, caller, DstFile)
 					} else if strings.Contains(event["FILENAME"], "CPA") {
 						_, caller, _ := utils.GetPadInfo(event["FILENAME"])
-						utils.Logger.Printf("Train Information:%s , MessageType: CPA, Caller: %s, RecordFileName: %s", trainInfo, caller, DstFile)
+						utils.Logger.Printf("Train Information: %s , MessageType: CPA, Caller: %s, RecordFileName: %s", trainInfo, caller, DstFile)
 					} else if strings.Contains(event["FILENAME"], "EMG") {
-						utils.Logger.Printf("Train Information:%s , MessageType: EMG, RecordFileName: %s", trainInfo, DstFile)
+						utils.Logger.Printf("Train Information: %s , MessageType: EMG, RecordFileName: %s", trainInfo, DstFile)
 					} else if strings.Contains(event["FILENAME"], "STN") {
-						utils.Logger.Printf("Train Information:%s , MessageType: STN, RecordFileName: %s", trainInfo, DstFile)
+						utils.Logger.Printf("Train Information: %s , MessageType: STN, RecordFileName: %s", trainInfo, DstFile)
 					} else if strings.Contains(event["FILENAME"], "DCS") {
-						utils.Logger.Printf("Train Information:%s , MessageType: DCS, RecordFileName: %s", trainInfo, DstFile)
+						utils.Logger.Printf("Train Information: %s , MessageType: DCS, RecordFileName: %s", trainInfo, DstFile)
 					} else if strings.Contains(event["FILENAME"], "SPC") {
-						utils.Logger.Printf("Train Information:%s , MessageType: SPC, RecordFileName: %s", trainInfo, DstFile)
+						utils.Logger.Printf("Train Information: %s , MessageType: SPC, RecordFileName: %s", trainInfo, DstFile)
 					} else if strings.Contains(event["FILENAME"], "CHK") {
-						utils.Logger.Printf("Train Information:%s , MessageType: Self Check, RecordFileName: %s", trainInfo, DstFile)
+						utils.Logger.Printf("Train Information: %s , MessageType: Self Check, RecordFileName: %s", trainInfo, DstFile)
 					} else if strings.Contains(event["FILENAME"], "TONE") {
-						utils.Logger.Printf("Train Information:%s , MessageType: TONE Test, RecordFileName: %s", trainInfo, DstFile)
+						utils.Logger.Printf("Train Information: %s , MessageType: TONE Test, RecordFileName: %s", trainInfo, DstFile)
+					} else if strings.Contains(event["FILENAME"], "PA") {
+						_, caller, _ := utils.GetPadInfo(event["FILENAME"])
+						utils.Logger.Printf("Train Information: %s , MessageType: PA, Caller: %s, RecordFileName: %s", trainInfo, caller, DstFile)
 					}
 				}
 
@@ -1253,7 +1254,7 @@ func StartAMI(connectOKCallBack func(), handleEvents []func(event map[string]str
 			connectOKCallBack()
 		} else {
 			lfshook.NewLogger().Errorf("ami connect failure %+v", payload)
-			active.Master = false
+			//active.Master = false
 		}
 	})
 	AminInstance.Connect()

+ 10 - 6
internal/app/index.go

@@ -1,28 +1,32 @@
 package app
 
 import (
+	"os/exec"
 	"pbx-api-gin/internal/app/ami/action"
 	"pbx-api-gin/internal/app/stc"
 	"pbx-api-gin/internal/app/stc/active"
 	"pbx-api-gin/internal/app/stc/priority"
 	"pbx-api-gin/internal/app/stc/socket"
 	"pbx-api-gin/pkg/utils"
+	"syscall"
 	"time"
 )
 
 func StartApp() {
 
-	time.Sleep(2 * time.Second)
 	//init asterisk
 	if !utils.CheckAsterisk() {
-		utils.LoggerDebug.Printf("Asterisk not running , run cmd /usr/sbin/asterisk !")
+		lfshook.NewLogger().Infof("Check asterisk , if not running , run cmd service asterisk start !")
+		cmd := exec.Command("service", "asterisk", "start")
+		cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
+		err := cmd.Run()
+		if err != nil {
+			lfshook.NewLogger().Infof("Failed to start asterisk: %v", err)
+			return
+		}
 
-		utils.ExecCmdAsync("/usr/sbin/asterisk")
 		time.Sleep(3 * time.Second)
 	}
-	if utils.CheckAsterisk() {
-		utils.LoggerDebug.Printf("Check asterisk , Asterisk is running !")
-	}
 
 	//Get cab number acording to IP
 	socket.SetMasterCabNum()

+ 78 - 65
internal/app/stc/broadcast/stc-broadcast.go

@@ -7,6 +7,7 @@ import (
 	"fmt"
 	"io"
 	"net"
+	"os/exec"
 	"pbx-api-gin/internal/app/ami/action"
 	"pbx-api-gin/internal/app/stc/active"
 	msgdata "pbx-api-gin/internal/app/stc/data"
@@ -15,6 +16,7 @@ import (
 	"pbx-api-gin/pkg/utils"
 	"strconv"
 	"sync"
+	"syscall"
 	"time"
 )
 
@@ -70,20 +72,36 @@ func HandleStcCmd(ctx context.Context, conn net.Conn) {
 }
 
 // get train info and pacu info from heartbeat
-func processHeartbeat(info []byte) {
+func getInfofromSTC(info []byte) {
 	//dataCount := info[0]
 	//Get train info
-	value := binary.BigEndian.Uint16(info[2:4]) //info[2] +  info[3]
+	value := binary.BigEndian.Uint16(info[2:4]) //info[2] +  info[3] 列车号数据
+	//value := 3
 	active.TrainNum = "TS" + strconv.Itoa(int(value))
 
-	//lfshook.NewLogger().Logger.Infof("TrainNum: %s", active.TrainNum)
+	lfshook.NewLogger().Logger.Infof("TrainNum: %s", active.TrainNum)
 
 	//Get ICP volume
 	icpBit8 := info[9] & 0xF
 	icpBit1 := (info[9] >> 4) & 0xF
-	active.DeviceEndpoint.ICPInfo[0].Volume = fmt.Sprintf("%d", icpBit1)
+	icpVol1 := 0
+	icpVol8 := 0
+
+	if icpBit1 == 0xe {
+		icpVol1 = 100
+	} else {
+		icpVol1 = int(icpBit1) * 7
+	}
+
+	if icpBit8 == 0xe {
+		icpVol8 = 100
+	} else {
+		icpVol8 = int(icpBit8) * 7
+	}
+
+	active.DeviceEndpoint.ICPInfo[0].Volume = fmt.Sprintf("%d", icpVol1)
 	active.DeviceEndpoint.ICPInfo[0].ID = "1"
-	active.DeviceEndpoint.ICPInfo[1].Volume = fmt.Sprintf("%d", icpBit8)
+	active.DeviceEndpoint.ICPInfo[1].Volume = fmt.Sprintf("%d", icpVol8)
 	active.DeviceEndpoint.ICPInfo[1].ID = "8"
 
 	//Get Pacu info
@@ -92,8 +110,8 @@ func processHeartbeat(info []byte) {
 
 	pacuVolume := binary.BigEndian.Uint32(info[5:9]) //info[5]-info[8]
 
-	//lfshook.NewLogger().Logger.Infof("=eidsStat:%x=======pacuStat:%x=====", eidsStat, pacuStat)
-
+	//lfshook.NewLogger().Logger.Infof("=====pacuVolume====info[5:9]=======%x", info[5:9])
+	//lfshook.NewLogger().Logger.Infof("=====pacuStatus====info[4]=======%x", info[4])
 	for i := 0; i < 8; i++ {
 		eidsBit := (eidsStat >> i) & 0x01 // 右移 i 位,再与 1 取最低位
 		//fmt.Printf("eidsBit bit %d = %d\n", i, eidsBit) // bit 0 是 LSB(最低位,最右)
@@ -103,8 +121,8 @@ func processHeartbeat(info []byte) {
 		//fmt.Printf("pacuStatBit bit %d = %d\n", i, pacuStatBit)
 
 		//get 4 bit every time
-		var pacuVolBit int8
-		pacuVolBit = int8((pacuVolume >> i) & 0xF)
+		//var pacuVolBit byte
+		pacuVolBit := (pacuVolume >> (i * 4)) & 0x0000000F
 		//fmt.Printf("pacuVolBit bit %d = %x\n", i, pacuVolBit)
 
 		active.DeviceEndpoint.PacuInfo[i].ID = strconv.Itoa(i + 1)
@@ -118,7 +136,11 @@ func processHeartbeat(info []byte) {
 		} else {
 			active.DeviceEndpoint.PacuInfo[i].Status = "abnormal"
 		}
-		active.DeviceEndpoint.PacuInfo[i].Volume = strconv.Itoa(int(pacuVolBit))
+		if int(pacuVolBit) == 14 {
+			active.DeviceEndpoint.PacuInfo[i].Volume = "100"
+		} else {
+			active.DeviceEndpoint.PacuInfo[i].Volume = strconv.Itoa(int(pacuVolBit) * 7)
+		}
 		//lfshook.NewLogger().Logger.Infof("PACU INFO===ID:%s===Mute:%+v===Stat:%s===Vol:%s", active.DeviceEndpoint.PacuInfo[i].ID, active.DeviceEndpoint.PacuInfo[i].Mute, active.DeviceEndpoint.PacuInfo[i].Status, active.DeviceEndpoint.PacuInfo[i].Volume)
 	}
 }
@@ -154,13 +176,15 @@ func processPacket(packet []byte) {
 
 	switch packet[5] {
 	case 0x01: //heartbeat
-		dataLen := binary.BigEndian.Uint16(packet[6:8])
-
-		if dataLen == 10 {
-			processHeartbeat(packet[8:])
-		} else {
-			//lfshook.NewLogger().Logger.Infof("=========Heartbeat data err !====len < 10=========")
-		}
+		return
+		//lfshook.NewLogger().Logger.Infof("===Get Heartbeat===packet:%x===========", packet)
+		//dataLen := binary.BigEndian.Uint16(packet[6:8])
+
+		//if dataLen == 10 {
+		//	processHeartbeat(packet[8:])
+		//} else {
+		//lfshook.NewLogger().Logger.Infof("=========Heartbeat data err !====len < 10=========")
+		//}
 	case 0x02: // STN
 		if active.ActivedCab != "" {
 			if priority.CheckPriority("STN") {
@@ -250,9 +274,12 @@ func processPacket(packet []byte) {
 	case 0x0b: // reset all PAD
 		AlarmHoldResetAll(packet[8]) // reset all pad
 
-	case 0x0c: // Set PAD time oute
+	case 0x0c: // Set PAD timeout
+		//lfshook.NewLogger().Logger.Infof("==type 0x0c===Get data from STC ====%x", packet)
 		PadTimeOutSetting(packet[8:]) // timeout setting
 
+		getInfofromSTC(packet[8:])
+
 	case 0x0d: // ICP answer PAD
 		if priority.CheckPriority("PAD-ICP") {
 
@@ -312,72 +339,51 @@ func StationAnn(data []byte) (err error) {
 // 激活信号
 func Active(data [3]byte) {
 
-	//lfshook.NewLogger().Logger.Infof("===cab%s======Active Type  %+v", active.CabNum, data)
-
-	//check asterisk available
-	/*	if active.Master { // master true
-			if !utils.CheckAsterisk() { //check asterisk not available and set master false
-				if active.MasterTag > 2 {
-					active.Master = false
-					active.MasterTag = 0
-				} else {
-					active.MasterTag++
-				}
-				//utils.ExecCmd("/etc/init.d/asterisk", "stop", "PBX")
-			} else {
-				active.MasterTag = 0
-			}
-
-		} else { // master false, check and start asterisk
-
-			//Master == false
-			if !utils.CheckAsterisk() {
-				if active.CabNum == "8" {
-					//utils.ExecCmd("/etc/init.d/asterisk", "start", "PBX")
-					utils.ExecCmd("/usr/sbin/asterisk")
-				}
-			}
-
-			//Master == false  cab == 1
-			//if active.CabNum == "1" {
-			//	if utils.CheckAsterisk() {
-			//		utils.ExecCmd("/etc/init.d/asterisk", "stop", "PBX")
-			//	}
-			//}
-		}
-	*/
-
 	//var info model.Sysinfo
 	Signal := int(data[0])
 	master := int(data[1])
 	TrainInfo := int(data[2])
 
-	utils.LoggerDebug.Printf("CabNumber:%s  Active:%x	Master:%x	Train devide & radiofault :%x", active.CabNum, Signal, master, TrainInfo)
+	lfshook.NewLogger().Logger.Infof("=====active:%x======cab=%s Master=%d=====data:%x======", Signal, active.CabNum, master, data)
 
 	//Set Master
 	if master == 1 && active.CabNum == "1" {
 
 		active.Master = true
-		//lfshook.NewLogger().Logger.Infof("=====cab1 Master")
 		if !utils.CheckAsterisk() {
-			utils.LoggerDebug.Printf("Check asterisk , not running , run cmd /usr/sbin/asterisk !")
-			utils.ExecCmdAsync("/usr/sbin/asterisk")
-			time.Sleep(3 * time.Second)
+			lfshook.NewLogger().Infof("Check asterisk , if not running , run cmd service asterisk start !")
+			cmd := exec.Command("service", "asterisk", "start")
+			cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
+			err := cmd.Run()
+			if err != nil {
+				lfshook.NewLogger().Infof("Failed to start asterisk: %v", err)
+				return
+			}
 		}
 	} else if master == 8 && active.CabNum == "8" {
 
 		active.Master = true
-		//utils.LoggerDebug.Printf("=====cab8 Master")
 		if !utils.CheckAsterisk() {
-			utils.LoggerDebug.Printf("Check asterisk , not running , run cmd /usr/sbin/asterisk !")
-			utils.ExecCmdAsync("/usr/sbin/asterisk")
-			time.Sleep(3 * time.Second)
+			lfshook.NewLogger().Infof("Check asterisk , if not running , run cmd service asterisk start !")
+			cmd := exec.Command("service", "asterisk", "start")
+			cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
+			err := cmd.Run()
+			if err != nil {
+				lfshook.NewLogger().Infof("Failed to start asterisk: %v", err)
+				return
+			}
 		}
 	} else if master == 8 && active.CabNum == "1" {
 
 		if utils.CheckAsterisk() {
-			utils.LoggerDebug.Printf("Master 8, cab1 ; Check asterisk , running , run cmd /etc/init.d/asterisk stop PBX !")
-			utils.ExecCmd("/etc/init.d/asterisk", "stop", "PBX")
+			lfshook.NewLogger().Infof("Check asterisk , if running slave, run cmd service asterisk stop !")
+			cmd := exec.Command("service", "asterisk", "stop")
+			cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
+			err := cmd.Run()
+			if err != nil {
+				lfshook.NewLogger().Infof("Failed to stop asterisk: %v", err)
+				return
+			}
 		}
 	} else if master == 1 && active.CabNum == "8" {
 		active.Master = false
@@ -392,7 +398,14 @@ func Active(data [3]byte) {
 
 			active.Master = true //列车断开,设置两边都Master
 			if !utils.CheckAsterisk() {
-				utils.ExecCmd("/usr/sbin/asterisk")
+				lfshook.NewLogger().Infof("Check asterisk , if not running , run cmd service asterisk start !")
+				cmd := exec.Command("service", "asterisk", "start")
+				cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
+				err := cmd.Run()
+				if err != nil {
+					lfshook.NewLogger().Infof("Failed to start asterisk: %v", err)
+					return
+				}
 			}
 		} else {
 			active.TrainDevide = 0

+ 0 - 2
pkg/utils/file.go

@@ -150,12 +150,10 @@ func GetPadInfo(base string) (padType, padNum, connectedCab string) {
 
 	// 取最后一段
 	lastPart := parts[len(parts)-1]
-
 	// 最后一段中,按‘-’分割返回前三段:parts[0], parts[1], parts[2] → PAD-2411-1411
 	ret := strings.Split(lastPart, "-")
 	if len(ret) < 3 {
 		return
 	}
-
 	return ret[0], ret[1], ret[2]
 }

+ 11 - 5
pkg/utils/utils.go

@@ -6,6 +6,7 @@ import (
 	"math/rand"
 	"net"
 	"os"
+	"pbx-api-gin/pkg/lfshook"
 	"strings"
 	"time"
 )
@@ -176,6 +177,8 @@ func IndexOf(sliceID []string, value string) int {
 
 func CheckAsterisk() bool {
 	target := "127.0.0.1:5060"
+	count := 2
+udpDial:
 	conn, err := net.DialTimeout("udp", target, 1*time.Second)
 	if err != nil {
 		return false
@@ -203,17 +206,20 @@ func CheckAsterisk() bool {
 		}
 	}
 
-	//lfshook.NewLogger().Logger.Infof("=====CheckAsterisk req====:%+v ", string(req))
-
-	conn.SetReadDeadline(time.Now().Add(1 * time.Second))
+	time.Sleep(time.Millisecond * 500)
+	//conn.SetReadDeadline(time.Now().Add(1 * time.Second))
 	buf := make([]byte, 2048)
 	n, err := conn.Read(buf)
 	if err != nil || n == 0 {
+		count--
+		lfshook.NewLogger().Logger.Infof("=====CheckAsterisk response==err==count:%d ", count)
+		if count > 0 {
+			time.Sleep(time.Millisecond * 500)
+			goto udpDial
+		}
 		return false
 	}
 	resp := string(buf[:n])
 
-	//lfshook.NewLogger().Logger.Infof("=====CheckAsterisk response====:%+v ", resp)
-
 	return strings.HasPrefix(resp, "SIP/2.0")
 }