Πίνακας περιεχομένων:
- Βήμα 1: Υποθέτω, ότι έχετε ήδη OpenWrt…
- Βήμα 2: Λογισμικό και εργαλεία
- Βήμα 3: Δημιουργία ελάχιστης εφαρμογής
- Βήμα 4: Προσθήκη ορισμένων πληροφοριών: Αριθμός πελατών, διεύθυνση IP WAN, Uptime
- Βήμα 5: WiFi Control: ON/OFF
- Βήμα 6: Διάγραμμα στατιστικών συστήματος
- Βήμα 7: Κατάσταση περιστροφής σκληρού δίσκου
- Βήμα 8: Διάγραμμα Δραστηριότητας Δικτύου
- Βήμα 9: Ειδοποιήσεις
- Βήμα 10: Αυτόματη εκτέλεση στο παρασκήνιο
- Βήμα 11: Συμπέρασμα και περαιτέρω ιδέες
Βίντεο: Εφαρμογή Android/iOS για απομακρυσμένη πρόσβαση στο δρομολογητή OpenWrt: 11 βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:35
Πρόσφατα αγόρασα ένα νέο δρομολογητή (Xiaomi Mi Router 3G). Και φυσικά, αυτό το νέο, φοβερό κομμάτι υλικού με ενέπνευσε να ξεκινήσω να δουλεύω σε αυτό το έργο;)
Βήμα 1: Υποθέτω, ότι έχετε ήδη OpenWrt…
Έπρεπε πρώτα να εγκαταστήσω το OpenWrt… Κυρίως, ακολούθησα αυτόν τον οδηγό (συγκεκριμένο για αυτό το μοντέλο δρομολογητή): https://dzone.com/articles/hacking-into-xiaomi-mi-… Ενώ εργαζόμουν σε αυτό, βρήκα αυτό το φοβερό βίντεο: Εγκατάσταση Openwrt, σημείο αναφοράς WiFi, Φίλη που αναβοσβήνει. Ω, γέλασα τόσο πολύ!:)
Προσοχή! Η εγκατάσταση του OpenWrt μπορεί να επηρεάσει το δρομολογητή σας. Μόλις ολοκληρωθεί, ξεκλειδώνει πλήρη ισχύ και έλεγχο. Δεν είμαι αρκετά γενναίος για να δώσω οδηγίες εδώ, καθώς μπορεί να είναι διαφορετικές για κάθε μοντέλο δρομολογητή.
Αλλά αν έχετε ήδη OpenWrt στο δρομολογητή σας, θα μπορείτε να ξεκινήσετε με αυτό το σεμινάριο στο notime
BTW, ορισμένοι πίνακες ανάπτυξης έρχονται με το OpenWrt εκτός συσκευής, όπως το Onion Omega, το VoCore, το LinkIt Smart 7688 και άλλα. Αυτό το σεμινάριο εξηγεί επίσης μερικές βασικές ιδέες πίσω από τη δημιουργία τέτοιων εφαρμογών, ώστε να μπορείτε εύκολα να το προσαρμόσετε ώστε να λειτουργεί με το Raspberry Pi και τα παρόμοια.
Για αυτό το έργο, θα χρησιμοποιώ κυρίως προεγκατεστημένο λογισμικό (διαθέσιμο σε οποιονδήποτε δρομολογητή με δυνατότητα OpenWrt). Αλλά για κάποια προηγμένη λειτουργικότητα, έπρεπε να εγκαταστήσω επιπλέον πακέτα. Αυτό γίνεται με λίγα μόνο κλικ, οπότε θα συμπεριλάβω τις οδηγίες εδώ.
Επίσης, υποθέτω ότι γνωρίζετε ήδη:
- Πώς να ανοίξετε/χρησιμοποιήσετε τερματικό SSH στο δρομολογητή OpenWrt
- Πώς να ανεβάσετε/επεξεργαστείτε αρχεία στο δρομολογητή σας (χρησιμοποιήστε FileZilla ή scp/sftp)
- Πώς να εργαστείτε με την κονσόλα Linux
Βήμα 2: Λογισμικό και εργαλεία
Από την πλευρά του smartphone, χρησιμοποιώ το Blynk. Παρέχει εφαρμογές iOS και Android για τον έλεγχο οποιουδήποτε υλικού. Μπορείτε εύκολα να δημιουργήσετε όμορφες γραφικές διεπαφές για όλα τα έργα σας σύροντας και αποθέτοντας widget, ακριβώς στο smartphone σας. Το Blynk χρησιμοποιείται κυρίως με Arduino, Raspberry Pi, κλπ. Αλλά γιατί να μην το εκτελέσετε στο ίδιο το δρομολογητή;;)
Από την πλευρά της συσκευής θα χρησιμοποιήσω το Lua για να γράψω την απαιτούμενη λειτουργικότητα. Θα μπορούσα επίσης να χρησιμοποιήσω Python ή Node.js, αλλά δυστυχώς αυτές οι επιλογές δεν είναι πάντα διαθέσιμες, λόγω έλλειψης πόρων σε ορισμένους δρομολογητές. C C/C ++, αλλά δεν είναι τόσο βολικό να συνεργαστείτε (επανασυγκρότηση για κάθε αλλαγή κ.λπ.) Από την άλλη πλευρά, το Lua είναι προεγκατεστημένο, είναι απλό στη χρήση και στην εκμάθηση. Χρησιμοποιείται από την προεπιλεγμένη διεπαφή ιστού, LuCI.
Βήμα 3: Δημιουργία ελάχιστης εφαρμογής
Ξεκινώντας με τα Blynk και Lua είναι τόσο εύκολο όσο:
- Λήψη της εφαρμογής Blynk (από το App Store, το Google Play)
- Δημιουργήστε ένα νέο έργο και αποκτήστε το Auth Token
- Ακολουθήστε τις οδηγίες εγκατάστασης του Blynk Lua για το OpenWrt.
Χρησιμοποιήστε το SSH για πρόσβαση στην κονσόλα του δρομολογητή σας. Αφού εκτελέσετε το προεπιλεγμένο παράδειγμα:
lua./examples/client.lua
Θα πρέπει να δούμε κάτι σαν αυτό:
Συνδετικός…
SSL χειραψία… Έτοιμο.
Αυτό σημαίνει ότι έχει δημιουργηθεί η ασφαλής, αμφίδρομη σύνδεση με την εφαρμογή! ΝΑΙ!
Μπορούμε τώρα να επεκτείνουμε εύκολα το παρεχόμενο παράδειγμα, οπότε κάνει κάτι ενδιαφέρον. Δημιούργησα ένα αντίγραφο αυτού του παραδείγματος για να το επεξεργαστώ:
cp./examples/client.lua./blynkmon.lua
Βήμα 4: Προσθήκη ορισμένων πληροφοριών: Αριθμός πελατών, διεύθυνση IP WAN, Uptime
Η βασική ιδέα είναι να λαμβάνετε περιοδικά τις πληροφορίες από το λειτουργικό σύστημα, να εκτελείτε μερικούς απλούς υπολογισμούς εάν χρειάζεται και, στη συνέχεια, να στέλνετε το αποτέλεσμα στο Blynk για προβολή.
Στο Linux/OpenWrt, έχουμε διάφορους τρόπους λήψης των δεδομένων του συστήματος:
- Εκτελέστε μια εντολή και αναλύστε το κείμενο που εξάγει
- Εκτελέστε μια εντολή και παρακολουθήστε τον κωδικό εξόδου που επιστρέφει
- Διαβάστε ένα αρχείο συστήματος, που βρίσκεται στους καταλόγους/proc/και/sys/class/
Τώρα θέλω να εμφανίσω τον αριθμό των συνδεδεμένων συσκευών.
Όταν τρέχω cat/proc/net/arp στην κονσόλα, εξάγει τη λίστα των γνωστών συσκευών, μαζί με τις διευθύνσεις MAC και IP τους:
Διεύθυνση IP Τύπος HW Σημαίες Διεύθυνση HW Mask Device
192.168.10.206 0x1 0x2 78: 02: f8: fb: d6: bf * br-lan 194.---------- 0x1 0x2 4c: 5e: 0c: 14: e0: 5c * eth0.2 192.168.10.162 0x1 0x0 04: b1: 67: 2f: e3: 74 * br-lan
Μπορούμε να το αναλύσουμε απευθείας στο Lua, αλλά είναι συχνά ευκολότερο να χρησιμοποιούμε εξειδικευμένα βοηθητικά προγράμματα. Στο Linux, αυτά είναι grep, head, tail, cut, wc, awk.
Για να λάβω αριθμό πελατών από την έξοδο arp, πρέπει να φιλτράρω τον πίνακα (να αφαιρέσω άσχετα στοιχεία) και να μετρήσω τις γραμμές πίνακα, με αποτέλεσμα την ακόλουθη εντολή:
cat/proc/net/arp | grep br-lan | grep 0x2 | wc -l
Ας το προσπαθήσουμε:
root@router: ~/lua-blynk# cat/proc/net/arp | grep br-lan | grep 0x2 | wc -l
1
Μεγάλος. Έχουμε τώρα την ιδέα για το πώς μπορούμε να συλλέξουμε όλες τις απαιτούμενες πληροφορίες. Ας το αυτοματοποιήσουμε. Για να κάνουμε τον κώδικα μας καθαρό και επεκτάσιμο, ας δημιουργήσουμε μερικές συναρτήσεις βοηθού:
λειτουργία exec_out (cmd)
τοπικό αρχείο = io.popen (cmd) αν όχι αρχείο, τότε επιστρέψτε στο μηδέν τοπικό αποτέλεσμα = αρχείο: διαβάστε ('*όλα') αρχείο: κλείστε () εκτυπώστε ("Εκτέλεση:"..cmd.. " ->".. έξοδος) επιστροφή εξόδου τελικής λειτουργίας read_file (διαδρομή) τοπικό αρχείο = io.open (διαδρομή, "rb") αν δεν είναι αρχείο, τότε επιστρέψτε στο μηδέν τοπικό περιεχόμενο = αρχείο: διαβάστε "*a" αρχείο: κλείστε () εκτύπωση ("Διαβάστε: "..path.." -> ".. περιεχόμενο) τέλος περιεχομένου επιστροφής
Χρησιμοποιώντας αυτά τα βοηθητικά προγράμματα, μπορούμε τώρα να εφαρμόσουμε τις πραγματικές λειτουργίες ανάκτησης δεδομένων:
συνάρτηση getArpClients ()
επιστροφή τόνου (exec_out ("cat/proc/net/arp | grep br -lan | grep 0x2 | wc -l")) τελική λειτουργία getUptime () return tonumber (exec_out ("cat/proc/uptime | awk '{print $ 1 } '")) τελική λειτουργία getWanIP () επιστροφή exec_out (" ifconfig eth0.2 | grep' inet addr: '| cut -d: -f2 | awk' {print $ 1} '") end
Μπορείτε να εκτελέσετε τμήματα αυτών των εντολών κελύφους, για να αποκτήσετε βαθύτερη κατανόηση του τρόπου λειτουργίας του και να το προσαρμόσετε στις ανάγκες σας.
Το πιο εύκολο μέρος είναι η αποστολή των δεδομένων στην εφαρμογή Blynk. Το προεπιλεγμένο παράδειγμα ρυθμίζει ήδη το χρονόμετρο, το οποίο εκτελεί κάποιο κώδικα κάθε 5 δευτερόλεπτα, οπότε απλώς το ξαναχρησιμοποιούμε:
local tmr1 = Timer: new {interval = 5000, func = function ()
blynk: virtualWrite (10, getArpClients ()) blynk: virtualWrite (11, string.format ("%. 1f h", getUptime ()/60/60)) blynk: virtualWrite (12, getWanIP ()) τέλος}
Στην εφαρμογή, προσθέτουμε 3 widget ετικετών και τα αντιστοιχίζουμε στις εικονικές καρφίτσες 10, 11, 12 ανάλογα.
Ενώ αυτό λειτουργεί, είναι μάλλον αναποτελεσματικό, καθώς το WAN IP ή ο αριθμός των πελατών δεν ενημερώνεται τόσο συχνά. Ας το διορθώσουμε
Για WAN IP, το μετακινούμε στον συνδεδεμένο χειριστή. Θα εκτελείται κάθε φορά που ο δρομολογητής δημιουργεί σύνδεση με το Blynk Cloud. Αυτό πρέπει να είναι αρκετό:
blynk: on ("συνδεδεμένο", λειτουργία ()
print ("Ready.") blynk: virtualWrite (12, getWanIP ()) τέλος)
Για Uptime και Clients Number, δημιουργούμε ένα ξεχωριστό χρονόμετρο με 5 λεπτά. διάστημα:
local tmr2 = Timer: new {interval = 5*60*1000, func = function ()
blynk: virtualWrite (10, getArpClients ()) blynk: virtualWrite (11, string.format ("%. 1f h", getUptime ()/60/60)) τέλος}
Βήμα 5: WiFi Control: ON/OFF
Μέχρι τώρα, λάβαμε μόνο μερικές πληροφορίες από τη συσκευή. Ας προσπαθήσουμε να το ελέγξουμε!
blynk: on ("V20", λειτουργία (param)
αν param [1] == "1" τότε os.execute ("wifi up") else os.execute ("wifi down") end end)
Από την πλευρά της εφαρμογής, μόλις πρόσθεσα ένα widget κουμπιού (λειτουργία: Switch) και το ανέθεσα στο V20.
Αυτό είναι. Φοβερο.
Βήμα 6: Διάγραμμα στατιστικών συστήματος
συνάρτηση getCpuLoad ()
return tonumber (exec_out ("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $ 2+$ 4}'")) end function getRamUsage () return tonumber (exec_out ("free | grep Mem | awk ' {print ($ 3- $ 7)/$ 2 * 100.0} '")) τέλος
Πρέπει επίσης να στείλουμε τα δεδομένα στο Blynk (ας χρησιμοποιήσουμε ξανά το tmr1):
local tmr1 = Timer: new {interval = 5000, func = function ()
blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) τέλος}
Στην πλευρά της εφαρμογής, προσθέστε το γραφικό στοιχείο SuperChart. Προσθέστε ροές δεδομένων CPU, RAM και εκχωρήστε σε V5, V6.
Βήμα 7: Κατάσταση περιστροφής σκληρού δίσκου
Ο δρομολογητής μου έχει μια εξωτερική μονάδα σκληρού δίσκου συνδεδεμένη ως συσκευή αποθήκευσης συνδεδεμένη στο δίκτυο. Το θέμα είναι ότι αυτή η μονάδα δίσκου έχει ρυθμιστεί ώστε να αρχίζει να περιστρέφεται όταν κάποιος έχει πρόσβαση σε αυτήν και να αναστέλλεται μετά από ένα χρονικό όριο.
Προφανώς, θα ήταν ωραίο να γνωρίζουμε πόσες φορές ενεργοποιείται όλη την ημέρα. Έτσι πρόσθεσα μια άλλη ροή δεδομένων στο γράφημα συστήματος μου.
Είναι λίγο πιο δύσκολο να αποκτήσετε την κατάσταση της μονάδας σκληρού δίσκου, αλλά βρήκα έναν τρόπο! Πρώτα απ 'όλα, εγκαταστήστε smartmontools από την κονσόλα SSH:
ενημέρωση opkg
opkg εγκατάσταση smartmontools
Στη συνέχεια, στον κωδικό μας, πρέπει να εκτελέσουμε μια ειδική εντολή και να ελέγξουμε τον κωδικό εξόδου:
συνάρτηση exec_ret (cmd)
τοπική έξοδος = os.execute (cmd) print ("Εκτέλεση:"..cmd.. " -> έξοδος:".. έξοδος) επιστροφή εξόδου λειτουργίας λήξης getHddSpinning () if exec_ret ("smartctl --nocheck = standby --info /dev/sda>/dev/null ") == 0 στη συνέχεια επιστρέψτε 1 άλλο επιστρέψτε 0 τέλος τέλος
Σημείωση: Ο σκληρός μου δίσκος είναι /dev /sda
Βήμα 8: Διάγραμμα Δραστηριότητας Δικτύου
Δημιουργούμε ένα άλλο γραφικό στοιχείο SuperChart (παρόμοιο με το προηγούμενο), προσθέτουμε ροές δεδομένων TX και RX και αναθέτουμε σε V1 και V2. Σημείωση: Θέλω να εμφανίσω στατική θύρα WAN και η θύρα WAN μου είναι eth0.2
Λειτουργίες βοηθού:
συνάρτηση getWanRxBytes ()
επιστροφή τόνου (read_file ("/sys/class/net/eth0.2/statistics/rx_bytes")) τελική λειτουργία getWanTxBytes () επιστροφή τόνου (read_file ("/sys/class/net/eth0.2/statistics/tx_bytes")) τέλος
Στη συνέχεια, προσθέστε λίγο κώδικα στο ίδιο tmr1. Αυτό είναι πιο περίπλοκο, καθώς χρειάζεται μόνο να υπολογίσουμε και να εμφανίσουμε τη διαφορά στα μεταδιδόμενα/λαμβανόμενα byte:
τοπικό prevTx, prevRx
local tmr1 = Timer: new {interval = 5000, func = function () local tx = getWanTxBytes () local rx = getWanRxBytes () if prevTx and prevTx ~ = tx then blynk: virtualWrite (1, tx - prevTx) λήξη εάν prevRx και prevRx ~ = rx και στη συνέχεια blynk: virtualWrite (2, rx - prevRx) τέλος prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWdys (7,)) τέλος}
Βήμα 9: Ειδοποιήσεις
Wantedθελα επίσης να ειδοποιηθώ όταν ο δρομολογητής μου χάσει το ρεύμα ή τη σύνδεση στο Διαδίκτυο. Για αυτό, χρειαζόμαστε widget ειδοποιήσεων.
Στις ρυθμίσεις γραφικού στοιχείου, ενεργοποιήστε την "ειδοποίηση εκτός σύνδεσης". Δεν απαιτείται κωδικός. Μπορούμε όμως να στείλουμε και προσαρμοσμένες ειδοποιήσεις από τον κωδικό μας.
Βήμα 10: Αυτόματη εκτέλεση στο παρασκήνιο
Προς το παρόν, το σενάριο πρέπει να εκτελεστεί με μη αυτόματο τρόπο, αλλά θέλω να το κάνω να εκτελείται αυτόματα στο παρασκήνιο όταν ενεργοποιείται ο δρομολογητής.
Αυτό γίνεται με τη δημιουργία μιας υπηρεσίας. Δημιουργήστε ένα αρχείο /etc/init.d/blynkmon:
#!/bin/sh /etc/rc.common
ΕΝΑΡΞΗ = 99 STOP = pidfile = "/var/run/blynkmon.pid" start () {if [-f $ pidfile]; στη συνέχεια ηχώ "blynkmon ήδη τρέχει" έξοδος 0 fi cd /root /lua-blynk lua blynkmon.lua your-auth-token> /dev /null & echo $! > $ pidfile} stop () {if [! -f $ pidfile]; τότε ηχώ "blynkmon not running" exit 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}
Σημείωση: μην ξεχάσετε να αντικαταστήσετε το διακριτικό εγγραφής σας
Στη συνέχεια, ενεργοποιήστε την υπηρεσία blynkmon:
υπηρεσία blynkmon ενεργοποίηση
Βήμα 11: Συμπέρασμα και περαιτέρω ιδέες
Μπορείτε να σαρώσετε αυτό το QR για να αποκτήσετε τον κλώνο του Blynk Project μου. Απαιτεί κάποια ενεργειακά σημεία (4600), καθώς χρησιμοποιεί πολλά widgets!
Βρείτε τον πλήρη κώδικα Lua εδώ:
Μέχρι τώρα καλά, αλλά εδώ είναι μερικές ιδέες που θα ήθελα να προσθέσω στο εγγύς μέλλον.
- Προσθήκη εντολής επανεκκίνησης. Αποφύγετε τυχαία κλικ σε αυτό.
- Προσθέστε widget τερματικού για να εκτελέσετε οποιαδήποτε εντολή Linux.
-
Προσθήκη γραφήματος θερμοκρασίας CPU.
UPD: Δυστυχώς, το OpenWrt δεν διαθέτει ορισμένα προγράμματα οδήγησης για το μοντέλο του δρομολογητή μου. Είναι όμως διαθέσιμο για πολλούς άλλους δρομολογητές
- Προσθέστε ειδοποίηση όταν μια συγκεκριμένη συσκευή συνδέεται/αποχωρεί από το δίκτυο. Έχουμε ήδη πληροφορίες arp, τώρα ελέγξτε μόνο τη διεύθυνση MAC.
Με αυτόν τον τρόπο, μπορούμε να παρακολουθούμε και να ελέγχουμε τρισδιάστατους εκτυπωτές, ρομπότ, έναν κανονικό υπολογιστή/φορητό υπολογιστή, πράγματα Arduino/ESP8266/ESP32/RaspberryPi, συσκευές Smart Home και σχεδόν οτιδήποτε υπάρχει. Ενημερώστε με αν έχετε άλλες ενδιαφέρουσες ιδέες. Τι πιστεύετε για όλα αυτά;
Συνιστάται:
Steam Punk το UPS σας για να απολαμβάνετε ώρες λειτουργίας για το δρομολογητή Wi-fi: 4 βήματα (με εικόνες)
Steam Punk Your UPS to Get Hours of Uptime for your Wi-fi Router: Υπάρχει κάτι θεμελιωδώς δυσάρεστο στο να μετατρέψετε το UPS σας την ισχύ της μπαταρίας 12V DC σε ισχύ AC 220V, έτσι ώστε οι μετασχηματιστές που λειτουργούν το δρομολογητή σας και την ίνα ONT να μπορούν να το μετατρέψουν ξανά σε 12V DC! Αντιμετωπίζετε επίσης το [συνήθως
Πρόσβαση στο σύστημα αρχείων Raspberry Pi μέσω των Windows: 9 βήματα
Πρόσβαση στο σύστημα αρχείων Raspberry Pi μέσω των Windows: Έχετε πάρει ποτέ ένα Raspberry Pi και έχετε πάει " Πρέπει να το ρυθμίζω με οθόνη, ποντίκι και πληκτρολόγιο κάθε φορά! &Quot; Η απογοήτευση που προκαλεί η αποσύνδεση/επανασύνδεση της οθόνης και του πληκτρολογίου/ποντικιού σας, απλώς η πρόσβαση στο Raspberry Pi δεν έχει καμία σημασία
Απομακρυσμένη πρόσβαση στο Raspberry Pi: SSH, Dekstop & FTP: 4 βήματα
Απομακρυσμένη πρόσβαση στο Raspberry Pi: SSH, Dekstop & FTP: Σε αυτήν την ανάρτηση, θα εξετάσουμε 3 διαφορετικές μεθόδους με τις οποίες μπορείτε να αποκτήσετε απομακρυσμένη πρόσβαση στο Raspberry Pi για να διευκολύνετε λίγο την εργασία με αυτό. Το πρώτο είναι το SSH, το οποίο θα σας επιτρέψει να έχετε απομακρυσμένη πρόσβαση στο τερματικό. Το δεύτερο είναι ένα remo
Απλή εφαρμογή IOS για μονάδες BLE: 4 βήματα
Απλή εφαρμογή IOS για ενότητες BLE: Αυτό το Instructable περιγράφει πώς μπορείτε να δημιουργήσετε μια εφαρμογή iOS με πολύ βασικές λειτουργίες. Αυτό το Instructable δεν θα περάσει από ολόκληρη τη διαδικασία δημιουργίας μιας εφαρμογής iOS BLE. Θα δώσει μόνο μια επισκόπηση υψηλού επιπέδου για ορισμένα σημαντικά στοιχεία με
Απομακρυσμένη πρόσβαση SSH στο Raspberry Pi 2: 5 βήματα
Απομακρυσμένη πρόσβαση SSH στο Raspberry Pi 2: Θέλατε ποτέ να αναπτύξετε ένα Raspberry Pi " στο πεδίο " και εξακολουθείτε να μπορείτε να έχετε πρόσβαση σε αυτόν; Εδώ είναι ένας εύκολος τρόπος για να ενεργοποιήσετε την απομακρυσμένη πρόσβαση SSH στο Raspberry Pi 2 (και σε άλλα μοντέλα επίσης). Ενώ υπάρχουν λύσεις που περιλαμβάνουν VPN ή διαμόρφωση