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实现
这一步重新利用了我这篇文章中介绍的代码
再次感谢zcy0xy学长的原教程
精简化的代码如下:
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命令就可以了
需要注意的是,在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于江宁