Refactor and simplify package structure and interfaces.
Reorganize code by removing unused files, restructuring package organization, and updating import references to new paths. This simplifies handling of smart and protocol-related operations, improves maintainability, and eliminates redundancy.
This commit is contained in:
@ -3,15 +3,17 @@ package main
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"gitea.unprism.ru/KRBL/n9m/v2"
|
||||
"gitea.unprism.ru/KRBL/n9m/v2/pkg/models"
|
||||
"gitea.unprism.ru/KRBL/n9m/v2/pkg/protocol"
|
||||
"gitea.unprism.ru/KRBL/n9m/v2/pkg/smart"
|
||||
"gitea.unprism.ru/KRBL/n9m/v2/pkg/utils"
|
||||
"io"
|
||||
"net"
|
||||
"os"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
var mainPack *n9m.SmartPackage
|
||||
var videoPack *n9m.SmartPackage
|
||||
var videoPack *smart.SmartChannelPackage
|
||||
|
||||
func main() {
|
||||
conn, err := net.Dial("tcp", "10.100.100.99:9006")
|
||||
@ -20,19 +22,19 @@ func main() {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
var pack = n9m.Package{}
|
||||
var pack = protocol.Package{}
|
||||
|
||||
pack.Payload.Module = "CERTIFICATE"
|
||||
pack.Payload.Operation = "CONNECT"
|
||||
pack.SetParameters(n9m.CertificateConnectClientRequest{})
|
||||
pack.SetParameters(models.CertificateConnectClientRequest{})
|
||||
conn.Write(pack.PackPackage())
|
||||
|
||||
handle(conn, &mainPack)
|
||||
handle(conn)
|
||||
}
|
||||
|
||||
func handleSpecialPackages(_ *n9m.SmartPackage, pack n9m.Package) error {
|
||||
func handleSpecialPackages(_ *smart.SmartPackage, pack protocol.Package) error {
|
||||
switch pack.SSRC {
|
||||
case n9m.SpecialPayloadTypeGPS:
|
||||
case protocol.SpecialPayloadTypeGPS:
|
||||
fmt.Printf("%+v\n", pack.GPS)
|
||||
return nil
|
||||
default:
|
||||
@ -40,15 +42,21 @@ func handleSpecialPackages(_ *n9m.SmartPackage, pack n9m.Package) error {
|
||||
}
|
||||
}
|
||||
|
||||
func handleCertificateConnect(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
var params n9m.CertificateConnectClientResponse
|
||||
func handleLivePackages(_ *smart.SmartPackage, pack protocol.Package) error {
|
||||
fmt.Printf("%+v\n", pack)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func handleCertificateConnect(sPack *smart.SmartPackage, pack protocol.Package) (err error) {
|
||||
var params models.CertificateConnectClientResponse
|
||||
|
||||
if err = pack.GetResponseAs(¶ms); err != nil {
|
||||
return fmt.Errorf("failed to get response: %w", err)
|
||||
}
|
||||
|
||||
var response = n9m.CertificateVerificationRequest{
|
||||
S0: GenerateVerifyKey(params.S0),
|
||||
var response = models.CertificateVerificationRequest{
|
||||
S0: utils.GenerateVerifyKey(params.S0),
|
||||
}
|
||||
|
||||
pack.Payload.Operation = "VERIFY"
|
||||
@ -59,8 +67,8 @@ func handleCertificateConnect(sPack *n9m.SmartPackage, pack n9m.Package) (err er
|
||||
return
|
||||
}
|
||||
|
||||
func handleVerify(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
var params n9m.CertificateVerificationResponse
|
||||
func handleVerify(sPack *smart.SmartPackage, pack protocol.Package) (err error) {
|
||||
var params models.CertificateVerificationResponse
|
||||
|
||||
if err = pack.GetResponseAs(¶ms); err != nil {
|
||||
return fmt.Errorf("failed to get response: %w", err)
|
||||
@ -72,7 +80,7 @@ func handleVerify(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
fmt.Println("шалость НЕ удалась(((")
|
||||
}
|
||||
|
||||
var request = n9m.CertificateLoginRequest{
|
||||
var request = models.CertificateLoginRequest{
|
||||
ClientID: 0,
|
||||
MAC: "",
|
||||
User: "admin",
|
||||
@ -87,8 +95,8 @@ func handleVerify(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func handleLogin(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
var params n9m.CertificateLoginResponse
|
||||
func handleLogin(sPack *smart.SmartPackage, pack protocol.Package) (err error) {
|
||||
var params models.CertificateLoginResponse
|
||||
|
||||
if err = pack.GetResponseAs(¶ms); err != nil {
|
||||
return fmt.Errorf("failed to get response: %w", err)
|
||||
@ -96,37 +104,36 @@ func handleLogin(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
|
||||
conn, err := net.Dial("tcp", "10.100.100.99:9006")
|
||||
|
||||
var request = n9m.CertificateCreateStreamRequest{
|
||||
StreamName: "KRBL",
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
pack.Payload.Operation = "CREATESTREAM"
|
||||
pack.SetParameters(request)
|
||||
videoPack, err = smart.NewSmartChannelPackage(conn, sPack)
|
||||
|
||||
conn.Write(pack.PackPackage())
|
||||
|
||||
go handle(conn, &videoPack)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func handleCreateStream(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
var params n9m.CertificateCreateStreamResponse
|
||||
|
||||
if err = pack.GetResponseAs(¶ms); err != nil {
|
||||
return fmt.Errorf("failed to get response: %w", err)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
if params.ErrorCode != 0 {
|
||||
fmt.Println("Create stream error:", params.ErrorCode, params.ErrorCause)
|
||||
return
|
||||
}
|
||||
go videoPack.Run()
|
||||
|
||||
var request = n9m.MediaStreamModelRequestLiveVideoRequest{
|
||||
StreamName: "KRBL",
|
||||
StreamType: 2,
|
||||
Channel: 1,
|
||||
AudioValid: 1,
|
||||
i := 0
|
||||
|
||||
videoPack.AddLiveSource(2, func(data []byte) error {
|
||||
fmt.Println("Есть контакт!")
|
||||
|
||||
i++
|
||||
|
||||
if i > 10 {
|
||||
return errors.New("я устал")
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
var request = models.MediaStreamModelRequestLiveVideoRequest{
|
||||
StreamName: videoPack.GetChannelName(),
|
||||
StreamType: models.StreamTypeMain,
|
||||
Channel: 4,
|
||||
AudioValid: 4,
|
||||
FrameMode: 0,
|
||||
}
|
||||
|
||||
@ -134,13 +141,13 @@ func handleCreateStream(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
pack.Payload.Operation = "REQUESTALIVEVIDEO"
|
||||
pack.SetParameters(request)
|
||||
|
||||
mainPack.Write(pack.PackPackage())
|
||||
sPack.Write(pack.PackPackage())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func handleRequestLiveVideo(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
var params n9m.MediaStreamModelRequestLiveVideoResponse
|
||||
func handleRequestLiveVideo(sPack *smart.SmartPackage, pack protocol.Package) (err error) {
|
||||
var params models.MediaStreamModelRequestLiveVideoResponse
|
||||
|
||||
if err = pack.GetResponseAs(¶ms); err != nil {
|
||||
return fmt.Errorf("failed to get response: %w", err)
|
||||
@ -151,10 +158,12 @@ func handleRequestLiveVideo(sPack *n9m.SmartPackage, pack n9m.Package) (err erro
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf("%+v\n", params)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func handleKeepAlive(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
func handleKeepAlive(sPack *smart.SmartPackage, pack protocol.Package) (err error) {
|
||||
serial := sPack.Storage["serial"]
|
||||
fmt.Println(serial, "still alive!")
|
||||
|
||||
@ -164,12 +173,12 @@ func handleKeepAlive(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func handleGetConfig(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
func handleGetConfig(sPack *smart.SmartPackage, pack protocol.Package) (err error) {
|
||||
serial := sPack.Storage["serial"]
|
||||
|
||||
os.WriteFile(fmt.Sprintf("./%s.json", serial), pack.RawPayload, 0644)
|
||||
|
||||
var request n9m.ConfigModelSetRequest
|
||||
var request models.ConfigModelSetRequest
|
||||
|
||||
if err = pack.GetParametersAs(&request); err != nil {
|
||||
fmt.Println(err)
|
||||
@ -179,22 +188,22 @@ func handleGetConfig(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func handleUselessAlarms(sPack *n9m.SmartPackage, pack n9m.Package, response n9m.SendAlarmInfoResponse) (err error) {
|
||||
func handleUselessAlarms(sPack *smart.SmartPackage, pack protocol.Package, response models.SendAlarmInfoResponse) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func handleVideoLossAlarm(sPack *n9m.SmartPackage, pack n9m.Package, response n9m.SendAlarmInfoResponse) (err error) {
|
||||
func handleVideoLossAlarm(sPack *smart.SmartPackage, pack protocol.Package, response models.SendAlarmInfoResponse) (err error) {
|
||||
fmt.Println("Video loss alarm!")
|
||||
return nil
|
||||
}
|
||||
|
||||
func handleCameraCoveredAlarm(sPack *n9m.SmartPackage, pack n9m.Package, response n9m.SendAlarmInfoResponse) (err error) {
|
||||
func handleCameraCoveredAlarm(sPack *smart.SmartPackage, pack protocol.Package, response models.SendAlarmInfoResponse) (err error) {
|
||||
fmt.Println("Camera covered alarm!")
|
||||
return nil
|
||||
}
|
||||
|
||||
func handleSPI(_ *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
var params n9m.SpiParameters
|
||||
func handleSPI(_ *smart.SmartPackage, pack protocol.Package) (err error) {
|
||||
var params models.SpiParameters
|
||||
|
||||
if err = pack.GetParametersAs(¶ms); err != nil {
|
||||
return
|
||||
@ -205,47 +214,28 @@ func handleSPI(_ *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func createSmartPackage(conn net.Conn) (pack *n9m.SmartPackage) {
|
||||
pack = n9m.NewSmartPackage(conn)
|
||||
func createSmartPackage(conn net.Conn) (pack *smart.SmartPackage) {
|
||||
pack = smart.NewSmartPackage(conn)
|
||||
|
||||
pack.AddPayloadHandler(n9m.PayloadTypeSpecial, handleSpecialPackages)
|
||||
pack.AddPayloadHandler(protocol.PayloadTypeLive, handleLivePackages)
|
||||
pack.AddPayloadHandler(protocol.PayloadTypeSpecial, handleSpecialPackages)
|
||||
|
||||
pack.AddJSONHandler("CERTIFICATE", "CONNECT", handleCertificateConnect)
|
||||
pack.AddJSONHandler("CERTIFICATE", "VERIFY", handleVerify)
|
||||
pack.AddJSONHandler("CERTIFICATE", "LOGIN", handleLogin)
|
||||
pack.AddJSONHandler("CERTIFICATE", "CREATESTREAM", handleCreateStream)
|
||||
pack.AddJSONHandler("CERTIFICATE", "KEEPALIVE", handleKeepAlive)
|
||||
pack.AddJSONHandler("MEDIASTREAMMODEL", "REQUESTALIVEVIDEO", handleRequestLiveVideo)
|
||||
pack.AddJSONHandler("CONFIGMODEL", "GET", handleGetConfig)
|
||||
pack.AddJSONHandler("DEVEMM", "SPI", handleSPI)
|
||||
|
||||
pack.AddAlarmHandler(n9m.AlarmTypeMotionDetection, handleUselessAlarms)
|
||||
pack.AddAlarmHandler(protocol.AlarmTypeMotionDetection, handleUselessAlarms)
|
||||
|
||||
pack.AddAlarmHandler(n9m.AlarmTypeVideoLoss, handleVideoLossAlarm)
|
||||
pack.AddAlarmHandler(n9m.AlarmTypeCameraCovered, handleCameraCoveredAlarm)
|
||||
pack.AddAlarmHandler(protocol.AlarmTypeVideoLoss, handleVideoLossAlarm)
|
||||
pack.AddAlarmHandler(protocol.AlarmTypeCameraCovered, handleCameraCoveredAlarm)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
/*
|
||||
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
|
||||
}
|
||||
}
|
||||
}()
|
||||
*/
|
||||
|
||||
func isNetConnClosedErr(err error) bool {
|
||||
switch {
|
||||
case
|
||||
@ -258,17 +248,12 @@ func isNetConnClosedErr(err error) bool {
|
||||
}
|
||||
}
|
||||
|
||||
func handle(conn net.Conn, pack **n9m.SmartPackage) {
|
||||
if pack != nil {
|
||||
*pack = createSmartPackage(conn)
|
||||
} else {
|
||||
tmp := createSmartPackage(conn)
|
||||
pack = &tmp
|
||||
}
|
||||
func handle(conn net.Conn) {
|
||||
pack := createSmartPackage(conn)
|
||||
|
||||
var err error
|
||||
for {
|
||||
if err = (*pack).Handle(); err != nil {
|
||||
if err = pack.Handle(); err != nil {
|
||||
fmt.Println("Error:", err)
|
||||
|
||||
if isNetConnClosedErr(err) {
|
||||
|
@ -1,15 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"crypto/hmac"
|
||||
"crypto/md5"
|
||||
"encoding/hex"
|
||||
)
|
||||
|
||||
func GenerateVerifyKey(key string) string {
|
||||
mac := hmac.New(md5.New, []byte(key))
|
||||
|
||||
mac.Write([]byte(key))
|
||||
|
||||
return hex.EncodeToString(mac.Sum(nil))
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
package main
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestGenerateVerifyKey(t *testing.T) {
|
||||
if GenerateVerifyKey("45792d55-0844-4053-848a-64fd0685fb32") != "fae5f19b8452c7bd03dc4f3471966c42" {
|
||||
t.Error()
|
||||
}
|
||||
}
|
@ -3,7 +3,9 @@ package main
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"gitea.unprism.ru/KRBL/n9m/v2"
|
||||
"gitea.unprism.ru/KRBL/n9m/v2/pkg/models"
|
||||
"gitea.unprism.ru/KRBL/n9m/v2/pkg/protocol"
|
||||
"gitea.unprism.ru/KRBL/n9m/v2/pkg/smart"
|
||||
"io"
|
||||
"net"
|
||||
"os"
|
||||
@ -30,9 +32,9 @@ func main() {
|
||||
}
|
||||
}
|
||||
|
||||
func handleSpecialPackages(_ *n9m.SmartPackage, pack n9m.Package) error {
|
||||
func handleSpecialPackages(_ *smart.SmartPackage, pack protocol.Package) error {
|
||||
switch pack.SSRC {
|
||||
case n9m.SpecialPayloadTypeGPS:
|
||||
case protocol.SpecialPayloadTypeGPS:
|
||||
fmt.Printf("%+v\n", pack.GPS)
|
||||
return nil
|
||||
default:
|
||||
@ -40,16 +42,16 @@ func handleSpecialPackages(_ *n9m.SmartPackage, pack n9m.Package) error {
|
||||
}
|
||||
}
|
||||
|
||||
func handleCertificateConnect(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
var params n9m.CertificateConnectRequest
|
||||
func handleCertificateConnect(sPack *smart.SmartPackage, pack protocol.Package) (err error) {
|
||||
var params models.CertificateConnectRequest
|
||||
|
||||
if err = pack.GetParametersAs(¶ms); err != nil {
|
||||
return fmt.Errorf("failed to get parameters: %w", err)
|
||||
}
|
||||
|
||||
var response = n9m.CertificateConnectResponse{
|
||||
var response = models.CertificateConnectResponse{
|
||||
ErrorCode: 0,
|
||||
CommandMask: n9m.CommandMaskAll,
|
||||
CommandMask: models.CommandMaskAll,
|
||||
}
|
||||
|
||||
pack.SetResponse(response)
|
||||
@ -61,7 +63,7 @@ func handleCertificateConnect(sPack *n9m.SmartPackage, pack n9m.Package) (err er
|
||||
fmt.Println("Connected:", params.SerialNumber)
|
||||
sPack.Storage["serial"] = params.SerialNumber
|
||||
|
||||
var request n9m.ConfigModelGetRequest
|
||||
var request models.ConfigModelGetRequest
|
||||
request.MDVR = "?"
|
||||
|
||||
pack.Payload.Module = "CONFIGMODEL"
|
||||
@ -73,7 +75,7 @@ func handleCertificateConnect(sPack *n9m.SmartPackage, pack n9m.Package) (err er
|
||||
return
|
||||
}
|
||||
|
||||
func handleKeepAlive(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
func handleKeepAlive(sPack *smart.SmartPackage, pack protocol.Package) (err error) {
|
||||
serial := sPack.Storage["serial"]
|
||||
fmt.Println(serial, "still alive!")
|
||||
|
||||
@ -83,12 +85,12 @@ func handleKeepAlive(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func handleGetConfig(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
func handleGetConfig(sPack *smart.SmartPackage, pack protocol.Package) (err error) {
|
||||
serial := sPack.Storage["serial"]
|
||||
|
||||
os.WriteFile(fmt.Sprintf("./%s.json", serial), pack.RawPayload, 0644)
|
||||
|
||||
var request n9m.ConfigModelSetRequest
|
||||
var request models.ConfigModelSetRequest
|
||||
|
||||
if err = pack.GetParametersAs(&request); err != nil {
|
||||
fmt.Println(err)
|
||||
@ -98,22 +100,22 @@ func handleGetConfig(sPack *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func handleUselessAlarms(sPack *n9m.SmartPackage, pack n9m.Package, response n9m.SendAlarmInfoResponse) (err error) {
|
||||
func handleUselessAlarms(sPack *smart.SmartPackage, pack protocol.Package, response models.SendAlarmInfoResponse) (err error) {
|
||||
return nil
|
||||
}
|
||||
|
||||
func handleVideoLossAlarm(sPack *n9m.SmartPackage, pack n9m.Package, response n9m.SendAlarmInfoResponse) (err error) {
|
||||
func handleVideoLossAlarm(sPack *smart.SmartPackage, pack protocol.Package, response models.SendAlarmInfoResponse) (err error) {
|
||||
fmt.Println("Video loss alarm!")
|
||||
return nil
|
||||
}
|
||||
|
||||
func handleCameraCoveredAlarm(sPack *n9m.SmartPackage, pack n9m.Package, response n9m.SendAlarmInfoResponse) (err error) {
|
||||
func handleCameraCoveredAlarm(sPack *smart.SmartPackage, pack protocol.Package, response models.SendAlarmInfoResponse) (err error) {
|
||||
fmt.Println("Camera covered alarm!")
|
||||
return nil
|
||||
}
|
||||
|
||||
func handleSPI(_ *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
var params n9m.SpiParameters
|
||||
func handleSPI(_ *smart.SmartPackage, pack protocol.Package) (err error) {
|
||||
var params models.SpiParameters
|
||||
|
||||
if err = pack.GetParametersAs(¶ms); err != nil {
|
||||
return
|
||||
@ -124,20 +126,20 @@ func handleSPI(_ *n9m.SmartPackage, pack n9m.Package) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func createSmartPackage(conn net.Conn) (pack *n9m.SmartPackage) {
|
||||
pack = n9m.NewSmartPackage(conn)
|
||||
func createSmartPackage(conn net.Conn) (pack *smart.SmartPackage) {
|
||||
pack = smart.NewSmartPackage(conn)
|
||||
|
||||
pack.AddPayloadHandler(n9m.PayloadTypeSpecial, handleSpecialPackages)
|
||||
pack.AddPayloadHandler(protocol.PayloadTypeSpecial, handleSpecialPackages)
|
||||
|
||||
pack.AddJSONHandler("CERTIFICATE", "CONNECT", handleCertificateConnect)
|
||||
pack.AddJSONHandler("CERTIFICATE", "KEEPALIVE", handleKeepAlive)
|
||||
pack.AddJSONHandler("CONFIGMODEL", "GET", handleGetConfig)
|
||||
pack.AddJSONHandler("DEVEMM", "SPI", handleSPI)
|
||||
|
||||
pack.AddAlarmHandler(n9m.AlarmTypeMotionDetection, handleUselessAlarms)
|
||||
pack.AddAlarmHandler(protocol.AlarmTypeMotionDetection, handleUselessAlarms)
|
||||
|
||||
pack.AddAlarmHandler(n9m.AlarmTypeVideoLoss, handleVideoLossAlarm)
|
||||
pack.AddAlarmHandler(n9m.AlarmTypeCameraCovered, handleCameraCoveredAlarm)
|
||||
pack.AddAlarmHandler(protocol.AlarmTypeVideoLoss, handleVideoLossAlarm)
|
||||
pack.AddAlarmHandler(protocol.AlarmTypeCameraCovered, handleCameraCoveredAlarm)
|
||||
|
||||
return
|
||||
}
|
||||
|
Reference in New Issue
Block a user