Introduced the SmartPackage struct to simplify and centralize logic for handling various payloads, including JSON and alarms. Moved specific handlers into dedicated functions and utilized maps for dynamic process function assignment. Improved error handling and modularity for better scalability and maintainability.
156 lines
3.6 KiB
Go
156 lines
3.6 KiB
Go
package n9m
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
type PayloadType uint8
|
|
|
|
const (
|
|
PayloadTypeData PayloadType = 0
|
|
PayloadTypeLive PayloadType = 2
|
|
PayloadTypeDownload PayloadType = 3
|
|
PayloadTypePlayback PayloadType = 4
|
|
PayloadTypeCapturedPhotos PayloadType = 6
|
|
PayloadTypeParameterImport PayloadType = 10
|
|
PayloadTypeParameterExport PayloadType = 11
|
|
PayloadTypeTransmissionSubStream PayloadType = 15
|
|
PayloadTypeRecordingSubStream PayloadType = 16
|
|
PayloadTypeBlackBox PayloadType = 17
|
|
PayloadTypeSpecial PayloadType = 22
|
|
PayloadTypeMaintainData PayloadType = 30
|
|
)
|
|
|
|
type SpecialPayloadType uint16
|
|
|
|
const (
|
|
SpecialPayloadTypeHeartbeat SpecialPayloadType = iota
|
|
SpecialPayloadTypeHeartbeatWithoutBody
|
|
SpecialPayloadTypeGPS
|
|
SpecialPayloadTypeMileage
|
|
SpecialPayloadTypeEnvironmentalQuality
|
|
SpecialPayloadTypeDrivingPosture
|
|
SpecialPayloadTypeScanningGun
|
|
SpecialPayloadTypeOil
|
|
SpecialPayloadTypeGDS
|
|
SpecialPayloadTypeGPSToBWS
|
|
SpecialPayloadTypeCANBOX
|
|
SpecialPayloadTypeGSenor
|
|
SpecialPayloadTypeAckGPS
|
|
)
|
|
|
|
type Message struct {
|
|
Module string `json:"MODULE"`
|
|
Session string `json:"SESSION"`
|
|
Operation string `json:"OPERATION"`
|
|
Parameter interface{} `json:"PARAMETER,omitempty"`
|
|
Response interface{} `json:"RESPONSE,omitempty"`
|
|
}
|
|
|
|
// 3.4.5.27.1
|
|
type GPSData struct {
|
|
GPSStatus uint8
|
|
Expand uint8
|
|
Real uint8
|
|
Longitude float64
|
|
Latitude float64
|
|
Speed float64
|
|
Direction float64
|
|
Altitude int32
|
|
Time time.Time
|
|
}
|
|
|
|
func (g *GPSData) MarshalJSON() ([]byte, error) {
|
|
var alias struct {
|
|
GPSStatus uint8 `json:"V"`
|
|
Longitude string `json:"J"`
|
|
Latitude string `json:"W"`
|
|
Speed uint `json:"S"`
|
|
Direction uint `json:"C"`
|
|
Altitude int32 `json:"H"`
|
|
Time string `json:"T"`
|
|
}
|
|
|
|
alias.GPSStatus = g.GPSStatus
|
|
alias.Longitude = fmt.Sprintf("%.6f", g.Longitude)
|
|
alias.Latitude = fmt.Sprintf("%.6f", g.Latitude)
|
|
alias.Speed = uint(g.Speed * 100)
|
|
alias.Direction = uint(g.Direction * 100)
|
|
alias.Altitude = g.Altitude
|
|
alias.Time = g.Time.Format("20060102150405")
|
|
|
|
return json.Marshal(alias)
|
|
}
|
|
|
|
func (g *GPSData) UnmarshalJSON(data []byte) (err error) {
|
|
var alias struct {
|
|
GPSStatus uint8 `json:"V"`
|
|
Longitude string `json:"J"`
|
|
Latitude string `json:"W"`
|
|
Speed uint `json:"S"`
|
|
Direction uint `json:"C"`
|
|
Altitude int32 `json:"H"`
|
|
Time string `json:"T"`
|
|
}
|
|
|
|
if err = json.Unmarshal(data, &alias); err != nil {
|
|
return
|
|
}
|
|
|
|
g.GPSStatus = alias.GPSStatus
|
|
|
|
if g.Longitude, err = strconv.ParseFloat(alias.Longitude, 64); err != nil {
|
|
return fmt.Errorf("invalid longitude: %w", err)
|
|
}
|
|
|
|
if g.Latitude, err = strconv.ParseFloat(alias.Latitude, 64); err != nil {
|
|
return fmt.Errorf("invalid latitude: %w", err)
|
|
}
|
|
|
|
g.Speed = float64(alias.Speed) / 100.0
|
|
g.Direction = float64(alias.Direction) / 100.0
|
|
g.Altitude = alias.Altitude
|
|
g.Time, _ = time.Parse("20060102150405", alias.Time)
|
|
|
|
return nil
|
|
}
|
|
|
|
type Package struct {
|
|
Version uint8
|
|
EncryptionFlag bool
|
|
CompressFlag bool
|
|
CSRCCount uint8
|
|
|
|
PayloadType PayloadType
|
|
SSRC SpecialPayloadType
|
|
Reserved uint64
|
|
CSRC [16]uint64
|
|
|
|
GPS GPSData
|
|
|
|
payloadLen uint64
|
|
Payload Message
|
|
RawPayload []byte
|
|
|
|
Accum []byte
|
|
}
|
|
|
|
type ProcessFunc func(*SmartPackage, Package) error
|
|
type AlarmProcessFunc func(*SmartPackage, Package, SendAlarmInfoResponse) error
|
|
|
|
type SmartPackage struct {
|
|
pack Package
|
|
|
|
conn net.Conn
|
|
buff []byte
|
|
|
|
payloadProcess map[PayloadType]ProcessFunc
|
|
jsonProcess map[string]ProcessFunc
|
|
alarmProcess map[AlarmType]AlarmProcessFunc
|
|
Storage map[string]interface{}
|
|
}
|