这个项目是大二时期我和我的组员一起做的一个项目,是我们《嵌入式系统原理及应用》这门课的一个结课作业。由于个人比较喜欢Python,当时正在使用Django框架搭建自己的网站(虽然到现在网站还没有正式完工,我大信控课就是多╮(╯_╰)╭),所以就想到了这个课题。可能下面的实习会用到相关知识,故在此记录。
整体方案为:Python+Django+Nginx+uWSGI+CentOS
树莓派我选用的是3B+(现在最新的应该是4B),当时在大创基地做项目时在亚博智能他们家买的,就是下面这款,感兴趣的话可以从这进入淘宝店铺。
在此之前,你可能还需要准备显示屏、HDMI数据线、稳定的电源(建议使用USB接口的)、网线(可选)、TF卡(可以稍微大一点,以备后需)、读卡器。
上述的硬件材料准备好之后,接下来就要开始配置了。
操作系统我用的是CentOS7.7,系统镜像文件选择,以及所需的SD卡格式化工具、镜像写入工具的下载及使用我就不一一说明了,可以参考网上的教程1,教程我会放到最下面,下载地址可以点击链接直接进入官网下载,也可去我的百度网盘下载(提取码:g9e6)。
我安装的镜像文件名字为 C e n t O S − U s e r l a n d − 7 − a r m v 7 h l − R a s p b e r r y P I − M i n i m a l − 1908 − s d a . r a w . x z CentOS-Userland-7-armv7hl-RaspberryPI-Minimal-1908-sda.raw.xz CentOS−Userland−7−armv7hl−RaspberryPI−Minimal−1908−sda.raw.xz(不带桌面环境,如果想要带桌面环境的可以选择Gnome版本或KDE版本,现在官网最新的是2003),解压之后就是 r a w raw raw格式的文件。
注:一定要选择支持树莓派的镜像文件。
# rootfs-expand
注:系统安装后,默认只有两个多G的内存,建议使用上述命令进行扩容,我参考过其他博客,使用其他扩容方法会出现扩容失败,当然也可能是因为系统不同。
# nmcli d
# nmcli d wifi # 查看周围的wifi
# nmcli d wifi connect yourSSID password 'yourpassword' # 连接wifi
# nmcli d show wlan0 # 查看wlan0的状态
# systemctl start sshd # 启动ssh
# systemctl status sshd # 查看ssh状态
# systemctl enable sshd # 设置开机自动启动
# yum update –y
# yum -y groupinstall "Development tools"
# yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
# yum -y install wget
# yum install ntp
# ntpdate pool.ntp.org
注:建议用上述命令,我用其他命令同步时间时出现了时间同步无效。
# wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
# ./configure --prefix=/usr/local/python3
# ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
# ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3
# pip3 install virtualenv
# ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
# mkdir -p /data/env
# mkdir -p /data/wwwroot
# cd /data/env/
# virtualenv --python=/usr/bin/python3 pyweb
# cd /data/env/pyweb/bin
# source activate
# deactivate
# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
# yum -y install mysql57-community-release-el7-10.noarch.rpm
# yum -y install mysql-community-server
# systemctl start mysqld.service
# systemctl status mysqld.service
# grep "password" /var/log/mysqld.log
# mysql -uroot –p
# ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
若MySQL安装失败,可选择使用CentOS内置的数据库Sqlite,由于Django2.2需要Sqlite的版本至少为3.8.3(CentOs默认版本是3.7.17),因此需要升级Sqlite。若Sqlite安装失败,可选择降低Django版本(2.1.8)。
# wgets https://www.sqlite.org/2019/sqlite-autoconf-3290000.tar.gz
# ./configure --prefix=/usr/local/
# make && make install
# mv /usr/bin/sqlite3 /usr/bin/sqlite3.bak
# ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
# export LD_LIBRARY_PATH="/usr/local/lib">> ~/.bashrc
# source ~/.bashrc
# pip3 install django=2.2.1(2.1.8)
# pip3 install uwsgi
# ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
# firewall-cmd --zone=public --add-port=8001/tcp --permanent
# netstat -tunlp
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
# uwsgi --http :8001 --wsgi-file /data/wwwroot/Benxi/test_uwsgi.py
注:这里的ip地址不一样是因为我在两个网络下测试的,实际的ip地址取决于当时所连接的网络,没记错的话一个是以太网,另一个是无线网。
[uwsgi]
chdir = /data/wwwroot/Benxi
home = /data/env/pythonweb
module = Benxi.wsgi:application
master = true
processes = 4
harakiri = 600
max-requests = 5000
socket = 127.0.0.1:8001
uid = 1000
gid = 2000
pidfile = uwsgi.pid
daemonize = uwsgi.log
vacuum = true
# uwsgi --ini /data/wwwroot/Benxi/benxi_uwsgi.ini
# yum install epel-release –y
# yum -y install nginx
# systemctl start nginx.service
或
# service nginx start
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#gzip on;
server {
listen 80;
server_name localhost;
charset utf-8;
client_max_body_size 75M;
location /static {
alias /data/wwwroot/Benxi/static;
proxy_connect_timeout 18000;
proxy_send_timeout 18000;
proxy_read_timeout 18000;
}
location /media {
alias /data/wwwroot/Benxi/media;
}
location / {
uwsgi_pass 127.0.0.1:8001;
include /usr/local/nginx/conf/uwsgi_params;
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
# uwsgi --ini /data/wwwroot/Benxi/benxi_uwsgi.ini
# service nginx start
当时需要答辩,所以就把服务器挂在了校园网下,但我们学校11点半校园网就断了,第二天还要手动去输入自己的学号及密码来登录校园网,所以就写了一个脚本让服务器一键登录校园网。这样学校内的师生只要连接上校园网或挂上VPN就可以访问到这个网站了。
最初的时候接触Python就是因为爬虫,所以习惯性的打开浏览器F12、F5来分析http请求,很简单一个请求,没有涉及到任何加密,切(ˉ▽ ̄~)。
import requests
if __name__ == '__main__':
url = 'http://10.2.5.251:801/eportal/?c=Portal&a=login&callback=dr1576830148028&login_' \
'method=1&user_account=(学号)%40unicom(服务商, 这里是中国联通)&user_password=(密码)&wlan_user_ip=(树莓派的ip地址)' \
'&wlan_user_mac=(树莓派的MAC信息)&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.0&_=1576830011640'
response = requests.get(url)
print(response.status_code)
最终的效果就是下面这样:
“期盼已久”的实习终于来了,果不其然,由于疫情期间学校严防严控,安排校内统一集中实习,还是在教室(’∇’)シ┳━┳。然后下午开会看到实习内容里有Python和Django,就想到了以前做的这个项目,所以就跟着当时写的报告,写下了这篇博客,哈哈哈,算是简单回顾一下吧(ง •̀_•́)ง
记得当时遇到了好多问题,参考了好多篇博客,具体的参考链接也不记得了,在此感谢博主们的分享(✪ω✪)!
参考教程
树莓派3系统CentOS安装教程 ↩︎