Πίνακας περιεχομένων:

Εφαρμογή Android/iOS για απομακρυσμένη πρόσβαση στο δρομολογητή OpenWrt: 11 βήματα
Εφαρμογή Android/iOS για απομακρυσμένη πρόσβαση στο δρομολογητή OpenWrt: 11 βήματα

Βίντεο: Εφαρμογή Android/iOS για απομακρυσμένη πρόσβαση στο δρομολογητή OpenWrt: 11 βήματα

Βίντεο: Εφαρμογή Android/iOS για απομακρυσμένη πρόσβαση στο δρομολογητή OpenWrt: 11 βήματα
Βίντεο: Πως να δώ την οθόνη του Android κινητού μου στο PC -2021 2024, Ιούνιος
Anonim
Εφαρμογή Android/iOS για απομακρυσμένη πρόσβαση στο δρομολογητή OpenWrt
Εφαρμογή Android/iOS για απομακρυσμένη πρόσβαση στο δρομολογητή OpenWrt
Εφαρμογή Android/iOS για απομακρυσμένη πρόσβαση στο δρομολογητή OpenWrt
Εφαρμογή Android/iOS για απομακρυσμένη πρόσβαση στο δρομολογητή OpenWrt

Πρόσφατα αγόρασα ένα νέο δρομολογητή (Xiaomi Mi Router 3G). Και φυσικά, αυτό το νέο, φοβερό κομμάτι υλικού με ενέπνευσε να ξεκινήσω να δουλεύω σε αυτό το έργο;)

Βήμα 1: Υποθέτω, ότι έχετε ήδη OpenWrt…

Υποθέτω, ότι έχετε ήδη OpenWrt…
Υποθέτω, ότι έχετε ήδη 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

WiFi Control: ON/OFF
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 και σχεδόν οτιδήποτε υπάρχει. Ενημερώστε με αν έχετε άλλες ενδιαφέρουσες ιδέες. Τι πιστεύετε για όλα αυτά;

Συνιστάται: