สารบัญ:

แอป Android/iOS เพื่อเข้าถึงเราเตอร์ OpenWrt ของคุณจากระยะไกล: 11 ขั้นตอน
แอป Android/iOS เพื่อเข้าถึงเราเตอร์ OpenWrt ของคุณจากระยะไกล: 11 ขั้นตอน

วีดีโอ: แอป Android/iOS เพื่อเข้าถึงเราเตอร์ OpenWrt ของคุณจากระยะไกล: 11 ขั้นตอน

วีดีโอ: แอป Android/iOS เพื่อเข้าถึงเราเตอร์ OpenWrt ของคุณจากระยะไกล: 11 ขั้นตอน
วีดีโอ: Professional Remote Access for Your Smart Home 2024, พฤศจิกายน
Anonim
แอพ Android/iOS เพื่อเข้าถึง OpenWrt Router ของคุณจากระยะไกล
แอพ Android/iOS เพื่อเข้าถึง OpenWrt Router ของคุณจากระยะไกล
แอพ Android/iOS เพื่อเข้าถึง OpenWrt Router ของคุณจากระยะไกล
แอพ Android/iOS เพื่อเข้าถึง OpenWrt Router ของคุณจากระยะไกล

ฉันเพิ่งซื้อเราเตอร์ใหม่ (Xiaomi Mi Router 3G) และแน่นอน ฮาร์ดแวร์ชิ้นใหม่ที่ยอดเยี่ยมนี้เป็นแรงบันดาลใจให้ฉันเริ่มทำงานในโครงการนี้;)

ขั้นตอนที่ 1: ฉันถือว่าคุณมี OpenWrt แล้ว…

ฉันคิดว่าคุณมี OpenWrt แล้ว…
ฉันคิดว่าคุณมี OpenWrt แล้ว…

ฉันต้องติดตั้ง OpenWrt ก่อน… ส่วนใหญ่ฉันทำตามคำแนะนำนี้ (เฉพาะสำหรับเราเตอร์รุ่นนี้):https://dzone.com/articles/hacking-into-xiaomi-mi-…ในขณะที่ทำงานนี้ ฉันพบวิดีโอที่ยอดเยี่ยมนี้: การติดตั้ง Openwrt, เกณฑ์มาตรฐาน WiFi, Girlfriend Flashing. Wow ฉันหัวเราะหนักมาก!:)

ความสนใจ! การติดตั้ง OpenWrt สามารถทำให้เราเตอร์ของคุณพังได้ แต่เมื่อเสร็จแล้วจะปลดล็อกพลังและการควบคุมอย่างเต็มที่ ฉันไม่กล้าให้คำแนะนำใดๆ ในที่นี้ เนื่องจากคำแนะนำอาจแตกต่างกันไปตามรุ่นเราเตอร์ทุกรุ่น

แต่ถ้าคุณมี OpenWrt บนเราเตอร์อยู่แล้ว คุณจะสามารถเริ่มด้วยบทช่วยสอนนี้ได้ในเวลาไม่นาน

BTW บอร์ดพัฒนาบางตัวมาพร้อมกับ OpenWrt แบบแกะกล่อง เช่น Onion Omega, VoCore, LinkIt Smart 7688 และอื่นๆ บทช่วยสอนนี้ยังอธิบายแนวคิดพื้นฐานเบื้องหลังการสร้างแอพดังกล่าว ดังนั้นคุณจึงสามารถปรับให้เข้ากับ Raspberry Pi และสิ่งที่ชอบได้อย่างง่ายดาย

สำหรับโปรเจ็กต์นี้ ฉันจะใช้ซอฟต์แวร์ที่ติดตั้งล่วงหน้าเป็นส่วนใหญ่ (มีในเราเตอร์ที่เปิดใช้งาน OpenWrt) แต่สำหรับฟังก์ชันขั้นสูงบางอย่าง ฉันต้องติดตั้งแพ็คเกจเพิ่มเติม ทำได้ในไม่กี่คลิก ดังนั้นฉันจะรวมคำแนะนำไว้ที่นี่

นอกจากนี้ ฉันคิดว่าคุณรู้อยู่แล้ว:

  • วิธีเปิด/ใช้งานเทอร์มินัล SSH กับเราเตอร์ OpenWrt ของคุณ
  • วิธีอัปโหลด/แก้ไขไฟล์บนเราเตอร์ของคุณ (ใช้ FileZilla หรือ scp/sftp)
  • วิธีทำงานกับคอนโซล Linux

ขั้นตอนที่ 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 เพื่อแสดงผล

ใน 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)

local file = io.popen(cmd) ถ้าไม่ใช่ file ให้คืนค่า nil end local output = file:read('*all') file:close() print("Run: "..cmd.." -> ".. เอาต์พุต) ส่งคืนฟังก์ชันสิ้นสุดเอาต์พุต read_file(เส้นทาง) ไฟล์ในเครื่อง = io.open(เส้นทาง, "rb") หากไม่ใช่ไฟล์ ให้ส่งคืนเนื้อหาในเครื่องที่สิ้นสุดศูนย์ = ไฟล์:อ่าน "*a" ไฟล์:close() พิมพ์("อ่าน: "..path.." -> "..content) ส่งคืนเนื้อหา end

การใช้ยูทิลิตีเหล่านี้ทำให้เราสามารถใช้ฟังก์ชันดึงข้อมูลจริงได้:

ฟังก์ชัน getArpClients()

return tonumber(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() return exec_out("ifconfig eth0.2 | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'") สิ้นสุด

คุณสามารถเรียกใช้บางส่วนของคำสั่งเชลล์เหล่านี้ เพื่อทำความเข้าใจวิธีการทำงานให้ลึกซึ้งยิ่งขึ้น และปรับให้เข้ากับความต้องการของคุณ

ส่วนที่ง่ายที่สุดคือการส่งข้อมูลไปยังแอป Blynk ตัวอย่างเริ่มต้นได้ตั้งค่าตัวจับเวลาแล้ว ซึ่งรันโค้ดบางตัวทุกๆ 5 วินาที ดังนั้นเราจึงนำกลับมาใช้ใหม่:

local tmr1 = ตัวจับเวลา: ใหม่ {ช่วงเวลา = 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("เชื่อมต่อ", function()

print("พร้อม") blynk:virtualWrite(12, getWanIP()) end)

สำหรับเวลาทำงานและหมายเลขลูกค้า เราสร้างตัวจับเวลาแยกกันโดยใช้เวลา 5 นาที ช่วงเวลา:

local tmr2 = ตัวจับเวลา: ใหม่ {ช่วงเวลา = 5*60*1000, func = ฟังก์ชัน ()

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") สิ้นสุด)

ในด้านแอป ฉันเพิ่งเพิ่มวิดเจ็ตปุ่ม (โหมด: สวิตช์) และกำหนดให้เป็น 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 ' {พิมพ์ ($$3-$7)/$2 * 100.0}'")) สิ้นสุด

เราต้องส่งข้อมูลไปยัง Blynk ด้วย (ลองใช้ tmr1 อีกครั้ง):

local tmr1 = ตัวจับเวลา: ใหม่ {ช่วงเวลา = 5000, func = ฟังก์ชัน ()

blynk:virtualWrite(5, getCpuLoad()) blynk:virtualWrite(6, getRamUsage()) สิ้นสุด}

ที่ด้านแอพ เพิ่มวิดเจ็ต SuperChart เพิ่ม CPU, สตรีมข้อมูล RAM และกำหนดให้กับ V5, V6

ขั้นตอนที่ 7: สถานะการหมุน HDD

เราเตอร์ของฉันมีไดรฟ์ HDD ภายนอกที่เชื่อมต่อเป็นอุปกรณ์ Network Attached Storage ประเด็นคือ ไดรฟ์นี้ได้รับการกำหนดค่าให้เริ่มหมุนเมื่อมีคนเข้าถึง และให้ระงับหลังจากหมดเวลา

แน่นอนว่ามันคงจะเจ๋งถ้ารู้ว่ามันเปิดกี่ครั้งตลอดทั้งวัน ดังนั้นฉันจึงเพิ่มสตรีมข้อมูลอื่นลงในแผนภูมิระบบของฉัน

การรับสถานะของไดรฟ์ HDD นั้นยากกว่าเล็กน้อย แต่ฉันพบวิธี! ก่อนอื่น ติดตั้ง smartmontools จากคอนโซล SSH:

opkg update

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 แล้ว return 1 กลับ 0 end end

หมายเหตุ: HDD ของฉันคือ /dev/sda

ขั้นตอนที่ 8: แผนภูมิกิจกรรมเครือข่าย

แผนภูมิกิจกรรมเครือข่าย
แผนภูมิกิจกรรมเครือข่าย

เราสร้างวิดเจ็ต SuperChart อื่น (คล้ายกับวิดเจ็ตก่อนหน้า) เพิ่มสตรีมข้อมูล TX และ RX และกำหนดให้กับ V1 และ V2 หมายเหตุ: ฉันต้องการแสดงสถานะพอร์ต WAN และพอร์ต 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

local tmr1 = Timer:new{interval = 5000, func = function() local tx = getWanTxBytes() local rx = getWanRxBytes() ถ้า prevTx และ prevTx ~= tx แล้ว blynk:virtualWrite(1, tx - prevTx) จะสิ้นสุดหาก prevRx และ prevRx ~= rx จากนั้น blynk:virtualWrite(2, rx - prevRx) end prevTx = tx prevRx = rx blynk:virtualWrite(5, getCpuLoad()) blynk:virtualWrite(6, getRamUsage()) britelynk:virtualHinning)) จบ}

ขั้นตอนที่ 9: การแจ้งเตือน

การแจ้งเตือน
การแจ้งเตือน

ฉันยังต้องการรับการแจ้งเตือนเมื่อเราเตอร์สูญเสียพลังงานหรือการเชื่อมต่ออินเทอร์เน็ต สำหรับสิ่งนี้ เราต้องใช้วิดเจ็ตการแจ้งเตือน

ในการตั้งค่าวิดเจ็ต เปิดใช้งาน "การแจ้งเตือนแบบออฟไลน์" ไม่ต้องใช้รหัส แต่เรายังส่งการแจ้งเตือนที่กำหนดเองจากโค้ดของเราได้อีกด้วย

ขั้นตอนที่ 10: การทำงานอัตโนมัติในเบื้องหลัง

สำหรับตอนนี้ สคริปต์จะต้องดำเนินการด้วยตนเอง แต่ฉันต้องการให้มันทำงานในพื้นหลังโดยอัตโนมัติเมื่อเปิดเราเตอร์

ทำได้โดยการสร้างบริการ สร้างไฟล์ /etc/init.d/blynkmon:

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

START=99 STOP= pidfile="/var/run/blynkmon.pid" start() { if [-f $pidfile]; จากนั้น echo "blynkmon ทำงานแล้ว" exit 0 fi cd /root/lua-blynk lua blynkmon.lua your-auth-token > /dev/null & echo $! > $pidfile } หยุด () { ถ้า [! -f $pidfile]; จากนั้น echo "blynkmon ไม่ทำงาน" exit 0 fi kill -9 $(cat $pidfile) rm $pidfile }

หมายเหตุ: อย่าลืมเปลี่ยน your-auth-token

จากนั้นเปิดใช้งานบริการ blynkmon:

บริการ blynkmon เปิดใช้งาน

ขั้นตอนที่ 11: บทสรุปและแนวคิดเพิ่มเติม

บทสรุปและแนวคิดเพิ่มเติม
บทสรุปและแนวคิดเพิ่มเติม

คุณสามารถสแกน QR นี้เพื่อรับโคลนของโครงการ Blynk ของฉันได้ ต้องใช้คะแนนพลังงาน (4600) เนื่องจากใช้วิดเจ็ตจำนวนมาก!

ค้นหารหัส Lua แบบเต็มได้ที่นี่:https://gist.github.com/vshymanskyy/3d3388a4e17f44…

จนถึงตอนนี้ดีมาก แต่นี่เป็นแนวคิดบางอย่างที่ฉันต้องการเพิ่มในอนาคตอันใกล้

  • เพิ่มคำสั่งรีบูต ป้องกันการคลิกโดยไม่ตั้งใจ
  • เพิ่มวิดเจ็ต Terminal เพื่อเรียกใช้คำสั่ง linux
  • เพิ่มแผนภูมิอุณหภูมิ CPU

    UPD: น่าเสียดายที่ OpenWrt ยังไม่มีไดรเวอร์บางตัวสำหรับรุ่นเราเตอร์ของฉัน แต่มีให้สำหรับเราเตอร์อื่น ๆ อีกมากมาย

  • เพิ่มการแจ้งเตือนเมื่อมีอุปกรณ์เฉพาะเข้าร่วม/ออกจากเครือข่าย เรามีข้อมูล arp แล้ว ให้ตรวจสอบเฉพาะที่อยู่ MAC เท่านั้น

ด้วยวิธีนี้ เราสามารถตรวจสอบและควบคุมเครื่องพิมพ์ 3 มิติ, หุ่นยนต์, พีซี/แล็ปท็อป, Arduino/ESP8266/ESP32/RaspberryPi, อุปกรณ์สมาร์ทโฮม และทุกสิ่งรอบตัว แจ้งให้เราทราบหากมีแนวคิดที่น่าสนใจอื่น ๆ คุณคิดอย่างไรเกี่ยวกับเรื่องนี้?

แนะนำ: