Სარჩევი:

Android/iOS აპლიკაცია თქვენს OpenWrt როუტერზე დისტანციურად წვდომისათვის: 11 ნაბიჯი
Android/iOS აპლიკაცია თქვენს OpenWrt როუტერზე დისტანციურად წვდომისათვის: 11 ნაბიჯი

ვიდეო: Android/iOS აპლიკაცია თქვენს OpenWrt როუტერზე დისტანციურად წვდომისათვის: 11 ნაბიჯი

ვიდეო: Android/iOS აპლიკაცია თქვენს OpenWrt როუტერზე დისტანციურად წვდომისათვის: 11 ნაბიჯი
ვიდეო: pulpstone როუტერის დაყენება, როგორც წვდომის წერტილი wifi ვაუჩერების გადაცემისთვის #TeknisiWifi 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 ყუთს, როგორიცაა ხახვი ომეგა, VoCore, LinkIt Smart 7688 და სხვა. ეს გაკვეთილი ასევე განმარტავს რამდენიმე ძირითად იდეას ასეთი პროგრამების შექმნის უკან, ასე რომ თქვენ შეგიძლიათ მარტივად მოარგოთ იგი ჟოლოს პითან და მის მსგავსებთან მუშაობისთვის.

ამ პროექტისთვის მე ძირითადად ვიყენებ წინასწარ დაინსტალირებულ პროგრამულ უზრუნველყოფას (ხელმისაწვდომია OpenWrt ჩართული ნებისმიერი როუტერით). მაგრამ ზოგიერთი მოწინავე ფუნქციონირებისთვის, მე მომიწია დამატებითი პაკეტების დაყენება. ეს კეთდება მხოლოდ რამდენიმე დაწკაპუნებით, ასე რომ, მე დავამატებ ინსტრუქციებს აქ.

ასევე, მე ვვარაუდობ, რომ თქვენ უკვე იცით:

  • როგორ გახსნათ/გამოიყენოთ SSH ტერმინალი თქვენს OpenWrt როუტერზე
  • როგორ ატვირთოთ/შეცვალოთ ფაილები თქვენს როუტერზე (გამოიყენეთ FileZilla ან scp/sftp)
  • როგორ ვიმუშაოთ Linux კონსოლთან

ნაბიჯი 2: პროგრამული უზრუნველყოფა და ინსტრუმენტები

პროგრამული უზრუნველყოფა და ინსტრუმენტები
პროგრამული უზრუნველყოფა და ინსტრუმენტები

სმარტფონის მხრივ, მე ვიყენებ ბლინკს. ის უზრუნველყოფს iOS და Android პროგრამებს ნებისმიერი ტექნიკის გასაკონტროლებლად. თქვენ მარტივად შეგიძლიათ შექმნათ ულამაზესი გრაფიკული ინტერფეისები თქვენი ყველა პროექტისთვის, ვიჯეტების უბრალოდ გადაადგილებით და ჩამოშვებით, პირდაპირ თქვენს სმარტფონზე. Blynk ძირითადად გამოიყენება Arduino– სთან, Raspberry Pi– სთან და ა.შ. მაგრამ რატომ არ გაუშვით ის თავად როუტერზე?;)

მოწყობილობის მხრივ მე გამოვიყენებ ლუას საჭირო ფუნქციონირების სკრიპტირებისთვის. ასევე შემიძლია გამოვიყენო Python ან Node.js, მაგრამ სამწუხაროდ ეს პარამეტრები ყოველთვის არ არის ხელმისაწვდომი, ზოგიერთ მარშრუტიზატორზე რესურსების ნაკლებობის გამო. ან C/C ++, მაგრამ მასთან მუშაობა არც ისე მოსახერხებელია (ყოველი ცვლილების გადაფორმება და ა.შ.) მეორეს მხრივ, ლუა წინასწარ არის დაინსტალირებული, მისი გამოყენება და სწავლა მარტივია. იგი გამოიყენება ნაგულისხმევი ვებ ინტერფეისით, LuCI.

ნაბიჯი 3: შექმენით მინიმალური აპლიკაცია

ბლინკთან და ლუასთან დაწყება ისეთივე ადვილია, როგორც:

  • ჩამოტვირთეთ ბლინკის აპლიკაცია (App Store– დან, Google Play– დან)
  • შექმენით ახალი პროექტი და მიიღეთ Auth Token
  • მიჰყევით ბლინკ ლუას ინსტალაციის ინსტრუქციას OpenWrt– ისთვის.

გამოიყენეთ SSH როუტერის კონსოლზე წვდომისათვის. ნაგულისხმევი მაგალითის გაშვების შემდეგ:

lua./example/client.lua

ჩვენ უნდა ვნახოთ მსგავსი რამ:

დაკავშირება…

SSL ხელის ჩამორთმევა … მზადაა.

რაც იმას ნიშნავს, რომ აპთან უსაფრთხო, ორმხრივი კავშირი დამყარებულია! დიახ!

ჩვენ ახლა შეგვიძლია მარტივად განვავრცოთ მოწოდებული მაგალითი, ასე რომ ის აკეთებს რაიმე საინტერესოს. მე შევქმენი ამ მაგალითის ასლი მის შესწორებაზე:

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

ნაბიჯი 4: ინფორმაციის დამატება: კლიენტების რაოდენობა, WAN IP მისამართი, დრო

ძირითადი იდეა არის პერიოდულად მიიღოთ ინფორმაცია ოპერაციული სისტემის სისტემიდან, საჭიროების შემთხვევაში შეასრულოთ რამდენიმე მარტივი გამოთვლა და შემდეგ შედეგი გამოაგზავნოთ ბლინკში საჩვენებლად.

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

ჩვენ შეგვიძლია გავაანალიზოთ ის პირდაპირ ლუაში, მაგრამ ხშირად ადვილია სპეციალიზირებული კომუნალური პროგრამების გამოყენება. Linux– ზე ეს არის grep, head, tail, cut, wc, awk.

კლიენტების რაოდენობის მისაღებად 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 (სმდ)

ლოკალური ფაილი = io.popen (cmd) თუ არ არის ფაილი მაშინ დააბრუნე ნული დასასრული ადგილობრივი გამომავალი = ფაილი: წაიკითხე ('*ყველა') ფაილი: დახურე () print ("გაუშვი:"..cmd.. " ->".. გამომავალი) დააბრუნეთ გამომავალი დასრულებული ფუნქცია read_file (ბილიკი) ადგილობრივი ფაილი = io.open (გზა, "rb") თუ არ არის ფაილი მაშინ დააბრუნეთ ნული ბოლომდე ადგილობრივი შინაარსი = ფაილი: წაიკითხეთ "*a" ფაილი: close () print ("Read: "..გზა.." -> "..კონტენტი) შინაარსის დაბრუნების დასასრული

ამ კომუნალური საშუალებების გამოყენებით, ჩვენ ახლა შეგვიძლია განვახორციელოთ მონაცემთა მოპოვების ფაქტობრივი ფუნქციები:

ფუნქცია getArpClients ()

დაბრუნების რიცხვი (exec_out ("cat/proc/net/arp | grep br -lan | grep 0x2 | wc -l")) ბოლო ფუნქცია getUptime () tonumber დაბრუნება (exec_out ("cat/proc/uptime | awk '{ბეჭდვა $ 1 } '")) დასრულების ფუნქცია getWanIP () დაბრუნება exec_out (" ifconfig eth0.2 | grep' inet addr: '| cut -d: -f2 | awk' {print $ 1} '") დასასრული

თქვენ შეგიძლიათ გაუშვათ ამ shell ბრძანებების ნაწილები, მიიღოთ უფრო ღრმა გაგება, თუ როგორ მუშაობს იგი და მოერგოთ მას თქვენს საჭიროებებზე.

უმარტივესი ნაწილია მონაცემების გაგზავნა ბლინკის აპლიკაციაში. ნაგულისხმევი მაგალითი უკვე ადგენს ტაიმერს, რომელიც მუშაობს ყოველ 5 წამში კოდზე, ასე რომ ჩვენ უბრალოდ ვიყენებთ მას:

ადგილობრივი tmr1 = ტაიმერი: ახალი {ინტერვალი = 5000, func = ფუნქცია ()

blynk: virtualWrite (10, getArpClients ()) blynk: virtualWrite (11, string.format ("%. 1f h", getUptime ()/60/60)) blynk: virtualWrite (12, getWanIP ()) დასასრული}

აპლიკაციაში ჩვენ ვამატებთ ეტიკეტის 3 ვიჯეტს და შესაბამისად ვაძლევთ მათ ვირტუალურ ქინძისთავებს 10, 11, 12.

მიუხედავად იმისა, რომ ეს მუშაობს, ის საკმაოდ არაეფექტურია, რადგან WAN IP ან კლიენტების რაოდენობა ასე ხშირად არ განახლდება. მოდი ეს გავასწოროთ

WAN IP– ისთვის ჩვენ გადავიტანთ დაკავშირებულ დამმუშავებელს. ის იმუშავებს ყოველ ჯერზე, როდესაც როუტერი დაამყარებს კავშირს Blynk Cloud– თან. ეს საკმარისი უნდა იყოს:

blynk: ჩართულია ("დაკავშირებულია", ფუნქცია ()

print ("Ready.") blynk: virtualWrite (12, getWanIP ()) დასასრული)

დროისა და კლიენტთა ნომრისთვის ჩვენ ვქმნით ცალკე ტაიმერს 5 წთ. ინტერვალი:

ადგილობრივი tmr2 = ტაიმერი: ახალი {ინტერვალი = 5*60*1000, ფუნქცია = ფუნქცია ()

blynk: virtualWrite (10, getArpClients ()) blynk: virtualWrite (11, string.format ("%. 1f სთ", getUptime ()/60/60)) დასასრული}

ნაბიჯი 5: WiFi კონტროლი: ON/OFF

WiFi კონტროლი: ON/OFF
WiFi კონტროლი: ON/OFF

აქამდე ჩვენ მხოლოდ ინფორმაციას ვიღებდით მოწყობილობიდან. შევეცადოთ გავაკონტროლოთ ის!

blynk: ჩართულია ("V20", ფუნქცია (პარამეტრი)

თუ param [1] == "1" მაშინ os.execute ("wifi up") სხვა os.execute ("wifi down") ბოლომდე)

პროგრამის მხარეს, მე უბრალოდ დავამატე ღილაკის ვიჯეტი (რეჟიმი: გადართვა) და მივანიჭე V20.

Ის არის. საოცარი.

ნაბიჯი 6: სისტემის სტატისტიკის სქემა

სისტემის სტატისტიკის სქემა
სისტემის სტატისტიკის სქემა
სისტემის სტატისტიკის სქემა
სისტემის სტატისტიკის სქემა

ფუნქცია getCpuLoad ()

დაბრუნების რიცხვი (exec_out ("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $ 2+$ 4}'")) ბოლო ფუნქცია getRamUsage () ტონუმერის დაბრუნება (exec_out ("უფასო | grep Mem | awk" {ბეჭდვა ($ 3- $ 7)/$ 2 * 100.0} "")) დასასრული

ჩვენ ასევე გვჭირდება მონაცემების გაგზავნა ბლინკში (ისევ გამოვიყენოთ tmr1):

ადგილობრივი tmr1 = ტაიმერი: ახალი {ინტერვალი = 5000, func = ფუნქცია ()

blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) დასასრული}

აპლიკაციის გვერდზე დაამატეთ SuperChart ვიჯეტი. დაამატეთ CPU, RAM მონაცემთა ნაკადები და მიანიჭეთ V5, V6.

ნაბიჯი 7: მყარი დისკის დაწნული სტატუსი

ჩემს როუტერს აქვს გარე HDD დრაივი, რომელიც დაკავშირებულია როგორც ქსელთან დაკავშირებული შენახვის მოწყობილობა. საქმე ის არის, რომ ეს დისკი არის კონფიგურირებული, რომ დაიწყოს ტრიალი, როდესაც ვინმე წვდება მასზე და შეჩერდეს დროის გასვლის შემდეგ.

ცხადია, მაგარი იქნება იცოდეთ რამდენჯერ ირთვება დღის განმავლობაში. ასე რომ, მე დავამატე კიდევ ერთი მონაცემთა ნაკადი ჩემს სისტემის სქემაში.

HDD დისკის სტატუსის მოპოვება ცოტა უფრო რთულია, მაგრამ მე ვიპოვე გზა! უპირველეს ყოვლისა, დააინსტალირეთ smartmontools SSH კონსოლიდან:

opkg განახლება

opkg დააინსტალირეთ smartmontools

შემდეგ, ჩვენს კოდში, ჩვენ უნდა შევასრულოთ სპეციალური ბრძანება და შევამოწმოთ გასასვლელი კოდი:

ფუნქცია exec_ret (სმდ)

ლოკალური გასვლა = os.execute (cmd) print ("გაუშვით:"..cmd.. " -> გასვლა:".. გასვლა) დაბრუნება გასასვლელი ბოლოს ფუნქცია getHddSpinning () if exec_ret ("smartctl --nocheck = ლოდინის -info /dev/sda>/dev/null ") == 0 შემდეგ დააბრუნეთ 1 სხვა დაბრუნდით 0 ბოლომდე

შენიშვნა: ჩემი HDD არის /dev /sda

ნაბიჯი 8: ქსელის აქტივობის სქემა

ქსელის აქტივობის სქემა
ქსელის აქტივობის სქემა

ჩვენ ვქმნით სხვა SuperChart ვიჯეტს (წინა მსგავსი), ვამატებთ TX და RX მონაცემთა ნაკადებს და ვანიჭებთ V1 და V2– ს. შენიშვნა: მინდა ვაჩვენო WAN პორტის სტატისტიკა და ჩემი WAN პორტი არის eth0.2

დამხმარე ფუნქციები:

ფუნქცია getWanRxBytes ()

დაბრუნების რიცხვი (წაკითხვის_ ფაილი ("/sys/class/net/eth0.2/სტატისტიკა/rx_bytes")) ფუნქციის დასრულება getWanTxBytes () დაბრუნების რიცხვი (წაკითხვის_ ფაილი ("/sys/class/net/eth0.2/სტატისტიკა/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,)) დასასრული}

ნაბიჯი 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 შენი-ავტორი-ნიშანი> /dev /null & echo $! > $ pidfile} stop () {if [! -f $ pidfile]; შემდეგ ეხმიანება "blynkmon არ მუშაობს" გასასვლელი 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

შენიშვნა: არ უნდა დაგვავიწყდეს, შეცვალოთ თქვენი- author-token

შემდეგ ჩართეთ blynkmon სერვისი:

სერვისის blynkmon ჩართვა

ნაბიჯი 11: დასკვნა და შემდგომი იდეები

დასკვნა და შემდგომი იდეები
დასკვნა და შემდგომი იდეები

თქვენ შეგიძლიათ დაასკანიროთ ეს QR, რომ მიიღოთ ჩემი ბლინკის პროექტის კლონი. ის მოითხოვს ენერგიის გარკვეულ წერტილებს (4600), რადგან ის იყენებს უამრავ ვიჯეტს!

იპოვეთ ლუას სრული კოდი აქ:

ჯერჯერობით ყველაფერი კარგად არის, მაგრამ აქ არის რამოდენიმე იდეა, რომლის დამატებაც მსურს უახლოეს მომავალში.

  • დაამატეთ გადატვირთვის ბრძანება. თავიდან აიცილეთ მასზე შემთხვევით დაწკაპუნება.
  • დაამატეთ ტერმინალის ვიჯეტი Linux– ის ნებისმიერი ბრძანების გასაშვებად.
  • დაამატეთ პროცესორის ტემპერატურის გრაფიკი.

    UPD: სამწუხაროდ OpenWrt– ს ამჟამად არ აქვს დრაივერები ჩემი როუტერის მოდელისთვის. მაგრამ ის ხელმისაწვდომია მრავალი სხვა მარშრუტიზატორისთვის

  • დაამატეთ შეტყობინება, როდესაც კონკრეტული მოწყობილობა უერთდება/ტოვებს ქსელს. ჩვენ უკვე გვაქვს arp ინფორმაცია, ახლა მხოლოდ MAC მისამართის შემოწმება.

ამ გზით, ჩვენ შეგვიძლია მონიტორინგი და კონტროლი 3D პრინტერებზე, რობოტებზე, ჩვეულებრივ კომპიუტერზე/ლეპტოპზე, Arduino/ESP8266/ESP32/RaspberryPi ნივთებზე, Smart Home მოწყობილობებზე და პრაქტიკულად გარშემო ყველაფერი. ნება მომეცით ვიცი რაიმე სხვა საინტერესო იდეა. რას ფიქრობთ ამ ყველაფერზე?

გირჩევთ: