一、項目概述
隨著物聯(lián)網(wǎng)(IoT)技術(shù)的發(fā)展,數(shù)據(jù)存儲和共享需求日益增長。本文將介紹如何利用樹莓派(Raspberry Pi)搭建一個網(wǎng)絡附加存儲(NAS)系統(tǒng),以實現(xiàn)數(shù)據(jù)的集中管理、共享和訪問。該系統(tǒng)具備可視化界面和訪問管理功能,用戶可以通過Web界面方便地管理文件,實現(xiàn)跨設(shè)備訪問,適合家庭或小型辦公室使用。
二、系統(tǒng)架構(gòu)
1. 硬件選擇
單片機:樹莓派4 Model B
存儲設(shè)備:外接USB硬盤或SD卡
網(wǎng)絡設(shè)備:支持Wi-Fi或有線網(wǎng)絡的路由器
2. 軟件技術(shù)棧
操作系統(tǒng):Raspberry Pi OS(基于Debian)
文件共享協(xié)議:Samba(用于文件共享)
后端框架:Flask(Python Web框架)
前端技術(shù):HTML、CSS、JavaScript(用于構(gòu)建可視化界面)
數(shù)據(jù)庫:SQLite(用于管理用戶信息和訪問記錄)
三、環(huán)境搭建
1. 準備環(huán)境
首先需要將Raspberry Pi OS安裝到樹莓派中??梢酝ㄟ^官方的樹莓派 Imager工具將操作系統(tǒng)寫入SD卡。
2. 安裝必要的軟件包
通過SSH或直接在樹莓派終端中執(zhí)行以下命令:
\# 更新軟件包列表
sudo apt update
sudo apt upgrade -y
\# 安裝Samba
sudo apt install samba samba-common-bin -y
\# 安裝Flask及其依賴
sudo apt install python3-flask python3-sqlite3 -y
3. 配置Samba
編輯Samba配置文件以共享文件夾:
sudo nano /etc/samba/smb.conf
在文件末尾添加以下內(nèi)容:
\[PiNAS\]
path = /home/pi/nas
available = yes
valid users = pi
read only = no
browsable = yes
public = yes
writable = yes
創(chuàng)建共享文件夾并設(shè)置權(quán)限:
mkdir /home/pi/nassudo chown -R pi:pi /home/pi/nas
重啟Samba服務:
sudo systemctl restart smbd
四、代碼實現(xiàn)
1. 創(chuàng)建Flask應用
創(chuàng)建一個新的目錄用于存放Flask項目:
mkdir ~/flask\_nascd ~/flask\_nas
在該目錄下創(chuàng)建app.py文件:
from flask import Flask, render_template, request, redirect, url_for
import os
import sqlite3
app = Flask(__name__)
DATABASE = 'nas.db'
def get_db():
conn = sqlite3.connect(DATABASE)
return conn
@app.route('/')
def index():
return render_template('index.html')
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return redirect(request.url)
file = request.files['file']
if file.filename == '':
return redirect(request.url)
# 保存文件到共享文件夾
file.save(os.path.join('/home/pi/nas', file.filename))
return redirect(url_for('index'))
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
代碼說明:
導入模塊:引入Flask框架及其相關(guān)模塊,以及用于操作文件和數(shù)據(jù)庫的os和sqlite3模塊。
創(chuàng)建Flask應用:實例化Flask應用。
數(shù)據(jù)庫連接函數(shù):
get_db()函數(shù)用于連接SQLite數(shù)據(jù)庫。首頁路由:訪問根地址時返回
index.html模板。文件上傳路由:處理文件上傳的POST請求。檢查上傳的文件是否存在,如果文件名為空則重定向回首頁。如果文件存在,將其保存到指定的共享文件夾。
運行應用:通過
app.run()啟動Flask應用,讓它在所有可用的網(wǎng)絡接口上運行(0.0.0.0),并監(jiān)聽5000端口。
2. 創(chuàng)建前端頁面
在flask_nas目錄下,創(chuàng)建templates文件夾,并在其中創(chuàng)建index.html文件:
mkdir templates
cd templates
nano index.html
在index.html中輸入以下內(nèi)容:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>樹莓派 NAS 文件上傳</title>
</head>
<body>
<h1>樹莓派 NAS 文件上傳</h1>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" required>
<input type="submit" value="上傳">
</form>
</body>
</html>
代碼說明:
HTML結(jié)構(gòu):使用標準的HTML5文檔結(jié)構(gòu)。
表單:創(chuàng)建一個表單用于文件上傳。
action屬性指向/upload路由,method設(shè)為POST,并使用enctype="multipart/form-data"來支持文件上傳。文件輸入:
<input type="file">用于選擇文件,required屬性確保用戶必須選擇一個文件才能提交表單。提交按鈕:
<input type="submit">用于提交表單。
3. 數(shù)據(jù)庫初始化
為了記錄用戶上傳的文件信息,可以創(chuàng)建一個SQLite數(shù)據(jù)庫,并在app.py中添加數(shù)據(jù)庫初始化邏輯。首先,在flask_nas目錄下創(chuàng)建一個nas.db數(shù)據(jù)庫:
sqlite3 nas.db
在SQLite命令行中輸入以下SQL語句創(chuàng)建一個文件記錄表:
CREATE TABLE files (
id INTEGER PRIMARY KEY AUTOINCREMENT,
filename TEXT NOT NULL,
upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
然后在upload_file函數(shù)中,保存文件上傳的記錄:
# 在upload_file函數(shù)中添加以下代碼
conn = get_db()
cursor = conn.cursor()
cursor.execute("INSERT INTO files (filename) VALUES (?)", (file.filename,))
conn.commit()
conn.close()
4. 啟動Flask應用
在終端中運行以下命令以啟動Flask應用:
python3 app.py
在應用啟動后,您可以通過訪問樹莓派的IP地址和5000端口來查看可視化界面。例如,如果樹莓派的IP地址是192.168.1.100,則在瀏覽器中輸入以下地址:
http://192.168.1.100:5000
5. 測試文件上傳功能
選擇文件:在頁面上點擊"選擇文件"按鈕,選擇要上傳的文件。
上傳文件:點擊"上傳"按鈕,文件將被上傳到樹莓派的共享文件夾中。
-
檢查文件:在終端中,您可以通過以下命令查看上傳的文件:
ls /home/pi/nas您應該能夠看到您剛才上傳的文件。
6. 數(shù)據(jù)庫記錄查看
若要查看上傳的文件記錄,可以在Python中查詢數(shù)據(jù)庫。您可以在app.py中添加一個新的路由來顯示已上傳文件的列表。更新代碼如下:
@app.route('/files')
def files():
conn = get_db()
cursor = conn.cursor()
cursor.execute("SELECT filename, upload_time FROM files")
uploaded_files = cursor.fetchall()
conn.close()
return render_template('files.html', files=uploaded_files)
然后在templates文件夾中創(chuàng)建一個新的HTML文件files.html:
nano templates/files.html
輸入以下內(nèi)容:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>已上傳文件列表</title>
</head>
<body>
<h1>已上傳文件列表</h1>
<table border="1">
<tr>
<th>文件名</th>
<th>上傳時間</th>
</tr>
{% for file in files %}
<tr>
<td>{{ file[0] }}</td>
<td>{{ file[1] }}</td>
</tr>
{% endfor %}
</table>
<a href="/">返回上傳頁面</a>
</body>
</html>
代碼說明:
新路由
/files:查詢數(shù)據(jù)庫中的文件記錄,并將結(jié)果傳遞給files.html模板。文件列表顯示:在
files.html中使用HTML表格來顯示已上傳文件的名稱和上傳時間。返回鏈接:提供一個返回上傳頁面的鏈接。
7. 添加訪問管理功能
為了增強系統(tǒng)的安全性,您可以為文件上傳功能添加基本的用戶身份驗證。我們可以在Flask應用中使用Flask-Login庫來實現(xiàn)這一點。
首先,安裝Flask-Login:
sudo apt install python3-flask-login
然后,在app.py文件中進行以下修改:
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
# 初始化Flask-Login
login_manager = LoginManager()
login_manager.init_app(app)
# 用戶類
class User(UserMixin):
def __init__(self, id):
self.id = id
# 用戶加載回調(diào)
@login_manager.user_loader
def load_user(user_id):
return User(user_id)
# 登錄路由
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
if username == 'admin' and password == 'password': # 使用簡單的用戶名和密碼
user = User(username)
login_user(user)
return redirect(url_for('index'))
return render_template('login.html')
# 修改首頁路由,添加登錄驗證
@app.route('/')
@login_required
def index():
return render_template('index.html')
代碼說明:
用戶類
User:定義一個用戶類,繼承自UserMixin,用于存儲用戶的ID。用戶加載回調(diào):定義
load_user函數(shù),F(xiàn)lask-Login會使用該函數(shù)根據(jù)用戶ID加載用戶對象。登錄路由:創(chuàng)建一個新的路由
/login,處理用戶的登錄請求。若用戶名和密碼匹配,調(diào)用login_user函數(shù)登錄用戶。
8. 創(chuàng)建登錄頁面
接下來,我們需要創(chuàng)建一個登錄頁面,以便用戶能夠輸入用戶名和密碼。請在templates文件夾中創(chuàng)建login.html文件:
nano templates/login.html
在login.html文件中輸入以下內(nèi)容:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登錄</title>
</head>
<body>
<h1>登錄</h1>
<form action="/login" method="post">
<label for="username">用戶名:</label>
<input type="text" name="username" required>
<br>
<label for="password">密碼:</label>
<input type="password" name="password" required>
<br>
<input type="submit" value="登錄">
</form>
</body>
</html>
代碼說明:
登錄表單:創(chuàng)建一個表單用于輸入用戶名和密碼,表單的
action屬性指向/login路由,method設(shè)為POST。輸入字段:使用
<input>標簽收集用戶名和密碼。
9. 添加登出功能
為了允許用戶登出,我們可以在app.py中添加一個新的路由處理登出請求:
# 登出路由
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('login'))
代碼說明:
- 登出路由
/logout:調(diào)用logout_user()函數(shù)登出當前用戶,并重定向到登錄頁面。
10. 更新首頁以顯示登出鏈接
在index.html中,添加一個登出鏈接,方便用戶登出:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>樹莓派 NAS 文件上傳</title>
</head>
<body>
<h1>樹莓派 NAS 文件上傳</h1>
<a href="/logout">登出</a>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" required>
<input type="submit" value="上傳">
</form>
<a href="/files">查看已上傳文件</a>
</body>
</html>
代碼說明:
登出鏈接:添加一個指向登出路由的鏈接,允許用戶在上傳文件后退出登錄。
查看已上傳文件鏈接:添加一個鏈接,指向
/files路由,方便用戶查看之前上傳的文件。
11. 完成代碼整合
確保在app.py的頂部導入所需的Flask-Login模塊:
from flask\_login import LoginManager, UserMixin, login\_user, login\_required, logout\_user, current_user
12. 啟動應用
確保您在終端中運行以下命令以啟動Flask應用:
python3 app.py
訪問樹莓派的IP地址和5000端口(例如http://192.168.1.100:5000),您將看到登錄頁面。
13. 測試訪問管理功能
登錄:使用用戶名
admin和密碼password進行登錄。文件上傳:成功登錄后,將被重定向到文件上傳界面,您可以選擇文件并上傳。
查看已上傳文件:上傳完成后,點擊"查看已上傳文件"鏈接,查看文件列表。
登出:完成操作后,點擊"登出"鏈接,確保可以成功退出。
五、項目總結(jié)
在本項目中,我們成功地使用樹莓派搭建了一個功能齊全的網(wǎng)絡附加存儲(NAS)系統(tǒng)。該系統(tǒng)不僅可以實現(xiàn)文件的上傳和存儲,還具備基本的用戶訪問管理功能,確保了文件的安全性和訪問的便捷性。以下是項目的主要特點和總結(jié):
項目特點
可視化界面:我們使用Flask框架構(gòu)建了一個簡單的Web界面,用戶可以通過瀏覽器輕松上傳文件、查看已上傳的文件和進行登錄/logout操作。
文件存儲:利用Samba協(xié)議實現(xiàn)文件共享,上傳的文件存儲在樹莓派的共享文件夾中,方便局域網(wǎng)內(nèi)的多設(shè)備訪問。
數(shù)據(jù)庫支持:使用SQLite數(shù)據(jù)庫記錄文件上傳的信息,包括文件名和上傳時間,便于后續(xù)管理和查詢。
用戶管理:集成了Flask-Login庫,實現(xiàn)了基本的用戶身份驗證功能。通過簡單的用戶名和密碼,用戶可以安全地登錄和登出,防止未授權(quán)訪問。
簡單易用:整個系統(tǒng)的搭建和使用相對簡單,適合初學者和物聯(lián)網(wǎng)愛好者進行學習和擴展。
項目擴展建議
盡管本項目已經(jīng)具備基本的功能,但仍有許多可以改進和擴展的地方:
增強安全性:使用更強的身份驗證機制,例如密碼哈希存儲和HTTPS加密,確保用戶數(shù)據(jù)的安全性。
文件管理功能:增加文件刪除、重命名等管理功能,提高用戶的使用體驗。
用戶注冊系統(tǒng):允許用戶注冊,存儲用戶信息,并支持不同用戶對文件的不同訪問權(quán)限。
前端優(yōu)化:使用現(xiàn)代前端框架(如React、Vue.js等)改進用戶界面,增加用戶交互體驗。
移動端適配:優(yōu)化網(wǎng)站在移動設(shè)備上的顯示效果,增加用戶的使用靈活性。
總結(jié)
通過本項目,我們不僅學習了如何使用樹莓派搭建一個NAS系統(tǒng),還深入了解了Web開發(fā)、數(shù)據(jù)庫管理和用戶身份驗證等多個重要概念。這為我們?nèi)蘸箝_發(fā)更復雜的物聯(lián)網(wǎng)應用打下了良好的基礎(chǔ)。希望通過這篇文章,能夠幫助更多的開發(fā)者和愛好者快速上手物聯(lián)網(wǎng)項目,并激發(fā)他們的創(chuàng)造力去探索更廣泛的應用場景。
如有任何問題或建議,歡迎在評論區(qū)留言討論。感謝您的閱讀,祝您在物聯(lián)網(wǎng)的探索中取得成功!