1. uplus 음성 길게 한번 재생 후 종료하는 방식으로 수정

2. 대표번호 설정
main
jjLee 2 years ago
parent cefde9c745
commit 3e12ecf719

@ -1,7 +1,7 @@
package icsapp package icsapp
import ( import (
"strings" // "strings"
"time" "time"
"gitlab.com/ics_cinnamon/voicegateway/icsconf" "gitlab.com/ics_cinnamon/voicegateway/icsconf"
@ -57,20 +57,20 @@ func (exe IcsExec) Execute() *icserror.IcsError {
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
//start bot-command TCP listener //start bot-command TCP listener
cmdDone := make(chan *icserror.IcsError) // cmdDone := make(chan *icserror.IcsError)
bcValue := strings.ToUpper(exe.config.CommandConfig.Value) // bcValue := strings.ToUpper(exe.config.CommandConfig.Value)
if strings.Compare("TRUE", bcValue) == 0 { // if strings.Compare("TRUE", bcValue) == 0 {
go func() { // go func() {
cmdErr := sm.RunBotCommandMNG() // cmdErr := sm.RunBotCommandMNG()
if cmdErr != nil { // if cmdErr != nil {
cmdDone <- cmdErr // cmdDone <- cmdErr
return // return
} // }
//defer sm.Close() // //defer sm.Close()
//cmdDone <- nil // //cmdDone <- nil
}() // }()
} // }
select { select {
case err := <-smDone: case err := <-smDone:
@ -79,12 +79,12 @@ func (exe IcsExec) Execute() *icserror.IcsError {
//err.Print() //err.Print()
return err return err
} }
case err := <-cmdDone: // case err := <-cmdDone:
l.Printf(icslog.LOG_LEVEL_INFO, -1, "Closed BotCommand manager: %s", err) // l.Printf(icslog.LOG_LEVEL_INFO, -1, "Closed BotCommand manager: %s", err)
if err != nil { // if err != nil {
//err.Print() // //err.Print()
return err // return err
} // }
} }
} }

@ -11,7 +11,7 @@ import (
) )
type IcsConfig struct { type IcsConfig struct {
XMLName xml.Name `xml:"ICSVG"` XMLName xml.Name `xml:"ICSVSIM"`
Version string `xml:"version,attr"` Version string `xml:"version,attr"`
InfoConfig InfoConfig `xml:"INFO"` InfoConfig InfoConfig `xml:"INFO"`
LicenseConfig LicenseConfig `xml:"LICENSE"` LicenseConfig LicenseConfig `xml:"LICENSE"`
@ -23,6 +23,8 @@ type IcsConfig struct {
VoiceAgentConfig VoiceAgentConfig `xml:"VOICEAGENT"` VoiceAgentConfig VoiceAgentConfig `xml:"VOICEAGENT"`
PbxConfig PbxConfig `xml:"PBX"` PbxConfig PbxConfig `xml:"PBX"`
SimLoopCount int `xml:"SIMLOOP"` SimLoopCount int `xml:"SIMLOOP"`
Representative Representative `xml:"REPRESENTATIVE"`
CallEndInfo CallEndInfo `xml:"CALLENDINFO"`
HomeDir string HomeDir string
} }
@ -105,6 +107,16 @@ type SIPConfig struct {
SIPProxy string `xml:"proxy,attr"` SIPProxy string `xml:"proxy,attr"`
} }
type Representative struct {
Value bool `xml:"value,attr"`
Name string `xml:"name,attr"`
}
type CallEndInfo struct {
Value bool `xml:"value,attr"`
Loop int `xml:"loopCount,attr"`
}
type PbxConfig struct { type PbxConfig struct {
PbxIp string `xml:"IP"` PbxIp string `xml:"IP"`
PbxPort int `xml:"PORT"` PbxPort int `xml:"PORT"`

@ -130,7 +130,7 @@ func NewIcsLog(conf *icsconf.LogConfig, level int, output int, path string, disk
//make log file - icsvg.log-yyyymmdd //make log file - icsvg.log-yyyymmdd
yyyy, mm, dd := gIcsLog.CurrentDate.Date() yyyy, mm, dd := gIcsLog.CurrentDate.Date()
gIcsLog.LogFileName = fmt.Sprintf("%s/icsvg.log-%d%02d%02d", gIcsLog.Path, yyyy, mm, dd) gIcsLog.LogFileName = fmt.Sprintf("%s/icsvsim.log-%d%02d%02d", gIcsLog.Path, yyyy, mm, dd)
stat, err := os.Stat(gIcsLog.LogFileName) stat, err := os.Stat(gIcsLog.LogFileName)
if err == nil { if err == nil {

@ -1,6 +1,7 @@
package icspacketparser package icspacketparser
import ( import (
"fmt"
"strconv" "strconv"
"strings" "strings"
@ -63,6 +64,7 @@ type SIP struct {
MaxForwards int64 MaxForwards int64
Contact string Contact string
To string To string
ToRep string
// ToTag string // ToTag string
From string From string
// FromTag string // FromTag string
@ -80,6 +82,7 @@ type SIP struct {
ResType string ResType string
XAICall string XAICall string
Media string
// direction bool // direction bool
@ -340,6 +343,8 @@ func (s *SIP) setSipStruct(name string, value string) (icserr *icserror.IcsError
return nil return nil
case "X-AICALL": case "X-AICALL":
s.XAICall = value s.XAICall = value
case "MEDIA":
s.Media = value
default: default:
values := strings.Split(value, ";") values := strings.Split(value, ";")
@ -355,6 +360,21 @@ func (s *SIP) setSipStruct(name string, value string) (icserr *icserror.IcsError
return nil return nil
} }
// representative
func (s *SIP) SetTo(name string) {
name1 := strings.SplitN(s.To, "@", 2)
tmp := "<sip:%s@" + name1[1]
s.To = fmt.Sprintf(tmp, name)
}
// representative
func (s *SIP) SetToRep() {
name1 := strings.SplitN(s.To, "@", 2)
name2 := strings.SplitN(name1[0], ":", 1)
s.ToRep = name2[0] + "@" + name1[1]
}
//implm interface Packeter //implm interface Packeter
func (s *SIP) GetPacketData(addr []*icsnet.IcsNetAddr, packet []byte) *icserror.IcsError { func (s *SIP) GetPacketData(addr []*icsnet.IcsNetAddr, packet []byte) *icserror.IcsError {
s.SrcAddr = addr[0] s.SrcAddr = addr[0]

@ -10,6 +10,7 @@ import (
"strings" "strings"
"time" "time"
"github.com/google/uuid"
"gitlab.com/ics_cinnamon/voicegateway/icscbtimer" "gitlab.com/ics_cinnamon/voicegateway/icscbtimer"
"gitlab.com/ics_cinnamon/voicegateway/icsconf" "gitlab.com/ics_cinnamon/voicegateway/icsconf"
"gitlab.com/ics_cinnamon/voicegateway/icsdtmf" "gitlab.com/ics_cinnamon/voicegateway/icsdtmf"
@ -273,17 +274,23 @@ func (s *IcsSession) RequestInvite(inviteto string) {
transport := conf.SIPConfig.Transport transport := conf.SIPConfig.Transport
format := conf.AgentConfig[s.ID].MediaConfig.Format format := conf.AgentConfig[s.ID].MediaConfig.Format
//sim
inviteMethod := fmt.Sprintf("sip:%s@192.168.0.83;transport=%s", s.AgentName, transport) inviteMethod := fmt.Sprintf("sip:%s@192.168.0.83;transport=%s", s.AgentName, transport)
s.uri = fmt.Sprintf("sip:%s@%s", s.AgentName, ip)
to := fmt.Sprintf("<sip:%s@192.168.0.83;user=phone>", s.AgentName)
if conf.Representative.Value {
inviteMethod = fmt.Sprintf("sip:%s@192.168.0.83;transport=%s", "AISB", transport)
s.uri = fmt.Sprintf("sip:%s@%s", "AISB", ip)
to = fmt.Sprintf("<sip:%s@192.168.0.83;user=phone>", "AISB")
}
reqInvite := sipasm.NewSIPMessage(sipasm.ICSSIP_METHOD_INVITE, inviteMethod) reqInvite := sipasm.NewSIPMessage(sipasm.ICSSIP_METHOD_INVITE, inviteMethod)
via := fmt.Sprintf("SIP/2.0/UDP 192.168.0.83:5090;branch=%s", sipasm.GenerateBranch()) via := fmt.Sprintf("SIP/2.0/UDP 192.168.0.83:5090;branch=%s", sipasm.GenerateBranch())
maxforwards := "70" maxforwards := "70"
from := fmt.Sprintf("<sip:%s@%s>;tag=%s", inviteto, ip, sipasm.GenerateTag()) from := fmt.Sprintf("<sip:%s@%s>;tag=%s", inviteto, ip, sipasm.GenerateTag())
s.uri = fmt.Sprintf("sip:%s@%s", s.AgentName, ip)
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Set URI [%s]", s.uri) l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Set URI [%s]", s.uri)
to := fmt.Sprintf("<sip:%s@192.168.0.83;user=phone>", s.AgentName)
postfix := "192.168.0.83" postfix := "192.168.0.83"
var callid string var callid string
if len(s.callID) != 0 { if len(s.callID) != 0 {
@ -331,7 +338,12 @@ func (s *IcsSession) RequestInvite(inviteto string) {
s.callID = callid s.callID = callid
if conf.Representative.Value {
s.SetAgentStatus(STATUS_AGENT_READY)
} else {
s.SetAgentStatus(STATUS_AGENT_CALLING) s.SetAgentStatus(STATUS_AGENT_CALLING)
}
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Sent Data(%d) [%s]->[%s]>\n%s", l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Sent Data(%d) [%s]->[%s]>\n%s",
wlen, wlen,
@ -342,6 +354,93 @@ func (s *IcsSession) RequestInvite(inviteto string) {
inviteFunc() inviteFunc()
} }
// pass invite for sim
func (s *IcsSession) PassInvite(sip *icspacketparser.SIP) *icserror.IcsError {
l := icslog.GetIcsLog()
conf := icsconf.GetIcsConfig()
// TODO - send bye
defer func() {
if err := recover(); err != nil {
l.Printf(icslog.LOG_LEVEL_WARN, s.ID, "%s \n%s",
icserror.ICSERRNETNotConnectError.GetMessage(), debug.Stack())
}
}()
ip := conf.InfoConfig.ServerIP
port := conf.SIPConfig.Port
fmt.Println("sip.Media ", sip.Media)
mediaPort, _ := strconv.Atoi(sip.Media)
proxy := conf.SIPConfig.SIPProxy
transport := conf.SIPConfig.Transport
format := conf.AgentConfig[s.ID].MediaConfig.Format
inviteMethod := fmt.Sprintf("sip:%s@%s;transport=%s", "AISB", proxy, transport)
reqInvite := sipasm.NewSIPMessage(sipasm.ICSSIP_METHOD_INVITE, inviteMethod)
via := fmt.Sprintf("SIP/2.0/UDP %s;rport;branch=%s", ip, sipasm.GenerateBranch())
maxforwards := "70"
from := fmt.Sprintf("<sip:%s@%s:5090>;tag=%s", s.AgentName, ip, sipasm.GenerateTag())
s.uri = fmt.Sprintf("sip:%s@%s", s.AgentName, ip)
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Set URI [%s]", s.uri)
to := fmt.Sprintf("<sip:%s@%s;user=phone>", "01025670081", ip)
//to := fmt.Sprintf("<sip:%s@%s>", s.AgentName, ip)
// postfix := fmt.Sprintf("@%s", ip)
var callid string
callid = uuid.New().String()
// if len(s.callID) != 0 {
// callid = s.callID
// //if len(s.regiCallID) != 0 {
// //callid = s.regiCallID
// } else {
// callid = sipasm.GenerateCallID(postfix)
// }
cseq := fmt.Sprintf("%d INVITE", s.Cseq)
s.Cseq++
contact := fmt.Sprintf("<sip:%s@%s:%d;transport=%s>", s.AgentName, ip, port, transport)
//expires := fmt.Sprintf("%d", conf.AgentConfig[s.ID].RegisterConfig.RegisterExpire)
userAgent := conf.InfoConfig.Product
allow := "REGISTER,OPTIONS,INVITE,ACK,CANCEL,BYE,NOTIFY,PRACK,REFER,INFO,SUBSCRIBE,UPDATE"
supported := "timer,path,replaces"
formats := strings.Split(format, " ")
reqInvite.SDP = sipasm.NewSDPMessage(ip, mediaPort, formats[:], 0)
sdpLength := fmt.Sprintf("%d", len(reqInvite.SDP.String()))
reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_VIA, via)
reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_MAX_FORWARDS, maxforwards)
reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_FROM, from)
reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_TO, to)
reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_CALL_ID, callid)
reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_CSEQ, cseq)
reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_CONTACT, contact)
//reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_EXPIRES, expires)
reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_USER_AGENT, userAgent)
reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_ALLOW, allow)
reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_SUPPORTED, supported)
reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_CONTENT_TYPE, "application/sdp")
reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_CONTENT_LENGTH, sdpLength)
reqInvite.AddSIPHeader(sipasm.ICSSIP_HEADER_TERMINATOR)
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "sip 내용 전달! %+v", sip)
// sendINVITE := fmt.Sprintf("%+v",sip)
wlen, werr := (*s.sipNeter).WriteSIP([]byte(reqInvite.String()))
if werr != nil {
l.Print(icslog.LOG_LEVEL_FATAL, s.ID, werr.GetMessage())
s.SetAgentStatus(STATUS_AGENT_READY)
return werr
}
fmt.Println(wlen)
s.RemoveSession()
return nil
}
//response invite //response invite
func (s *IcsSession) ProcInvite(sip *icspacketparser.SIP) *icserror.IcsError { func (s *IcsSession) ProcInvite(sip *icspacketparser.SIP) *icserror.IcsError {
l := icslog.GetIcsLog() l := icslog.GetIcsLog()
@ -413,6 +512,7 @@ func (s *IcsSession) ProcInvite(sip *icspacketparser.SIP) *icserror.IcsError {
remoteAddr := icsnet.NewNetAddrWithIPAddr(remoteAddrs) remoteAddr := icsnet.NewNetAddrWithIPAddr(remoteAddrs)
//connect to remote RTP //connect to remote RTP
s.rtpMediaNeter.SetRemoteAddr(&remoteAddr) s.rtpMediaNeter.SetRemoteAddr(&remoteAddr)
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Set media remote address - %s(%s)", remoteAddr, s.rtpMediaNeter.RemoteAddr()) l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Set media remote address - %s(%s)", remoteAddr, s.rtpMediaNeter.RemoteAddr())
/* /*
cerr := s.rtpMediaNeter.Connect(nil, &remoteAddr) cerr := s.rtpMediaNeter.Connect(nil, &remoteAddr)
@ -708,6 +808,7 @@ func (s *IcsSession) ProcInvite(sip *icspacketparser.SIP) *icserror.IcsError {
func (s *IcsSession) ProcACKInvite(sip *icspacketparser.SIP) *icserror.IcsError { func (s *IcsSession) ProcACKInvite(sip *icspacketparser.SIP) *icserror.IcsError {
l := icslog.GetIcsLog() l := icslog.GetIcsLog()
conf := icsconf.GetIcsConfig() conf := icsconf.GetIcsConfig()
s.InviteSIP = sip
/////////////////////////////////////////// ///////////////////////////////////////////
/////////////////////////////////////////// ///////////////////////////////////////////
@ -748,7 +849,11 @@ func (s *IcsSession) ProcACKInvite(sip *icspacketparser.SIP) *icserror.IcsError
transport := conf.SIPConfig.Transport transport := conf.SIPConfig.Transport
format := conf.AgentConfig[s.ID].MediaConfig.Format format := conf.AgentConfig[s.ID].MediaConfig.Format
if conf.Representative.Value {// 대표번호일때 강제로 콜링으로 변환
s.SetAgentStatus(STATUS_AGENT_CALLING)
}
status := s.GetAgentStatus() status := s.GetAgentStatus()
fmt.Println("BOT STATUS ", status == STATUS_AGENT_CALLING)
if status == STATUS_AGENT_CALLING { if status == STATUS_AGENT_CALLING {
ackMethod := fmt.Sprintf("sip:01025670081@%s;transport=%s", "192.168.0.222:5090", transport) ackMethod := fmt.Sprintf("sip:01025670081@%s;transport=%s", "192.168.0.222:5090", transport)
@ -941,6 +1046,8 @@ func (s *IcsSession) ProcACKInvite(sip *icspacketparser.SIP) *icserror.IcsError
/////////////////////////////////////////// ///////////////////////////////////////////
/////////////////////////////////////////// ///////////////////////////////////////////
fmt.Println(s)
fmt.Println("loop count ", s.simLoopCount)
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Sent Data(%d) [%s]->[%s]>\n%s", l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Sent Data(%d) [%s]->[%s]>\n%s",
wlen, wlen,
(*s.sipNeter).LocalAddr().String(), (*s.sipNeter).LocalAddr().String(),
@ -1044,6 +1151,8 @@ func (s *IcsSession) ProcBye(sip *icspacketparser.SIP) *icserror.IcsError {
//send call signal-end to VoiceAgent //send call signal-end to VoiceAgent
///////////////////////////////////////////// /////////////////////////////////////////////
//set call signal addr //set call signal addr
// fmt.Println(s)
fmt.Println(s)
csraddr := icsnet.NewNetAddrWithIPPort(s.AgentInfo.IP, s.AgentInfo.Port) csraddr := icsnet.NewNetAddrWithIPPort(s.AgentInfo.IP, s.AgentInfo.Port)
//csladdr := icsnet.NewNetAddrWithIPPort(conf.VoiceAgentConfig.MyAddr.ServerIP, conf.VoiceAgentConfig.MyAddr.ServerPort) //csladdr := icsnet.NewNetAddrWithIPPort(conf.VoiceAgentConfig.MyAddr.ServerIP, conf.VoiceAgentConfig.MyAddr.ServerPort)
/* /*
@ -1132,40 +1241,18 @@ func (s *IcsSession) SendRequestInvite() {
fmt.Println("######### sim loop count!! ", conf.SimLoopCount) fmt.Println("######### sim loop count!! ", conf.SimLoopCount)
fmt.Printf("Send Call Start Sip(%s) count %d!!!!!!!", s.AgentName, s.simLoopCount) fmt.Printf("Send Call Start Sip(%s) count %d!!!!!!!", s.AgentName, s.simLoopCount)
if s.simLoopCount < conf.SimLoopCount { if s.simLoopCount < conf.SimLoopCount {
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Send Call Start Sip(%s) count %d!!!!!!!", s.AgentName, s.simLoopCount) l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Send Call Start Sip(%s) count %d!!!!!!!\r\n", s.AgentName, s.simLoopCount)
s.RequestInvite("01024342788") s.RequestInvite("01024342788")
// fmt.Printf("Sent Call Start sip(%s) count (%d)\n\n", s.AgentName, s.simLoopCount)
// l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Sent Call Start sip(%s) count (%d)", s.AgentName, s.simLoopCount)
// tmp := "SIP/2.0 200 OK\r\nVia: SIP/2.0/UDP 192.168.0.83;received=192.168.0.21;rport=5090;branch=N2IwOGJjNmYtMTY5Zi00Y2NkLThjYzAtYWVhOTg3OGMyYTdj\r\nFrom: <sip:%s@192.168.83>;tag=MTY1MDk1NTEwNTY4NzgzNjI3NQ--\r\nTo: <sip:%s@192.168.0.83>;tag=1c1466330427\r\nCall-ID: 6a0b9cc3-e0c6-48da-a4f8-e7c40003bab2@192.168.0.21\r\nCSeq: 2 OPTIONS\r\nContact: <sip:192.168.0.222:5090>\r\nServer: M800B/v.7.20A.204.759\r\nContent-Length: 0\r\n"
// sendVal := []string{fmt.Sprintf(tmp, s.AgentName, s.AgentName)}
// address, err := net.ResolveUDPAddr("udp", "192.168.0.83:5090")
// if err != nil {
// fmt.Printf("ERROR!: %s\n", err)
// }
// conn, err := net.DialUDP("udp", nil, address)
// if err != nil {
// l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "connect err", err)
// fmt.Println("## connect err", err)
// }
// l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "send val - %s", []string(sendVal))
// for _, elem := range sendVal[:] {
// sent, err := conn.Write([]byte(elem))
// if err != nil {
// fmt.Printf("sent %d-%s\n", sent, elem)
// }
// time.Sleep(time.Millisecond * 100)
// }
s.simLoopCount += 1 s.simLoopCount += 1
} else { } else {
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Send Call Start Sip(%s) END!!!!!!!", s.AgentName, s.simLoopCount) l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Send Call Start Sip(%s) END!!!!!!!\r\n", s.AgentName, s.simLoopCount)
} }
} }
func (s *IcsSession) ProcSIP20Bye(sip *icspacketparser.SIP) *icserror.IcsError { func (s *IcsSession) ProcSIP20Bye(sip *icspacketparser.SIP) *icserror.IcsError {
l := icslog.GetIcsLog() l := icslog.GetIcsLog()
conf := icsconf.GetIcsConfig() conf := icsconf.GetIcsConfig()
// conf := icsconf.GetIcsConfig()
//ip := conf.InfoConfig.ServerIP //ip := conf.InfoConfig.ServerIP
//mediaPort := conf.AgentConfig[s.ID].MediaConfig.Port //mediaPort := conf.AgentConfig[s.ID].MediaConfig.Port
//sipPort := conf.SIPConfig.Port //sipPort := conf.SIPConfig.Port
@ -1173,65 +1260,75 @@ func (s *IcsSession) ProcSIP20Bye(sip *icspacketparser.SIP) *icserror.IcsError {
//format := conf.AgentConfig[s.ID].MediaConfig.Format //format := conf.AgentConfig[s.ID].MediaConfig.Format
l.Print(icslog.LOG_LEVEL_INFO, s.ID, "SIP2.0 BYE") l.Print(icslog.LOG_LEVEL_INFO, s.ID, "SIP2.0 BYE")
//////////////////////////////////////// s.RemoveSession()
//send call signal-end to VoiceAgent // ////////////////////////////////////////
///////////////////////////////////////////// // //send call signal-end to VoiceAgent
//set call signal addr // /////////////////////////////////////////////
csraddr := icsnet.NewNetAddrWithIPPort(s.AgentInfo.IP, s.AgentInfo.Port) // //set call signal addr
//csladdr := icsnet.NewNetAddrWithIPPort(conf.VoiceAgentConfig.MyAddr.ServerIP, conf.VoiceAgentConfig.MyAddr.ServerPort) // csraddr := icsnet.NewNetAddrWithIPPort(s.AgentInfo.IP, s.AgentInfo.Port)
/* // //csladdr := icsnet.NewNetAddrWithIPPort(conf.VoiceAgentConfig.MyAddr.ServerIP, conf.VoiceAgentConfig.MyAddr.ServerPort)
csraddr := icsnet.NewNetAddrWithIPPort(conf.VoiceAgentConfig.AgentInfo[s.ID].IP, conf.VoiceAgentConfig.AgentInfo[s.ID].Port) // /*
csladdr := icsnet.NewNetAddrWithIPPort(conf.VoiceAgentConfig.MyAddr.ServerIP, conf.VoiceAgentConfig.MyAddr.ServerPort) // csraddr := icsnet.NewNetAddrWithIPPort(conf.VoiceAgentConfig.AgentInfo[s.ID].IP, conf.VoiceAgentConfig.AgentInfo[s.ID].Port)
*/ // csladdr := icsnet.NewNetAddrWithIPPort(conf.VoiceAgentConfig.MyAddr.ServerIP, conf.VoiceAgentConfig.MyAddr.ServerPort)
// */
defer func() { // defer func() {
if err := recover(); err != nil { // if err := recover(); err != nil {
l.Printf(icslog.LOG_LEVEL_WARN, s.ID, "%s %s\n%s", // l.Printf(icslog.LOG_LEVEL_WARN, s.ID, "%s %s\n%s",
icserror.ICSERRNETNotConnectError.GetMessage(), csraddr, debug.Stack()) // icserror.ICSERRNETNotConnectError.GetMessage(), csraddr, debug.Stack())
} // }
}() // }()
var inout string = "O" // var inout string = "O"
s.SetDirection(true) // s.SetDirection(true)
if s.GetDirection() { // if s.GetDirection() {
inout = "I" // inout = "I"
} // }
callsignal := writecallsignal.NewCallSignalData() // callsignal := writecallsignal.NewCallSignalData()
s.StartTimeStamp = time.Now().UnixNano() // s.StartTimeStamp = time.Now().UnixNano()
s.EndTimeStamp = time.Now().UnixNano() // s.EndTimeStamp = time.Now().UnixNano()
s.ChannelID = conf.GetChannelID() // s.ChannelID = conf.GetChannelID()
s.ServerID = conf.GetServerID() // s.ServerID = conf.GetServerID()
station := conf.AgentConfig[s.ID].Name // station := conf.AgentConfig[s.ID].Name
s.Station = station // s.Station = station
/////////// // ///////////
cust1 := strings.SplitN(sip.From, "@", 2) // cust1 := strings.SplitN(sip.From, "@", 2)
cust2 := strings.SplitN(cust1[0], ":", 2) // cust2 := strings.SplitN(cust1[0], ":", 2)
s.CustID = cust2[1] // s.CustID = cust2[1]
////////// // //////////
l.Printf(icslog.LOG_LEVEL_DEBUG2, s.ID, ">>>>>channelid: %s, serverid: %d, station: %s, Custom: %s, starttimestamp: %d, START, inout: %s\n", // l.Printf(icslog.LOG_LEVEL_DEBUG2, s.ID, ">>>>>channelid: %s, serverid: %d, station: %s, Custom: %s, starttimestamp: %d, START, inout: %s\n",
s.ChannelID, s.ServerID, s.Station, s.CustID, s.StartTimeStamp, inout) // s.ChannelID, s.ServerID, s.Station, s.CustID, s.StartTimeStamp, inout)
callsignal.SetData(s.ChannelID, s.ServerID, s.Station, s.CustID, s.StartTimeStamp, s.EndTimeStamp, "E", inout) // callsignal.SetData(s.ChannelID, s.ServerID, s.Station, s.CustID, s.StartTimeStamp, s.EndTimeStamp, "E", inout)
t, wlen, werr := icsnet.SendCallSignal(nil, &csraddr, callsignal.GetData()) // t, wlen, werr := icsnet.SendCallSignal(nil, &csraddr, callsignal.GetData())
//t, wlen, werr := icsnet.SendCallSignal(&csladdr, &csraddr, callsignal.GetData()) // //t, wlen, werr := icsnet.SendCallSignal(&csladdr, &csraddr, callsignal.GetData())
defer t.Close() // defer t.Close()
if werr != nil { // if werr != nil {
l.Printf(icslog.LOG_LEVEL_ERROR, s.ID, "Failed to send Call-End signal to VoiceAgent(%s)", werr.GetError()) // l.Printf(icslog.LOG_LEVEL_ERROR, s.ID, "Failed to send Call-End signal to VoiceAgent(%s)", werr.GetError())
// } else {
// l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Sent Call-End signal to VoiceAgent(%d)", wlen)
// }
// //close voiceneter(voice connection to voice agent)
// if s.VoiceNeter != nil {
// s.VoiceNeter.Close()
// }
// s.RemoveSession()
fmt.Println("######### sim loop count!! ", conf.SimLoopCount)
fmt.Printf("Send Call Start Sip(%s) count %d!!!!!!!", s.AgentName, s.simLoopCount)
if s.simLoopCount < conf.SimLoopCount {
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Send Call Start Sip(%s) count %d!!!!!!!\r\n", s.AgentName, s.simLoopCount)
s.RequestInvite("01024342788")
s.simLoopCount += 1
} else { } else {
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Sent Call-End signal to VoiceAgent(%d)", wlen) l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Send Call Start Sip(%s) END!!!!!!!\r\n", s.AgentName, s.simLoopCount)
}
//close voiceneter(voice connection to voice agent)
if s.VoiceNeter != nil {
s.VoiceNeter.Close()
} }
s.RemoveSession()
return nil return nil
} }
//rtp sender callback timer function //rtp sender callback timer function
func (s *IcsSession) SendRTPCB(t *icscbtimer.IcsCBTimer) { func (s *IcsSession) SendRTPCB(t *icscbtimer.IcsCBTimer) {
l := icslog.GetIcsLog() l := icslog.GetIcsLog()
//conf := icsconf.GetIcsConfig() conf := icsconf.GetIcsConfig()
//format := conf.AgentConfig[s.ID].MediaConfig.Format //format := conf.AgentConfig[s.ID].MediaConfig.Format
defer func() { defer func() {
@ -1270,7 +1367,7 @@ func (s *IcsSession) SendRTPCB(t *icscbtimer.IcsCBTimer) {
// voiceFilePath := "/home/leejj9612/sim/voice/9001-RX-1648533187911907029.pcm" // voiceFilePath := "/home/leejj9612/sim/voice/9001-RX-1648533187911907029.pcm"
voiceFilePath := "/home/leejj9612/sim/voice/Sample.pcm" voiceFilePath := "/home/icsvsim/voice/Sample.pcm"
readPcmData, ferr := ioutil.ReadFile(voiceFilePath) readPcmData, ferr := ioutil.ReadFile(voiceFilePath)
if ferr != nil { if ferr != nil {
fmt.Println("Read Voice File error ", ferr) fmt.Println("Read Voice File error ", ferr)
@ -1283,6 +1380,7 @@ func (s *IcsSession) SendRTPCB(t *icscbtimer.IcsCBTimer) {
pcmDataLen := len(readPcmData) pcmDataLen := len(readPcmData)
pcmData := make([]byte, pcmDataLen) pcmData := make([]byte, pcmDataLen)
copy(pcmData, readPcmData[44:]) //cut off wave header copy(pcmData, readPcmData[44:]) //cut off wave header
// fmt.Printf("@@@@@ Read Data len: %d\r\n@@@@@ data: %+v\r\n@@@@@ copyData: %+v \r\n\r\n", pcmDataLen, readPcmData, pcmData)
//pcmData := s.tts[44:] //cut off wave header //pcmData := s.tts[44:] //cut off wave header
//fmt.Println("pcmData len>>>", pcmDataLen, len(s.tts)) //fmt.Println("pcmData len>>>", pcmDataLen, len(s.tts))
s.m.Unlock() s.m.Unlock()
@ -1297,8 +1395,96 @@ func (s *IcsSession) SendRTPCB(t *icscbtimer.IcsCBTimer) {
} }
//defer s.TxConverter.Close() //defer s.TxConverter.Close()
fmt.Printf("@@@@@@@@@@@@@@@@@ pcmDataLen : %d, loop Count: %d \r\n", pcmDataLen, conf.CallEndInfo.Loop)
//fmt.Println(">>>", s.payloadType, icspacketparser.RTPPayloadInfo[s.payloadType].PSize) //fmt.Println(">>>", s.payloadType, icspacketparser.RTPPayloadInfo[s.payloadType].PSize)
var rtp *icsrtp.RTP var rtp *icsrtp.RTP
if conf.CallEndInfo.Value {
for lc := 0; lc < conf.CallEndInfo.Loop; lc++ {
fmt.Printf("@@@@@@@@@@@@@@@@@@@@@@ %d ", lc)
iter := 0
totalSentLen := 0
offset := 0
psize := icspacketparser.RTPPayloadInfo[s.payloadType].PSize
ts := s.rtpTS
seq := s.rtpSeq
for t1 := range t.GetTick() {
if pcmDataLen < offset+psize {
//fmt.Println("BREAK!", pcmDataLen, offset+psize*2)
break
}
/*
uplus pcma ( 160 )
-
- pcma 160 ( )
*/
payload := pcmData[offset : offset+psize]
//payload, convErr := s.TxConverter.Encode(s.tts[offset : offset+icspacketparser.RTPPayloadInfo[s.payloadType].PSize])
// if convErr != nil {
// l.Printf(icslog.LOG_LEVEL_ERROR, s.ID, "Encoding Error - %s", convErr.GetError())
// return
// }
//fmt.Printf("1048@@@@ %+v\n", s.rtpMediaNeter)
/*
wflen, wferr := ttsfile1.Write(payload)
if wferr != nil {
fmt.Println("file.write error", wferr, wflen)
os.Exit(1)
}
ttsfile1.Sync()
*/
if iter == 0 {
if offset+psize >= pcmDataLen {
//if offset+psize >= alawDataLen {
offset = 0
}
rtp = icsrtp.NewRTP(1, //set mark bit
int(s.payloadType),
int(seq),
int(ts),
int(s.rtpSSRC),
payload)
//alawData[offset:offset+icspacketparser.RTPPayloadInfo[s.payloadType].PSize])
totalSentLen += icspacketparser.RTPPayloadInfo[s.payloadType].PSize
offset += psize
//offset += icspacketparser.RTPPayloadInfo[s.payloadType].PSize
} else {
if offset+psize >= pcmDataLen {
//if offset+psize >= alawDataLen {
offset = 0
}
rtp = icsrtp.NewRTP(0,
int(s.payloadType),
int(seq),
int(ts),
int(s.rtpSSRC),
payload)
//alawData[offset:offset+icspacketparser.RTPPayloadInfo[s.payloadType].PSize])
totalSentLen += icspacketparser.RTPPayloadInfo[s.payloadType].PSize
offset += psize
//offset += icspacketparser.RTPPayloadInfo[s.payloadType].PSize
}
iter++
ts += uint32(psize)
seq++
s.txCnt++
//fmt.Printf("1095@@@@ %+v\n", s.rtpMediaNeter)
wlen, werr := s.rtpMediaNeter.WriteRTP(rtp.Byte())
if werr != nil {
fmt.Println(t1, wlen, werr)
}
//fmt.Printf("wlen: %d\r", totalSentLen)
//l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Sent RTP(%d) to %s", wlen, s.rtpMediaNeter.RemoteAddr().String())
}
// fmt.Printf("Sent RTP(%d) to [%s] [%s]\r\n", totalSentLen, s.rtpMediaNeter.RemoteAddr().String(), s.AgentName )
// l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Sent RTP(%d) to %s", totalSentLen, s.rtpMediaNeter.RemoteAddr().String())
time.Sleep(time.Second)
}
s.RequestBYE(s.InviteSIP)
} else {
for { for {
iter := 0 iter := 0
totalSentLen := 0 totalSentLen := 0
@ -1376,6 +1562,8 @@ func (s *IcsSession) SendRTPCB(t *icscbtimer.IcsCBTimer) {
// fmt.Printf("Sent RTP(%d) to [%s] [%s]\r\n", totalSentLen, s.rtpMediaNeter.RemoteAddr().String(), s.AgentName ) // fmt.Printf("Sent RTP(%d) to [%s] [%s]\r\n", totalSentLen, s.rtpMediaNeter.RemoteAddr().String(), s.AgentName )
// l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Sent RTP(%d) to %s", totalSentLen, s.rtpMediaNeter.RemoteAddr().String()) // l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Sent RTP(%d) to %s", totalSentLen, s.rtpMediaNeter.RemoteAddr().String())
time.Sleep(time.Second) time.Sleep(time.Second)
// s.RequestBYE(s.InviteSIP)
}
} }
} }
@ -1727,10 +1915,79 @@ func (s *IcsSession) ProcReferNotify200ok(sip *icspacketparser.SIP) {
optfunc() optfunc()
} }
func (s *IcsSession) RequestBYESIM() {
l := icslog.GetIcsLog()
conf := icsconf.GetIcsConfig()
ip := conf.InfoConfig.ServerIP
port := conf.SIPConfig.Port
transport := conf.SIPConfig.Transport
// contact := fmt.Sprintf("<sip:%s@%s:%d;transport=%s>", s.AgentName, ip, port, transport)
// fmt.Println(">>>contact", inviteSIP.Contact)
// contactName1 := strings.SplitN(inviteSIP.Contact, "sip:", 2)
// contactName := strings.SplitN(contactName1[1], "@", 2)
optfunc := func() {
optMethod := fmt.Sprintf("sip:%s@%s;transport=%s", "AISB", conf.SIPConfig.SIPProxy, transport)
reqOpt := sipasm.NewSIPMessage(sipasm.ICSSIP_METHOD_BYE, optMethod)
via := fmt.Sprintf("SIP/2.0/UDP %s:%d;branch=%s", ip, port, sipasm.GenerateBranch())
maxforwards := "70"
// from := strings.SplitN(s.CustID, ": ", 2)
from := s.AgentName
// from := fmt.Sprintf("<sip:%s@%s>;tag=%s", s.AgentName, ip, sipasm.GenerateTag())
s.uri = fmt.Sprintf("sip:%s@%s", s.AgentName, ip)
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Set URI [%s]", s.uri)
// to := strings.SplitN(, ": ", 2)
to := s.CustID
//to := fmt.Sprintf("<sip:%s@%s>", s.AgentName, ip)
callid := s.callID
cseq := fmt.Sprintf("%d BYE", s.Cseq)
s.Cseq++
//referto := fmt.Sprintf("<sip:01025670081@192.168.0.221>")
contact := fmt.Sprintf("<sip:%s@%s:%d;transport=%s>", s.AgentName, ip, port, transport)
userAgent := conf.InfoConfig.Product
allow := "REGISTER,OPTIONS,INVITE,ACK,CANCEL,BYE,NOTIFY,PRACK,REFER,INFO,SUBSCRIBE,UPDATE"
supported := "timer,path,replaces"
contentLength := "0"
reqOpt.AddSIPHeader(sipasm.ICSSIP_HEADER_VIA, via)
reqOpt.AddSIPHeader(sipasm.ICSSIP_HEADER_MAX_FORWARDS, maxforwards)
reqOpt.AddSIPHeader(sipasm.ICSSIP_HEADER_FROM, to[0])
reqOpt.AddSIPHeader(sipasm.ICSSIP_HEADER_TO, from[0])
reqOpt.AddSIPHeader(sipasm.ICSSIP_HEADER_CALL_ID, callid)
reqOpt.AddSIPHeader(sipasm.ICSSIP_HEADER_CSEQ, cseq)
reqOpt.AddSIPHeader(sipasm.ICSSIP_HEADER_CONTACT, contact)
//reqOpt.AddSIPHeader(sipasm.ICSSIP_HEADER_REFER_TO, referto)
reqOpt.AddSIPHeader(sipasm.ICSSIP_HEADER_USER_AGENT, userAgent)
reqOpt.AddSIPHeader(sipasm.ICSSIP_HEADER_ALLOW, allow)
reqOpt.AddSIPHeader(sipasm.ICSSIP_HEADER_SUPPORTED, supported)
reqOpt.AddSIPHeader(sipasm.ICSSIP_HEADER_CONTENT_LENGTH, contentLength)
reqOpt.AddSIPHeader(sipasm.ICSSIP_HEADER_TERMINATOR)
wlen, werr := (*s.sipNeter).WriteSIP([]byte(reqOpt.String()))
if werr != nil {
l.Print(icslog.LOG_LEVEL_FATAL, s.ID, werr.GetMessage())
return
}
//l.Printf(icslog.LOG_LEVEL_WARN, s.ID, "BYE CALL STACK\n%s", debug.Stack())
l.Printf(icslog.LOG_LEVEL_DEBUG, s.ID, "Sent Data(%d) [%s]->[%s]>\n%s",
wlen,
(*s.sipNeter).LocalAddr().String(),
(*s.sipNeter).RemoteAddr().String(),
reqOpt.String())
}
optfunc()
}
//request bye //request bye
func (s *IcsSession) RequestBYE(inviteSIP *icspacketparser.SIP) { func (s *IcsSession) RequestBYE(inviteSIP *icspacketparser.SIP) {
l := icslog.GetIcsLog() l := icslog.GetIcsLog()
conf := icsconf.GetIcsConfig() conf := icsconf.GetIcsConfig()
fmt.Printf("inviteSIP %+v\r\n", inviteSIP)
ip := conf.InfoConfig.ServerIP ip := conf.InfoConfig.ServerIP
port := conf.SIPConfig.Port port := conf.SIPConfig.Port
transport := conf.SIPConfig.Transport transport := conf.SIPConfig.Transport
@ -1793,6 +2050,66 @@ func (s *IcsSession) RequestBYE(inviteSIP *icspacketparser.SIP) {
optfunc() optfunc()
} }
func (s *IcsSession) Res486Ack(sip *icspacketparser.SIP) *icserror.IcsError {
l := icslog.GetIcsLog()
conf := icsconf.GetIcsConfig()
ip := conf.InfoConfig.ServerIP
//mediaPort := conf.AgentConfig[s.ID].MediaConfig.Port
sipPort := conf.SIPConfig.Port
transport := conf.SIPConfig.Transport
ackMethod := fmt.Sprintf("sip:01025670081@%s;transport=%s", "192.168.0.222:5090", transport)
reqAck := sipasm.NewSIPMessage(sipasm.ICSSIP_METHOD_ACK, ackMethod)
//via := fmt.Sprintf("SIP/2.0/UDP %s;rport;branch=%s", ip, sipasm.GenerateBranch())
maxforwards := "70"
//from := fmt.Sprintf("<sip:%s@%s:5090>;tag=%s", s.AgentName, ip, sipasm.GenerateTag())
s.uri = fmt.Sprintf("sip:%s@%s", s.AgentName, ip)
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Set URI [%s]", s.uri)
//to := fmt.Sprintf("<sip:%s@%s;user=phone>", "01025670081", "192.168.0.221")
//to := fmt.Sprintf("<sip:%s@%s;user=phone>", "01025670081", ip)
//to := fmt.Sprintf("<sip:%s@%s>", s.AgentName, ip)
//cseq := fmt.Sprintf("%d INVITE", s.Cseq)
contact := fmt.Sprintf("<sip:%s@%s:%d;transport=%s>", s.AgentName, ip, sipPort, transport)
userAgent := conf.InfoConfig.Product
allow := "REGISTER,OPTIONS,INVITE,ACK,CANCEL,BYE,NOTIFY,PRACK,REFER,INFO,SUBSCRIBE,UPDATE"
supported := "timer,path,replaces"
for _, viav := range sip.Via {
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_VIA, viav)
}
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_MAX_FORWARDS, maxforwards)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_FROM, sip.From)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_TO, sip.To)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_CALL_ID, sip.CallID)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_CSEQ, sip.Cseq)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_CONTACT, contact)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_USER_AGENT, userAgent)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_ALLOW, allow)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_SUPPORTED, supported)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_CONTENT_LENGTH, "0")
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_TERMINATOR)
// wlen, werr := (*s.sipNeter).WriteSIPTo([]byte(reqAck.String()), s.remoteSIPAddr)
wlen, werr := (*s.sipNeter).WriteSIP([]byte(reqAck.String()))
if werr != nil {
l.Print(icslog.LOG_LEVEL_FATAL, s.ID, werr.GetMessage())
s.SetAgentStatus(STATUS_AGENT_READY)
return werr
}
l.Printf(icslog.LOG_LEVEL_INFO, s.ID, "Sent Data(%d) [%s]->[%s]>\n%s",
wlen,
(*s.sipNeter).LocalAddr().String(),
(*s.sipNeter).RemoteAddr().String(),
reqAck.String())
return nil
}
func (s *IcsSession) ResError(sip *icspacketparser.SIP, errNum int) { func (s *IcsSession) ResError(sip *icspacketparser.SIP, errNum int) {
var resError *sipasm.SIPMessage var resError *sipasm.SIPMessage
l := icslog.GetIcsLog() l := icslog.GetIcsLog()

@ -30,7 +30,8 @@ func (s *IcsSession) Processing(sip *parser.SIP) *icserror.IcsError {
l.Printf(icslog.LOG_LEVEL_DEBUG2, s.ID, "INVITE") l.Printf(icslog.LOG_LEVEL_DEBUG2, s.ID, "INVITE")
//time.Sleep(3000 * time.Millisecond) //time.Sleep(3000 * time.Millisecond)
//return nil //return nil
return s.ProcInvite(sip) return s.PassInvite(sip)
// return s.ProcInvite(sip)
case parser.ICS_SIP_METHOD_PUBLISH: case parser.ICS_SIP_METHOD_PUBLISH:
case parser.ICS_SIP_METHOD_OPTIONS: case parser.ICS_SIP_METHOD_OPTIONS:

@ -8,6 +8,7 @@ import (
"strings" "strings"
"sync" "sync"
"time" "time"
// "strconv"
"gitlab.com/ics_cinnamon/voicegateway/icscbtimer" "gitlab.com/ics_cinnamon/voicegateway/icscbtimer"
"gitlab.com/ics_cinnamon/voicegateway/icsconf" "gitlab.com/ics_cinnamon/voicegateway/icsconf"
@ -18,6 +19,7 @@ import (
"gitlab.com/ics_cinnamon/voicegateway/icspacketparser" "gitlab.com/ics_cinnamon/voicegateway/icspacketparser"
"gitlab.com/ics_cinnamon/voicegateway/icssvc" "gitlab.com/ics_cinnamon/voicegateway/icssvc"
"gitlab.com/ics_cinnamon/voicegateway/recorddata" "gitlab.com/ics_cinnamon/voicegateway/recorddata"
"gitlab.com/ics_cinnamon/voicegateway/sipasm"
) )
type SessionManager struct { type SessionManager struct {
@ -255,6 +257,59 @@ func (sm *SessionManager) Run() (icserr *icserror.IcsError) {
l.Printf(icslog.LOG_LEVEL_INFO, -1, "icspacketparser.ICS_SIP_METHOD_NOT_FOUND-%s", string(data)) l.Printf(icslog.LOG_LEVEL_INFO, -1, "icspacketparser.ICS_SIP_METHOD_NOT_FOUND-%s", string(data))
continue continue
} else { } else {
// fmt.Println("메서드", sip.Method.String())
// if sip.Method == icspacketparser.ICS_SIP_METHOD_INVITE {
// // conf := icsconf.GetIcsConfig()
// // TODO - send bye
// // defer func() {
// // if err := recover(); err != nil {
// // l.Printf(icslog.LOG_LEVEL_WARN, =1, "%s \n%s",
// // icserror.ICSERRNETNotConnectError.GetMessage(), debug.Stack())
// // }
// // }()
// l.Printf(icslog.LOG_LEVEL_INFO, -1, "sip 내용 전달! %+v", sip)
// // ip := strings.Split(conf.SIPConfig.SIPProxy, ":")[0]
// // port, cerr := strconv.Atoi(strings.Split(conf.SIPConfig.SIPProxy, ":")[1])
// // if cerr != nil {
// // fmt.Println("cerr err")
// // }
// // iport := fmt.Sprintf("%s:%d", ip, port)
// // fmt.Println(ip, port)
// sipPort := conf.SIPConfig.Port
// // transport := conf.SIPConfig.Transport
// sipProxy := conf.SIPConfig.SIPProxy
// remoteaddr := icsnet.NewNetAddrWithIPAddr(sipProxy)
// localAddrStr := fmt.Sprintf("192.168.0.4:%d", sipPort)
// localAddr := icsnet.NewNetAddrWithIPAddr(localAddrStr)
// t := icsnet.NewUDP(&localAddr, &remoteaddr)
// // fmt.Println("local ", t.LocalAddr().String())
// fmt.Println("remote ", t.RemoteAddr().String())
// // sendSIP := []string{data[:]}
// // for _, elem := range data {
// sent, err := t.WriteSIP([]byte(data))
// if err != nil {
// fmt.Println(err)
// }
// // }
// // wlen, werr := t.WriteSIP([]byte(data))
// // if werr != nil {
// // l.Print(icslog.LOG_LEVEL_FATAL, -1, werr.GetMessage())
// // // s.SetAgentStatus(STATUS_AGENT_READY)
// // // return werr
// // }
// fmt.Printf("send data \r\n%s, \r\n %d\r\n", string(data), sent)
// } else {
if SessionAvailableSipMethod(&sip) { if SessionAvailableSipMethod(&sip) {
l.Printf(icslog.LOG_LEVEL_DEBUG, -1, "Session Processing Method-[%s, %s, %s]", l.Printf(icslog.LOG_LEVEL_DEBUG, -1, "Session Processing Method-[%s, %s, %s]",
sip.Method, sip.ResType, sip.Cseq) sip.Method, sip.ResType, sip.Cseq)
@ -268,6 +323,54 @@ func (sm *SessionManager) Run() (icserr *icserror.IcsError) {
if serr != nil { if serr != nil {
l.Printf(icslog.LOG_LEVEL_ERROR, -1, "Licensed Session number[%d:%s] is EXCEEDED-%s", l.Printf(icslog.LOG_LEVEL_ERROR, -1, "Licensed Session number[%d:%s] is EXCEEDED-%s",
conf.GetChannelNum(), agentname, serr.GetMessage()) conf.GetChannelNum(), agentname, serr.GetMessage())
if conf.Representative.Value && sip.Source == "486" {
l.Printf(icslog.LOG_LEVEL_ERROR, -1, "All Agent Calling!!!!!")
sipPort := conf.SIPConfig.Port
// sipProxy := conf.SIPConfig.SIPProxy
transport := conf.SIPConfig.Transport
// remoteaddr := icsnet.NewNetAddrWithIPAddr(sipProxy)
// localAddrStr := fmt.Sprintf("0.0.0.0:%d", sipPort)
// localAddr := icsnet.NewNetAddrWithIPAddr(localAddrStr)
//////////////////////////////////////////////
ip := conf.InfoConfig.ServerIP
ackMethod := fmt.Sprintf("sip:01025670081@%s;transport=%s", "192.168.0.222:5090", transport)
reqAck := sipasm.NewSIPMessage(sipasm.ICSSIP_METHOD_ACK, ackMethod)
maxforwards := "70"
// s.uri = fmt.Sprintf("sip:%s@%s", conf.Representative.Name, ip)
// l.Printf(icslog.LOG_LEVEL_INFO, -1, "Set URI [%s]", s.uri)
contact := fmt.Sprintf("<sip:%s@%s:%d;transport=%s>", conf.Representative.Name, ip, sipPort, transport)
userAgent := conf.InfoConfig.Product
allow := "REGISTER,OPTIONS,INVITE,ACK,CANCEL,BYE,NOTIFY,PRACK,REFER,INFO,SUBSCRIBE,UPDATE"
supported := "timer,path,replaces"
for _, viav := range sip.Via {
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_VIA, viav)
}
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_MAX_FORWARDS, maxforwards)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_FROM, sip.From)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_TO, sip.To)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_CALL_ID, sip.CallID)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_CSEQ, sip.Cseq)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_CONTACT, contact)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_USER_AGENT, userAgent)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_ALLOW, allow)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_SUPPORTED, supported)
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_CONTENT_LENGTH, "0")
reqAck.AddSIPHeader(sipasm.ICSSIP_HEADER_TERMINATOR)
// wlen, werr := (*s.sipNeter).WriteSIPTo([]byte(reqAck.String()), s.remoteSIPAddr)
wlen, werr := (sm.SIPNeter).WriteSIP([]byte(reqAck.String()))
if werr != nil {
l.Print(icslog.LOG_LEVEL_FATAL, s.ID, werr.GetMessage())
return werr
}
l.Printf(icslog.LOG_LEVEL_INFO, -1, "Sent Data(%d) [%s]->[%s]>\n%s",
wlen,
(sm.SIPNeter).LocalAddr().String(),
(sm.SIPNeter).RemoteAddr().String(),
reqAck.String())
//////////////////////////////////////////////
}
continue continue
} }
l.Printf(icslog.LOG_LEVEL_INFO, -1, "Session Allocated. Session ID[%d] Call ID[%s]", s.ID, sip.GetCallID()) l.Printf(icslog.LOG_LEVEL_INFO, -1, "Session Allocated. Session ID[%d] Call ID[%s]", s.ID, sip.GetCallID())
@ -279,6 +382,21 @@ func (sm *SessionManager) Run() (icserr *icserror.IcsError) {
if sip.Method == icspacketparser.ICS_SIP_METHOD_INVITE { if sip.Method == icspacketparser.ICS_SIP_METHOD_INVITE {
s.SetCallID(sip.GetCallID()) s.SetCallID(sip.GetCallID())
} }
// 대표번호
if sip.Method == icspacketparser.ICS_SIP_METHOD_SIP20 || strings.SplitN(sip.Cseq, " ", 2)[1] == "INVITE" {
s.SetCallID(sip.GetCallID())
// representative
if conf.Representative.Value {
sip.SetToRep()
sip.SetTo(s.AgentName)
// if sip.Source == "486" {
// l.Printf(icslog.LOG_LEVEL_ERROR, -1, "All Agent Calling!!!!!")
// fmt.Println("##### All Agent Clling!!!!!! ")
// s.Res486Ack(&sip)
// continue
// }
}
}
if s.CheckAutomata(&sip) { if s.CheckAutomata(&sip) {
s.SetSessionMethod(sip) s.SetSessionMethod(sip)
@ -288,6 +406,13 @@ func (sm *SessionManager) Run() (icserr *icserror.IcsError) {
continue continue
} }
// if conf.Representative.Value && sip.Source == "486" {
// l.Printf(icslog.LOG_LEVEL_ERROR, -1, "All Agent Calling!!!!!")
// fmt.Println("##### All Agent Clling!!!!!! ")
// s.Res486Ack(&sip)
// continue
// }
//if cancel ACK or bye res, remove the session //if cancel ACK or bye res, remove the session
if s.MethodAutomata == ICS_SIP_AUTOMATA_CANCEL && sip.Method == icspacketparser.ICS_SIP_METHOD_ACK { if s.MethodAutomata == ICS_SIP_AUTOMATA_CANCEL && sip.Method == icspacketparser.ICS_SIP_METHOD_ACK {
s.Stop() s.Stop()
@ -330,7 +455,7 @@ func (sm *SessionManager) Run() (icserr *icserror.IcsError) {
l.Printf(icslog.LOG_LEVEL_INFO, -1, "%v", sip) l.Printf(icslog.LOG_LEVEL_INFO, -1, "%v", sip)
} }
} }
// }
} }
data = nil data = nil

@ -78,6 +78,39 @@ func findSessionWithAgentName(agentName string) *IcsSession {
return nil return nil
} }
// representative
func findSessionWithSessionStatus(callID string) *IcsSession {
conf := icsconf.GetIcsConfig()
sessions := getSessionInstance(nil)
for idx, session := range sessions {
session.m.Lock()
fmt.Println(session.AgentName, session.agentStatus)
if strings.Compare(conf.AgentConfig[idx].Value, "true") == 0 && session.agentStatus == 64 {
session.callID = callID
session.m.Unlock()
return session
}
session.m.Unlock()
}
return nil
}
func findSessionWithSessionStatusForINVITE() *IcsSession {
conf := icsconf.GetIcsConfig()
sessions := getSessionInstance(nil)
for idx, session := range sessions {
session.m.Lock()
if strings.Compare(conf.AgentConfig[idx].Value, "true") == 0 && session.agentStatus == 64 {
session.m.Unlock()
return session
}
session.m.Unlock()
}
return nil
}
func findSessionWithAgentName2(agentName string) *IcsSession { func findSessionWithAgentName2(agentName string) *IcsSession {
sessions := getSessionInstance(nil) sessions := getSessionInstance(nil)
for _, session := range sessions { for _, session := range sessions {
@ -110,6 +143,7 @@ func FindSessionID(sip icspacketparser.SIP) (IcsSessionID, *icserror.IcsError) {
func FindSession(data interface{}) (*IcsSession, *icserror.IcsError) { func FindSession(data interface{}) (*IcsSession, *icserror.IcsError) {
//func FindSession(sip icspacketparser.SIP) (*IcsSession, *icserror.IcsError) { //func FindSession(sip icspacketparser.SIP) (*IcsSession, *icserror.IcsError) {
l := icslog.GetIcsLog() l := icslog.GetIcsLog()
conf := icsconf.GetIcsConfig()
defer func() { defer func() {
if err := recover(); err != nil { if err := recover(); err != nil {
l.Printf(icslog.LOG_LEVEL_WARN, -1, "%s\n%s", l.Printf(icslog.LOG_LEVEL_WARN, -1, "%s\n%s",
@ -130,13 +164,15 @@ func FindSession(data interface{}) (*IcsSession, *icserror.IcsError) {
} }
*/ */
if conf.Representative.Value && sip.Method == icspacketparser.ICS_SIP_METHOD_SIP20 && strings.SplitN(sip.Cseq, " ", 2)[1] == "INVITE" {
if len(agentname) > 0 { if len(agentname) > 0 {
l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "FindSession>findSessionWithAgentName> agent name[%s]", agentname) l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "FindSession>findSessionWithAgentName> agent name[%s]", agentname)
session := findSessionWithAgentName(agentname) session := findSessionWithSessionStatus(callID)
if session != nil { if session != nil {
return session, nil return session, nil
} }
} }
} else {
if len(callID) > 0 { if len(callID) > 0 {
l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "FindSession>findSessionWithCallID> callid [%s]", callID) l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "FindSession>findSessionWithCallID> callid [%s]", callID)
session := findSessionWithCallID(callID) session := findSessionWithCallID(callID)
@ -144,6 +180,13 @@ func FindSession(data interface{}) (*IcsSession, *icserror.IcsError) {
return session, nil return session, nil
} }
} }
if len(agentname) > 0 {
l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "FindSession>findSessionWithAgentName> agent name[%s]", agentname)
session := findSessionWithAgentName(agentname)
if session != nil {
return session, nil
}
}
if len(uri) > 0 { if len(uri) > 0 {
l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "FindSession>findSessionWithFromURI> uri [%s]", uri) l.Printf(icslog.LOG_LEVEL_DEBUG2, -1, "FindSession>findSessionWithFromURI> uri [%s]", uri)
//fmt.Println("findsession", uri) //fmt.Println("findsession", uri)
@ -152,6 +195,7 @@ func FindSession(data interface{}) (*IcsSession, *icserror.IcsError) {
return session, nil return session, nil
} }
} }
}
case icspacketparser.RTP: case icspacketparser.RTP:
rtp := v rtp := v
srcPort := rtp.SrcAddr.Port srcPort := rtp.SrcAddr.Port
@ -335,6 +379,7 @@ func (s *IcsSession) RemoveSession() *icserror.IcsError {
s.referto = "" s.referto = ""
s.SetAgentStatus(STATUS_AGENT_READY) s.SetAgentStatus(STATUS_AGENT_READY)
s.SetRegisterStatus(STATUS_REGISTER_READY) s.SetRegisterStatus(STATUS_REGISTER_READY)
fmt.Println("REMOVE SESSION STATUS: ", s.GetAgentStatus())
s.m.Unlock() s.m.Unlock()
return nil return nil

@ -69,7 +69,7 @@ func WritePID(pid int) *icserror.IcsError {
var homeDir string var homeDir string
for _, e := range os.Environ() { for _, e := range os.Environ() {
s := strings.SplitN(e, "=", 2) s := strings.SplitN(e, "=", 2)
if strings.Compare(s[0], "ICSVG_ROOT") == 0 { if strings.Compare(s[0], "ICSVSIM_ROOT") == 0 {
homeDir = s[1] homeDir = s[1]
//service.SetHomeDir(s[1]) //service.SetHomeDir(s[1])
isStop = true isStop = true
@ -93,7 +93,7 @@ func CheckPID() bool {
var homeDir string var homeDir string
for _, e := range os.Environ() { for _, e := range os.Environ() {
s := strings.SplitN(e, "=", 2) s := strings.SplitN(e, "=", 2)
if strings.Compare(s[0], "ICSVG_ROOT") == 0 { if strings.Compare(s[0], "ICSVSIM_ROOT") == 0 {
homeDir = s[1] homeDir = s[1]
//service.SetHomeDir(s[1]) //service.SetHomeDir(s[1])
isStop = true isStop = true
@ -192,7 +192,7 @@ func PWritePID(pid int) *icserror.IcsError {
var homeDir string var homeDir string
for _, e := range os.Environ() { for _, e := range os.Environ() {
s := strings.SplitN(e, "=", 2) s := strings.SplitN(e, "=", 2)
if strings.Compare(s[0], "ICSVG_ROOT") == 0 { if strings.Compare(s[0], "ICSVSIM_ROOT") == 0 {
homeDir = s[1] homeDir = s[1]
//service.SetHomeDir(s[1]) //service.SetHomeDir(s[1])
isStop = true isStop = true
@ -216,7 +216,7 @@ func PCheckPID() bool {
var homeDir string var homeDir string
for _, e := range os.Environ() { for _, e := range os.Environ() {
s := strings.SplitN(e, "=", 2) s := strings.SplitN(e, "=", 2)
if strings.Compare(s[0], "ICSVG_ROOT") == 0 { if strings.Compare(s[0], "ICSVSIM_ROOT") == 0 {
homeDir = s[1] homeDir = s[1]
//service.SetHomeDir(s[1]) //service.SetHomeDir(s[1])
isStop = true isStop = true

@ -22,7 +22,7 @@ func main() {
var homeDir string var homeDir string
for _, e := range os.Environ() { for _, e := range os.Environ() {
s := strings.SplitN(e, "=", 2) s := strings.SplitN(e, "=", 2)
if strings.Compare(s[0], "ICSVG_ROOT") == 0 { if strings.Compare(s[0], "ICSVSIM_ROOT") == 0 {
homeDir = s[1] homeDir = s[1]
//service.SetHomeDir(s[1]) //service.SetHomeDir(s[1])
isStop = true isStop = true
@ -35,7 +35,7 @@ func main() {
} }
//configuration //configuration
configFile := fmt.Sprintf("%s/config/icsvg.xml", homeDir) configFile := fmt.Sprintf("%s/config/icsvsim.xml", homeDir)
conf, confErr := icsconf.OpenConfig(configFile, homeDir) conf, confErr := icsconf.OpenConfig(configFile, homeDir)
if confErr != nil { if confErr != nil {
confErr.PrintWithCaller(0) confErr.PrintWithCaller(0)

Binary file not shown.

@ -20,7 +20,7 @@ func main() {
for _, e := range os.Environ() { for _, e := range os.Environ() {
s := strings.SplitN(e, "=", 2) s := strings.SplitN(e, "=", 2)
if strings.Compare(s[0], "ICSVG_ROOT") == 0 { if strings.Compare(s[0], "ICSVSIM_ROOT") == 0 {
homeDir = s[1] homeDir = s[1]
//service.SetHomeDir(s[1]) //service.SetHomeDir(s[1])
isStop = true isStop = true
@ -33,7 +33,7 @@ func main() {
} }
//configuration //configuration
configFile := fmt.Sprintf("%s/config/icsvg.xml", homeDir) configFile := fmt.Sprintf("%s/config/icsvsim.xml", homeDir)
//configFile := fmt.Sprintf("%s/config/icsvc.xml", service.GetHomeDir()) //configFile := fmt.Sprintf("%s/config/icsvc.xml", service.GetHomeDir())
//fmt.Println("Config file:", configFile) //fmt.Println("Config file:", configFile)
conf, confErr := icsconf.OpenConfig(configFile, homeDir) conf, confErr := icsconf.OpenConfig(configFile, homeDir)
@ -57,7 +57,7 @@ func main() {
if d1 != d2 || y1 != y2 || m1 != m2 { if d1 != d2 || y1 != y2 || m1 != m2 {
icsLog.M.Lock() icsLog.M.Lock()
icsLog.LogFileName = fmt.Sprintf("%s/icsvg.log-%d%02d%02d", icsLog.Path, y2, m2, d2) // file name change icsLog.LogFileName = fmt.Sprintf("%s/icsvsim.log-%d%02d%02d", icsLog.Path, y2, m2, d2) // file name change
var oerr error var oerr error
icsLog.LogFile, oerr = os.OpenFile(icsLog.LogFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) icsLog.LogFile, oerr = os.OpenFile(icsLog.LogFileName, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
if oerr != nil { if oerr != nil {

@ -20,7 +20,7 @@ func main() {
/////////////////////////////////// ///////////////////////////////////
//Demonize service //Demonize service
//check Voice Gateway pid file - ICSVG_ROOT/voicegateway.pid //check Voice Gateway pid file - ICSVSIM_ROOT/voicegateway.pid
//if already running, terminate self. //if already running, terminate self.
/* /*
if icsutil.CheckPID() { if icsutil.CheckPID() {
@ -48,7 +48,7 @@ func main() {
var homeDir string var homeDir string
for _, e := range os.Environ() { for _, e := range os.Environ() {
s := strings.SplitN(e, "=", 2) s := strings.SplitN(e, "=", 2)
if strings.Compare(s[0], "ICSVG_ROOT") == 0 { if strings.Compare(s[0], "ICSVSIM_ROOT") == 0 {
homeDir = s[1] homeDir = s[1]
//service.SetHomeDir(s[1]) //service.SetHomeDir(s[1])
isStop = true isStop = true
@ -61,7 +61,7 @@ func main() {
} }
//configuration //configuration
configFile := fmt.Sprintf("%s/config/icsvg.xml", homeDir) configFile := fmt.Sprintf("%s/config/icsvsim.xml", homeDir)
//configFile := fmt.Sprintf("%s/config/icsvg.xml", service.GetHomeDir()) //configFile := fmt.Sprintf("%s/config/icsvg.xml", service.GetHomeDir())
//fmt.Println("Config file:", configFile) //fmt.Println("Config file:", configFile)
conf, confErr := icsconf.OpenConfig(configFile, homeDir) conf, confErr := icsconf.OpenConfig(configFile, homeDir)
Loading…
Cancel
Save