NFCcreate-web/start.sh
2025-09-25 19:04:00 +08:00

212 lines
5.2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# NFC 生產工具啟動腳本
# 適用於 Linux 環境
set -e # 遇到錯誤立即退出
# 顏色定義
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 日誌函數
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 檢查是否在正確的目錄
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
log_info "NFC 生產工具啟動中..."
log_info "工作目錄: $(pwd)"
# 檢查必要檔案
check_files() {
local missing_files=()
if [[ ! -f "app.py" ]]; then
missing_files+=("app.py")
fi
if [[ ! -f "requirements.txt" ]]; then
missing_files+=("requirements.txt")
fi
if [[ ! -d "linux64_release" ]]; then
missing_files+=("linux64_release/")
fi
if [[ ! -f "linux64_release/nt4h_c_example" ]]; then
missing_files+=("linux64_release/nt4h_c_example")
fi
if [[ ${#missing_files[@]} -gt 0 ]]; then
log_error "缺少必要檔案:"
for file in "${missing_files[@]}"; do
echo " - $file"
done
exit 1
fi
}
# 檢查 Python 環境
check_python() {
if ! command -v python3 &> /dev/null; then
log_error "Python3 未安裝,請先安裝 Python3"
exit 1
fi
local python_version=$(python3 --version | cut -d' ' -f2)
log_info "Python 版本: $python_version"
# 檢查版本是否 >= 3.7
if ! python3 -c "import sys; exit(0 if sys.version_info >= (3, 7) else 1)" 2>/dev/null; then
log_error "需要 Python 3.7 或以上版本"
exit 1
fi
}
# 設定虛擬環境
setup_venv() {
if [[ ! -d "myenv" ]]; then
log_info "創建 Python 虛擬環境..."
python3 -m venv myenv
log_success "虛擬環境創建完成"
fi
log_info "啟動虛擬環境..."
source myenv/bin/activate
# 檢查是否需要安裝依賴
if [[ ! -f "myenv/pyvenv.cfg" ]] || [[ ! -d "myenv/lib" ]]; then
log_error "虛擬環境損壞,請刪除 myenv 目錄後重新執行"
exit 1
fi
# 安裝或更新依賴
log_info "檢查 Python 依賴套件..."
pip install --upgrade pip
pip install -r requirements.txt
log_success "依賴套件安裝完成"
}
# 檢查 USB 權限
check_usb_permissions() {
log_info "檢查 USB 裝置權限..."
# 檢查 udev 規則是否存在
if [[ ! -f "/etc/udev/rules.d/99-ufr.rules" ]]; then
log_warning "未找到 uFR udev 規則,可能無法存取 USB 裝置"
log_info "建議執行以下命令設定 USB 權限:"
echo "sudo tee /etc/udev/rules.d/99-ufr.rules << EOF"
echo "SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"0403\", ATTRS{idProduct}==\"6001\", MODE=\"0666\""
echo "SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"0403\", ATTRS{idProduct}==\"6014\", MODE=\"0666\""
echo "EOF"
echo "sudo udevadm control --reload-rules"
echo "sudo udevadm trigger"
fi
# 檢查當前使用者是否在 dialout 群組
if ! groups | grep -q dialout; then
log_warning "當前使用者不在 dialout 群組中"
log_info "建議執行sudo usermod -a -G dialout \$USER"
fi
}
# 設定檔案權限
set_permissions() {
log_info "設定檔案權限..."
chmod +x linux64_release/nt4h_c_example 2>/dev/null || true
chmod +x linux64_release/libnt4h_c.so 2>/dev/null || true
# 設定設定檔權限
if [[ -f "linux64_release/keys.txt" ]]; then
chmod 666 linux64_release/keys.txt 2>/dev/null || true
fi
if [[ -f "linux64_release/urls.txt" ]]; then
chmod 666 linux64_release/urls.txt 2>/dev/null || true
fi
log_success "權限設定完成"
}
# 檢查網路端口
check_port() {
local port=5000
if netstat -tuln 2>/dev/null | grep -q ":$port "; then
log_warning "端口 $port 已被佔用"
log_info "請檢查是否有其他實例正在執行"
return 1
fi
log_success "端口 $port 可用"
return 0
}
# 顯示啟動資訊
show_startup_info() {
echo
log_success "=== NFC 生產工具啟動成功 ==="
echo
log_info "Web 介面: http://localhost:5000"
log_info "按 Ctrl+C 停止服務"
echo
log_info "系統資訊:"
echo " - 作業系統: $(uname -s) $(uname -r)"
echo " - 架構: $(uname -m)"
echo " - Python: $(python3 --version)"
echo " - 工作目錄: $(pwd)"
echo
}
# 主執行流程
main() {
echo "=========================================="
echo " NFC 生產工具 - Linux 啟動腳本"
echo "=========================================="
echo
# 執行檢查
check_files
check_python
setup_venv
check_usb_permissions
set_permissions
# 檢查端口
if ! check_port; then
log_error "無法啟動服務,端口被佔用"
exit 1
fi
# 顯示啟動資訊
show_startup_info
# 啟動 Flask 應用程式
log_info "啟動 Flask 應用程式..."
python app.py
}
# 執行主函數
main "$@"