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.
265 lines
6.0 KiB
Go
265 lines
6.0 KiB
Go
package main
|
||
|
||
import (
|
||
"errors"
|
||
"fmt"
|
||
"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 videoPack *smart.SmartChannelPackage
|
||
|
||
func main() {
|
||
conn, err := net.Dial("tcp", "10.100.100.99:9006")
|
||
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
|
||
var pack = protocol.Package{}
|
||
|
||
pack.Payload.Module = "CERTIFICATE"
|
||
pack.Payload.Operation = "CONNECT"
|
||
pack.SetParameters(models.CertificateConnectClientRequest{})
|
||
conn.Write(pack.PackPackage())
|
||
|
||
handle(conn)
|
||
}
|
||
|
||
func handleSpecialPackages(_ *smart.SmartPackage, pack protocol.Package) error {
|
||
switch pack.SSRC {
|
||
case protocol.SpecialPayloadTypeGPS:
|
||
fmt.Printf("%+v\n", pack.GPS)
|
||
return nil
|
||
default:
|
||
return fmt.Errorf("unhandled special operation: %d", pack.SSRC)
|
||
}
|
||
}
|
||
|
||
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 = models.CertificateVerificationRequest{
|
||
S0: utils.GenerateVerifyKey(params.S0),
|
||
}
|
||
|
||
pack.Payload.Operation = "VERIFY"
|
||
pack.SetParameters(response)
|
||
|
||
sPack.Write(pack.PackPackage())
|
||
|
||
return
|
||
}
|
||
|
||
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)
|
||
}
|
||
|
||
if params.ErrorCode == 0 {
|
||
fmt.Println("ШАЛОСТЬ УДАЛАСЬ!")
|
||
} else {
|
||
fmt.Println("шалость НЕ удалась(((")
|
||
}
|
||
|
||
var request = models.CertificateLoginRequest{
|
||
ClientID: 0,
|
||
MAC: "",
|
||
User: "admin",
|
||
Password: "",
|
||
}
|
||
|
||
pack.Payload.Operation = "LOGIN"
|
||
pack.SetParameters(request)
|
||
|
||
sPack.Write(pack.PackPackage())
|
||
|
||
return
|
||
}
|
||
|
||
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)
|
||
}
|
||
|
||
conn, err := net.Dial("tcp", "10.100.100.99:9006")
|
||
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
|
||
videoPack, err = smart.NewSmartChannelPackage(conn, sPack)
|
||
|
||
if err != nil {
|
||
panic(err)
|
||
}
|
||
|
||
go videoPack.Run()
|
||
|
||
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,
|
||
}
|
||
|
||
pack.Payload.Module = "MEDIASTREAMMODEL"
|
||
pack.Payload.Operation = "REQUESTALIVEVIDEO"
|
||
pack.SetParameters(request)
|
||
|
||
sPack.Write(pack.PackPackage())
|
||
|
||
return
|
||
}
|
||
|
||
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)
|
||
}
|
||
|
||
if params.ErrorCode != 0 {
|
||
fmt.Println("Request live stream error:", params.ErrorCode, params.ErrorCause)
|
||
return
|
||
}
|
||
|
||
fmt.Printf("%+v\n", params)
|
||
|
||
return
|
||
}
|
||
|
||
func handleKeepAlive(sPack *smart.SmartPackage, pack protocol.Package) (err error) {
|
||
serial := sPack.Storage["serial"]
|
||
fmt.Println(serial, "still alive!")
|
||
|
||
pack.SetResponse(nil)
|
||
sPack.Write(pack.PackPackage())
|
||
|
||
return
|
||
}
|
||
|
||
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 models.ConfigModelSetRequest
|
||
|
||
if err = pack.GetParametersAs(&request); err != nil {
|
||
fmt.Println(err)
|
||
return err
|
||
}
|
||
|
||
return
|
||
}
|
||
|
||
func handleUselessAlarms(sPack *smart.SmartPackage, pack protocol.Package, response models.SendAlarmInfoResponse) (err error) {
|
||
return nil
|
||
}
|
||
|
||
func handleVideoLossAlarm(sPack *smart.SmartPackage, pack protocol.Package, response models.SendAlarmInfoResponse) (err error) {
|
||
fmt.Println("Video loss alarm!")
|
||
return nil
|
||
}
|
||
|
||
func handleCameraCoveredAlarm(sPack *smart.SmartPackage, pack protocol.Package, response models.SendAlarmInfoResponse) (err error) {
|
||
fmt.Println("Camera covered alarm!")
|
||
return nil
|
||
}
|
||
|
||
func handleSPI(_ *smart.SmartPackage, pack protocol.Package) (err error) {
|
||
var params models.SpiParameters
|
||
|
||
if err = pack.GetParametersAs(¶ms); err != nil {
|
||
return
|
||
}
|
||
|
||
fmt.Printf("%+v\n", params)
|
||
|
||
return
|
||
}
|
||
|
||
func createSmartPackage(conn net.Conn) (pack *smart.SmartPackage) {
|
||
pack = smart.NewSmartPackage(conn)
|
||
|
||
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", "KEEPALIVE", handleKeepAlive)
|
||
pack.AddJSONHandler("MEDIASTREAMMODEL", "REQUESTALIVEVIDEO", handleRequestLiveVideo)
|
||
pack.AddJSONHandler("CONFIGMODEL", "GET", handleGetConfig)
|
||
pack.AddJSONHandler("DEVEMM", "SPI", handleSPI)
|
||
|
||
pack.AddAlarmHandler(protocol.AlarmTypeMotionDetection, handleUselessAlarms)
|
||
|
||
pack.AddAlarmHandler(protocol.AlarmTypeVideoLoss, handleVideoLossAlarm)
|
||
pack.AddAlarmHandler(protocol.AlarmTypeCameraCovered, handleCameraCoveredAlarm)
|
||
|
||
return
|
||
}
|
||
|
||
func isNetConnClosedErr(err error) bool {
|
||
switch {
|
||
case
|
||
errors.Is(err, net.ErrClosed),
|
||
errors.Is(err, io.EOF),
|
||
errors.Is(err, syscall.EPIPE):
|
||
return true
|
||
default:
|
||
return false
|
||
}
|
||
}
|
||
|
||
func handle(conn net.Conn) {
|
||
pack := createSmartPackage(conn)
|
||
|
||
var err error
|
||
for {
|
||
if err = pack.Handle(); err != nil {
|
||
fmt.Println("Error:", err)
|
||
|
||
if isNetConnClosedErr(err) {
|
||
return
|
||
}
|
||
}
|
||
}
|
||
}
|