From bfdca3ffcbf77d7eea4a70d0fdd4148974306f61 Mon Sep 17 00:00:00 2001 From: Alexander Lazarenko Date: Thu, 30 Nov 2023 20:05:11 +0300 Subject: [PATCH] File split --- certificate.go | 41 ++++ configmodel.go | 73 ++++++ devemm.go | 36 +++ evem.go | 18 ++ io.go | 175 +++++++++++++++ mediastreammodel.go | 87 ++++++++ scheme.go | 32 +++ storm.go | 80 +++++++ utils.go | 528 +------------------------------------------- 9 files changed, 543 insertions(+), 527 deletions(-) create mode 100644 certificate.go create mode 100644 configmodel.go create mode 100644 devemm.go create mode 100644 evem.go create mode 100644 io.go create mode 100644 mediastreammodel.go create mode 100644 scheme.go create mode 100644 storm.go diff --git a/certificate.go b/certificate.go new file mode 100644 index 0000000..5b0daa1 --- /dev/null +++ b/certificate.go @@ -0,0 +1,41 @@ +package n9m + +func (e *Package) RequestConnect(session string, serial string, numOfCams int) { + e.Payload = map[string]any{ + "MODULE": "CERTIFICATE", + "OPERATION": "CONNECT", + "PARAMETER": map[string]any{ + "DSNO": serial, + "CHANNEL": numOfCams, + }, + "SESSION": session, + } +} + +// video server util +func (e *Package) ResponseConnect(Sid string, streamName string) { + e.Payload = map[string]any{ + "MODULE": "CERTIFICATE", + "OPERATION": "CREATESTREAM", + "RESPONSE": map[string]any{ + "ERRORCODE": 0, + "STREAMNAME": streamName, + }, + "SESSION": Sid, + } +} + +// main server util +func (e *Package) ResponseCertificateConnect(Sid string) { + e.Payload = map[string]any{ + "MODULE": "CERTIFICATE", + "OPERATION": "CONNECT", + "RESPONSE": map[string]any{ + "ERRORCAUSE": "", + "ERRORCODE": 0, + "MASKCMD": 5, + "PRO": "1.0.5", + }, + "SESSION": Sid, + } +} diff --git a/configmodel.go b/configmodel.go new file mode 100644 index 0000000..e1fcf8b --- /dev/null +++ b/configmodel.go @@ -0,0 +1,73 @@ +package n9m + +import "log" + +// request reqistration parameters (directly to register) +func (e *Package) RequestParameters(params map[string]any, serial int, session string) { + e.Payload = map[string]any{ + "MODULE": "CONFIGMODEL", + "OPERATION": "GET", + "PARAMETER": map[string]any{ + "MDVR": params["MDVR"], + "SERIAL": serial, + }, + "SESSION": session, + } +} // end of 'RequestParameters' function + +// set reigeter parameters (directly to register) +func (e *Package) SetParameters(params map[string]any, serial int, session string) { + e.Payload = map[string]any{ + "MODULE": "CONFIGMODEL", + "OPERATION": "SET", + "PARAMETER": map[string]any{ + "MDVR": params["MDVR"], + "SERIAL": serial, + }, + "SESSION": session, + } + log.Println(e.Payload) +} // end of 'SetParameters' function + +// todo al1 +func (e *Package) ConfigeModel(Sid string) { + e.Payload = map[string]any{ + "MODULE": "CONFIGMODEL", + "OPERATION": "SET", + "PARAMETER": map[string]any{ + "MDVR": map[string]any{ + "KEYS": map[string]any{ // KEY parameters + "GV": 1, // GPS version + }, + "PGDSM": map[string]any{ // Network monitoring status parameters + "PGPS": map[string]any{ // GPS position + "EN": 1, // Real-time position monitoring + "TM": 10, // Time interval + }, + }, + "PSI": map[string]any{ // Platform basic information + "CG": map[string]any{ // Call information + "AS": 0, // Automatic answer + }, + }, + "SUBSTRNET": map[string]any{ + "SM": 1, // 0-Smooth .. 4-Clear + }, + }, + }, + } +} + +// main server util +func (e *Package) ResponseConfigModelSet(Sid string) { + e.Payload = map[string]any{ + "MODULE": "CONFIGMODUL", // it's not error + "OPERATION": "SET", + "RESPONSE": map[string]any{ + "ERRORCODE": 0, + "ERRORCAUSE": "None", + "ERRORDESCRIPTION": "None", + }, + "SESSION": Sid, + } +} diff --git a/devemm.go b/devemm.go new file mode 100644 index 0000000..db3e473 --- /dev/null +++ b/devemm.go @@ -0,0 +1,36 @@ +package n9m + +import "fmt" + +// main server util +func (e *Package) RequestGeolocation(serial int, Sid string) { + e.Payload = map[string]any{ + "MODULE": "DEVEMM", + "OPERATION": "GETPOS", + "PARAMETER": map[string]any{ + "SERIAL": serial, + }, + "SESSION": Sid, + } +} + +func (e *Package) ResponseGeolocation(errorCode int, errorCause string, serial int, longitude float32, latitude float32, altitude float32, speed int, course int, time string) { + e.Payload = map[string]any{ + "MODULE": "DEVEMM", + "OPERATION": "GETPOS", + "RESPONSE": map[string]any{ + "ERRORCODE": errorCode, + "ERRORCAUSE": errorCause, + "SERIAL": serial, + "P": map[string]any{ + "V": errorCode == 0, + "J": fmt.Sprintf("%4.6v", longitude), + "W": fmt.Sprintf("%4.6v", latitude), + "H": fmt.Sprintf("%4.6v", altitude), + "S": speed, // unit - 0.01 km/h + "C": course, // direction (angle from north) + "T": time, // yyyymmddhhmmss + }, + }, + } +} diff --git a/evem.go b/evem.go new file mode 100644 index 0000000..08616c1 --- /dev/null +++ b/evem.go @@ -0,0 +1,18 @@ +package n9m + +// main server util +func (e *Package) ResponseAlarm(alarmType int64, alarmUID int64, cmdno int64, cmdtype int64, run int64, serial string, Sid string) { + e.Payload = map[string]any{ + "MODULE": "EVEM", + "OPERATION": "SENDALARMINFO", + "RESPONSE": map[string]any{ + "ALARMTYPE": alarmType, + "ALARMUID": alarmUID, + "CMDNO": cmdno, + "CMDTYPE": cmdtype, + "ERRORCODE": 0, + "RUN": run, + }, + "SESSION": Sid, + } +} diff --git a/io.go b/io.go new file mode 100644 index 0000000..bc20a2b --- /dev/null +++ b/io.go @@ -0,0 +1,175 @@ +package n9m + +import ( + "bytes" + "encoding/json" + "fmt" + "log" + + "github.com/icza/bitio" + "github.com/tidwall/gjson" +) + +// Extract fields from JSON +func (e *Package) SaveJsonFields() { + if value, exist := e.Payload["MODULE"]; exist { + e.Json.Module = value.(string) + } else { + e.Json.Module = "" + } + + if value, exist := e.Payload["KEY"]; exist { + e.Json.Key = value.(string) + } else { + e.Json.Key = "" + } + + if value, exist := e.Payload["OPERATION"]; exist { + e.Json.Operation = value.(string) + } else { + e.Json.Operation = "" + } + + if value, exist := e.Payload["RESPONSE"]; exist { + e.Json.Response = value.(map[string]interface{}) + } else { + e.Json.Response = make(map[string]interface{}) + } + + if value, exist := e.Payload["PARAMETER"]; exist { + e.Json.Parameters = value.(map[string]interface{}) + } else if value, exist := e.Payload["PARAMETERS"]; exist { + e.Json.Parameters = value.(map[string]interface{}) + } else { + e.Json.Parameters = make(map[string]interface{}) + } +} + +// Read package +func (e *Package) ReadPackage() bool { + if len(e.Accum) < 12 { + return false + } + + r := bitio.NewReader(bytes.NewBuffer(e.Accum)) + e.Version = r.TryReadBits(2) + e.Encription = r.TryReadBits(1) + e.Mark = r.TryReadBits(1) + e.CC = r.TryReadBits(4) + e.PayloadType = r.TryReadBits(8) + e.SSRC = r.TryReadBits(16) + + log.Println(e.PayloadType) + + is_special := e.Encription == 1 && e.Mark == 1 + if is_special { + r.TryReadBits(8 * 4) + e.PayloadLen = r.TryReadBits(8) + r.TryReadBits(3 * 8) + + if uint64(len(e.Accum)) < e.PayloadLen+12 { + return false + } + } else { + e.PayloadLen = r.TryReadBits(32) + // WTF: e.CC is useless + for i := uint64(0); i < 1; i++ { + e.CSRC[i] = r.TryReadBits(32) + } + } + + numOfBytes := 0 + rawbytes := []byte{} + if e.PayloadLen != 0 { + if e.PayloadLen > 1000000 { + log.Printf("%v\n", e) + log.Panicln("CORRUPTED PACKAGE") + } + + rawbytes = make([]byte, e.PayloadLen) + numOfBytes, _ = r.Read(rawbytes) + } + + if numOfBytes != int(e.PayloadLen) { + return false + } + + e.Raw = e.Accum[:12+e.PayloadLen] + e.Accum = e.Accum[12+e.PayloadLen:] + e.RawPayload = rawbytes + + var ok bool + e.GPayload = gjson.Parse(string(rawbytes)) + e.Payload, ok = e.GPayload.Value().(map[string]interface{}) + if !ok { + e.Payload = gjson.Parse("{}").Value().(map[string]interface{}) + } + + e.SaveJsonFields() + + return e.PayloadLen > 0 +} + +func (e *Package) PackPackage() []byte { + e.SaveJsonFields() + + b := &bytes.Buffer{} + w := bitio.NewWriter(b) + + w.TryWriteBits(e.Version, 2) + w.TryWriteBits(e.Encription, 1) + w.TryWriteBits(e.Mark, 1) + w.TryWriteBits(e.CC, 4) + w.TryWriteBits(e.PayloadType, 8) + w.TryWriteBits(e.SSRC, 16) + conv, err := json.Marshal(e.Payload) + + if err != nil { + fmt.Println(err) + return nil + } + + e.PayloadLen = uint64(len(conv)) + if e.PayloadLen != 0 { + e.PayloadLen++ + } + w.TryWriteBits(e.PayloadLen, 32) + + // WTF: e.CC is useless + for i := uint64(0); i < 1; i++ { + w.TryWriteBits(e.CSRC[i], 32) + } + if e.PayloadLen != 0 { + w.Write(conv) + w.Write([]byte{0}) + } + w.Close() + + return b.Bytes() +} + +func (e *Package) PackRawPackage() []byte { + b := &bytes.Buffer{} + w := bitio.NewWriter(b) + + w.TryWriteBits(e.Version, 2) + w.TryWriteBits(e.Encription, 1) + w.TryWriteBits(e.Mark, 1) + w.TryWriteBits(e.CC, 4) + w.TryWriteBits(e.PayloadType, 8) + w.TryWriteBits(e.SSRC, 16) + e.PayloadLen = uint64(len(e.RawPayload) + 1) + w.TryWriteBits(e.PayloadLen, 32) + + // WTF: e.CC is useless + for i := uint64(0); i < 1; i++ { + w.TryWriteBits(e.CSRC[i], 32) + } + if e.PayloadLen != 0 { + w.Write(e.RawPayload) + w.Write([]byte{0}) + } + w.Close() + + return b.Bytes() +} diff --git a/mediastreammodel.go b/mediastreammodel.go new file mode 100644 index 0000000..29eae8c --- /dev/null +++ b/mediastreammodel.go @@ -0,0 +1,87 @@ +package n9m + +import "fmt" + +func (e *Package) MediaRequestDownloadVideo(token int, serial string, session string, camNo int, date string, begin_time string, end_time string, recordID string, serverId int, ip string) { + e.Payload = map[string]any{ + "MODULE": "MEDIASTREAMMODEL", + "OPERATION": "REQUESTDOWNLOADVIDEO", + "PARAMETER": map[string]any{ + "PT": 3, + "SSRC": 1, + "STREAMNAME": "DOWNLOAD" + "_" + serial + "_" + fmt.Sprint(camNo) + "_" + fmt.Sprint(serverId), + "STREAMTYPE": 1, // main stream + "RECORDID": recordID, + "CHANNEL": 1 << (camNo - 1), + "STARTTIME": date + begin_time, + "ENDTIME": date + end_time, + "OFFSETFLAG": 1, + "OFFSET": 0, + "IPANDPORT": ip + ":12092", + "SERIAL": token, + "DT": 1, // high speed download + }, + "SESSION": session, + } +} + +// main server util +func (e *Package) MediaRequestAliveVideo(token int, camNo int64, Sid string, serial string, quality int64, ip string) { + + channel := 0 + + if camNo == 1 { + channel = 1 + } else { + channel = 1 << (camNo - 1) + } + e.Payload = map[string]any{ + "MODULE": "MEDIASTREAMMODEL", + "OPERATION": "REQUESTALIVEVIDEO", + "PARAMETER": map[string]any{ + "AUDIOVALID": 1, + "CHANNEL": channel, + "FRAMEMODE": 0, + "IPANDPORT": ip + ":12092", + "STREAMNAME": "LIVE" + "_" + serial + "_" + fmt.Sprint(camNo), + "STREAMTYPE": quality, + "SERIAL": token, + }, + "SESSION": Sid, + } +} + +// main server util +func (e *Package) MediaRequestRemotePlayback(token int, serial string, session string, camNo int, date string, begin_time string, end_time string, serverId int, ip string) { + e.Payload = map[string]any{ + "MODULE": "MEDIASTREAMMODEL", + "OPERATION": "REQUESTREMOTEPLAYBACK", + "PARAMETER": map[string]any{ + "STREAMNAME": "PLAYBACK" + "_" + fmt.Sprint(serial) + "_" + fmt.Sprint(camNo) + "_" + fmt.Sprint(serverId), + "STREAMTYPE": 1, // main stream + "VIDEOTYPE": 2, // common files + "CHANNEL": 1 << (camNo - 1), + "STARTTIME": date + begin_time, + // "ENDTIME": date + end_time, + "IPANDPORT": ip + ":12092", + "SERIAL": token, + "PBST": 0, + }, + "SESSION": session, + } +} + +// main server util +func (e *Package) ControlRemotePlayback(token int, serial string, session string, camNo int, date string, begin_time string, end_time string, serverId int) { + e.Payload = map[string]any{ + "MODULE": "MEDIASTREAMMODEL", + "OPERATION": "CONTROLREMOTEPLAYBACK", + "PARAMETER": map[string]any{ + "STREAMNAME": fmt.Sprint(serial) + "_" + fmt.Sprint(camNo) + "_" + fmt.Sprint(serverId), + "SERIAL": token, + "PALYBACKCMD": 5, // main stream + "CHANNEL": 268435455, // common files + }, + "SESSION": session, + } +} diff --git a/scheme.go b/scheme.go new file mode 100644 index 0000000..02e7edd --- /dev/null +++ b/scheme.go @@ -0,0 +1,32 @@ +package n9m + +import "github.com/tidwall/gjson" + +type PayloadJson struct { + Module string + Key string + Operation string + Parameters map[string]interface{} + Response map[string]interface{} +} + +type Package struct { + Version uint64 + Encription uint64 + Mark uint64 + CC uint64 + PayloadType uint64 + SSRC uint64 + Reserved uint64 + CSRC [16]uint64 + + PayloadLen uint64 + GPayload gjson.Result + Payload map[string]interface{} + RawPayload []byte + + Raw []byte + Accum []byte + + Json PayloadJson +} diff --git a/storm.go b/storm.go new file mode 100644 index 0000000..977420c --- /dev/null +++ b/storm.go @@ -0,0 +1,80 @@ +package n9m + +func (e *Package) ResponseCalendar(errorCode int, errorCause string, serial int, dates []string) { + e.Payload = map[string]any{ + "MODULE": "STORM", + "OPERATION": "GETCALENDAR", + "RESPONSE": map[string]any{ + "ERRORCODE": errorCode, + "ERRORCAUSE": errorCause, + "SERIAL": serial, + "COUNT": len(dates), + "CALENDER": dates, + // no CHCALENDER[COUNT] + // no T[COUNT] + }, + } +} + +func (e *Package) RequestCalendar(queryTime string, serial int, session string, camNo int64) { + channel := 1 << (camNo - 1) + e.Payload = map[string]any{ + "MODULE": "STORM", + "OPERATION": "GETCALENDAR", + "PARAMETER": map[string]any{ + "CALENDARTYPE": 1, // Month data + "STREAMTYPE": 1, // Main Stream + "FILETYPE": 0b111111, // get file type + "PICMTYPE": 0b10, // fixed timing pictures (fixed framerate) + "APT0": 0xFFFFFF, // get every alarm + "APT1": 0xFFFF, // get every alarm + "AUDIOTYPE": 0b111, // normal recording, passenger complaints, alarm recording + "CHANNEL": channel, // request all channels + "QUERYTIME": queryTime, // year + month = xxxxxx + "SERIAL": serial, + "NEWSTREAMTYPE": 0b111, // master stream (bit1) + "RFSTORAGE": 0, // 0 - hdd, 1 - sd + }, + "SESSION": session, + } +} + +// filenames without fileextension +func (e *Package) ResponseFileList(errorCode int, errorCause string, serial int, filenames []string, fileextensions []int, ids []string) { + e.Payload = map[string]any{ + "MODULE": "STORM", + "OPERATION": "QUERYFILELIST", + "RESPONSE": map[string]any{ + "ERRORCODE": errorCode, + "ERRORCAUSE": errorCause, + "SERIAL": serial, + "SENDFILECOUNT": len(filenames), + "RECORD": filenames, + "FILETYPE": fileextensions, + "RECORDID": ids, + }, + } +} + +func (e *Package) RequestFileList(queryTime string, serial int, session string, camNo int64) { + channel := 1 << (camNo - 1) + e.Payload = map[string]any{ + "MODULE": "STORM", + "OPERATION": "QUERYFILELIST", + "PARAMETER": map[string]any{ + "STREAMTYPE": 1, // Main Stream + "FILETYPE": 0b111111, // get all filetypes + "PICMTYPE": 0b10, // fixed timing pictures (fixed framerate) + "APT0": 0xFFFFFF, // get every alarm + "APT1": 0xFFFF, // get every alarm + "AUDIOTYPE": 0b111, // normal recording, passenger complaints, alarm recording + "CHANNEL": channel, // request all channels + "STARTTIME": queryTime + "000000", + "ENDTIME": queryTime + "235959", + "SERIAL": serial, + "NEWSTREAMTYPE": 0b10, // master stream (bit1) + "RFSTORAGE": 0, // 0 - hdd, 1 - sd + }, + "SESSION": session, + } +} diff --git a/utils.go b/utils.go index e422658..09d66af 100644 --- a/utils.go +++ b/utils.go @@ -1,540 +1,14 @@ package n9m import ( - "bytes" "encoding/hex" - "encoding/json" - "fmt" - "os" - - "log" - - "github.com/icza/bitio" - "github.com/tidwall/gjson" ) -var ip string = os.Getenv("SERVER_IP") - -type PayloadJson struct { - Module string - Key string - Operation string - Parameters map[string]interface{} - Response map[string]interface{} -} - -type Package struct { - Version uint64 - Encription uint64 - Mark uint64 - CC uint64 - PayloadType uint64 - SSRC uint64 - Reserved uint64 - CSRC [16]uint64 - - PayloadLen uint64 - GPayload gjson.Result - Payload map[string]interface{} - RawPayload []byte - - Raw []byte - Accum []byte - - Json PayloadJson -} - -// todo разобраться зачем оно ъ +// add bytes to accum func (e *Package) AddToAccum(data []byte) { e.Accum = append(e.Accum, data...) } -func (e *Package) SaveJsonFields() { - if value, exist := e.Payload["MODULE"]; exist { - e.Json.Module = value.(string) - } else { - e.Json.Module = "" - } - - if value, exist := e.Payload["KEY"]; exist { - e.Json.Key = value.(string) - } else { - e.Json.Key = "" - } - - if value, exist := e.Payload["OPERATION"]; exist { - e.Json.Operation = value.(string) - } else { - e.Json.Operation = "" - } - - if value, exist := e.Payload["RESPONSE"]; exist { - e.Json.Response = value.(map[string]interface{}) - } else { - e.Json.Response = make(map[string]interface{}) - } - - if value, exist := e.Payload["PARAMETER"]; exist { - e.Json.Parameters = value.(map[string]interface{}) - } else if value, exist := e.Payload["PARAMETERS"]; exist { - e.Json.Parameters = value.(map[string]interface{}) - } else { - e.Json.Parameters = make(map[string]interface{}) - } -} - -func (e *Package) ReadPackage() bool { - if len(e.Accum) < 12 { - return false - } - - r := bitio.NewReader(bytes.NewBuffer(e.Accum)) - e.Version = r.TryReadBits(2) - e.Encription = r.TryReadBits(1) - e.Mark = r.TryReadBits(1) - e.CC = r.TryReadBits(4) - e.PayloadType = r.TryReadBits(8) - e.SSRC = r.TryReadBits(16) - - log.Println(e.PayloadType) - - is_special := e.Encription == 1 && e.Mark == 1 - if is_special { - r.TryReadBits(8 * 4) - e.PayloadLen = r.TryReadBits(8) - r.TryReadBits(3 * 8) - - if uint64(len(e.Accum)) < e.PayloadLen+12 { - return false - } - } else { - e.PayloadLen = r.TryReadBits(32) - // WTF: e.CC is useless - for i := uint64(0); i < 1; i++ { - e.CSRC[i] = r.TryReadBits(32) - } - } - - numOfBytes := 0 - rawbytes := []byte{} - if e.PayloadLen != 0 { - if e.PayloadLen > 1000000 { - log.Printf("%v\n", e) - log.Panicln("CORRUPTED PACKAGE") - } - - rawbytes = make([]byte, e.PayloadLen) - numOfBytes, _ = r.Read(rawbytes) - } - - if numOfBytes != int(e.PayloadLen) { - return false - } - - e.Raw = e.Accum[:12+e.PayloadLen] - e.Accum = e.Accum[12+e.PayloadLen:] - e.RawPayload = rawbytes - - var ok bool - e.GPayload = gjson.Parse(string(rawbytes)) - e.Payload, ok = e.GPayload.Value().(map[string]interface{}) - if !ok { - e.Payload = gjson.Parse("{}").Value().(map[string]interface{}) - } - - e.SaveJsonFields() - - return e.PayloadLen > 0 -} - -func (e *Package) PackPackage() []byte { - e.SaveJsonFields() - - b := &bytes.Buffer{} - w := bitio.NewWriter(b) - - w.TryWriteBits(e.Version, 2) - w.TryWriteBits(e.Encription, 1) - w.TryWriteBits(e.Mark, 1) - w.TryWriteBits(e.CC, 4) - w.TryWriteBits(e.PayloadType, 8) - w.TryWriteBits(e.SSRC, 16) - conv, err := json.Marshal(e.Payload) - - if err != nil { - fmt.Println(err) - return nil - } - - e.PayloadLen = uint64(len(conv)) - if e.PayloadLen != 0 { - e.PayloadLen++ - } - w.TryWriteBits(e.PayloadLen, 32) - - // WTF: e.CC is useless - for i := uint64(0); i < 1; i++ { - w.TryWriteBits(e.CSRC[i], 32) - } - if e.PayloadLen != 0 { - w.Write(conv) - w.Write([]byte{0}) - } - w.Close() - - return b.Bytes() -} - -func (e *Package) PackRawPackage() []byte { - b := &bytes.Buffer{} - w := bitio.NewWriter(b) - - w.TryWriteBits(e.Version, 2) - w.TryWriteBits(e.Encription, 1) - w.TryWriteBits(e.Mark, 1) - w.TryWriteBits(e.CC, 4) - w.TryWriteBits(e.PayloadType, 8) - w.TryWriteBits(e.SSRC, 16) - e.PayloadLen = uint64(len(e.RawPayload) + 1) - w.TryWriteBits(e.PayloadLen, 32) - - // WTF: e.CC is useless - for i := uint64(0); i < 1; i++ { - w.TryWriteBits(e.CSRC[i], 32) - } - if e.PayloadLen != 0 { - w.Write(e.RawPayload) - w.Write([]byte{0}) - } - w.Close() - - return b.Bytes() -} - -// main server util -func (e *Package) RequestGeolocation(serial int, Sid string) { - e.Payload = map[string]any{ - "MODULE": "DEVEMM", - "OPERATION": "GETPOS", - "PARAMETER": map[string]any{ - "SERIAL": serial, - }, - "SESSION": Sid, - } -} - -func (e *Package) ResponseGeolocation(errorCode int, errorCause string, serial int, longitude float32, latitude float32, altitude float32, speed int, course int, time string) { - e.Payload = map[string]any{ - "MODULE": "DEVEMM", - "OPERATION": "GETPOS", - "RESPONSE": map[string]any{ - "ERRORCODE": errorCode, - "ERRORCAUSE": errorCause, - "SERIAL": serial, - "P": map[string]any{ - "V": errorCode == 0, - "J": fmt.Sprintf("%4.6v", longitude), - "W": fmt.Sprintf("%4.6v", latitude), - "H": fmt.Sprintf("%4.6v", altitude), - "S": speed, // unit - 0.01 km/h - "C": course, // direction (angle from north) - "T": time, // yyyymmddhhmmss - }, - }, - } -} - -func (e *Package) RequestConnect(session string, serial string, numOfCams int) { - e.Payload = map[string]any{ - "MODULE": "CERTIFICATE", - "OPERATION": "CONNECT", - "PARAMETER": map[string]any{ - "DSNO": serial, - "CHANNEL": numOfCams, - }, - "SESSION": session, - } -} - -// video server util -func (e *Package) ResponseConnect(Sid string, streamName string) { - e.Payload = map[string]any{ - "MODULE": "CERTIFICATE", - "OPERATION": "CREATESTREAM", - "RESPONSE": map[string]any{ - "ERRORCODE": 0, - "STREAMNAME": streamName, - }, - "SESSION": Sid, - } -} - -func (e *Package) ResponseCalendar(errorCode int, errorCause string, serial int, dates []string) { - e.Payload = map[string]any{ - "MODULE": "STORM", - "OPERATION": "GETCALENDAR", - "RESPONSE": map[string]any{ - "ERRORCODE": errorCode, - "ERRORCAUSE": errorCause, - "SERIAL": serial, - "COUNT": len(dates), - "CALENDER": dates, - // no CHCALENDER[COUNT] - // no T[COUNT] - }, - } -} - -func (e *Package) RequestCalendar(queryTime string, serial int, session string, camNo int64) { - channel := 1 << (camNo - 1) - e.Payload = map[string]any{ - "MODULE": "STORM", - "OPERATION": "GETCALENDAR", - "PARAMETER": map[string]any{ - "CALENDARTYPE": 1, // Month data - "STREAMTYPE": 1, // Main Stream - "FILETYPE": 0b111111, // get file type - "PICMTYPE": 0b10, // fixed timing pictures (fixed framerate) - "APT0": 0xFFFFFF, // get every alarm - "APT1": 0xFFFF, // get every alarm - "AUDIOTYPE": 0b111, // normal recording, passenger complaints, alarm recording - "CHANNEL": channel, // request all channels - "QUERYTIME": queryTime, // year + month = xxxxxx - "SERIAL": serial, - "NEWSTREAMTYPE": 0b111, // master stream (bit1) - "RFSTORAGE": 0, // 0 - hdd, 1 - sd - }, - "SESSION": session, - } -} - -// filenames without fileextension -func (e *Package) ResponseFileList(errorCode int, errorCause string, serial int, filenames []string, fileextensions []int, ids []string) { - e.Payload = map[string]any{ - "MODULE": "STORM", - "OPERATION": "QUERYFILELIST", - "RESPONSE": map[string]any{ - "ERRORCODE": errorCode, - "ERRORCAUSE": errorCause, - "SERIAL": serial, - "SENDFILECOUNT": len(filenames), - "RECORD": filenames, - "FILETYPE": fileextensions, - "RECORDID": ids, - }, - } -} - -func (e *Package) RequestFileList(queryTime string, serial int, session string, camNo int64) { - channel := 1 << (camNo - 1) - e.Payload = map[string]any{ - "MODULE": "STORM", - "OPERATION": "QUERYFILELIST", - "PARAMETER": map[string]any{ - "STREAMTYPE": 1, // Main Stream - "FILETYPE": 0b111111, // get all filetypes - "PICMTYPE": 0b10, // fixed timing pictures (fixed framerate) - "APT0": 0xFFFFFF, // get every alarm - "APT1": 0xFFFF, // get every alarm - "AUDIOTYPE": 0b111, // normal recording, passenger complaints, alarm recording - "CHANNEL": channel, // request all channels - "STARTTIME": queryTime + "000000", - "ENDTIME": queryTime + "235959", - "SERIAL": serial, - "NEWSTREAMTYPE": 0b10, // master stream (bit1) - "RFSTORAGE": 0, // 0 - hdd, 1 - sd - }, - "SESSION": session, - } -} - -// main server util -func (e *Package) ResponseCertificateConnect(Sid string) { - e.Payload = map[string]any{ - "MODULE": "CERTIFICATE", - "OPERATION": "CONNECT", - "RESPONSE": map[string]any{ - "ERRORCAUSE": "", - "ERRORCODE": 0, - "MASKCMD": 5, - "PRO": "1.0.5", - }, - "SESSION": Sid, - } -} - -// request reqistration parameters (directly to register) -func (e *Package) RequestParameters(params map[string]any, serial int, session string) { - e.Payload = map[string]any{ - "MODULE": "CONFIGMODEL", - "OPERATION": "GET", - "PARAMETER": map[string]any{ - "MDVR": params["MDVR"], - "SERIAL": serial, - }, - "SESSION": session, - } -} // end of 'RequestParameters' function - -// set reigeter parameters (directly to register) -func (e *Package) SetParameters(params map[string]any, serial int, session string) { - e.Payload = map[string]any{ - "MODULE": "CONFIGMODEL", - "OPERATION": "SET", - "PARAMETER": map[string]any{ - "MDVR": params["MDVR"], - "SERIAL": serial, - }, - "SESSION": session, - } - log.Println(e.Payload) -} // end of 'SetParameters' function - -// todo al1 -func (e *Package) ConfigeModel(Sid string) { - e.Payload = map[string]any{ - "MODULE": "CONFIGMODEL", - "OPERATION": "SET", - "PARAMETER": map[string]any{ - "MDVR": map[string]any{ - "KEYS": map[string]any{ // KEY parameters - "GV": 1, // GPS version - }, - "PGDSM": map[string]any{ // Network monitoring status parameters - "PGPS": map[string]any{ // GPS position - "EN": 1, // Real-time position monitoring - "TM": 10, // Time interval - }, - }, - "PSI": map[string]any{ // Platform basic information - "CG": map[string]any{ // Call information - "AS": 0, // Automatic answer - }, - }, - "SUBSTRNET": map[string]any{ - "SM": 1, // 0-Smooth .. 4-Clear - }, - }, - }, - } -} - -// main server util -func (e *Package) MediaRequestAliveVideo(token int, camNo int64, Sid string, serial string, quality int64) { - - channel := 0 - - if camNo == 1 { - channel = 1 - } else { - channel = 1 << (camNo - 1) - } - e.Payload = map[string]any{ - "MODULE": "MEDIASTREAMMODEL", - "OPERATION": "REQUESTALIVEVIDEO", - "PARAMETER": map[string]any{ - "AUDIOVALID": 1, - "CHANNEL": channel, - "FRAMEMODE": 0, - "IPANDPORT": ip + ":12092", - "STREAMNAME": "LIVE" + "_" + serial + "_" + fmt.Sprint(camNo), - "STREAMTYPE": quality, - "SERIAL": token, - }, - "SESSION": Sid, - } -} - -// main server util -func (e *Package) MediaRequestRemotePlayback(token int, serial string, session string, camNo int, date string, begin_time string, end_time string, serverId int) { - e.Payload = map[string]any{ - "MODULE": "MEDIASTREAMMODEL", - "OPERATION": "REQUESTREMOTEPLAYBACK", - "PARAMETER": map[string]any{ - "STREAMNAME": "PLAYBACK" + "_" + fmt.Sprint(serial) + "_" + fmt.Sprint(camNo) + "_" + fmt.Sprint(serverId), - "STREAMTYPE": 1, // main stream - "VIDEOTYPE": 2, // common files - "CHANNEL": 1 << (camNo - 1), - "STARTTIME": date + begin_time, - // "ENDTIME": date + end_time, - "IPANDPORT": ip + ":12092", - "SERIAL": token, - "PBST": 0, - }, - "SESSION": session, - } -} - -// main server util -func (e *Package) ControlRemotePlayback(token int, serial string, session string, camNo int, date string, begin_time string, end_time string, serverId int) { - e.Payload = map[string]any{ - "MODULE": "MEDIASTREAMMODEL", - "OPERATION": "CONTROLREMOTEPLAYBACK", - "PARAMETER": map[string]any{ - "STREAMNAME": fmt.Sprint(serial) + "_" + fmt.Sprint(camNo) + "_" + fmt.Sprint(serverId), - "SERIAL": token, - "PALYBACKCMD": 5, // main stream - "CHANNEL": 268435455, // common files - }, - "SESSION": session, - } -} - -func (e *Package) MediaRequestDownloadVideo(token int, serial string, session string, camNo int, date string, begin_time string, end_time string, recordID string, serverId int) { - e.Payload = map[string]any{ - "MODULE": "MEDIASTREAMMODEL", - "OPERATION": "REQUESTDOWNLOADVIDEO", - "PARAMETER": map[string]any{ - "PT": 3, - "SSRC": 1, - "STREAMNAME": "DOWNLOAD" + "_" + serial + "_" + fmt.Sprint(camNo) + "_" + fmt.Sprint(serverId), - "STREAMTYPE": 1, // main stream - "RECORDID": recordID, - "CHANNEL": 1 << (camNo - 1), - "STARTTIME": date + begin_time, - "ENDTIME": date + end_time, - "OFFSETFLAG": 1, - "OFFSET": 0, - "IPANDPORT": ip + ":12092", - "SERIAL": token, - "DT": 1, // high speed download - }, - "SESSION": session, - } -} - -// main server util -func (e *Package) ResponseAlarm(alarmType int64, alarmUID int64, cmdno int64, cmdtype int64, run int64, serial string, Sid string) { - e.Payload = map[string]any{ - "MODULE": "EVEM", - "OPERATION": "SENDALARMINFO", - "RESPONSE": map[string]any{ - "ALARMTYPE": alarmType, - "ALARMUID": alarmUID, - "CMDNO": cmdno, - "CMDTYPE": cmdtype, - "ERRORCODE": 0, - "RUN": run, - }, - "SESSION": Sid, - } -} - -// main server util -func (e *Package) ResponseConfigModelSet(Sid string) { - e.Payload = map[string]any{ - "MODULE": "CONFIGMODUL", - "OPERATION": "SET", - "RESPONSE": map[string]any{ - "ERRORCODE": 0, - "ERRORCAUSE": "None", - "ERRORDESCRIPTION": "None", - }, - "SESSION": Sid, - } -} - -// todo ъ // why store a string and constantly change it to the same thing // the stored string is not used func (e *Package) GetToken() {