diff --git a/report/AuthReport.tex b/report/AuthReport.tex index adfaa67..fc234dd 100644 --- a/report/AuthReport.tex +++ b/report/AuthReport.tex @@ -206,7 +206,7 @@ % [4]: Caption text % example: \InsertFigure{0.8}{fig:lala}{lala.png}{\eng{Makes lala}} \newcommand{\InsertFigure}[4]{ - \begin{figure*}[ht] + \begin{figure*}[h!] \captionsetup{format=plain} \centering \includegraphics[width=#1\textwidth]{#3} @@ -214,3 +214,24 @@ \label{#2} \end{figure*} } + +% \WrapFigure{}{}{}{} +% [1]: scale +% [2]: place left or right r,l,R,L +% [3]: Label +% [4]: Figure file +% [5]: Caption text +% example: \WrapFigure{0.8}{r}{fig:lala}{lala.png}{\eng{Makes lala}} +\newcommand{\WrapFigure}[5]{ + \begin{wrapfigure}{#2}{#1\textwidth} + \vspace{-30pt} + \begin{center} + \captionsetup{format=plain} + \includegraphics[width=#1\textwidth]{#4} + \caption{#5} + \label{#3} + \end{center} + \vspace{-30pt} + \end{wrapfigure} +} + diff --git a/report/images/ADSL_frequency.png b/report/images/ADSL_frequency.png new file mode 100644 index 0000000..3fc7202 Binary files /dev/null and b/report/images/ADSL_frequency.png differ diff --git a/report/images/pcm-modulator.png b/report/images/pcm-modulator.png new file mode 100644 index 0000000..b425af1 Binary files /dev/null and b/report/images/pcm-modulator.png differ diff --git a/report/report.tex b/report/report.tex index 45a8437..f47a2a9 100644 --- a/report/report.tex +++ b/report/report.tex @@ -2,13 +2,13 @@ % Network programming Lab sum report % % authors: -% Χρήστος Χουτουρίδης ΑΕΜ 8997 -% cchoutou@ece.auth.gr +% Χρήστος Χουτουρίδης ΑΕΜ 8997 +% cchoutou@ece.auth.gr % Document configuration \newcommand{\ClassName}{Δίκτυα Υπολογιστών Ι} -\newcommand{\DocTitle}{Αναφορά 1ης συνόδου} +\newcommand{\DocTitle}{Εργασία δικτυακού προγραμματισμού I} \newcommand{\InstructorName}{Δημήτριος Μητράκος} \newcommand{\InstructorMail}{mitrakos@eng.auth.gr} \newcommand{\CurrentDate}{\today} @@ -19,7 +19,9 @@ %\renewcommand{\AuthorMail}{cchoutou@ece.auth.gr} %\renewcommand{\AuthorAEM}{8997} -\setFancyHead{\ClassName}{Χρήστος Χουτουρίδης 8997} +%\setFancyHead{\ClassName}{Χρήστος Χουτουρίδης 8997} +\fancyhead[L]{\ClassName} +\fancyhead[R]{Χρήστος Χουτουρίδης 8997} % Document % ================= @@ -28,40 +30,162 @@ \FirstPage \tableofcontents -\listoffigures +%\listoffigures %\listoftables \section{Εισαγωγή} -Για την παρούσα σύνοδο ζητήθηκε η λήψη μετρήσεων τουλάχιστον 4 λεπτών μέσω του μηχανισμού \eng{Echo} και του μηχανισμού \eng{AQR}. -Ακόμα ζητήθηκε η λήψη δύο εικόνων από τον \eng{videoCoder} τόσο με σφάλματα όσο και χωρίς. -Τέλος ζητήθηκε μία εικόνα με 4 ίχνη \eng{GPS} από την διαδρομή 1, τα οποία πρέπει να απέχουν μεταξύ τους τουλάχιστων 4 \eng{sec}. -\par Για να είναι ικανή η εξαγωγή συμπερασμάτων για την κατανομή του χρόνου απόκρισης, αλλά και της κατανομής πιθανότητας επανεκπομπών αποφασίσαμε να επεκτείνουμε τον χρόνο μετρήσεων στα 40 λεπτά. -Σε αυτή την απόφαση συνέβαλλε και το γεγονός ότι οι μετρήσεις έγιναν σε τοποθεσία με πάρα πολύ κακή γραμμή και εν μέσω τεχνικών προβλημάτων. -\par Για την ανάλυση των μετρήσεων και την παραγωγή των γραφημάτων χρησιμοποιήσαμε \eng{matlab}. -Τον κώδικα για την ανάλυση μπορείτε να τον βρείτε στον κατάλογο \eng{matlab} του παραδοτέου καθώς και στο αποθετήριο της εργασίας. - -\section{Μετρήσεις μηχανισμού \eng{Echo}} +Η εργασία αυτή αφορά μια εφαρμογή δικτυακού προγραμματισμού που αναπτύχθηκε σε γλώσσα \eng{Java.} +Η εφαρμογή χρησιμοποιήθηκε ως εργαλείο επικοινωνίας με τον \eng{server} του εργαστηρίου “\textbf{Ιθάκη}”, ώστε να πραγματοποιήσει μία σειρά από μετρήσεις και λήψεις δεδομένων. +Με τα δεδομένα των μετρήσεων μπορέσαμε να εξάγουμε συμπεράσματα τόσο για την χρονική απόκριση του \eng{server} και του καναλιού επικοινωνίας, όσο και για την πιθανότητα εσφαλμένης μετάδοσης δεδομένων. +Για την επεξεργασία των δεδομένων και την παρουσίαση των αποτελεσμάτων χρησιμοποιήθηκε το \eng{matlab.} + +\section{Παραδοτέα} +Στο αρχείο που μεταφορτώνεται στην Ιθάκη υπάρχουν: +\begin{itemize} + \item Οι αναφορές σε μορφή \eng{pdf.} + \item Ο κατάλογος \eng{\textbf{matlab}} που περιέχει τον κώδικα που χρησιμοποιήθηκε για την επεξεργασία και μορφοποίηση των αποτελεσμάτων, καθώς και τα δεδομένα από τις συνόδους. + \item Ο κατάλογος \eng{\textbf{src}} που περιέχει τον κώδικα της εφαρμογής. + \item Ο κατάλογος \eng{\textbf{doc}} που περιέχει την τεκμηρίωση του κώδικα σε μορφή \eng{html.} +\end{itemize} +Τέλος στον σύνδεσμο \href{https://git.hoo2.net/hoo2/virtualModem}{\eng{git.hoo2.net/hoo2/virtualModem}} υπάρχει το \textbf{αποθετήριο με τον κώδικα} της εφαρμογής, τον κώδικα των αναφορών καθώς και τον κώδικα \eng{matlab} που χρησιμοποιήσαμε για να επεξεργαστούμε τα δεδομένα. + +% Backround - modem section +% ============================ +\section{Γενικά περί \eng{modem}} +Ξεκινώντας από την ονομασία τους, ο όρος \eng{modem} προέρχεται από τη συνένωση των λέξεων \eng{modulator-demodulator.} +Πρόκειται για ηλεκτρονική συσκευή η οποία είναι ικανή για την μετάδοση δεδομένων από ένα ηλεκτρονικό υπολογιστή σε έναν άλλο. +Ιστορικά οι συσκευές αυτές συνήθως χρησιμοποιούσαν τις τηλεφωνικές γραμμές. +Τα πρώτα \eng{modem} ήταν τα \eng{\textit{bell 101}} και άρχισαν να παράγονται μαζικά το 1958 από την εταιρία \eng{AT\&T}\cite{bell-101}, ώστε να χρησιμοποιηθούν στο υπολογιστικό σύστημα \eng{SAGE}\cite{sage}. +Ένα χαρακτηριστικό των \eng{modem,} το οποίο βρίσκεται κάτω από συνεχή έρευνα για βελτίωση, είναι η ταχύτητα δεδομένων τα οποία μπορούν να μεταδώσουν και η οποία μετράται σε \eng{bit/sec} ή \eng{bps.} +Για το σκοπό αυτό αναπτύχθηκαν πολλά πρωτόκολλα και τεχνολογίες. + +\par Κατά τα τέλη της δεκαετίας του 1990 αρκετές εταιρίες ανταγωνίζονται για να επιτύχουν καλύτερες ταχύτητες μετάδοσης με αποτέλεσμα τον Φεβρουάριο του 1998, η παγκόσμια ένωση τηλεπικοινωνιών να ανακοινώνει το πρότυπο \eng{v90}\cite{itu_v90}. +Δύο χρόνια αργότερα η ίδια το βελτιώνει, παρουσιάζοντας το \eng{v92}\cite{itu_v92}, το οποίο χρησιμοποιεί διαμόρφωση \eng{\textbf{PCM},} τόσο για την λήψη, όσο και για την αποστολή δεδομένων. +Η σπουδαιότητα αυτού φαίνεται από το γεγονός οτι το \eng{PCM} χρησιμοποιείται ευρέως μέχρι και σήμερα. + +\subsection{\eng{PCM - Pulse code modulation}} +\WrapFigure{0.5}{R}{fig:pcm-modulator}{pcm-modulator.png}{Διάγραμμα ενός \eng{PCM}} +Η διαμόρφωση \eng{PCM} είναι η απλούστερη μορφή κωδικοποίησης μιας κυματομορφής. +Το ζητούμενο είναι να μετατραπεί ένα αναλογικό σήμα σε ψηφιακή πληροφορία και το ανάποδο. +Ένας κωδικοποιητής \eng{PCM} χρησιμοποιείται για την παραγωγή ψηφιακής πληροφορίας από ένα αναλογικό σήμα, ενώ ένας αποκωδικοποιητής για αντίθετο. +Οι κωδικοποιητές \eng{PCM} αποτελούνται από τρία βασικά μέρη. +Ένα \textbf{δειγματολήπτη}, ένα \textbf{κβαντιστή} και ένα \textbf{κωδικοποιητή}. + +\par Τα στοιχεία που έκαναν την διαμόρφωση \eng{PCM} μια από τις ποιο βασικές τεχνικές κωδικοποίησης είναι: +\begin{itemize} + \item Η απλότητα του υλικού που απαιτείται για την υλοποίηση. + \item Η μή χρησιμοποίηση φέροντος. + \item Η ευρωστία απέναντι στους θορύβους και τις παρεμβολές. + \item Η ασφάλεια στη μετάδοση, καθώς διευκολύνεται η χρήση κρυπτογράφησης. +\end{itemize} + +\subsection{Αρχή λειτουργίας \eng{PCM}} +Όπως φαίνεται και στο σχήμα \ref{fig:pcm-modulator}, αρχικά το σήμα δειγματοληπτείται. +Εδώ ο δειγματολήπτης πρέπει να χρησιμοποιήσει μια συχνότητα μεγαλύτερη από τη συχνότητα \eng{Nyquist}\cite{shannon-1949}. +Έπειτα το δειγματοληπτημένο σήμα διέρχεται από τον κβαντιστή, απ' όπου και εξέρχεται σε πεπερασμένες στάθμες πλάτους. +Αυτό επιτυγχάνεται καθώς ο κβαντιστής αλλάζει την τιμή πλάτους του σήματος εξόδου σε προκαθορισμένες διακριτές τιμές, επιλέγοντας κάθε φορά μια τιμή που είναι κοντινότερη σε αυτή του σήματος εισόδου. +Τέλος η κάθε στάθμη κωδικοποιείται σε ένα ψηφιακό αριθμό, ομαδοποιείται σε ψηφιακές λέξεις των \eng{n bits} και εξέρχεται από τη διάταξη. + +\subsection{\eng{ADSL}} +\WrapFigure{0.5}{R}{fig:adsl-frequency}{ADSL_frequency.png}{\eng{Βandwith} συχνοτήτων που χρησιμοποιείται για φωνή, αποστολή και λήψη δεδομένων μιας γραμμής \eng{ADSL.}} +Μια ποιο πρόσφατη τεχνολογία στο χώρο των \eng{modem,} είναι η \eng{DSL (digital subscriber line).} +Σε αυτή την τεχνολογία γίνεται χρήση ενός μεγαλύτερου εύρους συχνοτήτων από αυτό της φωνής μιας τηλεφωνικής γραμμής. +Με αυτό τον τρόπο υπάρχει δυνατότητα για μετάδοση δεδομένων με μεγαλύτερο ρυθμό. +Μια υλοποίηση αυτής της τεχνολογίας είναι το \eng{ADSL (Asymmetric digital subscriber line)\cite{ADSL_ANSI-1998}\cite{w.Stallings},} όπου το \eng{bandwith} συχνοτήτων που χρησιμοποιείται για αποστολή δεδομένων είναι διαφορετικού μεγέθους από αυτό που χρησιμοποιείται για την λήψη (σχήμα \ref{fig:adsl-frequency}). + +% Session 1 analysis +% ============================ +\section{Ανάλυση πειραματικών δεδομένων} \subsection{Πρώτη σύνοδος} -Με βάση την απόκριση του συστήματος στα πακέτα \eng{echo} της πρώτης συνόδου διαγράμματος παράξαμε την κατανομή που φαίνεται παρακάτω. - -\InsertFigure{fig:E7837-dist} -{session1/E7837-dist.png} +\InsertFigure{0.9}{fig:E7837-dist}{session1/E7837-dist.png} {Κατανομή του χρόνου απόκρισης του συστήματος για αποστολές\eng{echo} 40 λεπτών} +Με βάση την απόκριση του συστήματος στα πακέτα \eng{echo G1} της πρώτης συνόδου, παράξαμε την κατανομή που φαίνεται στο σχήμα \ref{fig:E7837-dist}. -Με μια πρώτη ματιά μπορούμε να διακρίνουμε ότι ο μέσος χρόνος απόκρισης που φαίνεται στον κύριο λοβό, είναι περίπου 120 \eng{msec}, ενώ ακόμα αυτός είναι μή συμμετρικός και μετατοπισμένος προς τα αριστερά. +\par Με μια πρώτη ματιά μπορούμε να διακρίνουμε ότι ο μέσος χρόνος απόκρισης που φαίνεται στον κύριο λοβό, είναι περίπου 120 \eng{msec}, ενώ ακόμα αυτός είναι μή συμμετρικός και μετατοπισμένος προς τα αριστερά. Ακόμα η κατανομή παρουσιάζει εκτός του κύριου λοβού δύο ακόμα μικρότερους λοβούς σε χρόνους περί τα 180 και 210 \eng{msec} αντίστοιχα. -\subsection{Συμπεράσματα} -Εύκολα μπορεί κάποιος να παρατηρήσει πως οι μικρότεροι λοβοί είναι μια “σχεδόν μικρογραφία” του κύριου. -Αυτό μας οδηγεί στο συμπέρασμα πως δεν πρόκειται για απόκριση που οφείλεται \eng{server} της Ιθάκης, αλλά ίσως κάποια διαφορετική διαδρομή που ακολούθησαν τα συγκεκριμένα πακέτα, η οποία παίρνει περισσότερο χρόνο. -Το γεγονός ότι δημιουργούνται λοβοί, τόσο ο κύριος όσο και οι μικρότεροι, έγκειται στο ότι οι διαδρομές που ακολουθούν τα πακέτα είναι πεπερασμένες. - - -\section{Μετρήσεις μηχανισμού \eng{ARQ}} - - - - - +\par +\InsertFigure{0.9}{fig:ARQ1-dist}{session1/ARQ-dist.png} +{Κατανομή του χρόνου απόκρισης του συστήματος για αποστολές\eng{ARQ} 40 λεπτών} +Αντίστοιχα με βάση την απόκριση του συστήματος για αποστολές με το μηχανισμό \eng{ARQ G2} της πρώτης συνόδου παράξαμε την κατανομή του σχήματος \ref{fig:ARQ1-dist}. +Εδώ μπορούμε να διακρίνουμε επιπλέον μικρούς λοβούς οι οποίοι αφορούν τις κατανομές για πακέτα τα οποία χρειάστηκαν περισσότερες από μία αποστολές. + +\par Εύκολα μπορεί κάποιος να παρατηρήσει πως οι μικρότεροι λοβοί είναι μια “σχεδόν μικρογραφία” του κύριου. +Αυτό μας οδηγεί στο συμπέρασμα πως δεν πρόκειται για απόκριση που οφείλεται στον \eng{server} της Ιθάκης, αλλά ίσως κάποια διαφορετική διαδρομή που ακολούθησαν τα συγκεκριμένα πακέτα, η οποία παίρνει περισσότερο χρόνο. +Φυσικά δεν μπορούμε να αποκλείσουμε τον \eng{server,} καθώς κάλλιστα και αυτός θα μπορούσε να δημιουργεί τεχνικά τις ίδιες καθυστερήσεις. +Το γεγονός όμως ότι δημιουργούνται λοβοί, τόσο ο κύριος όσο και οι μικρότεροι, έγκειται στο ότι οι διαδρομές που ακολουθούν τα πακέτα είναι συγκεκριμένες και πεπερασμένες. + +\par Στο γράφημα του σχήματος \eng{G3} της πρώτης συνόδου φαίνεται ο αριθμός τον εκπομπών ανά πακέτο αλλά και ο κανονικοποιημένος αριθμός των επανεκπομπών. +Αυτός αντιστοιχεί ουσιαστικά στην πιθανότητα που έχει κάποιο πακέτο να χρειαστεί επανεκπομπή. + +\par Η εκτιμώμενη συνάρτηση που προσεγγίζει την πιθανότητα του αριθμού των επανεκπομπών, με βάση τα αποτελέσματα των μετρήσεων της πρώτης συνόδου είναι εκθετική και ακολουθεί την εξίσωση: +\[ + P(n) = 0.740089 e^{-1.36012n} +\] +Όπου \eng{n}, ο αριθμός των επανεκπομπών. + +% Session 2 analysis +% ============================ +\subsection{Δεύτερη σύνοδος} +\InsertFigure{0.9}{fig:E1510-dist}{session2/E1510-dist.png} +{Κατανομή του χρόνου απόκρισης του συστήματος για αποστολές\eng{echo} 60 λεπτών} +Με βάση την απόκριση του συστήματος στα πακέτα \eng{echo G1} της δεύτερης συνόδου, παράξαμε την κατανομή που φαίνεται στο σχήμα \ref{fig:E1510-dist}. + +\par Αρχικά βλέπουμε ότι το σύστημα έχει διπλό “κύριο” λοβό. +Αυτό πρόκυψε γιατί τα δεδομένα λήφθηκαν με σύνδεση μέσω \eng{GSM} και όπως φαίνεται και στο γράφημα \eng{G1} της δεύτερης συνόδου, περίπου μετά τα πρώτα 10000 πακέτα, η απόκριση του συστήματος μειώθηκε. +Η χρήση της γραμμής του \eng{GSM} έγινε λόγω τεχνικών προβλημάτων στην επίγεια γραμμή. +Παρόλα αυτά μπορούμε να παρατηρήσουμε πως οι κύριοι λοβοί δεν παρουσιάζουν την ασυμμετρία που είχαν στις μετρήσεις με την επίγεια γραμμή που είχαμε στην πρώτη σύνοδο. + +\par +\InsertFigure{0.9}{fig:ARQ2-dist}{session2/ARQ-dist.png} +{Κατανομή του χρόνου απόκρισης του συστήματος για αποστολές\eng{ARQ} 60 λεπτών} +Αντίστοιχα με βάση την απόκριση του συστήματος για αποστολές με το μηχανισμό \eng{ARQ G2} της δεύτερης συνόδου παράξαμε την κατανομή του σχήματος \ref{fig:ARQ2-dist}. +Εδώ χρησιμοποιήθηκε πάλι η επίγεια γραμμή, καθώς η βλάβη αποκαταστάθηκε. +Μπορούμε και σε αυτή την περίπτωση, όπως ακριβώς και στην αντίστοιχη της πρώτης συνόδου, να διακρίνουμε επιπλέον μικρούς λοβούς οι οποίοι αφορούν τις κατανομές για πακέτα τα οποία χρειάστηκαν περισσότερες από μία αποστολές. +Αυτή τη φορά η λοβοί είναι πολύ μικρότεροι, καθώς η πιθανότητα σφάλματος αυτή τη φορά είναι μικρότερη. + +\par Στο γράφημα του σχήματος \eng{G3} της δεύτερης συνόδου φαίνεται ο αριθμός τον εκπομπών ανά πακέτο αλλά και ο κανονικοποιημένος αριθμός των επανεκπομπών. +Αυτός και εδώ αντιστοιχεί στην πιθανότητα που έχει κάποιο πακέτο να χρειαστεί επανεκπομπή. + +\par Η εκτιμώμενη συνάρτηση που προσεγγίζει την πιθανότητα του αριθμού των επανεκπομπών, με βάση τα αποτελέσματα των μετρήσεων της δεύτερης συνόδου είναι επίσης εκθετική και ακολουθεί την εξίσωση: +\[ + P(n) = 0.851462 e^{-1.90528n} +\] +Όπου \eng{n}, ο αριθμός των επανεκπομπών. + +% Epilogue +% ============================ +\section{Επίλογος} +Συνολικά παρατηρούμε πως οι αποκρίσεις δεν έχουν σταθερή συμπεριφορά, κάτι που λέει πολλά για το περιβάλλον στο οποίο πρέπει να “ζουν” οι εφαρμογές που επικοινωνούν με το δίκτυο. +Κατά την εκπόνηση μόνο της παρούσας είχαμε τεχνικά προβλήματα στην επίγεια γραμμή όπως η απώλεια πακέτων ακόμη και στο \eng{ping.} +Παρόλα αυτά θεωρούμε ότι καταφέραμε να δημιουργήσουμε μια εφαρμογή που να “μιλάει” τη γλώσσα της \textbf{Ιθάκης} και να μπορεί να λάβει μετρήσεις και δεδομένα με σταθερότητα. +Κλείνοντας την παρούσα εργασία μπορούμε να πούμε πως μας πρόσφερε αρκετό έδαφος για πειραματισμό και αυτό είναι κάτι που εκτιμούμε ιδιαίτερα. + +% References +% ============================ +\begin{thebibliography}{100} + +\bibitem{bell-101} +\href{http://ethw.org/Bell_Telephone_Laboratories,_Inc._List_of_Significant_Innovations_\%26_Discoveries_(1925-1983)}{\eng{Bell Telephone Laboratories, Inc. List of Significant Innovations \& Discoveries (1925-1983)}} + +\bibitem{sage} +\eng{Kent C. Redmond \& Thomas M. Smith (2000). From Whirlwind to MITRE: The R\&D Story of the SAGE Air Defense Computer. MIT Press. ISBN 978-0-262-26426-6.(20th of April 1951 - p.1, National Security Act 1947 - p.12, April 1947 - p.13)} + +\bibitem{itu_v90} +\href{http://www.itu.int/newsarchive/press_releases/1998/04.html}{\eng{"Agreement reached on 56K Modem standard". International Telecommunication Union. 9 February 1998}} + +\bibitem{itu_v92} +\href{http://modemsite.com/56k/v92.asp}{\eng{Modern site: V.92}} + +\bibitem{shannon-1949} +\eng{Shannon, Claude E. (January 1949). "Communication in the presence of noise". Proceedings of the Institute of Radio Engineers. 37 (1): 10–21} + +\bibitem{ADSL_ANSI-1998} +\eng{ANSI T1.413-1998 "Network and Customer Installation Interfaces – Asymmetric Digital Subscriber Line (ADSL) Metallic Interface." (American National Standards Institute 1998)} + +\bibitem{w.Stallings} +\eng{Data and Computer Communications, William Stallings, ISBN 0-13-243310-9, ISBN 978-0-13-243310-5} + +\end{thebibliography} \end{document} \ No newline at end of file diff --git a/report/session1.tex b/report/session1.tex index b8cce55..32f4e15 100644 --- a/report/session1.tex +++ b/report/session1.tex @@ -61,11 +61,11 @@ q = 1 - \sqrt[\uproot{6}128]{\frac{1}{1.35978}} = 0.00239806 => q = 0.2398 \% \] -\par Τέλος με βάση τα πειραματικά αποτελέσματα της συνόδου (σχήμα \ref{fig:ARQ-dist-error}) η εκτιμώμενη συνάρτηση πιθανότητας του αριθμού των επανεκπομπών είναι εκθετική και ακολουθεί την εξίσωση: +\par Τέλος με βάση τα πειραματικά αποτελέσματα της συνόδου (σχήμα \ref{fig:ARQ-dist-error}) η εκτιμώμενη συνάρτηση που προσεγγίζει την πιθανότητα του αριθμού των επανεκπομπών είναι εκθετική και ακολουθεί την εξίσωση: \[ - P(x) = 0.740089 e^{-1.36012x} + P(n) = 0.740089 e^{-1.36012n} \] -Όπου \eng{x}, ο αριθμός των επανεκπομπών. +Όπου \eng{n}, ο αριθμός των επανεκπομπών. \newpage \section{Διαγράμματα και εικόνες από τη σύνοδο} @@ -98,6 +98,6 @@ % GPS \InsertFigure{0.8}{fig:P1124}{session1/P1124-2020-04-11-18:55:50.jpg} -{Εικόνα 8 σημείων της διαδρομής 1, με 10\eng{sec} διαφορά μεταξύ τους.} +{Εικόνα 8 σημείων της διαδρομής 1, εκκινώντας από το ίχνος 600, με 10\eng{sec} διαφορά μεταξύ τους.} \end{document} diff --git a/report/session2.tex b/report/session2.tex index 29b1c6d..7c4dfea 100644 --- a/report/session2.tex +++ b/report/session2.tex @@ -61,7 +61,7 @@ q = 1 - \sqrt[\uproot{6}128]{\frac{1}{1.17522}} = 0.00126057 => q = 0.126 \% \] -\par Τέλος με βάση τα πειραματικά αποτελέσματα της συνόδου (σχήμα \ref{fig:ARQ-dist-error}) η εκτιμώμενη συνάρτηση πιθανότητας του αριθμού των επανεκπομπών είναι εκθετική και ακολουθεί την εξίσωση: +\par Τέλος με βάση τα πειραματικά αποτελέσματα της συνόδου (σχήμα \ref{fig:ARQ-dist-error}) η εκτιμώμενη συνάρτηση που προσεγγίζει την πιθανότητα του αριθμού των επανεκπομπών είναι εκθετική και ακολουθεί την εξίσωση: \[ P(x) = 0.851462 e^{-1.90528x} \] @@ -98,9 +98,9 @@ % GPS \InsertFigure{0.8}{fig:P7683_1}{session2/P7683-2020-04-14-17:30:41.jpg} -{Εικόνα 8 σημείων της διαδρομής 1, με 8\eng{sec} διαφορά μεταξύ τους.} +{Εικόνα 8 σημείων της διαδρομής 1, εκκινώντας από το ίχνος 480, με 8\eng{sec} διαφορά μεταξύ τους.} \InsertFigure{0.8}{fig:P7683_2}{session2/P7683-2020-04-14-17:24:55.jpg} -{Εικόνα 8 σημείων της διαδρομής 1, με 6\eng{sec} διαφορά μεταξύ τους.} +{Εικόνα 8 σημείων της διαδρομής 1, εκκινώντας από το ίχνος 200, με 6\eng{sec} διαφορά μεταξύ τους.} \end{document} diff --git a/report/source.tex b/report/source.tex new file mode 100644 index 0000000..17e2c35 --- /dev/null +++ b/report/source.tex @@ -0,0 +1,1160 @@ +% +% Network programming Lab report source code +% +% authors: +% Χρήστος Χουτουρίδης ΑΕΜ 8997 +% cchoutou@ece.auth.gr + + +% Document configuration +\newcommand{\ClassName}{Δίκτυα Υπολογιστών Ι} +\newcommand{\DocTitle}{Κώδικας εφαρμογής} +\newcommand{\InstructorName}{Δημήτριος Μητράκος} +\newcommand{\InstructorMail}{mitrakos@eng.auth.gr} +\newcommand{\CurrentDate}{\today} + +\input{AuthReport.tex} + +%\renewcommand{\AuthorName}{Χρήστος Χουτουρίδης} +%\renewcommand{\AuthorMail}{cchoutou@ece.auth.gr} +%\renewcommand{\AuthorAEM}{8997} + +\fancyhead[L]{\ClassName} +\fancyhead[R]{Χρήστος Χουτουρίδης 8997} + +% Document +% ================= +\begin{document} + +\FirstPage + +\tableofcontents + +\section{Περιγραφή} +Για την ανάπτυξη του κώδικα χρησιμοποιήσαμε το περιβάλλον \eng{eclipse} και το \eng{openjdk} στην έκδοση 11. +Επειδή η εφαρμογή λειτουργεί ως \eng{command line tool,} χρησιμοποιήσαμε ακόμα το \eng{commons-cli} από \href{http://commons.apache.org/proper/commons-cli/}{\eng{apache commons}} ώς εργαλείο ανάγνωσης των ορισμάτων του χρήστη. +Η υλοποίηση της εφαρμογής είναι πολύ απλή. +Δεν χρησιμοποιούμε \eng{interfaces} ή κληρονομικότητα. +Αντίθετα έχουμε χωρίσει την εφαρμογή σε αυτόνομα αντικείμενα. +Τα αντικείμενα \eng{Com} και \eng{Log} παρέχουν τις βασικές λειτουργίες για την επικοινωνία με τον \eng{server} και την έξοδο του προγράμματος αντίστοιχα. +Τα αντικείμενα αυτά χρησιμοποιούνται απλώς μέσα υπόλοιπα. +Χρησιμοποιούμε δηλαδή την απλούστερη δυνατή τεχνική (\eng{build by composition}). + +\par Τον κώδικα καθώς και την παραγόμενη τεκμηρίωσή του μέσω \eng{JavaDoc} μπορείτε να την βρείτε στο παραδοτέο αρχείο στους καταλόγους \eng{src} και \eng{doc.} +Τέλος στο \href{https://git.hoo2.net/hoo2/virtualModem}{προσωπικό αποθετήριο} του συντάκτη υπάρχει όλος ο κώδικας της εφαρμογής, της εργασίας και της επεξεργασίας των αποτελεσμάτων. +Παραθέτουμε παρακάτω τον κώδικα της εφαρμογής σε μορφή !!κειμένου!!, όπως αυτό ζητήθηκε από την εκφώνηση της εργασίας. +Το κάθε κεφάλαιο αντιστοιχεί σε ξεχωριστό αρχείο του κώδικα. + +\selectlanguage{english} +\titleformat{\section}[block]{\large\textbf}{\thesection.}{1em}{} +\small +\section{virtualModem.java} +\begin{verbatim} +/** + * @file VirtualModem.java + * @brief + * Contain the Main class for the project VirtualModem + * + * Usage examples: + * ========================== + * java -jar ./VirtualModem.jar -v -l Exxxx-$(date +%F-%T).log -e Exxxx 600 + * java -jar ./VirtualModem.jar -v -l Qxxx-Rxxxx-$(date +%F-%T).log -a Qxxxx Rxxxx 600 + * java -jar ./VirtualModem.jar -v -l Pxxxx_600_80_8p-$(date +%F-%T).log -p Pxxxx 600 80 8 P1124-$(date +%F-%T) + * java -jar ./VirtualModem.jar -v -l Mxxxx-$(date +%F-%T).log -g Mxxxx Mxxxx-$(date +%F-%T) 2 + * java -jar ./VirtualModem.jar -v -l Gxxxx-$(date +%F-%T).log -g Gxxxx Gxxxx-$(date +%F-%T) 2 + * + * @author Christos Choutouridis AEM:8997 + * @email cchoutou@ece.auth.gr + */ +package net.hoo2.auth.vmodem; + +/** @name imports */ +/** @{ */ +import org.apache.commons.cli.*; /** command line utility */ +/** @} */ + + +/** + * @class VirtualModem + * + * @brief This is the main control class of the program. + * + * This class includes the main function which read the user input + * and create the appropriate object for the requested sequence to + * retrieve data. + */ +public class VirtualModem { + + /** @name Data */ + /** @{ */ + CommandLine line; /** Command line for the argument list */ + CommandLineParser parser; /** Parser for the argument list */ + Options options; /** Option configuration container */ + HelpFormatter formatter; /** An extra helper for -h */ + Com com; /** Reference to basic configuration module */ + Log log; /** Reference to basic logging module */ + /** @} */ + + /** + * @brief The main constructor of the class + * We allocate memory for the data needed for the command line + */ + public VirtualModem () { + parser = new DefaultParser(); + options = new Options(); + formatter = new HelpFormatter(); + com = new Com(); + + // Create argument options and a basic help file + // for future use. + Option verb = new Option ("v", "verbose", false, "Be more verbose to the console"); + Option help = new Option ("h", "help", false, "Print this message"); + Option timeout = Option.builder("t") + .longOpt("timeout") + .hasArg() + .valueSeparator('=') + .desc("Select timeout in [sec]") + .build(); + Option speed = Option.builder("s") + .longOpt("speed") + .hasArg() + .valueSeparator('=') + .desc("Select speed in [bps]") + .build(); + Option log = Option.builder("l") + .longOpt("log") + .hasArg() + .desc("Log file name to use") + .build(); + Option echo = Option.builder("e") + .longOpt("echo") + .numberOfArgs(2) + .desc ("Request echo sequence where = <1> <2>\n" + + " <1>: The echo requested code from virtual lab\n" + + " <2>: The time duration of the session [sec]") + .build(); + Option arq = Option.builder("a") + .longOpt("arq") + .numberOfArgs(3) + .desc ("Request arq sequence where = <1> <2> <3>\n" + + " <1>: The ACK requested code for virtual lab\n" + + " <2>: The NACK requested code from virtual lab\n" + + " <2>: The time duration for the session [sec]") + .build(); + Option img = Option.builder("g") + .longOpt("img") + .numberOfArgs(3) + .desc("Request an image sequence where = <1> <2> <3>\n" + + " <1>: The image requested code from virtual lab\n" + + " <2>: The filename to use for storing the image (without .jpg)\n" + + " <3>: The requested images to fetch.") + .build(); + Option gps = Option.builder("p") + .longOpt("gps") + .numberOfArgs(5) // G8164 10 800 8 gps_10_800 + .desc("Request a GPS sequence where = <1> <2> <3> <4>\n" + + " <1>: The gps requested code from virtual lab\n" + + " <2>: The time from trace to use as starting point [sec]\n" + + " <3>: The time duration for the trace to fetch [sec]\n" + + " <4>: The number of points to fetch from the above trace\n" + + " <5>: The filename to use for storing the image (without .jpg)") + .build(); + options.addOption(verb); + options.addOption(help); + options.addOption(timeout); + options.addOption(speed); + options.addOption(log); + options.addOption(echo); + options.addOption(arq); + options.addOption(img); + options.addOption(gps); + } + + /** @name private api */ + /**@{*/ + + /** + * parse the command line arguments + * @param args the arguments to parse + * @return the status of the operation + */ + private boolean getCmdOptions (String[] args) { + try { + // parse the command line arguments + line = parser.parse (options, args); + } + catch( ParseException exp ) { + // oops, something went wrong + System.err.println( "Parsing command line failed: " + exp.getMessage() ); + return false; + } + return true; + } + + /** + * Dispatch the correct functionality based on arguments + * @return the status of the operation (currently true) + */ + private boolean commandDispatcher () { + boolean verbose = false; + + if (line.hasOption("help")) { + formatter.printHelp( "virtualModem", options ); + return true; + } + + // Get log and verbose options first + if (line.hasOption("verbose")) + verbose = true; + if (line.hasOption("log")) + log = new Log (line.getOptionValue("log"), verbose); + else + log = new Log (null, verbose); + if (log.open() != true) + return false; + + // get other options + if (line.hasOption("timeout")) { + com.timeout(Integer.parseInt(line.getOptionValue("timeout"))); + } + if (line.hasOption("speed")) { + com.speed(Integer.parseInt(line.getOptionValue("speed"))); + } + + // Execution dispatcher + if (line.hasOption("echo")) { + byte[] code = line.getOptionValues("echo")[0].getBytes(); + Echo e = new Echo(com, log, code, + Integer.valueOf(line.getOptionValues("echo")[1])); + if (com.open()) { + e.caption(code); + e.run(); + com.close(); + } + } + else if (line.hasOption("arq")) { + byte[] ack = line.getOptionValues("arq")[0].getBytes(); + byte[] nack = line.getOptionValues("arq")[1].getBytes(); + ARQ a = new ARQ(com, log, ack, nack, + Integer.valueOf(line.getOptionValues("arq")[2])); + if (com.open()) { + a.caption(ack, nack); + a.run(); + com.close(); + } + } + else if (line.hasOption("img")) { + byte[] code = line.getOptionValues("img")[0].getBytes(); + Image im = new Image (com, log, code, + line.getOptionValues("img")[1], + Integer.valueOf(line.getOptionValues("img")[2])); + if (com.open()) { + im.caption(code); + im.run(); + com.close(); + } + } + else if (line.hasOption("gps")) { + byte[] code = line.getOptionValues("gps")[0].getBytes(); + GPS g = new GPS ( + com, log, code, + Integer.valueOf(line.getOptionValues("gps")[1]), + Integer.valueOf(line.getOptionValues("gps")[2]), + Integer.valueOf(line.getOptionValues("gps")[3]) + ); + Image im = new Image ( + com, log, null, + line.getOptionValues("gps")[4], 1 + ); + if (com.open()) { + g.caption(); + im.code(g.run().getBytes()); + im.run(); + com.close(); + } + } + + log.close(); + return true; + } + /**@}*/ + + + /** + * @brief Main function + */ + public static void main(String[] args) { + // allocate the main object + VirtualModem vmodem = new VirtualModem(); + + // prepare command line input + if (vmodem.getCmdOptions (args) != true) + return; + // Call the requested functionality + if (vmodem.commandDispatcher() != true) + return; + } +} +\end{verbatim} + +\section{Com.java} +\begin{verbatim} +/** + * @file Com.java + * + * @author Christos Choutouridis AEM:8997 + * @email cchoutou@ece.auth.gr + */ +package net.hoo2.auth.vmodem; + +/** @name imports */ +/** @{ */ +import java.util.Arrays; +import ithakimodem.*; +/** @} */ + +/** + * @class Com + * + * Wrapper object of the provided Modem class to provide + * a convenient and common API for all the session functionalities + */ +class Com { + static final int SPEED_DEFAULT = 48000; /** default communication speed [bps] */ + static final int TIMEOUT_DEFAULT = 2000; /** default timeout values [sec] */ + static final String URL_DEFAULT = "ithaki"; /** Default destination. Ithaki of-course */ + + private Modem modem_; /** Ref to Modem */ + private int speed_; /** Communication speed [bps] */ + private int timeout_; /** communication timeout [sec] */ + + /** + * Basic constructor + */ + Com () { + modem_ = new Modem(); + speed_ = SPEED_DEFAULT; + timeout_ = TIMEOUT_DEFAULT; + modem_.setSpeed(speed_); + modem_.setTimeout(timeout_); + } + /** A more fancy constructor + * + * @param log Reference to Log to use + * @param speed The desired speed [bps] + * @param timeout The desired timeout [sec] + * @note + * Currently not used + */ + Com (Log log, int speed, int timeout) { + modem_ = new Modem(); + speed_ = speed; + timeout_ = timeout; + modem_.setSpeed(speed_); + modem_.setTimeout(timeout_); + } + + /** @name Mutator interface */ + /**@{ */ + /** Get the current timeout value [sec] */ + int timeout () { return timeout_; } + /** Set the timeout value [sec] */ + void timeout (int timeout) { + if (timeout_ != timeout) { + timeout_ = timeout; + modem_.setTimeout(timeout_); + } + } + /** Get the current speed [bps] */ + int speed () { return speed_; } + /** Set the speed [bps] */ + void speed (int speed) { + if (speed_ != speed) { + speed_ = speed; + modem_.setSpeed(speed_); + } + } + /**@} */ + + /** @name Public API of the class */ + /**@{ */ + /** Open a communication channel with a URL */ + boolean open (String url) { return modem_.open(url); } + /** Open a communication channel with Ithaki */ + boolean open () { return modem_.open(URL_DEFAULT); } + /** Close the connection */ + boolean close() { return modem_.close(); } + + /** + * @grief The basic communication functionality + * + * This function sends a request to server and return the response. In order to + * do that, the main reading loop seeks for the starting pattern and use the data + * from that point up to the ending pattern. This is very helpful for binary incoming + * data. + * @note + * Blocking mode + * @param data Reference to Transaction data to use @see Transaction + * @param code The request code to send + * @param begin The starting pattern of the response data + * @param end The ending pattern of the response data + * @param bin A flag to indicate that the data are in binary form + * @return Reference to Transaction object with the response data. @see Transaction + */ + Transaction request (Transaction data, byte[] code, byte[] begin, byte[] end, boolean bin) { + int ch =0; + boolean have_begin = (begin != null) ? false : true; + boolean incoming = false; + + // Clear the receive buffer first + _clear (data.response, 0, data.response.length); + if (code != null) { + // if we have a request + data.code = code; // store the request code for the transaction + modem_.write(data.code); // send the code and mark the time + modem_.write((int)'\r'); + data.departure = System.currentTimeMillis();// - (long)((8*(data.code.length+1))*(1000.0/speed_)); + } + + // main receive loop + data.size =0; + do { + // escape guard for memory protection + if (data.size >= data.response.length) { + data.size =0; + return data; + } + // read the data byte from server + try { + ch = modem_.read(); + } + catch (Exception e) { + // Oops!!!! something went wrong. Break and return :( + System.err.println (e.getMessage()); + data.size =0; + return data; + } + if (!incoming) { + // first byte triggered. mark the time + incoming = true; + data.arrival = System.currentTimeMillis();// - (long)(8*(1000.0/speed_)); + } + data.response [data.size++] = (byte)ch; // store the byte + + if (!have_begin && (detect(data.response, begin, data.size) != -1)) { + // If begin pattern detected, start over. + _clear(data.response, 0, data.size); + data.size = _copy (data.response, begin); + have_begin = true; + } + } while ( + ch != -1 && ( + !have_begin || ( + (bin || (detect (data.response, "\r\n\n\n".getBytes(), data.size) == -1)) + && (bin || (detect (data.response, "NO CARRIER".getBytes(), data.size) == -1)) + && (detect (data.response, end, data.size) == -1) + ) + ) + ); + /*^ + * We loop until: + * 1) server returns -1 + * 2) A end pattern arrives + * 3) A "\r\n\n\n" sequence arrives (in character mode, not for binary files) + * 4) A "NO CARRIER" sequence arrives (in character mode, not for binary files) + */ + return data; + } + + /** + * @brief + * A pattern detect functionality. + * + * Search in data input for the pattern and return its position if found. + * @note + * O(n^2) in time. + * @param data The data buffer to search into + * @param pattern The pattern to search for + * @param max The maximum length to search + * @return The position of pattern in data, or -1 if not found + */ + static int detect (byte[] data, byte[] pattern, int max) { + if (pattern != null) { + for (int i =0 ; i= src.length) { + for (int i=0 ; i1) + file = filename_ + "_" + i + ".jpg"; + else + file = filename_ + ".jpg"; + line = new String(code_) + ": "; + log_.write(line); + transaction_ = com_.request(transaction_, code_, IMAGE_BEGIN, IMAGE_END, true); + line = "File= " + file + + " Tr= " + (transaction_.arrival - transaction_.departure) + " [msec]" + + " Tt= " + (System.currentTimeMillis() - transaction_.departure) + " [msec]"; + log_.write(line); + try { + ostream = new BufferedOutputStream(new FileOutputStream(file)); + ostream.write(transaction_.response); + ostream.flush(); + ostream.close(); + } + catch (Exception exp) { + System.err.println ("Error creating " + file + exp.getMessage()); + return; + } + } + } +} +\end{verbatim} + +\end{document} \ No newline at end of file