Added support for handling various payload types, including GPS and alarms, with new structures and constants. Introduced helper methods for JSON marshalling/unmarshalling of GPS data and modularized the handling of certificates, configurations, and alarms. Implemented foundational server code for testing and expanded several package functionalities.
175 lines
3.9 KiB
Go
175 lines
3.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"gitea.unprism.ru/KRBL/n9m"
|
|
"net"
|
|
"os"
|
|
)
|
|
|
|
func main() {
|
|
ln, err := net.Listen("tcp", "0.0.0.0:5556")
|
|
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
for {
|
|
var conn net.Conn
|
|
|
|
conn, err = ln.Accept()
|
|
|
|
if err != nil {
|
|
continue
|
|
}
|
|
|
|
go handle(conn)
|
|
}
|
|
}
|
|
|
|
func handle(conn net.Conn) {
|
|
var err error
|
|
var rn int
|
|
|
|
var serial string
|
|
|
|
packS := n9m.Package{}
|
|
tmp := make([]byte, 1024)
|
|
|
|
for {
|
|
rn, err = conn.Read(tmp)
|
|
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
|
|
packS.AddToAccum(tmp[:rn])
|
|
|
|
for packS.ReadPackage() {
|
|
switch packS.PayloadType {
|
|
case n9m.PayloadTypeData:
|
|
combined := packS.Payload.Module + ":" + packS.Payload.Operation
|
|
|
|
switch combined {
|
|
case "CERTIFICATE:CONNECT":
|
|
var params n9m.CertificateConnectRequest
|
|
|
|
if err = packS.GetParametersAs(¶ms); err != nil {
|
|
fmt.Println(combined, err)
|
|
return
|
|
}
|
|
|
|
var response = n9m.CertificateConnectResponse{
|
|
ErrorCode: 0,
|
|
CommandMask: n9m.CommandMaskAll,
|
|
}
|
|
|
|
packS.SetResponse(response)
|
|
|
|
if _, err = conn.Write(packS.PackPackage()); err != nil {
|
|
fmt.Println(combined, err)
|
|
return
|
|
}
|
|
|
|
fmt.Println("Connected:", params.SerialNumber)
|
|
serial = params.SerialNumber
|
|
|
|
var request n9m.ConfigModelGetRequest
|
|
request.MDVR = "?"
|
|
packS.Payload.Module = "CONFIGMODEL"
|
|
packS.Payload.Operation = "GET"
|
|
packS.SetParameters(request)
|
|
|
|
conn.Write(packS.PackPackage())
|
|
|
|
/*
|
|
go func() {
|
|
pack := packS
|
|
pack.Payload.Module = "EVEM"
|
|
pack.Payload.Operation = "GALARMING"
|
|
|
|
ticker := time.NewTicker(5 * time.Second)
|
|
defer ticker.Stop()
|
|
|
|
for range ticker.C {
|
|
fmt.Println("Sent!")
|
|
if _, err := conn.Write(pack.PackPackage()); err != nil {
|
|
fmt.Println("Failed to send GALARMING:", err)
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
*/
|
|
case "CERTIFICATE:KEEPALIVE":
|
|
packS.SetResponse(nil)
|
|
if _, err = conn.Write(packS.PackPackage()); err != nil {
|
|
fmt.Println(combined, err)
|
|
return
|
|
}
|
|
|
|
fmt.Println("Connection is still alive!")
|
|
case "EVEM:GGALARMING":
|
|
fmt.Println(string(packS.RawPayload))
|
|
|
|
var response n9m.EventModelGetAlarmingResponse
|
|
if err = packS.GetResponseAs(&response); err != nil {
|
|
fmt.Println(combined, err)
|
|
continue
|
|
}
|
|
|
|
fmt.Printf("%+v\n", response)
|
|
case "CONFIGMODEL:GET":
|
|
os.WriteFile(fmt.Sprintf("./%s.json", serial), packS.RawPayload, 0644)
|
|
case "EVEM:SENDALARMINFO":
|
|
var params n9m.SendAlarmInfoParameters
|
|
var response n9m.SendAlarmInfoResponse
|
|
|
|
if err = packS.GetParametersAs(¶ms); err != nil {
|
|
fmt.Printf("Error: %s\nData: %s", err, packS.RawPayload)
|
|
continue
|
|
}
|
|
|
|
response.ErrorCode = 0
|
|
response.AlarmType = params.AlarmType
|
|
response.CommandType = params.CommandType
|
|
response.AlarmUID = params.AlarmUID
|
|
response.NumberOfRestarts = params.NumberOfRestarts
|
|
response.InstructionSerial = params.InstructionSerial
|
|
|
|
switch params.AlarmType {
|
|
case n9m.AlarmTypeMotionDetection:
|
|
break
|
|
case n9m.AlarmTypeVideoLoss, n9m.AlarmTypeCameraCovered:
|
|
var cameraParams n9m.SendAlarmInfoCameraParameters
|
|
|
|
if err = packS.GetParametersAs(&cameraParams); err != nil {
|
|
fmt.Printf("Error: %s\nData: %s", err, packS.RawPayload)
|
|
continue
|
|
}
|
|
|
|
fmt.Printf("%+v\n", cameraParams)
|
|
|
|
packS.SetResponse(response)
|
|
conn.Write(packS.PackPackage())
|
|
default:
|
|
fmt.Println("Unknown alarm type:", params.AlarmType)
|
|
}
|
|
default:
|
|
fmt.Println("Strange operation:", combined)
|
|
}
|
|
|
|
case n9m.PayloadTypeSpecial:
|
|
switch packS.SSRC {
|
|
case n9m.SpecialPayloadTypeGPS:
|
|
fmt.Printf("%+v\n", packS.GPS)
|
|
default:
|
|
fmt.Println("Unhandled special operation:", packS.SSRC)
|
|
}
|
|
default:
|
|
fmt.Println("Unhandled operation:", packS.PayloadType)
|
|
}
|
|
}
|
|
}
|
|
}
|