You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.2 KiB
Go
114 lines
3.2 KiB
Go
package readcallsignal
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"runtime/debug"
|
|
|
|
"gitlab.com/cinnamon/voiceagent/icserror"
|
|
"gitlab.com/cinnamon/voiceagent/icslog"
|
|
"gitlab.com/cinnamon/voiceagent/recorddata"
|
|
)
|
|
|
|
type CallSignal struct {
|
|
ChannelID string
|
|
ServerID string
|
|
AgentID string
|
|
Station string
|
|
CreateTime int64
|
|
EventType string
|
|
StartTime int64
|
|
EndTime int64
|
|
InOut string
|
|
CustID string
|
|
}
|
|
|
|
type CallSignalP struct {
|
|
CallSignal [recorddata.MAX_CALLSIGNAL_PACKET_LEN]byte
|
|
}
|
|
|
|
//call signal protocol offset. ex)buffer[id:len]
|
|
const (
|
|
CHANNELID = 0 //byte array 13
|
|
CHANNELID_LEN = 13 //byte array 13
|
|
SERVERID = CHANNELID + 13 //short 2
|
|
SERVERID_LEN = SERVERID + 2 //short 2
|
|
AGENTID = SERVERID + 2 //byte array 16
|
|
AGENTID_LEN = AGENTID + 16 //byte array 16
|
|
STATION = AGENTID + 16 //int 4
|
|
STATION_LEN = STATION + 4 //int 4
|
|
CREATETIME = STATION + 4 //long 8
|
|
CREATETIME_LEN = CREATETIME + 8 //long 8
|
|
EVENTTYPE = CREATETIME + 8 //byte 1
|
|
EVENTTYPE_LEN = EVENTTYPE + 1 //byte 1
|
|
STARTTIME = EVENTTYPE + 1 //long 8
|
|
STARTTIME_LEN = STARTTIME + 8 //long 8
|
|
ENDTIME = STARTTIME + 8 //long 8
|
|
ENDTIME_LEN = ENDTIME + 8 //long 8
|
|
INOUT = ENDTIME + 8 //byte 1
|
|
INOUT_LEN = INOUT + 1 //byte 1
|
|
CUSTID = INOUT + 1 //1
|
|
CUSTID_LEN = CUSTID + 20
|
|
)
|
|
|
|
func NewCallSignal(data []byte) *CallSignal {
|
|
if len(data) > recorddata.MAX_CALLSIGNAL_PACKET_LEN {
|
|
/*
|
|
for iter, v := range data {
|
|
fmt.Println(iter, v)
|
|
}
|
|
fmt.Printf("len>>>> %d, |%s|\n", len(data), string(data))
|
|
*/
|
|
return nil
|
|
}
|
|
|
|
cs := CallSignal{}
|
|
cs.Parse(data)
|
|
//fmt.Printf("%+v\n", cs)
|
|
|
|
return &cs
|
|
}
|
|
|
|
func (cs *CallSignal) Parse(data []byte) *icserror.IcsError {
|
|
l := icslog.GetIcsLog()
|
|
var derr *icserror.IcsError = nil
|
|
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
switch v := err.(type) {
|
|
case error:
|
|
icserror.ICSERRRECORDDATAParsing.SetError(v)
|
|
l.Printf(icslog.LOG_LEVEL_WARN, -1, "PANIC! %s\n%s", icserror.ICSERRRECORDDATAParsing.GetError().Error(), string(debug.Stack()))
|
|
default:
|
|
l.Print(icslog.LOG_LEVEL_WARN, -1, icserror.ICSERRRECORDDATAParsing.GetError().Error())
|
|
}
|
|
}
|
|
derr = icserror.ICSERRRECORDDATAParsing
|
|
}()
|
|
|
|
cs.ChannelID = string(data[CHANNELID:CHANNELID_LEN])
|
|
cs.ServerID = string(data[SERVERID:SERVERID_LEN])
|
|
cs.AgentID = string(data[AGENTID:AGENTID_LEN])
|
|
//istation := int(binary.LittleEndian.Uint32(data[STATION:STATION_LEN]))
|
|
//cs.Station = fmt.Sprintf("%d", istation)
|
|
//fmt.Println("Station", cs.Station)
|
|
cs.Station = string(data[STATION:STATION_LEN])
|
|
cs.CreateTime = int64(binary.LittleEndian.Uint64(data[CREATETIME:CREATETIME_LEN]))
|
|
cs.EventType = string(data[EVENTTYPE:EVENTTYPE_LEN][0])
|
|
cs.StartTime = int64(binary.LittleEndian.Uint64(data[STARTTIME:STARTTIME_LEN]))
|
|
cs.EndTime = int64(binary.LittleEndian.Uint64(data[ENDTIME:ENDTIME_LEN]))
|
|
|
|
//fmt.Printf("100LINE>>> %d\n", data[INOUT:INOUT_LEN][0])
|
|
switch data[INOUT:INOUT_LEN][0] {
|
|
case 254:
|
|
cs.InOut = "10"
|
|
case 255:
|
|
cs.InOut = "11"
|
|
default:
|
|
cs.InOut = string(data[INOUT:INOUT_LEN][0])
|
|
}
|
|
|
|
cs.CustID = string(data[CUSTID:CUSTID_LEN])
|
|
|
|
return derr
|
|
}
|