فهرست مطالب:

برنامه Android/iOS برای دسترسی از راه دور به روتر OpenWrt شما: 11 مرحله
برنامه Android/iOS برای دسترسی از راه دور به روتر OpenWrt شما: 11 مرحله

تصویری: برنامه Android/iOS برای دسترسی از راه دور به روتر OpenWrt شما: 11 مرحله

تصویری: برنامه Android/iOS برای دسترسی از راه دور به روتر OpenWrt شما: 11 مرحله
تصویری: باز کردن قفل آیفون در 30 ثانیه ! 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 و دیگران. این آموزش همچنین ایده های اساسی پشت ایجاد چنین برنامه هایی را توضیح می دهد ، بنابراین می توانید آن را به راحتی با رزبری پای و موارد مشابه آن کار کنید.

برای این پروژه ، من بیشتر از نرم افزار از پیش نصب شده استفاده می کنم (در هر روتر مجهز به OpenWrt موجود است). اما برای برخی از عملکردهای پیشرفته ، مجبور شدم بسته های اضافی را نصب کنم. این کار تنها با چند کلیک انجام می شود ، بنابراین دستورالعمل ها را در اینجا قرار می دهم.

همچنین ، فرض می کنم که شما قبلاً می دانید:

  • نحوه باز کردن/استفاده از ترمینال SSH در روتر OpenWrt شما
  • نحوه بارگذاری/ویرایش فایل ها در روتر خود (از FileZilla یا scp/sftp استفاده کنید)
  • نحوه کار با کنسول لینوکس

مرحله 2: نرم افزار و ابزارها

نرم افزار و ابزار
نرم افزار و ابزار

در سمت تلفن هوشمند ، من از Blynk استفاده می کنم. این برنامه برای کنترل هر گونه سخت افزار برنامه های iOS و Android را ارائه می دهد. شما به راحتی می توانید واسطه های گرافیکی زیبایی را برای همه پروژه های خود با کشیدن و رها کردن ویجت ها ، درست در تلفن هوشمند خود بسازید. Blynk بیشتر با Arduino ، Raspberry Pi و غیره استفاده می شود. اما چرا آن را روی روتر خود اجرا نمی کنید؟ ؛)

در سمت دستگاه ، من از Lua برای اسکریپت عملکرد مورد نیاز استفاده می کنم. همچنین می توانم از Python یا Node.js استفاده کنم ، اما متأسفانه به دلیل کمبود منابع در برخی از روترها ، این گزینه ها همیشه در دسترس نیستند. یا 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 ، زمان به روز

ایده اصلی این است که اطلاعات را به طور دوره ای از سیستم عامل دریافت کنید ، در صورت نیاز محاسبات ساده را انجام دهید و سپس نتیجه را برای نمایش به Blynk ارسال کنید.

در لینوکس/OpenWrt ، چندین روش برای بدست آوردن اطلاعات سیستم داریم:

  • یک فرمان را اجرا کرده و متن خروجی آن را تجزیه کنید
  • یک فرمان را اجرا کنید و کد خروجی را که برمی گرداند را تماشا کنید
  • یک فایل سیستم ، واقع در/proc/و/sys/class/directory را بخوانید

اکنون می خواهم تعداد دستگاه های متصل را نمایش دهم.

وقتی 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 تجزیه کنیم ، اما اغلب استفاده از ابزارهای تخصصی آسان تر است. در لینوکس ، اینها 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) اگر فایل نباشد ، نتیجه را صفر کنید: خروجی) خروجی خروجی تابع read_file (path) فایل محلی = io.open (path ، "rb") اگر فایل نباشد ، محتوای محلی = فایل را به صفر بازگردانید: فایل "*a" را بخوانید (close () print ("Read: "..path.." -> ".. محتوا) پایان محتوا را برگردانید

با استفاده از این ابزارهای کاربردی ، اکنون می توانیم توابع واکشی واقعی داده ها را پیاده سازی کنیم:

تابع getArpClients ()

return tonumber (exec_out ("cat/proc/net/arp | grep br -lan | grep 0x2 | wc -l")) end 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 App است. مثال پیش فرض زمان سنج را تنظیم می کند ، که هر 5 ثانیه مقداری کد اجرا می کند ، بنابراین ما فقط از آن استفاده مجدد می کنیم:

محلی tmr1 = تایمر: جدید {interval = 5000 ، func = function ()

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

در برنامه ، ما 3 ویجت برچسب اضافه می کنیم و بر این اساس آنها را به پین های مجازی 10 ، 11 ، 12 اختصاص می دهیم.

در حالی که این کار می کند ، نسبتاً ناکارآمد است ، زیرا IP WAN یا تعداد کلاینت ها به طور مرتب به روز نمی شوند. بیایید این را برطرف کنیم

برای WAN IP ، ما آن را به کنترل کننده متصل منتقل می کنیم. هر بار که روتر ارتباطی با Blynk Cloud برقرار می کند ، اجرا می شود. این باید کافی باشد:

blynk: روشن ("متصل" ، عملکرد ()

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)) end}

مرحله 5: کنترل WiFi: روشن/خاموش

کنترل WiFi: روشن/خاموش
کنترل WiFi: روشن/خاموش

تا کنون ، ما فقط اطلاعاتی از دستگاه دریافت می کردیم. بیایید سعی کنیم آن را کنترل کنیم!

blynk: روشن ("V20" ، عملکرد (param)

اگر param [1] == "1" سپس os.execute ("wifi up") وگرنه os.execute ("wifi down") انتهای انتهایی)

در سمت برنامه ، من فقط یک ویجت Button (حالت: 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 استفاده کنیم):

محلی tmr1 = تایمر: جدید {interval = 5000 ، func = function ()

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)

local exit = os.execute (cmd) print ("Run:"..cmd.. " -> exit:".. exit) بازگشت تابع پایان خروجی getHddSpinning () if exec_ret ("smartctl --nocheck = standby --info /dev/sda>/dev/null ") == 0 سپس 1 دیگر برگردانید 0 پایان پایانی

توجه: هارد دیسک من /dev /sda است

مرحله 8: نمودار فعالیت شبکه

نمودار فعالیت شبکه
نمودار فعالیت شبکه

ما یک ویجت SuperChart دیگر (مشابه قبلی) ایجاد می کنیم ، DATSTREAM های TX و RX را اضافه می کنیم و به V1 و V2 اختصاص می دهیم. توجه: من می خواهم statc پورت WAN را نمایش دهم و پورت WAN من eth0.2 است

توابع کمکی:

تابع getWanRxBytes ()

return tonumber (read_file ("/sys/class/net/eth0.2/statistics/rx_bytes")) تابع پایانی getWanTxBytes () بازگرداندن تعداد (read_file ("/sys/class/net/eth0.2/statistics/tx_bytes")) پایان

بعد ، مقداری کد به همان tmr1 اضافه کنید. این پیچیده تر است ، زیرا ما فقط باید تفاوت بایت های ارسال شده/دریافت شده را محاسبه و نمایش دهیم:

prevTx محلی ، prevRx

local tmr1 = Timer: new {interval = 5000، func = function () local tx = getWanTxBytes () local rx = getWanRxBytes () if prevTx و prevTx ~ = tx سپس blynk: virtualWrite (1 ، tx - prevTx) اگر prevRx و prevRx r = rx سپس blynk: virtualWrite (2، rx - prevRx) پایان prevTx = tx prevRx = rx blynk: virtualWrite (5، getCpuLoad ()) blynk: virtualWrite (6، getRamUsage ()) blynk: virtualWdS (7،)) پایان}

مرحله 9: اعلان ها

اطلاعیه
اطلاعیه

من همچنین می خواستم هنگامی که روتر من برق یا اتصال اینترنت خود را قطع می کند به من اطلاع داده شود. برای این منظور ، ما به ویجت Notification نیاز داریم.

در تنظیمات ویجت ، "اعلان آفلاین" را فعال کنید. نیازی به کد نیست. اما ما همچنین می توانیم اعلان های سفارشی را از کد خود ارسال کنیم.

مرحله 10: خودکار در پس زمینه

در حال حاضر اسکریپت باید به صورت دستی اجرا شود ، اما من می خواهم وقتی روتر روشن می شود ، به طور خودکار در پس زمینه اجرا شود.

این کار با ایجاد یک سرویس انجام می شود. ایجاد یک فایل /etc/init.d/blynkmon:

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

START = 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 در حال اجرا نیست" خروج 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

توجه: فراموش نکنید که توکن خود را جایگزین کنید

سپس سرویس blynkmon را فعال کنید:

سرویس blynkmon را فعال کنید

مرحله 11: نتیجه گیری و ایده های بیشتر

نتیجه گیری و ایده های بیشتر
نتیجه گیری و ایده های بیشتر

شما می توانید این QR را اسکن کنید تا کلون پروژه Blynk من را دریافت کنید. به برخی از نقاط انرژی (4600) نیاز دارد ، زیرا از ویجت های زیادی استفاده می کند!

کد کامل Lua را در اینجا پیدا کنید:

تا اینجا خوب است ، اما در اینجا ایده هایی وجود دارد که می خواهم در آینده به آنها اضافه کنم.

  • دستور Reboot را اضافه کنید. از کلیک تصادفی روی آن جلوگیری کنید.
  • ویجت ترمینال را برای اجرای هرگونه دستور لینوکس اضافه کنید.
  • نمودار دمای CPU را اضافه کنید.

    UPD: متأسفانه OpenWrt در حال حاضر فاقد برخی از درایورها برای مدل روتر من است. اما برای بسیاری از روترهای دیگر در دسترس است

  • هنگام پیوستن/خروج یک دستگاه از شبکه ، اعلان اضافه کنید. ما قبلاً اطلاعات arp داریم ، اکنون فقط آدرس MAC را بررسی کنید.

به این ترتیب ، ما می توانیم پرینترهای سه بعدی ، روبات ها ، یک رایانه شخصی/لپ تاپ معمولی ، Arduino/ESP8266/ESP32/RaspberryPi ، دستگاه های خانه هوشمند و تقریباً هر چیزی را در اطراف مانیتور و کنترل کنیم. اگر ایده جالب دیگری دارید به من اطلاع دهید. نظر شما در مورد همه اینها چیست؟

توصیه شده: