[我的樹莓派服務器]樹莓派自動通過東南大學Web認證並報告IP地址!

1背景

這學期從開學開始就在忙託福,考完了之後仍舊每日碌碌而不知所爲,跋山涉水帶回來的樹莓派也喫灰了好久。

前段時間做項目突然要用到SQL,聽說在Win下的卸載非常麻煩,於是腦洞大開。一開始只有在樹莓派上裝MySQL的想法,在經歷了數日的YY,最終決定頂着數門考試的壓力重新把樹莓派掛到外網上作服務器。

其實之前也有過成功的嘗試,但上次是經過寬帶路由器掛上的,只需要簡單進行端口轉發即可。這次由於沒有續訂寬帶,所以只能用校園網。一個很大的問題——

要讓沒有常規I/O設備的樹莓派(就是這麼窮酸)自動通過校園網Web認證,並報告IP地址進行遠端訪問。

很明顯,本次作業的問題可以一分爲二:自動Web認證和IP地址報告。

下面將盡可能詳細地介紹作業過程,但是由於內容的特殊性,可能幫不到讀者了。

2設備

樹莓派3B+

SenseHat上的搖桿和LED點陣

一臺Win10電腦

東南大學無線校園網

3自動通過校園網Web認證

3.1安裝火狐瀏覽器

3.1.1爲什麼不用Chromium?

在Raspbian系統下用Selenium調起原生的Chromium瀏覽器異常困難。

首先是Root權限下必須以

chromium-browser --no-sandbox

禁用沙盒模式的參數運行

其次是調用時無限報錯

selenium.common.exceptions.WebDriverException: Message: Service /usr/lib/chromium-browser/chromedriver unexpectedly exited. Status code was: 127

可能是chrome和chromium之間微妙的區別導致的錯誤吧……最後也沒找到適合樹莓派的Chrome,死忠粉只好轉投火狐了……

3.1.2火狐安裝過程

感謝丹俠啊GODOG的這篇文章

【Selenium】Raspbian+Selenium+Firefox

它囊括了從瀏覽器安裝方式到driver的下載鏈接、版本挑選的所有內容,可謂詳盡。諸位儘可參考。

3.2自動通過Web認證的Python實現

這一步重新利用了我這篇文章中介紹的代碼

Python實現WLAN斷開重連和SEU校園網註銷再登錄

再次感謝zcy0xy學長的原教程

拒絕掉線!利用selenium實現校園網自動重連

精簡化的代碼如下:

def login():
    browser = webdriver.Firefox()
    browser.get('http://w.seu.edu.cn/')

    username_input = browser.find_element_by_id("username")
    password_input = browser.find_element_by_id("password")
    login_button = browser.find_element_by_id("login")

    username_input.send_keys('一卡通號')
    password_input.send_keys('統一認證密碼')
    login_button.click()
    browser.close()

到這一步,樹莓派就能成功通過校園網認證了。那麼如何在互聯網的茫茫人海里找到它呢?

4SenseHat簡易I/O實現IP地址報告

SenseHat是個好東西。不僅輸入、輸出、傳感器一應俱全,而且插在樹莓派上非常美觀。美中不足就是佔用了所有的GPIO口……導致掛載墨水屏的時候必須把它拆下來。另外Raspbian系統自帶茫茫多的示例代碼,可以發現sense_hat這個模塊已經寫好了搖桿響應和LED點陣輸出字符串的函數,不可謂不良心。

通過操作SenseHat上的搖桿,可以令樹莓派執行想要的功能:比如用Hat上的LED點陣輸出IP地址,或者是執行一次自動登錄函數。這就是整個簡易I/O的邏輯。

4.1獲取本機字符串形式的IP地址

Linux下可以簡單地通過在Terminal中輸入命令

iwconfig

來查看IP地址,而這樣得到的並非我們想要的簡練的IP地址。怎麼辦呢?藉助這篇文章中提供的Shell命令就可以了

shell中獲取本機ip地址

需要注意的是,在Python中需要轉義字符來正確輸入引號。

4.2簡易I/O控制的Python實現

直接上代碼!

from sense_hat import *
import os
from selenium import webdriver

hat=SenseHat()

def login():
    browser = webdriver.Firefox()
    browser.get('http://w.seu.edu.cn/')

    username_input = browser.find_element_by_id("username")
    password_input = browser.find_element_by_id("password")
    login_button = browser.find_element_by_id("login")

    username_input.send_keys('一卡通號')
    password_input.send_keys('統一認證密碼')
    login_button.click()
    browser.close()


def show_ip():
    ip=os.popen('/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk \'{print $2}\'|tr -d \"addr:\"').read()
    hat.show_message(ip, 0.05, (100,100,100))
    
while True:
    event = hat.stick.wait_for_event()
    if event.action == ACTION_PRESSED:
        if event.direction == DIRECTION_MIDDLE:
            show_ip()
        if event.direction == DIRECTION_UP:
            login()
        if event.direction == DIRECTION_DOWN:
            login()
        if event.direction == DIRECTION_LEFT:
            login()
        if event.direction == DIRECTION_RIGHT:
            login()

搖桿部分很大程度時抄例程的…… 

 

這樣,樹莓派終於不用在無線熱點裏蝸居,而可以直接擁抱互聯網的大海了!

 

感謝閱讀!

 

181129於江寧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章