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 "" }