52 lines
1.3 KiB
Go
52 lines
1.3 KiB
Go
package envelope
|
|
|
|
import "strings"
|
|
|
|
func IsRealtimeTelemetryFrame(env FrameEnvelope) bool {
|
|
if env.ParseStatus == ParseBadFrame {
|
|
return false
|
|
}
|
|
switch env.Protocol {
|
|
case ProtocolGB32960:
|
|
command := strings.TrimSpace(env.MessageID)
|
|
if command == "" && env.Parsed != nil {
|
|
if header, ok := env.Parsed["header"].(map[string]any); ok {
|
|
command = strings.TrimSpace(stringAny(header["command"]))
|
|
}
|
|
}
|
|
if strings.EqualFold(command, "0x02") || strings.EqualFold(command, "0x03") {
|
|
return true
|
|
}
|
|
_, hasDataUnits := env.Parsed["data_units"]
|
|
return hasDataUnits || hasRealtimeField(env)
|
|
case ProtocolJT808:
|
|
if strings.EqualFold(strings.TrimSpace(env.MessageID), "0x0200") {
|
|
return true
|
|
}
|
|
if _, ok := env.Parsed["location"]; ok {
|
|
return true
|
|
}
|
|
return hasRealtimeField(env)
|
|
case ProtocolYutongMQTT:
|
|
data, ok := env.Parsed["data"].(map[string]any)
|
|
return ok && len(data) > 0
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
func hasRealtimeField(env FrameEnvelope) bool {
|
|
return env.Fields[FieldLatitude] != nil ||
|
|
env.Fields[FieldLongitude] != nil ||
|
|
env.Fields[FieldTotalMileageKM] != nil ||
|
|
env.Fields[FieldSpeedKMH] != nil ||
|
|
env.Fields[FieldSOCPercent] != nil
|
|
}
|
|
|
|
func stringAny(value any) string {
|
|
if text, ok := value.(string); ok {
|
|
return text
|
|
}
|
|
return ""
|
|
}
|