תוכן עניינים:

אפליקציית Android/iOS לגישה נתב OpenWrt מרחוק: 11 שלבים
אפליקציית Android/iOS לגישה נתב OpenWrt מרחוק: 11 שלבים

וִידֵאוֹ: אפליקציית Android/iOS לגישה נתב OpenWrt מרחוק: 11 שלבים

וִידֵאוֹ: אפליקציית Android/iOS לגישה נתב OpenWrt מרחוק: 11 שלבים
וִידֵאוֹ: BAHAS IPHONE MURAH KOK MALAH FOKUS KE OPENWRT!? 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 בנתב שלך, תוכל להתחיל עם הדרכה זו בזמן

BTW, כמה לוחות פיתוח מגיעים עם OpenWrt מחוץ לקופסה, כמו Onion Omega, VoCore, LinkIt Smart 7688 ואחרים. הדרכה זו מסבירה גם כמה רעיונות בסיסיים מאחורי יצירת אפליקציות כאלה, כך שתוכל להתאים אותה בקלות לעבודה עם Raspberry Pi וכדומה.

עבור פרויקט זה אשתמש בעיקר בתוכנות מותקנות מראש (זמינות בכל נתב התומך ב- OpenWrt). אבל בשביל פונקציונליות מתקדמת כלשהי, הייתי צריך להתקין חבילות נוספות. זה נעשה בכמה לחיצות בלבד, אז אכלול את ההנחיות כאן.

כמו כן, אני מניח שאתה כבר יודע:

  • כיצד לפתוח/להשתמש במסוף SSH לנתב OpenWrt שלך
  • כיצד להעלות/לערוך קבצים בנתב שלך (השתמש ב- FileZilla או scp/sftp)
  • כיצד לעבוד עם קונסולת לינוקס

שלב 2: תוכנה וכלים

תוכנה וכלים
תוכנה וכלים

בצד הסמארטפון, אני משתמש ב- Blynk. הוא מספק יישומי iOS ו- Android לשליטה על כל חומרה. אתה יכול לבנות ממשקים גרפיים יפים לכל הפרויקטים שלך פשוט על ידי גרירה ושחרור של ווידג'טים, ישירות בסמארטפון שלך. Blynk משמש בעיקר עם Arduino, Raspberry Pi וכו 'אבל למה לא להריץ אותו על הנתב עצמו?;)

בצד המכשיר אשתמש ב- Lua לתסריט את הפונקציונליות הדרושה. אני יכול גם להשתמש ב- Python או Node.js, אך למרבה הצער האפשרויות האלה לא תמיד זמינות, בגלל חוסר משאבים בכמה נתבים. או C/C ++, אבל זה לא כל כך נוח לעבוד איתו (הידור מחדש לכל שינוי וכו ') מצד שני, לואה מותקנת מראש, פשוטה לשימוש ולמידה. הוא משמש את ממשק האינטרנט המוגדר כברירת מחדל, LuCI.

שלב 3: יצירת אפליקציה מינימלית

תחילת העבודה עם בלינק ולואה היא קלה כמו:

  • הורד את אפליקציית Blynk (מחנות האפליקציות, Google Play)
  • צור פרויקט חדש וקבל את אסימון האימות
  • עקוב אחר הוראות ההתקנה של Blynk Lua עבור OpenWrt.

השתמש ב- SSH כדי לגשת למסוף הנתב שלך. לאחר הפעלת דוגמת ברירת המחדל:

lua./examples/client.lua

אנחנו צריכים לראות משהו כזה:

מְקַשֵׁר…

לחיצת יד SSL … מוכן.

מה שאומר שהחיבור המאובטח והדו-כיווני לאפליקציה נוצר! YAY!

כעת אנו יכולים להרחיב בקלות את הדוגמא שניתנה, כך שהיא עושה משהו מעניין. יצרתי עותק של הדוגמה הזו כדי לערוך אותה:

cp./examples/client.lua./blynkmon.lua

שלב 4: הוספת מידע: מספר לקוחות, כתובת IP WAN, זמן פעולה

הרעיון הבסיסי הוא לקבל את המידע ממערכת ההפעלה מעת לעת, לבצע כמה חישובים פשוטים במידת הצורך ולאחר מכן לשלוח את התוצאה ל- Blynk לתצוגה.

ב- Linux/OpenWrt, יש לנו מספר דרכים להשיג את נתוני המערכת:

  • הפעל פקודה ונתח את הטקסט שהוא פולט
  • הפעל פקודה וצפה בקוד היציאה שהוא מחזיר
  • קרא קובץ מערכת, הממוקם בספריות/proc/ו/sys/class/

עכשיו אני רוצה להציג את מספר המכשירים המחוברים.

כשאני מפעיל cat/proc/net/arp בקונסולה, הוא מוציא את רשימת המכשירים הידועים, יחד עם כתובות ה- MAC וה- IP שלהם:

כתובת IP סוג HW מסמן התקן מסכת כתובת HW התקן

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, ראש, זנב, חתך, wc, awk.

כדי לקבל מספר לקוחות מפלט arp, אני צריך לסנן את הטבלה (להסיר פריטים לא קשורים) ולספור את שורות הטבלה, מה שמביא לפקודה הבאה:

חתול/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) אם לא קובץ אז החזר פלט מקומי אפס = file: read ('*all') file: close () print ("Run:"..cmd.. " ->".. פלט) החזר פלט סיום הפונקציה read_file (נתיב) קובץ מקומי = io.open (נתיב, "rb") אם לא קובץ אז החזר תוכן מקומי אפס סוף = קובץ: קרא "*a" קובץ: close () הדפס ("קרא: ".. נתיב.." -> ".. תוכן) החזר סיום תוכן

באמצעות כלי עזר אלה, אנו יכולים כעת ליישם את פונקציות אחזור הנתונים בפועל:

פונקציה getArpClients ()

החזר tonumber (exec_out ("cat/proc/net/arp | grep br -lan | grep 0x2 | wc -l")) function function getUptime () return tonumber (exec_out ("cat/proc/uptime | awk '{print $ 1 } '")) end function getWanIP () return exec_out (" ifconfig eth0.2 | grep' inet addr: '| cut -d: -f2 | awk' {print $ 1} '") end

אתה יכול להריץ חלקים מפקודות פגז אלה, כדי לקבל הבנה מעמיקה יותר של אופן פעולתו ולהתאים אותו לצרכיך.

החלק הקל ביותר הוא שליחת הנתונים לאפליקציית Blynk. דוגמת ברירת המחדל כבר מגדירה את הטיימר, שמריץ קוד כל 5 שניות, אז פשוט נשתמש בו שוב:

מקומי tmr1 = טיימר: חדש {מרווח = 5000, פונק = פונקציה ()

blynk: virtualWrite (10, getArpClients ()) blynk: virtualWrite (11, string.format ("%. 1f h", getUptime ()/60/60)) blynk: virtualWrite (12, getWanIP ()) end}

באפליקציה, אנו מוסיפים 3 ווידג'טים של תוויות, ומקצים אותם לפינים וירטואליים 10, 11, 12 בהתאם.

למרות שזה עובד, זה די לא יעיל, מכיוון ש- WAN IP או מספר לקוחות אינם מתעדכנים לעתים קרובות כל כך. בואו נתקן זאת

עבור WAN IP, אנו מעבירים אותו למטפל מחובר. הוא יופעל בכל פעם שהנתב יוצר חיבור ל- Blynk Cloud. זה אמור להספיק:

blynk: on ("מחובר", פונקציה ()

print ("מוכן") blynk: virtualWrite (12, getWanIP ()) סוף)

עבור זמן פעולה ומספר לקוחות, אנו יוצרים טיימר נפרד עם 5 דקות. הַפסָקָה:

מקומי tmr2 = טיימר: חדש {מרווח = 5*60*1000, פונק = פונקציה ()

blynk: virtualWrite (10, getArpClients ()) blynk: virtualWrite (11, string.format ("%. 1f h", getUptime ()/60/60)) end}

שלב 5: בקרת WiFi: הפעלה/כיבוי

בקרת WiFi: הפעלה/כיבוי
בקרת WiFi: הפעלה/כיבוי

עד עכשיו קיבלנו רק מידע מהמכשיר. ננסה לשלוט בו!

blynk: on ("V20", פונקציה (param)

אם param [1] == "1" אז os.execute ("wifi up") אחר os.execute ("wifi down") סוף סוף)

בצד האפליקציה, פשוט הוספתי ווידג'ט לחצן (מצב: מתג) והקצתי אותו ל- V20.

זהו זה. מדהים.

שלב 6: תרשים סטטיסטיקות מערכת

תרשים סטטיסטיקות מערכת
תרשים סטטיסטיקות מערכת
תרשים סטטיסטיקות מערכת
תרשים סטטיסטיקות מערכת

פונקציה getCpuLoad ()

return tonumber (exec_out ("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $ 2+$ 4}'")) function function getRamUsage () return tonumber (exec_out ("free | grep Mem | awk ' {print ($ 3- $ 7)/$ 2 * 100.0} '")) סוף

עלינו גם לשלוח את הנתונים לבלינק (בואו נשתמש שוב ב- tmr1):

מקומי tmr1 = טיימר: חדש {מרווח = 5000, פונק = פונקציה ()

blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) end}

בצד האפליקציה, הוסף ווידג'ט SuperChart. הוסף מעבד, זרימות נתונים של RAM והקצה ל- V5, V6.

שלב 7: מצב ספינינג HDD

לנתב שלי יש כונן HDD חיצוני המחובר כמכשיר אחסון מצורף לרשת. העניין הוא שהכונן הזה מוגדר להתחיל להסתובב כשמישהו ניגש אליו ולהשהות אותו לאחר פסק זמן.

ברור שיהיה מגניב לדעת כמה פעמים הוא נדלק במהלך היום. אז הוספתי זרם נתונים נוסף לתרשים המערכת שלי.

זה קצת יותר מסובך לקבל את הסטטוס של כונן HDD, אבל מצאתי דרך! קודם כל, התקן את smartmontools ממסוף ה- SSH:

עדכון opkg

opkg להתקין smartmontools

לאחר מכן, בקוד שלנו, עלינו להריץ פקודה מיוחדת ולבדוק את קוד היציאה:

פונקציה exec_ret (cmd)

יציאה מקומית = os.execute (cmd) הדפסה ("הפעלה:".. cmd.. " -> יציאה:".. יציאה) חזור פונקציית סיום יציאה getHddSpinning () אם exec_ret ("smartctl --nocheck = standby --info /dev/sda>/dev/null ") == 0 ואז החזר 1 אחר החזר 0 סוף סוף

הערה: הדיסק הקשיח שלי הוא /dev /sda

שלב 8: תרשים פעילות רשת

תרשים פעילות רשת
תרשים פעילות רשת

אנו יוצרים יישומון SuperChart נוסף (בדומה לקודמו), מוסיפים זרימות נתונים של TX ו- RX ומקצים ל- V1 ו- V2 הערה: אני רוצה להציג את נתוני WAN port, ויציאת ה- WAN שלי היא eth0.2

פונקציות עוזרות:

פונקציה getWanRxBytes ()

החזר tonumber (read_file ("/sys/class/net/eth0.2/statistics/rx_bytes")) פונקציית סיום getWanTxBytes () החזר tonumber (read_file ("/sys/class/net/eth0.2/statistics/tx_bytes")) סוף

לאחר מכן, הוסף קוד לאותו tmr1. זה מסובך יותר, מכיוון שאנו רק צריכים לחשב ולהציג את ההבדל בתאים המועברים/מתקבלים:

מקומי prevTx, prevRx

מקומי tmr1 = טיימר: חדש {מרווח = 5000, func = פונקציה () מקומי tx = getWanTxBytes () מקומי rx = getWanRxBytes () אם prevTx ו- prevTx ~ = tx אז 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: virtualWrite (7, getHddSpinning ()) סוף}

שלב 9: הודעות

התראות
התראות

רציתי גם לקבל הודעה כאשר הנתב שלי מאבד חשמל או חיבור לאינטרנט. לשם כך, אנו זקוקים לווידג'ט התראות.

בהגדרות ווידג'ט, הפעל "התראה לא מקוונת". אין צורך בקוד. אך אנו יכולים גם לשלוח הודעות מותאמות אישית מהקוד שלנו.

שלב 10: הפעלה אוטומטית ברקע

לעת עתה, הסקריפט צריך להתבצע באופן ידני, אך אני רוצה לגרום לו לפעול ברקע באופן אוטומטי כאשר הנתב מופעל.

הדבר נעשה על ידי יצירת שירות. צור קובץ /etc/init.d/blynkmon:

#!/bin/sh /etc/rc.common

START = 99 STOP = pidfile = "/var/run/blynkmon.pid" start () {if [-f $ pidfile]; ואז הד "בלינקמון כבר פועל" יציאה 0 fi cd /root /lua-blynk lua blynkmon.lua your-auth-token> /dev /null & echo $! > $ pidfile} stop () {if [! -f $ pidfile]; ואז הד "בלינקמון לא פועל" יציאה 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

הערה: אל תשכח להחליף את ה- your-auth-token

לאחר מכן, הפעל את שירות blynkmon:

שירות blynkmon אפשר

שלב 11: סיכום ורעיונות נוספים

סיכום ורעיונות נוספים
סיכום ורעיונות נוספים

אתה יכול לסרוק את ה- QR הזה כדי לקבל את השיבוט של פרויקט Blynk שלי. זה דורש כמה נקודות אנרגיה (4600), מכיוון שהוא משתמש בהרבה ווידג'טים!

מצא את קוד לואה המלא כאן:

עד כה טוב, אבל הנה כמה רעיונות שהייתי רוצה להוסיף בעתיד הקרוב.

  • הוסף את הפקודה Reboot. מנע לחיצה עליו בטעות.
  • הוסף ווידג'ט מסוף להפעלת כל פקודת לינוקס.
  • הוסף תרשים טמפרטורת מעבד.

    UPD: לצערי OpenWrt חסרים כרגע מנהלי התקנים לדגם הנתב שלי. אבל הוא זמין לנתבים רבים אחרים

  • הוסף הודעה כאשר מכשיר מסוים מצטרף/עוזב את הרשת. יש לנו כבר מידע ARP, עכשיו בדוק רק את כתובת ה- MAC.

בדרך זו אנו יכולים לפקח ולשלוט במדפסות תלת -ממד, רובוטים, מחשב/מחשב נייד רגיל, Arduino/ESP8266/ESP32/RaspberryPi, מכשירי בית חכם ולמעשה כל דבר בסביבה. הודע לי אם יש לך רעיונות מעניינים אחרים. מה אתה חושב על כל זה?

מוּמלָץ: