جدول المحتويات:

تطبيق Android / iOS للوصول إلى جهاز التوجيه OpenWrt الخاص بك عن بُعد: 11 خطوة
تطبيق Android / iOS للوصول إلى جهاز التوجيه OpenWrt الخاص بك عن بُعد: 11 خطوة

فيديو: تطبيق Android / iOS للوصول إلى جهاز التوجيه OpenWrt الخاص بك عن بُعد: 11 خطوة

فيديو: تطبيق Android / iOS للوصول إلى جهاز التوجيه OpenWrt الخاص بك عن بُعد: 11 خطوة
فيديو: Build Your Own Network Bonding Router: Raspberry Pi with Speedify for Faster Internet 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 ، Girlfriend Flashing. واو ضحكت بشدة!:)

انتباه! يمكن أن يؤدي تثبيت OpenWrt إلى تعطيل جهاز التوجيه الخاص بك. ولكن بمجرد اكتمالها ، فإنها تفتح لك القوة والتحكم الكاملين. لست شجاعًا بما يكفي لتقديم أي تعليمات هنا ، حيث قد تختلف باختلاف طراز جهاز التوجيه.

ولكن إذا كان لديك OpenWrt بالفعل على جهاز التوجيه الخاص بك ، فستتمكن من البدء بهذا البرنامج التعليمي في وقت قريب

راجع للشغل ، بعض لوحات التطوير تأتي مع OpenWrt خارج الصندوق ، مثل Onion Omega و VoCore و LinkIt Smart 7688 وغيرها. يشرح هذا البرنامج التعليمي أيضًا بعض الأفكار الأساسية وراء إنشاء مثل هذه التطبيقات ، بحيث يمكنك بسهولة تكييفها للعمل مع Raspberry Pi وما شابه.

بالنسبة لهذا المشروع ، سأستخدم في الغالب برامج مثبتة مسبقًا (متوفرة على أي جهاز توجيه يدعم OpenWrt). ولكن بالنسبة لبعض الوظائف المتقدمة ، كان علي تثبيت حزم إضافية. يتم ذلك بنقرات قليلة فقط ، لذلك سأقوم بتضمين التعليمات هنا.

أيضًا ، أفترض أنك تعرف بالفعل:

  • كيفية فتح / استخدام محطة SSH لجهاز التوجيه OpenWrt الخاص بك
  • كيفية تحميل / تحرير الملفات على جهاز التوجيه الخاص بك (استخدم FileZilla أو scp / sftp)
  • كيفية العمل مع Linux Console

الخطوة الثانية: البرامج والأدوات

البرمجيات والأدوات
البرمجيات والأدوات

على جانب الهاتف الذكي ، أستخدم Blynk. يوفر تطبيقات iOS و Android للتحكم في أي جهاز. يمكنك بسهولة إنشاء واجهات رسومية جميلة لجميع مشاريعك ببساطة عن طريق سحب وإسقاط الحاجيات ، مباشرة على هاتفك الذكي. يستخدم Blynk في الغالب مع Arduino و Raspberry Pi وما إلى ذلك ولكن لماذا لا يتم تشغيله على جهاز التوجيه نفسه؟ ؛)

على جانب الجهاز ، سأستخدم Lua لبرمجة الوظائف المطلوبة ، ويمكنني أيضًا استخدام Python أو Node.js ، لكن للأسف لا تتوفر هذه الخيارات دائمًا ، بسبب نقص الموارد في بعض أجهزة التوجيه ، أو C / C ++ ، ولكن ليس من الملائم العمل مع (إعادة التحويل البرمجي لكل تغيير ، وما إلى ذلك) من ناحية أخرى ، Lua مثبت مسبقًا ، وهو سهل الاستخدام والتعلم. يتم استخدامه بواسطة واجهة الويب الافتراضية ، LuCI.

الخطوة 3: إنشاء تطبيق بسيط

إن بدء استخدام Blynk و Lua سهل مثل:

  • قم بتنزيل تطبيق Blynk (من متجر التطبيقات ، Google Play)
  • قم بإنشاء مشروع جديد واحصل على Auth Token
  • اتبع تعليمات تثبيت Blynk Lua الخاصة بـ OpenWrt.

استخدم SSH للوصول إلى وحدة التحكم في جهاز التوجيه. بعد تشغيل المثال الافتراضي:

lua./examples/client.lua

يجب أن نرى شيئًا كهذا:

توصيل…

مصافحة SSL … جاهز.

مما يعني أنه تم إنشاء اتصال آمن ثنائي الاتجاه بالتطبيق!

يمكننا الآن بسهولة توسيع المثال المقدم ، لذلك فهو يفعل شيئًا مثيرًا للاهتمام. لقد قمت بإنشاء نسخة من هذا المثال لتحريره:

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

الخطوة 4: إضافة بعض المعلومات: عدد العملاء ، عنوان IP لشبكة WAN ، وقت التشغيل

الفكرة الأساسية هي الحصول على المعلومات من نظام التشغيل بشكل دوري ، وإجراء بعض الحسابات البسيطة إذا لزم الأمر ، ثم إرسال النتيجة إلى Blynk لعرضها.

في Linux / OpenWrt ، لدينا عدة طرق للحصول على بيانات النظام:

  • قم بتشغيل أحد الأوامر ، وقم بتحليل النص الذي يخرجه
  • قم بتشغيل أحد الأوامر ، وراقب كود الخروج الذي يعيده
  • اقرأ ملف النظام الموجود في / proc / و / sys / class / الدلائل

الآن أريد عرض عدد الأجهزة المتصلة.

عندما أقوم بتشغيل cat / proc / net / arp على وحدة التحكم ، فإنه ينتج قائمة بالأجهزة المعروفة ، إلى جانب عناوين MAC و IP الخاصة بها:

عنوان IP نوع HW Flags HW address Mask الجهاز

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 ، أحتاج إلى تصفية الجدول (إزالة العناصر غير ذات الصلة) وحساب صفوف الجدول ، مما يؤدي إلى الأمر التالي:

قطة / بروك / صافي / ARP | grep br-lan | grep 0x2 | مرحاض -l

فلنجربها:

root @ router: ~ / lua-blynk # cat / proc / net / arp | grep br-lan | grep 0x2 | مرحاض -l

1

رائعة. نحصل الآن على فكرة كيف يمكننا جمع كل المعلومات المطلوبة. لنقم بأتمتة ذلك ، ولجعل الكود الخاص بنا نظيفًا وقابلًا للتوسيع ، دعنا ننشئ بعض الوظائف المساعدة:

وظيفة exec_out (cmd)

local file = io.popen (cmd) إذا لم يكن ملفًا ، فقم بإرجاع nil end local output = file: read ('* all') file: close () print ("Run:"..cmd.. "->".. الإخراج) إرجاع وظيفة نهاية الإخراج read_file (المسار) الملف المحلي = io.open (المسار ، "rb") إذا لم يكن ملفًا ، فقم بإرجاع nil end local content = file: read file: close () print ("قراءة: "..path.." -> "..content) إرجاع نهاية المحتوى

باستخدام هذه الأدوات المساعدة ، يمكننا الآن تنفيذ وظائف جلب البيانات الفعلية:

دالة getArpClients ()

return tonumber ("cat / proc / net / arp | grep br-lan | grep 0x2 | wc -l")) وظيفة النهاية getUptime () عودة 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

يمكنك تشغيل أجزاء من أوامر shell هذه ، لاكتساب فهم أعمق لكيفية عملها ، ولتعديلها وفقًا لاحتياجاتك.

أسهل جزء هو إرسال البيانات إلى تطبيق Blynk. يقوم المثال الافتراضي بالفعل بإعداد المؤقت ، والذي يقوم بتشغيل بعض التعليمات البرمجية كل 5 ثوانٍ ، لذلك نقوم بإعادة استخدامه:

local tmr1 = Timer: جديد {الفاصل الزمني = 5000 ، func = الوظيفة ()

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

في التطبيق ، أضفنا 3 أدوات تسمية ، وقمنا بتعيينها إلى Virtual Pins 10 ، 11 ، 12 وفقًا لذلك.

بينما يعمل هذا ، فإنه غير فعال إلى حد ما ، حيث لا يتم تحديث WAN IP أو عدد العملاء بشكل متكرر. دعنا نصلح هذا

بالنسبة إلى WAN IP ، ننقله إلى معالج متصل. سيتم تشغيله في كل مرة ينشئ فيها جهاز التوجيه الاتصال بـ Blynk Cloud. يجب أن يكون هذا كافيًا:

blynk: on ("متصل" ، الوظيفة ()

طباعة ("جاهز.") blynk: virtualWrite (12 ، getWanIP ()) end)

بالنسبة لأعداد الجهوزية وعدد العملاء ، نقوم بإنشاء مؤقت منفصل بـ 5 دقائق. فترة:

local tmr2 = Timer: جديد {الفاصل الزمني = 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: on ("V20" ، الوظيفة (بارام)

if param [1] == "1" ثم os.execute ("wifi up") آخر os.execute ("wifi down") end)

على جانب التطبيق ، أضفت للتو أداة Button (الوضع: Switch) وقمت بتعيينها إلى V20.

هذا كل شيء. مدهش.

الخطوة 6: مخطط إحصائيات النظام

مخطط إحصائيات النظام
مخطط إحصائيات النظام
مخطط إحصائيات النظام
مخطط إحصائيات النظام

وظيفة getCpuLoad ()

return tonumber ("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $ 2 + $ 4}'") وظيفة النهاية getRamUsage () return tonumber ("free | grep Mem | awk" {print ($ 3- $ 7) / $ 2 * 100.0} ")) النهاية

نحتاج أيضًا إلى إرسال البيانات إلى Blynk (دعنا نستخدم tmr1 مرة أخرى):

local tmr1 = Timer: جديد {الفاصل الزمني = 5000 ، func = function ()

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

على جانب التطبيق ، أضف أداة SuperChart. إضافة وحدة المعالجة المركزية ، وذاكرة الوصول العشوائي datastreams وتعيينها إلى V5 ، V6.

الخطوة 7: HDD Spinning Status

يحتوي جهاز التوجيه الخاص بي على محرك أقراص صلبة خارجي متصل كجهاز تخزين متصل بالشبكة ، ويتم تكوين محرك الأقراص هذا لبدء الدوران عند وصول شخص ما إليه ، والتعليق بعد انتهاء المهلة.

من الواضح أنه سيكون من الرائع معرفة عدد مرات تشغيله على مدار اليوم. لذلك أضفت داتاستريم آخر إلى مخطط النظام الخاص بي.

من الصعب قليلاً الحصول على حالة محرك الأقراص الصلبة ، لكنني وجدت طريقة! بادئ ذي بدء ، قم بتثبيت 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 end

ملاحظة: محرك الأقراص الثابتة الخاص بي هو / dev / sda

الخطوة 8: مخطط نشاط الشبكة

مخطط نشاط الشبكة
مخطط نشاط الشبكة

نقوم بإنشاء عنصر واجهة مستخدم SuperChart آخر (مشابه للواحد السابق) ، وإضافة TX و RX datastreams ، والتعيين إلى V1 و V2. ملاحظة: أريد عرض حالة منفذ WAN ، ومنفذ WAN الخاص بي هو eth0.2

وظائف المساعد:

وظيفة getWanRxBytes ()

return 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

local tmr1 = Timer: جديد {الفاصل الزمني = 5000 ، func = function () local tx = getWanTxBytes () local rx = getWanRxBytes () if prevTx و prevTx ~ = tx ثم blynk: virtualWrite (1، tx - prevTx) end if prevRx و prevRx ~ = rx ثم blynk: virtualWrite (2، rx - prevRx) end prevTx = tx prevRx = rx blynk: virtualWrite (5، getCpuLoad ()) blynk: virtualWrite (6، getRamUsage ()) blynk: virtualWrite (7، getHdSpinning ()) نهاية}

الخطوة 9: الإخطارات

إشعارات
إشعارات

أردت أيضًا أن يتم إخطاري عندما يفقد جهاز التوجيه الخاص بي الطاقة أو الاتصال بالإنترنت. لهذا ، نحتاج إلى أداة إعلام.

في إعدادات الأدوات ، قم بتمكين "الإعلام بلا اتصال". لا حاجة إلى رمز. ولكن يمكننا أيضًا إرسال إشعارات مخصصة من التعليمات البرمجية الخاصة بنا.

الخطوة 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 not running" exit 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

ملاحظة: لا تنسَ استبدال رمز المصادقة الخاص بك

ثم قم بتمكين خدمة blynkmon:

تمكين الخدمة blynkmon

الخطوة 11: الخلاصة والأفكار الأخرى

الخلاصة والأفكار الأخرى
الخلاصة والأفكار الأخرى

يمكنك مسح QR هذا للحصول على نسخة من مشروع Blynk الخاص بي. يتطلب بعض نقاط الطاقة (4600) ، لأنه يستخدم الكثير من الأدوات!

ابحث عن كود Lua الكامل هنا: https://gist.github.com/vshymanskyy/3d3388a4e17f44 …

جيد حتى الآن ، ولكن إليك بعض الأفكار التي أود إضافتها في المستقبل القريب.

  • أضف أمر إعادة التشغيل. منع النقر فوقه بطريق الخطأ.
  • أضف عنصر واجهة مستخدم Terminal لتشغيل أي أمر من أوامر linux.
  • أضف مخطط درجة حرارة وحدة المعالجة المركزية.

    محدث: للأسف يفتقر OpenWrt حاليًا إلى بعض برامج التشغيل لطراز جهاز التوجيه الخاص بي. ولكنه متاح للعديد من أجهزة التوجيه الأخرى

  • أضف إشعارًا عندما ينضم جهاز معين إلى الشبكة / يغادرها ، لدينا بالفعل معلومات ARP ، والآن تحقق فقط من عنوان MAC.

بهذه الطريقة ، يمكننا مراقبة الطابعات ثلاثية الأبعاد والروبوتات وجهاز كمبيوتر شخصي / كمبيوتر محمول عادي والتحكم فيها ، وأشياء Arduino / ESP8266 / ESP32 / RaspberryPi ، وأجهزة المنزل الذكي ، وأي شيء تقريبًا. اسمحوا لي أن أعرف إذا كان لديك أي أفكار أخرى مثيرة للاهتمام ، ما رأيك في كل هذا؟

موصى به: