dujunchen 1 هفته پیش
والد
کامیت
869998ac75

+ 29 - 0
internal/app/ami/action/call.go

@@ -179,6 +179,35 @@ func Redirect(channel, dst, dialrule string) (err error) {
 	return err
 }
 
+// Redirect 转接
+func RedirectInQueue(channel, dst, dialrule, callerID string) (err error) {
+	//callerID := "redirect"
+	lfshook.NewLogger().Infof("redirect src %s to dst %s", channel, dst)
+	if !utils.IsChannel(channel) {
+		//callerID = channel
+		if channel, err = GetChannelByExtenNotBridged(channel); err != nil {
+			return err
+		}
+	}
+
+	action := map[string]string{
+		"Action":   "Redirect",
+		"Channel":  channel,
+		"Exten":    dst,
+		"Context":  dialrule,
+		"CallerID": callerID,
+		"Priority": "1",
+		"async":    "true",
+	}
+	lfshook.NewLogger().Infof("redirect %+v", action)
+	res, _, err := AminInstance.Send(action)
+	if err != nil {
+		lfshook.NewLogger().Error(err)
+	}
+	lfshook.NewLogger().Info(res)
+	return err
+}
+
 // Redirect 转接
 func BlindTransfer(channel, dst, dialrule string) (err error) {
 

+ 27 - 0
internal/app/ami/action/channel.go

@@ -65,6 +65,33 @@ func GetChannelByExten(exten string) (channel string, err error) {
 	return channel, nil
 }
 
+// GetChannelByExten  通过 exten 查询对应通道
+func GetChannelByExtenNotBridged(exten string) (channel string, err error) {
+	lfshook.NewLogger().Infof("GetChannelByExten %s", exten)
+	_, events, err := AminInstance.Send(map[string]string{
+		"Action": "CoreShowChannels",
+	})
+	if err != nil {
+		lfshook.NewLogger().Errorf("core show channels error %+v", err)
+		return "", err
+	}
+
+	for _, event := range events {
+		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)
+			break
+		}
+	}
+	if channel == "" {
+		lfshook.NewLogger().Errorf("not found channel %s", exten)
+		return "", errors.New("not found channel")
+	}
+
+	return channel, nil
+}
+
 // GetBridgedChan  通过 exten 查询对应通道
 func GetExtenChan(exten string) (channel string, err error) {
 	lfshook.NewLogger().Infof("GetExtenChan %s", exten)

+ 22 - 20
internal/app/ami/action/index.go

@@ -40,7 +40,8 @@ func HandleAMI(event map[string]string, conn net.Conn) {
 
 			alstatus.AlarmStatus(event["CallerIDNum"], "dial", conn)
 		}
-	case "DialEnd":
+	case "1111":
+		//case "DialEnd":
 		lfshook.NewLogger().Infof("=========%s", event["Event"])
 		if utils.IsPAIU(event["CallerIDNum"]) {
 			alstatus.AlarmStatus(event["CallerIDNum"], "Idle", conn) // Alarm dial end
@@ -50,24 +51,6 @@ func HandleAMI(event map[string]string, conn net.Conn) {
 		if utils.IsPAIU(event["CallerIDNum"]) { // Alarm join the queue
 			alstatus.AlarmStatus(event["CallerIDNum"], "queue", conn)
 
-			switch string(event["CallerIDNum"][2]) { // connect the pacu to pad acording to the pad number
-			case "1":
-				ChanSpy(event["CallerIDNum"], pacu1, false, true) //connect pacu to pad
-			case "2":
-				ChanSpy(event["CallerIDNum"], pacu2, false, true) //connect pacu to pad
-			case "3":
-				ChanSpy(event["CallerIDNum"], pacu3, false, true) //connect pacu to pad
-			case "4":
-				ChanSpy(event["CallerIDNum"], pacu4, false, true) //connect pacu to pad
-			case "5":
-				ChanSpy(event["CallerIDNum"], pacu5, false, true) //connect pacu to pad
-			case "6":
-				ChanSpy(event["CallerIDNum"], pacu6, false, true) //connect pacu to pad
-			case "7":
-				ChanSpy(event["CallerIDNum"], pacu7, false, true) //connect pacu to pad
-			case "8":
-				ChanSpy(event["CallerIDNum"], pacu8, false, true) //connect pacu to pad
-			}
 		}
 
 	case "ExtensionStatus":
@@ -87,8 +70,27 @@ func HandleAMI(event map[string]string, conn net.Conn) {
 			}
 		}
 	case "BridgeEnter":
-		lfshook.NewLogger().Infof("=========%s", event["Event"])
+		lfshook.NewLogger().Infof("=========%s====%s", event["Event"], event["CallerIDNum"])
 		if utils.IsPAIU(event["CallerIDNum"]) {
+
+			switch string(event["CallerIDNum"][2]) { // connect the pacu to pad acording to the pad number
+			case "1":
+				ChanSpy(event["CallerIDNum"], pacu1, false, true) //connect pacu to pad
+			case "2":
+				ChanSpy(event["CallerIDNum"], pacu2, false, true) //connect pacu to pad
+			case "3":
+				ChanSpy(event["CallerIDNum"], pacu3, false, true) //connect pacu to pad
+			case "4":
+				ChanSpy(event["CallerIDNum"], pacu4, false, true) //connect pacu to pad
+			case "5":
+				ChanSpy(event["CallerIDNum"], pacu5, false, true) //connect pacu to pad
+			case "6":
+				ChanSpy(event["CallerIDNum"], pacu6, false, true) //connect pacu to pad
+			case "7":
+				ChanSpy(event["CallerIDNum"], pacu7, false, true) //connect pacu to pad
+			case "8":
+				ChanSpy(event["CallerIDNum"], pacu8, false, true) //connect pacu to pad
+			}
 			alstatus.AlarmStatus(event["CallerIDNum"], "connect", conn) // Alarm connected
 		}
 	}

+ 14 - 8
internal/app/index.go

@@ -14,13 +14,19 @@ var conn net.Conn
 func StartApp() {
 	mysql.CreateDBInstance()
 
-	conn = stc.CreateConnection("172.16.0.11", 10100)
-
-	go action.StartAMI(func() {
-		lfshook.NewLogger().Info("ami callback")
-		// 首次连接才进行初始化
-	}, []func(event map[string]string){}, conn)
-
-	go stc.StartStcConnection(conn) //connect
+	//conn = stc.CreateConnection("192.168.17.14", 6099)
+	conn = stc.CreateConnection("10.0.11.11", 10100) //172.16.0.11
+	if conn != nil {
+
+		go action.StartAMI(func() {
+			lfshook.NewLogger().Info("ami callback")
+			// 首次连接才进行初始化
+		}, []func(event map[string]string){}, conn)
+
+		go stc.StartStcConnection(conn) //connect
+	} else {
+		conn = stc.CreateConnection("10.0.11.11", 10100)
+		lfshook.NewLogger().Info("reconnect")
+	}
 
 }

+ 23 - 8
internal/app/stc/broadcast/stc-broadcast.go

@@ -21,7 +21,9 @@ func HandleStcCmd(conn net.Conn) {
 			fmt.Println("Error reading from server:", err)
 			return
 		}
-		lfshook.NewLogger().Logger.Infof("Get data from STC :%+v", buffer[:n])
+		if buffer[5] != 0x01 {
+			lfshook.NewLogger().Logger.Infof("Get data from STC ===============:%x", buffer[:n])
+		}
 
 		switch buffer[5] {
 		case 0x01: //heartbeat
@@ -48,7 +50,7 @@ func HandleStcCmd(conn net.Conn) {
 			SelfCheck(buffer)
 
 		case 0x0a: //
-			AlarmHandle(buffer[10:])
+			AlarmHandle(buffer)
 
 		case 0x0b: //
 			AlarmResetAll()
@@ -208,22 +210,35 @@ func SelfCheck(data []byte) {
 // ICP操作乘客报警(根据激活信息判断转到1车还是8车================)
 func AlarmHandle(data []byte) {
 	handler := data[8]
-	extlen := data[9]
-	exten := msgdata.SubstrByRune(string(data[10:]), 0, int(extlen))
+	//extlen := data[9]
+	carr := data[12]
+	pos := data[13]
+	exten := fmt.Sprintf("24%c%c", carr, pos)
 
 	switch handler {
-	case 0x01: //answer(ICP+Alarm+PACU==============================)
+	case 0x01: //answer(ICP+Alarm+PACU)
 
-		err := action.Redirect(exten, "2311", "default") // 1车接听
+		err := action.RedirectInQueue(exten, "0402", "ani-rule", "1") // 1车ICP接听
 		if err != nil {
-			lfshook.NewLogger().Info(err)
+			lfshook.NewLogger().Logger.Infof("================ICP Answer PAD====ERR============ : %+v", err.Error())
 		}
 		//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接听
+		if err != nil {
+			//lfshook.NewLogger().Info(err)
+			lfshook.NewLogger().Logger.Infof("================ICP Answer PAD====ERR============ : %+v", err.Error())
+		}
+		//invite PACU join in
+		//action.Hangup("PACU")
+		//action.ChanSpy("PACU", exten, false, true)
+		lfshook.NewLogger().Logger.Infof("================ICP Answer PAD================:%s ", exten)
 	case 0x02: //hold  重新放回队列里面
-		err := action.Redirect(exten, "0300", "default")
+		err := action.RedirectInQueue(exten, "0300", "default", "1")
 		if err != nil {
 			lfshook.NewLogger().Info(err)
 		}

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

@@ -28,6 +28,7 @@ func StartStcConnection(conn net.Conn) {
 
 func CreateConnection(ServerAddr string, Port int) net.Conn {
 	// connect server
+	fmt.Println("==========conn server============")
 	conn, err := net.DialTCP("tcp", &net.TCPAddr{
 		IP:   net.ParseIP("0.0.0.0"),
 		Port: 10201,
@@ -38,6 +39,7 @@ func CreateConnection(ServerAddr string, Port int) net.Conn {
 	if err != nil {
 		fmt.Println("Error conn server:", err)
 		log.Fatal(err)
+		return nil
 	}
 
 	fileDesc, _ := conn.File()

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

@@ -14,6 +14,7 @@ func SendToStc(conn net.Conn, data []byte) {
 	if err != nil {
 		fmt.Println("send msg err:", err)
 	}
+	lfshook.NewLogger().Logger.Infof("=data:==%x", data)
 }
 
 // report alarm status to STC