Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Κατά τη διάρκεια της καραντίνας, μου προτάθηκε να συμμετάσχω στην ανάπτυξη μιας συσκευής για τη μέτρηση της ταχύτητας των μόντεμ LTE για αρκετούς χειριστές κινητής τηλεφωνίας.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Ο πελάτης ήθελε να αξιολογήσει την ταχύτητα διαφόρων τηλεπικοινωνιακών φορέων σε διαφορετικές γεωγραφικές τοποθεσίες, προκειμένου να μπορέσει να καταλάβει ποιος φορέας κινητής τηλεφωνίας ήταν ο βέλτιστος για αυτόν κατά την εγκατάσταση εξοπλισμού χρησιμοποιώντας σύνδεση LTE, για παράδειγμα, για εκπομπές βίντεο. Ταυτόχρονα, το πρόβλημα έπρεπε να λυθεί όσο πιο απλά και φθηνά γινόταν, χωρίς ακριβό εξοπλισμό.

Θα πω αμέσως ότι η εργασία δεν είναι η πιο απλή και εντατική γνώση· θα σας πω ποια προβλήματα αντιμετώπισα και πώς τα έλυσα. Λοιπόν πάμε.

Σημείωση

Η μέτρηση της ταχύτητας μιας σύνδεσης LTE είναι ένα πολύ περίπλοκο θέμα: πρέπει να επιλέξετε τον σωστό εξοπλισμό και τεχνική μέτρησης και επίσης να έχετε καλή κατανόηση της τοπολογίας και της λειτουργίας του κυψελοειδούς δικτύου. Επιπλέον, η ταχύτητα μπορεί να επηρεαστεί από διάφορους παράγοντες: τον αριθμό των συνδρομητών σε μια κυψέλη, τις καιρικές συνθήκες, ακόμη και από κυψέλη σε κυψέλη, η ταχύτητα μπορεί να ποικίλλει δραματικά λόγω της τοπολογίας του δικτύου. Γενικά, αυτό είναι ένα πρόβλημα με έναν τεράστιο αριθμό αγνώστων και μόνο ένας τηλεπικοινωνιακός φορέας μπορεί να το λύσει σωστά.

Αρχικά, ο πελάτης ήθελε απλώς να οδηγήσει το courier με τα τηλέφωνα των χειριστών, να κάνει μετρήσεις απευθείας στο τηλέφωνο και στη συνέχεια να γράψει τα αποτελέσματα της μέτρησης ταχύτητας σε ένα σημειωματάριο. Η λύση μου για τη μέτρηση της ταχύτητας των δικτύων lte, αν και δεν είναι ιδανική, λύνει το πρόβλημα.

Λόγω έλλειψης χρόνου, πήρα αποφάσεις όχι υπέρ της ευκολίας ή της πρακτικότητας, αλλά υπέρ της ταχύτητας ανάπτυξης. Για παράδειγμα, το αντίστροφο ssh χρησιμοποιήθηκε για απομακρυσμένη πρόσβαση, αντί για το πιο πρακτικό VPN, προκειμένου να εξοικονομηθεί χρόνος στη ρύθμιση του διακομιστή και κάθε μεμονωμένου πελάτη.

Τεχνικό έργο

Όπως αναφέρεται στο άρθρο Χωρίς τεχνικές προδιαγραφές: γιατί ο πελάτης δεν το θέλει: Μην δουλεύετε χωρίς τεχνικές προδιαγραφές! Ποτέ, πουθενά!

Το τεχνικό έργο ήταν αρκετά απλό, θα το επεκτείνω λίγο για την κατανόηση του τελικού χρήστη. Η επιλογή των τεχνικών λύσεων και του εξοπλισμού υπαγορεύτηκε από τον πελάτη. Έτσι, η ίδια η τεχνική προδιαγραφή, μετά από όλες τις εγκρίσεις:

Βασίζεται σε έναν υπολογιστή με μία πλακέτα vim2 κάντε έναν ελεγκτή ταχύτητας για συνδέσεις lte μέσω μόντεμ Huawei e3372h - 153 αρκετοί τηλεπικοινωνιακοί φορείς (από ένα έως ν). Είναι επίσης απαραίτητο να λαμβάνετε συντεταγμένες από δέκτη GPS που είναι συνδεδεμένος μέσω UART. Κάντε μετρήσεις ταχύτητας χρησιμοποιώντας την υπηρεσία www.speedtest.net και βάλτε τα σε έναν πίνακα όπως:

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Πίνακας σε μορφή csv. Στη συνέχεια, στείλτε αυτό το σήμα με e-mail κάθε 6 ώρες. Σε περίπτωση σφαλμάτων, αναβοσβήνει το LED που είναι συνδεδεμένο στο GPIO.

Περιέγραψα τις τεχνικές προδιαγραφές σε ελεύθερη μορφή, μετά από πολλές εγκρίσεις. Αλλά το νόημα της εργασίας είναι ήδη ορατό. Για όλα δόθηκε μια εβδομάδα. Στην πραγματικότητα όμως κράτησε τρεις εβδομάδες. Αυτό λαμβάνοντας υπόψη το γεγονός ότι το έκανα μόνο μετά την κύρια δουλειά μου και τα Σαββατοκύριακα.

Εδώ θέλω για άλλη μια φορά να επιστήσω την προσοχή στο γεγονός ότι ο πελάτης συμφώνησε εκ των προτέρων για τη χρήση της υπηρεσίας μέτρησης ταχύτητας και του υλικού, γεγονός που περιόρισε σημαντικά τις δυνατότητές μου. Ο προϋπολογισμός ήταν επίσης περιορισμένος, επομένως δεν αγοράστηκε τίποτα ιδιαίτερο. Έπρεπε λοιπόν να παίξουμε με αυτούς τους κανόνες.

Αρχιτεκτονική και ανάπτυξη

Το σχήμα είναι απλό και προφανές. Ως εκ τούτου, θα το αφήσω χωρίς κανένα ιδιαίτερο σχόλιο.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Αποφάσισα να υλοποιήσω ολόκληρο το έργο σε python, παρά το γεγονός ότι δεν είχα καθόλου εμπειρία ανάπτυξης σε αυτήν τη γλώσσα. Το επέλεξα γιατί υπήρχαν ένα σωρό έτοιμα παραδείγματα και λύσεις που θα μπορούσαν να επιταχύνουν την ανάπτυξη. Ως εκ τούτου, ζητώ από όλους τους επαγγελματίες προγραμματιστές να μην επιπλήξουν την πρώτη μου εμπειρία ανάπτυξης σε python και χαίρομαι πάντα να ακούω εποικοδομητική κριτική για να βελτιώσω τις δεξιότητές μου.

Επίσης στη διαδικασία ανακάλυψα ότι η python έχει δύο εκδόσεις 2 και 3 που τρέχουν, με αποτέλεσμα να καταλήξω στην τρίτη.

Κόμβοι υλικού

Μονής πλάκας vim2

Μου έδωσαν έναν υπολογιστή μονής πλακέτας ως κύριο μηχάνημα vim2

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Ένας εξαιρετικός, ισχυρός επεξεργαστής πολυμέσων για ένα έξυπνο σπίτι και SMART-TV, αλλά εξαιρετικά ακατάλληλος για αυτήν την εργασία ή, ας πούμε, κακώς κατάλληλος. Για παράδειγμα, το κύριο λειτουργικό του σύστημα είναι το Android και το Linux είναι ένα δευτερεύον λειτουργικό σύστημα και, κατά συνέπεια, κανείς δεν εγγυάται την υψηλή ποιότητα λειτουργίας όλων των κόμβων και προγραμμάτων οδήγησης στο Linux. Και υποθέτω ότι ορισμένα από τα προβλήματα σχετίζονταν με τα προγράμματα οδήγησης USB αυτής της πλατφόρμας, επομένως τα μόντεμ δεν λειτουργούσαν όπως αναμενόταν σε αυτήν την πλακέτα. Έχει επίσης πολύ κακή και διάσπαρτη τεκμηρίωση, οπότε κάθε επιχείρηση χρειαζόταν πολύ χρόνο σκάβοντας στις αποβάθρες. Ακόμη και η συνηθισμένη δουλειά με το GPIO πήρε πολύ αίμα. Για παράδειγμα, μου πήρε αρκετές ώρες για να ρυθμίσω το LED. Αλλά, για να είμαστε αντικειμενικοί, ουσιαστικά δεν είχε σημασία τι είδους μονή πλακέτα ήταν, το κυριότερο ήταν ότι λειτουργούσε και υπήρχαν θύρες USB.

Πρώτα, πρέπει να εγκαταστήσω το Linux σε αυτόν τον πίνακα. Για να μην ψάξω τα άγρια ​​της τεκμηρίωσης για όλους, αλλά και για όσους θα ασχοληθούν με αυτό το σύστημα ενιαίου πίνακα, γράφω αυτό το κεφάλαιο.

Υπάρχουν δύο επιλογές για να εγκαταστήσετε το Linux: σε εξωτερική κάρτα SD ή σε εσωτερικό MMC. Πέρασα ένα βράδυ προσπαθώντας να καταλάβω πώς να το κάνω να λειτουργεί με την κάρτα, έτσι αποφάσισα να το εγκαταστήσω στο MMC, αν και χωρίς αμφιβολία θα ήταν πολύ πιο εύκολο να δουλέψω με μια εξωτερική κάρτα.

Σχετικά με το υλικολογισμικό στραβά είπε εδώ. Μεταφράζω από το περίεργο στα ρωσικά. Για να αναβοσβήσω την πλακέτα, πρέπει να συνδέσω το υλικό UART. Το συνέδεσε με τον παρακάτω τρόπο.

  • Καρφίτσα εργαλείου GND: <—> Pin17 του GPIO των VIM
  • Καρφίτσωμα εργαλείου TXD: <—> Pin18 του GPIO των VIM (Linux_Rx)
  • Tool Pin RXD: <—> Pin19 του GPIO των VIM (Linux_Tx)
  • Εργαλείο Pin VCC: <—> Pin20 του GPIO των VIM

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Μετά από αυτό, κατέβασα το υλικολογισμικό ως εκ τούτου,. Συγκεκριμένη έκδοση υλικολογισμικού VIM1_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.

Για να ανεβάσω αυτό το υλικολογισμικό, χρειάζομαι βοηθητικά προγράμματα. Περισσότερες λεπτομέρειες σχετικά με αυτό εδώ. Δεν έχω δοκιμάσει να το αναβοσβήσω στα Windows, αλλά πρέπει να σας πω λίγα λόγια για το υλικολογισμικό στο Linux. Αρχικά, θα εγκαταστήσω τα βοηθητικά προγράμματα σύμφωνα με τις οδηγίες.

git clone https://github.com/khadas/utils
cd /path/to/utils
sudo ./INSTALL

Aaand... Τίποτα δεν λειτουργεί. Πέρασα μερικές ώρες για να επεξεργαστώ τα σενάρια εγκατάστασης, ώστε όλα να εγκατασταθούν σωστά για μένα. Δεν θυμάμαι τι έκανα εκεί, αλλά υπήρχε και εκείνο το τσίρκο με άλογα. Οπότε να προσέχεις. Αλλά χωρίς αυτά τα βοηθητικά προγράμματα δεν έχει νόημα να βασανίζουμε περαιτέρω το vim2. Καλύτερα να μην τα βάζεις καθόλου μαζί του!

Μετά από επτά κύκλους της κόλασης, διαμόρφωση σεναρίου και εγκατάσταση, έλαβα ένα πακέτο βοηθητικών προγραμμάτων εργασίας. Συνέδεσα την πλακέτα μέσω USB στον υπολογιστή μου Linux και συνέδεσα επίσης το UART σύμφωνα με το παραπάνω διάγραμμα.
Ρυθμίζω το αγαπημένο μου τερματικό minicom για ταχύτητα 115200, χωρίς έλεγχο σφαλμάτων υλικού και λογισμικού. Και ας ξεκινήσουμε.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Κατά τη φόρτωση του VIM2 στο τερματικό UART, πατάω ένα πλήκτρο, όπως το πλήκτρο διαστήματος, για να σταματήσει η φόρτωση. Αφού εμφανιστεί η γραμμή

kvim2# 

Εισάγω την εντολή:

kvim2# run update

Στον κεντρικό υπολογιστή από τον οποίο φορτώνουμε, εκτελώ:

burn-tool -v aml -b VIM2 -i  VIM2_Ubuntu-server-bionic_Linux-4.9_arm64_EMMC_V20191231.img

Αυτό είναι, φευ. Έλεγξα, υπάρχει Linux στον πίνακα. Σύνδεση/κωδικός πρόσβασης khadas:khadas.

Μετά από αυτό, μερικές μικρές αρχικές ρυθμίσεις. Για περαιτέρω εργασία, απενεργοποιώ τον κωδικό πρόσβασης για το sudo (ναι, όχι ασφαλές, αλλά βολικό).

sudo visudo

Επεξεργάζομαι τη γραμμή στη φόρμα και αποθηκεύω

# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) NOPASSWD: ALL

Στη συνέχεια αλλάζω την τρέχουσα τοπική ρύθμιση ώστε η ώρα να είναι στη Μόσχα, διαφορετικά θα είναι στο Γκρίνουιτς.

sudo timedatectl set-timezone Europe/Moscow

ή

ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Εάν το βρίσκετε δύσκολο, μην χρησιμοποιήσετε αυτόν τον πίνακα, το Raspberry Pi είναι καλύτερο. Τίμια.

Μόντεμ Huawei e3372h – 153

Αυτό το μόντεμ ήταν μια σημαντική πηγή αίματος για μένα και, στην πραγματικότητα, έγινε το σημείο συμφόρησης όλου του έργου. Γενικά, το όνομα "μόντεμ" για αυτές τις συσκευές δεν αντικατοπτρίζει καθόλου την ουσία της δουλειάς: αυτός είναι ένας ισχυρός συνδυασμός, αυτό το κομμάτι υλικού έχει μια σύνθετη συσκευή που προσποιείται ότι είναι ένα CD-ROM για να εγκαταστήσει προγράμματα οδήγησης, και μετά μεταβαίνει σε λειτουργία κάρτας δικτύου.

Αρχιτεκτονικά, από τη σκοπιά ενός χρήστη Linux, μετά από όλες τις ρυθμίσεις, μοιάζει με αυτό: μετά τη σύνδεση του μόντεμ, έχω μια διεπαφή δικτύου eth*, η οποία μέσω dhcp λαμβάνει τη διεύθυνση IP 192.168.8.100 και την προεπιλεγμένη πύλη είναι 192.168.8.1.

Και η πιο σημαντική στιγμή! Αυτό το μοντέλο μόντεμ δεν μπορεί να λειτουργήσει σε λειτουργία μόντεμ, η οποία ελέγχεται από εντολές AT. Όλα θα ήταν πολύ πιο απλά, δημιουργήστε συνδέσεις PPP για κάθε μόντεμ και στη συνέχεια λειτουργήστε με αυτές. Αλλά στην περίπτωσή μου, ο "ο ίδιος" (ακριβέστερα, ένας δύτης Linux σύμφωνα με τους κανόνες του udev), δημιουργεί μια διεπαφή eth και της εκχωρεί μια διεύθυνση IP μέσω dhcp.

Για να αποφύγετε περαιτέρω σύγχυση, προτείνω να ξεχάσετε τη λέξη «μόντεμ» και να πείτε κάρτα δικτύου και πύλη, γιατί στην ουσία είναι σαν να συνδέετε μια νέα κάρτα δικτύου με μια πύλη.
Όταν υπάρχει ένα μόντεμ, αυτό δεν προκαλεί ειδικά προβλήματα, αλλά όταν υπάρχουν περισσότερα από ένα, δηλαδή n-κομμάτια, εμφανίζεται η παρακάτω εικόνα δικτύου.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Δηλαδή, n κάρτες δικτύου, με την ίδια διεύθυνση IP, η καθεμία με την ίδια προεπιλεγμένη πύλη. Αλλά στην πραγματικότητα, το καθένα από αυτά συνδέεται με τον δικό του χειριστή.

Αρχικά, είχα μια απλή λύση: χρησιμοποιώντας την εντολή ifconfig ή ip, απενεργοποιήστε όλες τις διεπαφές και απλώς ενεργοποιήστε τη μία με τη σειρά και δοκιμάστε την. Η λύση ήταν καλή για όλους, εκτός από το ότι κατά τις στιγμές μεταγωγής δεν μπορούσα να συνδεθώ στη συσκευή. Και επειδή η εναλλαγή είναι συχνή και γρήγορη, στην πραγματικότητα δεν είχα καμία ευκαιρία να συνδεθώ.

Ως εκ τούτου, επέλεξα τη διαδρομή χειροκίνητης αλλαγής των διευθύνσεων IP των μόντεμ και στη συνέχεια οδήγηση της κυκλοφορίας χρησιμοποιώντας ρυθμίσεις δρομολόγησης.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Αυτό δεν ήταν το τέλος των προβλημάτων μου με τα μόντεμ: σε περίπτωση προβλημάτων τροφοδοσίας, έπεφταν και χρειαζόταν μια καλή σταθερή τροφοδοσία ρεύματος στον διανομέα USB. Έλυσα αυτό το πρόβλημα συγκολλώντας σκληρά το ρεύμα απευθείας στον διανομέα. Ένα άλλο πρόβλημα που αντιμετώπισα και το οποίο κατέστρεψε ολόκληρο το έργο: μετά από επανεκκίνηση ή κρύα εκκίνηση της συσκευής, δεν εντοπίστηκαν όλα τα μόντεμ και όχι πάντα, και δεν μπορούσα να προσδιορίσω γιατί συνέβη αυτό και με ποιον αλγόριθμο. Πρώτα όμως πρώτα.

Για να λειτουργεί σωστά το μόντεμ, εγκατέστησα το πακέτο usb-modeswitch.

sudo apt update
sudo apt install -y usb-modeswitch

Μετά από αυτό, μετά τη σύνδεση, το μόντεμ θα εντοπιστεί και θα διαμορφωθεί σωστά από το υποσύστημα udev. Ελέγχω συνδέοντας απλώς το μόντεμ και βεβαιώνομαι ότι εμφανίζεται το δίκτυο.
Ένα άλλο πρόβλημα που δεν μπόρεσα να λύσω: πώς μπορώ να βρω το όνομα του χειριστή με τον οποίο συνεργαζόμαστε από αυτό το μόντεμ; Το όνομα χειριστή περιέχεται στη διεπαφή ιστού του μόντεμ στη διεύθυνση 192.168.8.1. Αυτή είναι μια δυναμική ιστοσελίδα που λαμβάνει δεδομένα μέσω αιτημάτων Ajax, επομένως η απλή wgeting της σελίδας και η ανάλυση του ονόματος δεν θα λειτουργήσει. Άρχισα λοιπόν να κοιτάζω πώς να αναπτύξω μια ιστοσελίδα κ.λπ., και συνειδητοποίησα ότι έκανα κάποιου είδους ανοησίες. Ως αποτέλεσμα, έφτυσε και ο χειριστής άρχισε να λαμβάνει χρησιμοποιώντας το ίδιο το Speedtest API.

Θα ήταν πολύ πιο εύκολο αν το μόντεμ είχε πρόσβαση μέσω εντολών AT. Θα ήταν δυνατό να το διαμορφώσετε εκ νέου, να δημιουργήσετε μια σύνδεση ppp, να εκχωρήσετε μια IP, να αποκτήσετε έναν τηλεπικοινωνιακό φορέα κ.λπ. Αλλά δυστυχώς, δουλεύω με αυτό που μου έχουν δοθεί.

GPS

Ο δέκτης GPS που μου δόθηκε είχε διεπαφή UART και τροφοδοσία. Δεν ήταν η καλύτερη λύση, αλλά ήταν ακόμα εφαρμόσιμη και απλή. Ο δέκτης έμοιαζε κάπως έτσι.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Για να είμαι ειλικρινής, αυτή ήταν η πρώτη μου φορά που δούλευα με δέκτη GPS, αλλά όπως περίμενα, τα πάντα είχαν σχεδιαστεί για εμάς εδώ και πολύ καιρό. Χρησιμοποιούμε λοιπόν έτοιμες λύσεις.

Αρχικά, ενεργοποιώ το uart_AO_B (UART_RX_AO_B, UART_TX_AO_B) για τη σύνδεση του GPS.

khadas@Khadas:~$ sudo fdtput -t s /dtb.img /serial@c81004e0 status okay

Στη συνέχεια ελέγχω την επιτυχία της επέμβασης.

khadas@Khadas:~$ fdtget /dtb.img /serial@c81004e0 status
okay

Αυτή η εντολή προφανώς επεξεργάζεται το devtree on the fly, κάτι που είναι πολύ βολικό.

Μετά την επιτυχία αυτής της λειτουργίας, επανεκκινήστε και εγκαταστήστε τον δαίμονα GPS.

khadas@Khadas:~$ sudo reboot

Εγκατάσταση του δαίμονα GPS. Εγκαθιστώ τα πάντα και τα κόβω αμέσως για περαιτέρω διαμόρφωση.

sudo apt install gpsd gpsd-clients -y
sudo killall gpsd
 
/* GPS daemon stop/disable */
sudo systemctl stop gpsd.socket
sudo systemctl disable gpsd.socket

Επεξεργασία του αρχείου ρυθμίσεων.

sudo vim /etc/default/gpsd

Εγκαθιστώ ένα UART στο οποίο θα κρέμεται το GPS.

DEVICES="/dev/ttyS4"

Και μετά ανάβουμε τα πάντα και ξεκινάμε.

/* GPS daemon enable/start */
sudo systemctl enable gpsd.socket
sudo systemctl start gpsd.socket

Μετά από αυτό, συνδέω το GPS.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Το καλώδιο GPS είναι στα χέρια μου, τα καλώδια εντοπισμού σφαλμάτων UART είναι ορατά κάτω από τα δάχτυλά μου.

Κάνω επανεκκίνηση και ελέγχω τη λειτουργία του GPS χρησιμοποιώντας το πρόγραμμα gpsmon.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Δεν μπορείτε να δείτε τους δορυφόρους σε αυτό το στιγμιότυπο οθόνης, αλλά μπορείτε να δείτε την επικοινωνία με τον δέκτη GPS και αυτό σημαίνει ότι όλα είναι καλά.

Στην python, δοκίμασα πολλές επιλογές για να δουλέψω με αυτόν τον δαίμονα, αλλά συμφώνησα με αυτή που λειτούργησε σωστά με τον python 3.

Εγκαθιστώ την απαραίτητη βιβλιοθήκη.

sudo -H pip3 install gps3 

Και σμιλεύω τον κώδικα εργασίας.

from gps3.agps3threaded import AGPS3mechanism
...

def getPositionData(agps_thread):
	counter = 0;
	while True:
		longitude = agps_thread.data_stream.lon
		latitude = agps_thread.data_stream.lat
		if latitude != 'n/a' and longitude != 'n/a':
			return '{}' .format(longitude), '{}' .format(latitude)
		counter = counter + 1
		print ("Wait gps counter = %d" % counter)
		if counter == 10:
			ErrorMessage("Ошибка GPS приемника!!!")
			return "NA", "NA"
		time.sleep(1.0)
...
f __name__ == '__main__':
...
	#gps
	agps_thread = AGPS3mechanism()  # Instantiate AGPS3 Mechanisms
	agps_thread.stream_data()  # From localhost (), or other hosts, by example, (host='gps.ddns.net')
	agps_thread.run_thread()  # Throttle time to sleep after an empty lookup, default '()' 0.2 two tenths of a second

Αν χρειαστεί να πάρω συντεταγμένες, αυτό γίνεται με την ακόλουθη κλήση:

longitude, latitude = getPositionData(agps_thread)

Και μέσα σε 1-10 δευτερόλεπτα είτε θα πάρω τη συντεταγμένη είτε όχι. Ναι, έκανα δέκα προσπάθειες να πάρω συντεταγμένες. Δεν είναι βέλτιστο, στραβό και λοξό, αλλά λειτουργεί. Αποφάσισα να το κάνω αυτό γιατί το GPS μπορεί να έχει κακή λήψη και να μην λαμβάνει πάντα δεδομένα. Εάν περιμένετε να λάβετε δεδομένα, τότε εάν εργάζεστε σε απομακρυσμένο δωμάτιο, το πρόγραμμα θα παγώσει σε αυτό το μέρος. Επομένως, εφάρμοσα αυτή την άκομψη επιλογή.

Κατ 'αρχήν, εάν υπήρχε περισσότερος χρόνος, θα ήταν δυνατή η λήψη δεδομένων από το GPS απευθείας μέσω UART, η ανάλυση σε ξεχωριστό νήμα και η εργασία με αυτό. Αλλά δεν υπήρχε καθόλου χρόνος, εξ ου και ο βάναυσα άσχημος κώδικας. Και ναι, δεν ντρέπομαι.

Δίοδος εκπομπής φωτός

Η σύνδεση του LED ήταν απλή και δύσκολη ταυτόχρονα. Η κύρια δυσκολία είναι ότι ο αριθμός pin στο σύστημα δεν αντιστοιχεί στον αριθμό pin στον πίνακα και επειδή η τεκμηρίωση είναι γραμμένη με το αριστερό χέρι. Για να συγκρίνετε τον αριθμό pin του υλικού και τον αριθμό pin στο λειτουργικό σύστημα, πρέπει να εκτελέσετε την εντολή:

gpio readall

Θα εμφανιστεί ένας πίνακας αντιστοιχίας καρφίτσας στο σύστημα και στον πίνακα. Μετά από αυτό, μπορώ ήδη να λειτουργήσω την καρφίτσα στο ίδιο το λειτουργικό σύστημα. Στην περίπτωσή μου το LED είναι συνδεδεμένο GPIOH_5.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Αλλάζω τον ακροδέκτη GPIO σε λειτουργία εξόδου.

gpio -g mode 421 out

Γράφω το μηδέν.

gpio -g write 421 0

Γράφω ένα.

gpio -g write 421 1

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE
Όλα είναι αναμμένα, αφού γράψετε "1"

#gpio subsistem
def gpio_init():
	os.system("gpio -g mode 421 out")
	os.system("gpio -g write 421 1")

def gpio_set(val):
	os.system("gpio -g write 421 %d" % val)
	
def error_blink():
	gpio_set(0)
	time.sleep(0.1)
	gpio_set(1)
	time.sleep(0.1)
	gpio_set(0)
	time.sleep(0.1)
	gpio_set(1)
	time.sleep(0.1)
	gpio_set(0)
	time.sleep(1.0)
	gpio_set(1)

def good_blink():
	gpio_set(1)

Τώρα, σε περίπτωση σφαλμάτων, καλώ την error_blink() και το LED θα αναβοσβήνει όμορφα.

Κόμβοι λογισμικού

Speedtest API

Είναι μεγάλη χαρά που η υπηρεσία speedtest.net έχει το δικό της python-API, μπορείτε να δείτε Github.

Το καλό είναι ότι υπάρχουν πηγαίοι κώδικες που μπορούν επίσης να προβληθούν. Μπορείτε να βρείτε πώς να εργαστείτε με αυτό το API (απλά παραδείγματα). σχετική ενότητα.

Εγκαθιστώ τη βιβλιοθήκη της python με την ακόλουθη εντολή.

sudo -H pip3 install speedtest-cli

Για παράδειγμα, μπορείτε ακόμη και να εγκαταστήσετε έναν ελεγκτή ταχύτητας στο Ubuntu απευθείας από το λογισμικό. Αυτή είναι η ίδια εφαρμογή python, η οποία στη συνέχεια μπορεί να εκκινηθεί απευθείας από την κονσόλα.

sudo apt install speedtest-cli -y

Και μετρήστε την ταχύτητά σας στο Διαδίκτυο.

speedtest-cli
Retrieving speedtest.net configuration...
Testing from B***** (*.*.*.*)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by MTS (Moscow) [0.12 km]: 11.8 ms
Testing download speed................................................................................
Download: 7.10 Mbit/s
Testing upload speed......................................................................................................
Upload: 3.86 Mbit/s

Ως αποτέλεσμα, όπως και εγώ. Έπρεπε να μπω στους πηγαίους κώδικες αυτού του τεστ ταχύτητας για να τους εφαρμόσω πληρέστερα στο έργο μου. Ένα από τα πιο σημαντικά καθήκοντα είναι να αποκτήσετε το όνομα του τηλεπικοινωνιακού φορέα για να το αντικαταστήσετε στην πινακίδα.

import speedtest
from datetime import datetime
...
#Указываем конкретный сервер для теста
#6053) MaximaTelecom (Moscow, Russian Federation)
servers = ["6053"]
# If you want to use a single threaded test
threads = None
s = speedtest.Speedtest()
#получаем имя оператора сотовой связи
opos = '%(isp)s' % s.config['client']
s.get_servers(servers)
#получаем текстовую строку с параметрами сервера
testserver = '%(sponsor)s (%(name)s) [%(d)0.2f km]: %(latency)s ms' % s.results.server
#тест загрузки
s.download(threads=threads)
#тест выгрузки
s.upload(threads=threads)
#получаем результаты
s.results.share()

#После чего формируется строка для записи в csv-файл.
#получаем позицию GPS
longitude, latitude = getPositionData(agps_thread)
#время и дата
curdata = datetime.now().strftime('%d.%m.%Y')
curtime = datetime.now().strftime('%H:%M:%S')
delimiter = ';'
result_string = opos + delimiter + str(curpos) + delimiter + 
	curdata + delimiter + curtime + delimiter + longitude + ', ' + latitude + delimiter + 
	str(s.results.download/1000.0/1000.0) + delimiter + str(s.results.upload / 1000.0 / 1000.0) + 
	delimiter + str(s.results.ping) + delimiter + testserver + "n"
#тут идет запись в файл логов

Και εδώ, όλα αποδείχθηκαν ότι δεν ήταν τόσο απλά, αν και θα φαινόταν πολύ πιο απλά. Αρχικά, η παράμετρος servers ήταν ίση με [], λένε, επιλέξτε τον καλύτερο διακομιστή. Ως αποτέλεσμα, είχα τυχαίους διακομιστές και, όπως μπορείτε να μαντέψετε, μεταβλητή ταχύτητα. Αυτό είναι ένα αρκετά περίπλοκο θέμα, η χρήση ενός σταθερού διακομιστή, αν ναι, στατικό ή δυναμικό, απαιτεί έρευνα. Αλλά εδώ είναι ένα παράδειγμα γραφημάτων μέτρησης ταχύτητας για έναν χειριστή Beeline όταν επιλέγει δυναμικά έναν δοκιμαστικό διακομιστή και έναν στατικά σταθερό.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE
Το αποτέλεσμα της μέτρησης της ταχύτητας κατά την επιλογή ενός δυναμικού διακομιστή.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE
Το αποτέλεσμα της δοκιμής ταχύτητας, με έναν αυστηρά επιλεγμένο διακομιστή.

Κατά τη διάρκεια της δοκιμής, υπάρχει "γούνα" και στα δύο σημεία και πρέπει να αφαιρεθεί χρησιμοποιώντας μαθηματικές μεθόδους. Αλλά με έναν σταθερό διακομιστή είναι ελαφρώς λιγότερο και το πλάτος είναι πιο σταθερό.
Γενικά, αυτό είναι ένα μέρος μεγάλης έρευνας. Και θα μετρούσα την ταχύτητα του διακομιστή μου χρησιμοποιώντας το βοηθητικό πρόγραμμα iperf. Εμμένουμε όμως στις τεχνικές προδιαγραφές.

Αποστολή αλληλογραφίας και λάθη

Για να στείλω αλληλογραφία, δοκίμασα πολλές δεκάδες διαφορετικές επιλογές, αλλά στο τέλος συμφώνησα στα εξής. Κατέγραψα ένα γραμματοκιβώτιο στο Yandex και μετά το πήρα Αυτό είναι ένα παράδειγμα αποστολής αλληλογραφίας. Το έλεγξα και το έβαλα στο πρόγραμμα. Αυτό το παράδειγμα εξετάζει διάφορες επιλογές, συμπεριλαμβανομένης της αποστολής από το gmail κ.λπ. Δεν ήθελα να ασχοληθώ με τη ρύθμιση του διακομιστή αλληλογραφίας μου και δεν είχα χρόνο για αυτό, αλλά όπως αποδείχθηκε αργότερα, ήταν επίσης μάταιο.

Τα αρχεία καταγραφής στάλθηκαν σύμφωνα με τον προγραμματιστή, αν υπάρχει σύνδεση, κάθε 6 ώρες: στις 00:06, 12:18, XNUMX:XNUMX και XNUMX:XNUMX. Το έστειλε ως εξής.

from send_email import *
...
message_log = "Логи тестирования платы №1"
EmailForSend = ["[email protected]", "[email protected]"]
files = ["/home/khadas/modems_speedtest/csv"]
...
def sendLogs():
	global EmailForSend
	curdata = datetime.now().strftime('%d.%m.%Y')
	сurtime = datetime.now().strftime('%H:%M:%S')
	try:
		for addr_to in EmailForSend:
			send_email(addr_to, message_log, "Логи за " + curdata + " " + сurtime, files)
	except:
		print("Network problem for send mail")
		return False
	return True

Αρχικά στάλθηκαν επίσης σφάλματα. Αρχικά, συγκεντρώθηκαν στη λίστα και, στη συνέχεια, στάλθηκαν επίσης χρησιμοποιώντας τον προγραμματιστή, εάν υπήρχε σύνδεση. Ωστόσο, τότε προέκυψαν προβλήματα με το γεγονός ότι η Yandex έχει ένα όριο στον αριθμό των μηνυμάτων που αποστέλλονται ανά ημέρα (αυτό είναι πόνος, θλίψη και ταπείνωση). Δεδομένου ότι θα μπορούσε να υπάρχει τεράστιος αριθμός σφαλμάτων ακόμη και ανά λεπτό, έπρεπε να εγκαταλείψουμε την αποστολή σφαλμάτων μέσω ταχυδρομείου. Λάβετε υπόψη, λοιπόν, κατά την αυτόματη αποστολή πληροφοριών σχετικά με ένα τέτοιο πρόβλημα μέσω των υπηρεσιών Yandex.

Διακομιστής σχολίων

Για να έχω πρόσβαση σε ένα απομακρυσμένο κομμάτι υλικού και να μπορώ να το προσαρμόσω και να το ρυθμίσω εκ νέου, χρειαζόμουν έναν εξωτερικό διακομιστή. Γενικά, για να είμαστε δίκαιοι, θα ήταν σωστό να στείλετε όλα τα δεδομένα στον διακομιστή και να δημιουργήσετε όλα τα όμορφα γραφήματα στη διεπαφή ιστού. Όχι όμως όλα ταυτόχρονα.

Για VPS επέλεξα ruvds.com. Θα μπορούσατε να πάρετε τον πιο απλό διακομιστή. Και γενικά, για τους σκοπούς μου αυτό θα ήταν αρκετό. Αλλά επειδή δεν πλήρωσα για τον διακομιστή από την τσέπη μου, αποφάσισα να τον πάρω με ένα μικρό απόθεμα, ώστε να είναι αρκετό εάν επρόκειτο να αναπτύξουμε μια διεπαφή ιστού, τον δικό μας διακομιστή SMTP, VPN κ.λπ. Επιπλέον, μπορείτε να ρυθμίσετε ένα bot Telegram και να μην έχετε προβλήματα με τον αποκλεισμό του. Επομένως, επέλεξα το Άμστερνταμ και τις ακόλουθες παραμέτρους.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Ως μέθοδο επικοινωνίας με το υλικό, το vim2 επέλεξε μια αντίστροφη σύνδεση ssh και, όπως έδειξε η πρακτική, δεν είναι και η καλύτερη. Εάν η σύνδεση χαθεί, ο διακομιστής κρατά τη θύρα και είναι αδύνατη η σύνδεση μέσω αυτής για κάποιο χρονικό διάστημα. Επομένως, είναι ακόμα καλύτερο να χρησιμοποιείτε άλλες μεθόδους επικοινωνίας, για παράδειγμα VPN. Στο μέλλον ήθελα να αλλάξω σε VPN, αλλά δεν είχα χρόνο.

Δεν θα υπεισέλθω σε λεπτομέρειες σχετικά με τη ρύθμιση ενός τείχους προστασίας, τον περιορισμό των δικαιωμάτων, την απενεργοποίηση των συνδέσεων root ssh και άλλες αλήθειες για τη ρύθμιση ενός VPS. Θα ήθελα να πιστεύω ότι τα ξέρεις ήδη όλα. Για απομακρυσμένη σύνδεση, δημιουργώ έναν νέο χρήστη στο διακομιστή.

adduser vimssh

Δημιουργώ κλειδιά σύνδεσης ssh στο υλικό μας.

ssh-keygen

Και τα αντιγράφω στον διακομιστή μας.

ssh-copy-id [email protected]

Στο υλικό μας, δημιουργώ μια αυτόματη αντίστροφη σύνδεση ssh σε κάθε εκκίνηση.

[Unit] Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service] User=khadas
ExecStart=/usr/bin/ssh -NT -o ExitOnForwardFailure=yes -o ServerAliveInterval=60 -CD 8080 -R 8083:localhost:22 [email protected]
RestartSec=5
Restart=always
[Install] WantedBy=multi-user.target

Δώστε προσοχή στη θύρα 8083: καθορίζει ποια θύρα θα χρησιμοποιήσω για σύνδεση μέσω αντίστροφης ssh. Προσθέστε το στην εκκίνηση και ξεκινήστε.

sudo systemctl enable autossh.service
sudo systemctl start autossh.service

Μπορείτε ακόμη να δείτε την κατάσταση:

sudo systemctl status autossh.service

Τώρα, στον διακομιστή VPS μας, αν τρέξουμε:

ssh -p 8083 khadas@localhost

Στη συνέχεια φτάνω στο δοκιμαστικό κομμάτι του υλικού μου. Και από το υλικό μπορώ επίσης να στείλω αρχεία καταγραφής και οποιαδήποτε δεδομένα μέσω ssh στον διακομιστή μου, πράγμα πολύ βολικό.

Βάζοντας όλα μαζί

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE
Ενεργοποιώντας, ας ξεκινήσουμε την ανάπτυξη και τον εντοπισμό σφαλμάτων

Phew, καλά, αυτό είναι, περιέγραψα όλους τους κόμβους. Τώρα ήρθε η ώρα να τα συνδυάσουμε όλα μαζί. Μπορείτε να δείτε τον κωδικό εδώ.

Ένα σημαντικό σημείο με τον κώδικα: Αυτό το έργο μπορεί να μην ξεκινά έτσι, επειδή ήταν προσαρμοσμένο για μια συγκεκριμένη εργασία, μιας συγκεκριμένης αρχιτεκτονικής. Παρόλο που δίνω τον πηγαίο κώδικα, θα εξηγήσω τα πιο πολύτιμα πράγματα εδώ, ακριβώς στο κείμενο, διαφορετικά είναι εντελώς ακατανόητο.

Στην αρχή, αρχικοποιώ το gps, το gpio και ανοίγω ένα ξεχωριστό νήμα προγραμματιστή.

#запуск потока планировщика
pShedulerThread = threading.Thread(target=ShedulerThread, args=(1,))
pShedulerThread.start()

Ο χρονοπρογραμματιστής είναι αρκετά απλός: φαίνεται να δει αν έχει έρθει η ώρα να σταλούν μηνύματα και ποια είναι η τρέχουσα κατάσταση σφάλματος. Εάν υπάρχει σημαία σφάλματος, τότε αναβοσβήνουμε το LED.

#sheduler
def ShedulerThread(name):
	global ready_to_send
	while True:
		d = datetime.today()
		time_x = d.strftime('%H:%M')
		if time_x in time_send_csv:
			ready_to_send = True
		if error_status:
			error_blink()
		else:
			good_blink()
		time.sleep(1)

Το πιο δύσκολο μέρος αυτού του έργου είναι η διατήρηση της αντίστροφης σύνδεσης ssh για κάθε δοκιμή. Κάθε δοκιμή περιλαμβάνει εκ νέου διαμόρφωση της προεπιλεγμένης πύλης και του διακομιστή DNS. Αφού έτσι κι αλλιώς κανείς δεν διαβάζει, να ξέρεις ότι το τρένο δεν κινείται σε ξύλινες ράγες. Όποιος βρει το πασχαλινό αυγό παίρνει γλυκά.

Για να γίνει αυτό, δημιουργώ έναν ξεχωριστό πίνακα δρομολόγησης -set-mark 0x2 και έναν κανόνα για την ανακατεύθυνση της κυκλοφορίας.

def InitRouteForSSH():
	cmd_run("sudo iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j MARK --set-mark 0x2")
	cmd_run("sudo ip rule add fwmark 0x2/0x2 lookup 102")

Μπορείτε να μάθετε περισσότερα για το πώς λειτουργεί διαβάστε σε αυτό το άρθρο.

Μετά από αυτό μπαίνω σε έναν ατελείωτο βρόχο, όπου κάθε φορά λαμβάνουμε μια λίστα με συνδεδεμένα μόντεμ (για να μάθουμε αν έχει αλλάξει ξαφνικά η διαμόρφωση του δικτύου).

network_list = getNetworklist()

Η λήψη μιας λίστας διεπαφών δικτύου είναι αρκετά απλή.

def getNetworklist():
	full_networklist = os.listdir('/sys/class/net/')
	network_list = [x for x in full_networklist if "eth" in x and x != "eth0"]
	return network_list

Μετά τη λήψη της λίστας, ρύθμισα διευθύνσεις IP σε όλες τις διεπαφές, όπως έδειξα στην εικόνα στο κεφάλαιο για το μόντεμ.

SetIpAllNetwork(network_list)

def SetIpAllNetwork(network_list):
	for iface in network_list:
		lastip = "%d" % (3 + network_list.index(iface))
		cmd_run ("sudo ifconfig " + iface + " 192.168.8." + lastip +" up")

Στη συνέχεια, απλώς περνάω από κάθε διεπαφή σε έναν βρόχο. Και ρυθμίζω κάθε διεπαφή.

	for iface in network_list:
		ConfigNetwork(iface)

def ConfigNetwork(iface):
#сбрасываем все настройки
		cmd_run("sudo ip route flush all")
#Назначаем шлюз по умолчанию
		cmd_run("sudo route add default gw 192.168.8.1 " + iface)
#задаем dns-сервер (это нужно для работы speedtest)
		cmd_run ("sudo bash -c 'echo nameserver 8.8.8.8 > /etc/resolv.conf'")

Ελέγχω τη διασύνδεση για λειτουργικότητα, αν δεν υπάρχει δίκτυο, τότε δημιουργώ σφάλματα. Εάν υπάρχει δίκτυο, τότε ήρθε η ώρα να δράσετε!

Εδώ διαμορφώνω τη δρομολόγηση ssh σε αυτή τη διεπαφή (αν δεν έχει γίνει), στέλνω σφάλματα στον διακομιστή αν έχει έρθει η ώρα, στέλνω αρχεία καταγραφής και τέλος τρέχω ένα speedtest και αποθηκεύω τα αρχεία καταγραφής σε ένα αρχείο csv.

if not NetworkAvalible():
....
#Здесь мы формируем ошибки
....
else: #Есть сеть, ура, работаем!
#Если у нас проблемный интерфейс, на котором ssh, то меняем его
  if (sshint == lastbanint or sshint =="free"):
    print("********** Setup SSH ********************")
    if sshint !="free":
      сmd_run("sudo ip route del default via 192.168.8.1 dev " + sshint +" table 102")
    SetupReverseSSH(iface)
    sshint = iface
#раз сетка работает, то давай срочно все отправим!!!
    if ready_to_send:
      print ("**** Ready to send!!!")
        if sendLogs():
          ready_to_send = False
        if error_status:
          SendErrors()
#и далее тестируем скорость и сохраняем логи. 

Αξίζει να αναφέρουμε τη λειτουργία ρύθμισης του αντίστροφου ssh.

def SetupReverseSSH(iface):
	cmd_run("sudo systemctl stop autossh.service")
	cmd_run("sudo ip route add default via 192.168.8.1 dev " + iface +" table 102")
	cmd_run("sudo systemctl start autossh.service")

Και φυσικά, πρέπει να προσθέσετε όλη αυτή την ομορφιά στην εκκίνηση. Για να το κάνω αυτό δημιουργώ ένα αρχείο:

sudo vim /etc/systemd/system/modems_speedtest.service

Και γράφω σε αυτό:

[Unit] Description=Modem Speed Test
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service] User=khadas
ExecStart=/usr/bin/python3.6 /home/khadas/modems_speedtest/networks.py
RestartSec=5
Restart=always
[Install] WantedBy=multi-user.target

Ενεργοποιώ την αυτόματη φόρτωση και ξεκινάω!

sudo systemctl enable modems_speedtest.service
sudo systemctl start modems_speedtest.service

Τώρα μπορώ να δω αρχεία καταγραφής του τι συμβαίνει χρησιμοποιώντας την εντολή:

journalctl -u modems_speedtest.service --no-pager -f

Ευρήματα

Λοιπόν, τώρα το πιο σημαντικό είναι, τι συνέβη ως αποτέλεσμα; Ακολουθούν μερικά γραφήματα που κατάφερα να αποτυπώσω κατά τη διαδικασία ανάπτυξης και εντοπισμού σφαλμάτων. Τα γραφήματα κατασκευάστηκαν χρησιμοποιώντας gnuplot με το ακόλουθο σενάριο.

#! /usr/bin/gnuplot -persist
set terminal postscript eps enhanced color solid
set output "Rostelecom.ps"
 
#set terminal png size 1024, 768
#set output "Rostelecom.png"
 
set datafile separator ';'
set grid xtics ytics
set xdata time
set ylabel "Speed Mb/s"
set xlabel 'Time'
set timefmt '%d.%m.%Y;%H:%M:%S'
set title "Rostelecom Speed"

plot "Rostelecom.csv" using 3:6 with lines title "Download", '' using 3:7 with lines title "Upload"
 
set title "Rostelecom 2 Ping"
set ylabel "Ping ms"
plot "Rostelecom.csv" using 3:8 with lines title "Ping"

Η πρώτη εμπειρία ήταν με τον χειριστή Tele2, τον οποίο διεξήγαγα για αρκετές ημέρες.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Εδώ χρησιμοποίησα έναν διακομιστή δυναμικής μέτρησης. Οι μετρήσεις ταχύτητας λειτουργούν, αλλά παρουσιάζουν μεγάλες διακυμάνσεις, αλλά κάποια μέση τιμή εξακολουθεί να είναι ορατή και αυτό μπορεί να ληφθεί φιλτράροντας τα δεδομένα, για παράδειγμα, με έναν κινητό μέσο όρο.

Αργότερα έφτιαξα μια σειρά από γραφήματα για άλλους τηλεπικοινωνιακούς φορείς. Σε αυτήν την περίπτωση, υπήρχε ήδη ένας διακομιστής δοκιμής και τα αποτελέσματα ήταν επίσης πολύ ενδιαφέροντα.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Όπως μπορείτε να δείτε, το θέμα είναι πολύ εκτεταμένο για έρευνα και επεξεργασία αυτών των δεδομένων και σαφώς δεν διαρκεί για μερικές εβδομάδες εργασίας. Αλλά…

Αποτέλεσμα της εργασίας

Η εργασία ολοκληρώθηκε απότομα λόγω συνθηκών πέρα ​​από τον έλεγχό μου. Μια από τις αδυναμίες αυτού του έργου, κατά την υποκειμενική μου άποψη, ήταν το μόντεμ, το οποίο δεν ήθελε πραγματικά να λειτουργεί ταυτόχρονα με άλλα μόντεμ, και έκανε τέτοια κόλπα κάθε φορά που φορτωνόταν. Για τους σκοπούς αυτούς, υπάρχει ένας τεράστιος αριθμός άλλων μοντέλων μόντεμ· συνήθως είναι ήδη σε μορφή Mini PCI-e και είναι εγκατεστημένα μέσα στη συσκευή και είναι πολύ πιο εύκολο να διαμορφωθούν. Αλλά αυτό είναι μια εντελώς διαφορετική ιστορία. Το έργο ήταν ενδιαφέρον και χάρηκα πολύ που μπόρεσα να συμμετάσχω σε αυτό.

Ταυτόχρονη δοκιμή ταχύτητας σε πολλά μόντεμ LTE

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο