Mục lục:

Ứng dụng Android / iOS để truy cập từ xa bộ định tuyến OpenWrt của bạn: 11 bước
Ứng dụng Android / iOS để truy cập từ xa bộ định tuyến OpenWrt của bạn: 11 bước

Video: Ứng dụng Android / iOS để truy cập từ xa bộ định tuyến OpenWrt của bạn: 11 bước

Video: Ứng dụng Android / iOS để truy cập từ xa bộ định tuyến OpenWrt của bạn: 11 bước
Video: Cài đặt 1.1.1.1 Warp+ của CloudFlare lên OpenWrt, tự bật cho IP quốc tế 2024, Tháng sáu
Anonim
Ứng dụng Android / iOS để truy cập bộ định tuyến OpenWrt của bạn từ xa
Ứng dụng Android / iOS để truy cập bộ định tuyến OpenWrt của bạn từ xa
Ứng dụng Android / iOS để truy cập bộ định tuyến OpenWrt của bạn từ xa
Ứng dụng Android / iOS để truy cập bộ định tuyến OpenWrt của bạn từ xa

Gần đây tôi đã mua một bộ định tuyến mới (Xiaomi Mi Router 3G). Và tất nhiên, phần cứng mới, tuyệt vời này đã truyền cảm hứng cho tôi bắt đầu làm việc với dự án này;)

Bước 1: Tôi giả sử rằng bạn đã có OpenWrt…

Tôi giả sử rằng bạn đã có OpenWrt…
Tôi giả sử rằng bạn đã có OpenWrt…

Tôi phải cài đặt OpenWrt trước… Hầu hết, tôi đã làm theo hướng dẫn này (cụ thể cho kiểu bộ định tuyến này): https://dzone.com/articles/hacking-into-xiaomi-mi-… Trong khi làm việc với điều này, tôi đã tìm thấy video tuyệt vời này: Cài đặt openwrt, điểm chuẩn WiFi, Nhấp nháy bạn gái. Thật là tôi đã cười rất tươi!:)

Chú ý! Cài đặt OpenWrt có thể đóng cục bộ định tuyến của bạn. Nhưng sau khi hoàn thành, nó mở ra toàn bộ quyền lực và quyền kiểm soát. Tôi không đủ can đảm để cung cấp bất kỳ hướng dẫn nào ở đây, vì chúng có thể khác nhau đối với mọi kiểu bộ định tuyến.

Nhưng nếu bạn đã có OpenWrt trên bộ định tuyến của mình, bạn sẽ có thể bắt đầu với hướng dẫn này ngay lập tức

BTW, một số bảng phát triển đi kèm với OpenWrt, như Onion Omega, VoCore, LinkIt Smart 7688 và những bảng khác. Hướng dẫn này cũng giải thích một số ý tưởng cơ bản đằng sau việc tạo các ứng dụng như vậy, vì vậy bạn có thể dễ dàng điều chỉnh nó để hoạt động với Raspberry Pi và các ứng dụng tương tự.

Đối với dự án này, tôi sẽ chủ yếu sử dụng phần mềm được cài đặt sẵn (có sẵn trên bất kỳ bộ định tuyến nào hỗ trợ OpenWrt). Nhưng đối với một số chức năng nâng cao, tôi phải cài đặt các gói bổ sung. Điều này được thực hiện chỉ trong một vài cú nhấp chuột, vì vậy tôi sẽ bao gồm các hướng dẫn ở đây.

Ngoài ra, tôi cho rằng bạn đã biết:

  • Cách mở / sử dụng thiết bị đầu cuối SSH với bộ định tuyến OpenWrt của bạn
  • Cách tải lên / chỉnh sửa tệp trên bộ định tuyến của bạn (sử dụng FileZilla hoặc scp / sftp)
  • Cách làm việc với bảng điều khiển Linux

Bước 2: Phần mềm và Công cụ

Phần mềm và Công cụ
Phần mềm và Công cụ

Về mặt điện thoại thông minh, tôi đang sử dụng Blynk. Nó cung cấp các ứng dụng iOS và Android để kiểm soát bất kỳ phần cứng nào. Bạn có thể dễ dàng xây dựng các giao diện đồ họa đẹp mắt cho tất cả các dự án của mình chỉ bằng cách kéo và thả các widget ngay trên điện thoại thông minh của bạn. Blynk chủ yếu được sử dụng với Arduino, Raspberry Pi, v.v. Nhưng tại sao không chạy nó trên chính bộ định tuyến?;)

Về mặt thiết bị, tôi sẽ sử dụng Lua để tập lệnh cho các chức năng cần thiết. Tôi cũng có thể sử dụng Python hoặc Node.js, nhưng tiếc là không phải lúc nào các tùy chọn này cũng có sẵn do thiếu tài nguyên trên một số bộ định tuyến. Hoặc C / C ++, nhưng Nó không quá thuận tiện để làm việc (biên dịch lại cho mọi thay đổi, v.v.) Mặt khác, Lua được cài đặt sẵn, dễ sử dụng và học hỏi. Nó được sử dụng bởi giao diện web mặc định, LuCI.

Bước 3: Tạo một ứng dụng tối thiểu

Bắt đầu với Blynk và Lua dễ dàng như sau:

  • Tải xuống ứng dụng Blynk (từ App Store, Google Play)
  • Tạo một dự án mới và nhận Mã xác thực
  • Làm theo hướng dẫn cài đặt Blynk Lua cho OpenWrt.

Sử dụng SSH để truy cập bảng điều khiển bộ định tuyến của bạn. Sau khi chạy ví dụ mặc định:

lua./examples/client.lua

Chúng ta sẽ thấy một cái gì đó như thế này:

Đang kết nối…

Bắt tay SSL… Sẵn sàng.

Điều đó có nghĩa là kết nối an toàn, hai chiều với ứng dụng đã được thiết lập! YAY!

Bây giờ chúng ta có thể dễ dàng mở rộng ví dụ được cung cấp, vì vậy nó thực hiện một điều gì đó thú vị. Tôi đã tạo một bản sao của ví dụ này để chỉnh sửa nó:

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

Bước 4: Thêm một số thông tin: Số lượng khách hàng, Địa chỉ IP WAN, Thời gian hoạt động

Ý tưởng cơ bản là lấy thông tin từ HĐH theo định kỳ, thực hiện một số phép tính đơn giản nếu cần, sau đó gửi kết quả đến Blynk để hiển thị.

Trong Linux / OpenWrt, chúng tôi có một số cách để lấy dữ liệu hệ thống:

  • Chạy một lệnh và phân tích cú pháp văn bản mà nó xuất ra
  • Chạy một lệnh và xem mã thoát mà nó trả về
  • Đọc tệp hệ thống, nằm trong thư mục / proc / và / sys / class /

Bây giờ tôi muốn hiển thị số lượng thiết bị được kết nối.

Khi tôi chạy cat / proc / net / arp trên bảng điều khiển, nó sẽ xuất ra danh sách các thiết bị đã biết, cùng với địa chỉ MAC và IP của chúng:

Địa chỉ IP Loại HW Cờ Địa chỉ HW Mặt nạ Thiết bị

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

Chúng ta có thể phân tích cú pháp trực tiếp trong Lua, nhưng thường dễ dàng hơn khi sử dụng các tiện ích chuyên dụng. Trên Linux, đó là grep, head, tail, cut, wc, awk.

Để có được số lượng khách hàng từ đầu ra arp, tôi cần lọc bảng (loại bỏ các mục không liên quan) và đếm các hàng trong bảng, dẫn đến lệnh sau:

cat / proc / net / arp | grep br-lan | grep 0x2 | wc -l

Hãy thử nó:

root @ router: ~ / lua-blynk # cat / proc / net / arp | grep br-lan | grep 0x2 | wc -l

1

Tuyệt vời. Bây giờ chúng tôi có ý tưởng về cách chúng tôi có thể thu thập tất cả các thông tin cần thiết. Hãy tự động hóa nó. Để làm cho mã của chúng ta sạch sẽ và có thể mở rộng được, hãy tạo một số hàm trợ giúp:

hàm thực thi (cmd)

local file = io.popen (cmd) if not file then return nil end local output = file: read ('* all') file: close () print ("Run:"..cmd.. "->".. output) trả về kết thúc đầu ra hàm read_file (đường dẫn) local file = io.open (path, "rb") nếu không phải là file thì trả về nil end local content = file: read "* a" file: close () print ("Đọc: "..path.." -> "..content) trả về nội dung kết thúc

Sử dụng các tiện ích này, bây giờ chúng ta có thể triển khai các chức năng tìm nạp dữ liệu thực tế:

hàm getArpClients ()

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

Bạn có thể chạy các phần của các lệnh shell này, để hiểu sâu hơn về cách nó hoạt động và điều chỉnh nó theo nhu cầu của bạn.

Phần dễ nhất là gửi dữ liệu đến Ứng dụng Blynk. Ví dụ mặc định đã thiết lập bộ đếm thời gian, chạy một số mã sau mỗi 5 giây, vì vậy chúng tôi chỉ cần sử dụng lại nó:

local tmr1 = Timer: new {khoảng = 5000, func = function ()

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

Trong ứng dụng, chúng tôi thêm 3 tiện ích nhãn và gán chúng cho các Ghim ảo 10, 11, 12 tương ứng.

Mặc dù cách này hoạt động nhưng nó không hiệu quả vì IP WAN hoặc số lượng máy khách không cập nhật thường xuyên

Đối với IP WAN, chúng tôi chuyển nó sang trình xử lý được kết nối. Nó sẽ được chạy mỗi khi bộ định tuyến thiết lập kết nối với Blynk Cloud. Điều này phải đủ:

blynk: on ("được kết nối", hàm ()

print ("Sẵn sàng.") blynk: virtualWrite (12, getWanIP ()) end)

Đối với Thời gian hoạt động và Số lượng khách hàng, chúng tôi tạo một bộ hẹn giờ riêng với 5 phút. khoảng thời gian:

local tmr2 = Timer: new {khoảng = 5 * 60 * 1000, func = function ()

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

Bước 5: Điều khiển WiFi: BẬT / TẮT

Điều khiển WiFi: BẬT / TẮT
Điều khiển WiFi: BẬT / TẮT

Cho đến bây giờ, chúng tôi chỉ nhận được một số thông tin từ thiết bị. Hãy thử kiểm soát nó!

blynk: on ("V20", function (param)

if param [1] == "1" then os.execute ("wifi up") else os.execute ("wifi down") end end)

Về phía ứng dụng, tôi vừa thêm tiện ích Nút (chế độ: Chuyển đổi) và gán nó cho V20.

Đó là nó. Kinh ngạc.

Bước 6: Biểu đồ thống kê hệ thống

Biểu đồ thống kê hệ thống
Biểu đồ thống kê hệ thống
Biểu đồ thống kê hệ thống
Biểu đồ thống kê hệ thống

hàm getCpuLoad ()

return tonumber (execute_out ("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $ 2 + $ 4}'")) end function getRamUsage () return tonumber (execute_out ("free | grep Mem | awk" {print ($ 3- $ 7) / $ 2 * 100.0} '")) kết thúc

Chúng tôi cũng cần gửi dữ liệu đến Blynk (hãy sử dụng lại tmr1):

local tmr1 = Timer: new {khoảng = 5000, func = function ()

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

Trên App Side, thêm tiện ích SuperChart. Thêm luồng dữ liệu CPU, RAM và gán cho V5, V6.

Bước 7: Trạng thái quay của HDD

Bộ định tuyến của tôi có một ổ cứng HDD bên ngoài được kết nối như một Thiết bị lưu trữ đính kèm mạng, có điều là ổ này được định cấu hình để bắt đầu quay khi ai đó truy cập vào nó và tạm dừng sau một thời gian chờ.

Rõ ràng, sẽ rất tuyệt nếu biết nó bật bao nhiêu lần trong một ngày. Vì vậy, tôi đã thêm một luồng dữ liệu khác vào biểu đồ Hệ thống của mình.

Sẽ hơi phức tạp hơn một chút để xác định tình trạng của ổ cứng HDD, nhưng tôi đã tìm ra cách! Trước hết, hãy cài đặt smartmontools từ bảng điều khiển SSH:

cập nhật opkg

opkg cài đặt smartmontools

Sau đó, trong mã của chúng tôi, chúng tôi cần chạy một lệnh đặc biệt và kiểm tra mã thoát:

chức năng thực thi (cmd)

local exit = os.execute (cmd) print ("Run:"..cmd.. "-> exit:".. exit) trả về hàm kết thúc thoát getHddSpinning () if execute_ret ("smartctl --nocheck = standby --info / dev / sda> / dev / null ") == 0 then return 1 else return 0 end end

Lưu ý: ổ cứng của tôi là / dev / sda

Bước 8: Biểu đồ hoạt động mạng

Biểu đồ hoạt động mạng
Biểu đồ hoạt động mạng

Chúng tôi Tạo một tiện ích SuperChart khác (tương tự như trước đó), Thêm luồng dữ liệu TX và RX và gán cho V1 và V2.

Chức năng của người trợ giúp:

hàm getWanRxBytes ()

return tonumber (read_file ("/ sys / class / net / eth0.2 / Statistics / rx_bytes")) end function getWanTxBytes () return tonumber (read_file ("/ sys / class / net / eth0.2 / Statistics / tx_bytes")) kết thúc

Tiếp theo, thêm một số mã vào cùng một tmr1. Điều này phức tạp hơn, vì chúng tôi chỉ cần tính toán và hiển thị sự khác biệt về byte truyền / nhận:

preTx cục bộ, prevRx

cục bộ tmr1 = Bộ định thời: new {khoảng = 5000, func = function () cục bộ tx = getWanTxBytes () cục bộ rx = getWanRxBytes () nếu prevTx và prevTx ~ = tx thì blynk: virtualWrite (1, tx - prevTx) kết thúc nếu presRx và prevRx ~ = rx then blynk: virtualWrite (2, rx - prevRx) end prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning ()) kết thúc}

Bước 9: Thông báo

Thông báo
Thông báo

Tôi cũng muốn được thông báo khi Bộ định tuyến của tôi mất nguồn hoặc kết nối internet, vì vậy chúng ta cần tiện ích Thông báo.

Trong cài đặt tiện ích, hãy bật "thông báo ngoại tuyến". Không cần mã. Nhưng chúng tôi cũng có thể gửi thông báo tùy chỉnh từ mã của chúng tôi.

Bước 10: Tự động chạy trong nền

Hiện tại, tập lệnh phải được thực thi theo cách thủ công, nhưng tôi muốn làm cho nó tự động chạy trong nền khi bộ định tuyến được bật nguồn.

Điều này được thực hiện bằng cách tạo một dịch vụ. Tạo tệp /etc/init.d/blynkmon:

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

START = 99 STOP = pidfile = "/ var / run / blynkmon.pid" start () {if [-f $ pidfile]; sau đó echo "blynkmon đã chạy" thoát 0 fi cd / root / lua-blynk lua blynkmon.lua your-auth-token> / dev / null & echo $! > $ pidfile} stop () {if [! -f $ pidfile]; sau đó echo "blynkmon not running" thoát 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Lưu ý: đừng quên thay thế your-auth-token

Sau đó, kích hoạt dịch vụ blynkmon:

dịch vụ blynkmon kích hoạt

Bước 11: Kết luận & Ý tưởng thêm

Kết luận & Ý tưởng Thêm
Kết luận & Ý tưởng Thêm

Bạn có thể quét mã QR này để lấy bản sao của Dự án Blynk của tôi. Nó yêu cầu một số điểm năng lượng (4600), vì nó sử dụng rất nhiều vật dụng!

Tìm mã Full Lua tại đây:

Cho đến nay rất tốt, nhưng đây là một số ý tưởng tôi muốn bổ sung trong tương lai gần.

  • Thêm lệnh Khởi động lại. Ngăn chặn việc vô tình nhấp vào nó.
  • Thêm tiện ích đầu cuối để chạy bất kỳ lệnh linux nào.
  • Thêm biểu đồ nhiệt độ CPU.

    UPD: Rất tiếc là OpenWrt hiện thiếu một số trình điều khiển cho kiểu bộ định tuyến của tôi. Nhưng nó có sẵn cho nhiều bộ định tuyến khác

  • Thêm thông báo khi một thiết bị cụ thể tham gia / rời khỏi mạng. Chúng tôi đã có thông tin arp, giờ chỉ cần kiểm tra địa chỉ MAC.

Bằng cách này, chúng tôi có thể giám sát và điều khiển Máy in 3D, Robot, PC / Máy tính xách tay thông thường, nội dung Arduino / ESP8266 / ESP32 / RaspberryPi, thiết bị Smart Home và hầu như mọi thứ xung quanh. Hãy cho tôi biết nếu có bất kỳ ý tưởng thú vị nào khác. Bạn nghĩ gì về tất cả những điều này?

Đề xuất: