[안드로이드] Wifi기반 체류 시간 앱 - 2

2일차: Android - Wi-Fi 정보 수집 및 등록

목표: 앱에서 사용자의 현재 Wi-Fi 정보를 가져오고, 집 Wi-Fi를 등록하는 기능을 구현합니다.

세부 할 일:

Wi-Fi 권한 요청 및 현재 연결된 Wi-Fi의 SSID, BSSID 가져오기 기능 구현

사용자가 "우리집 Wi-Fi로 등록" 버튼을 누르면 해당 Wi-Fi 정보를 앱 내부에 저장하는 화면 및 로직 구현

 

DB 연결

 

from fastapi import FastAPI
import models 
from database import SessionLocal, engine

models.Base.metadata.create_all(bind=engine)

app = FastAPI()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from dotenv import load_dotenv
import os

load_dotenv()

DATABASE_URL = os.getenv("DATABASE_URL")

engine = create_engine(DATABASE_URL)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

 

from sqlalchemy import Column, DateTime, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func  
from database import Base

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    user_name = Column(String(50), unique=True, index=True, nullable=False)
    home_wifi_bssid = Column(String(50), nullable=True)

    logs = relationship("WifiLog", back_populates="user")

class WifiLog(Base):
    __tablename__ = "wifi_logs"

    id = Column(Integer, primary_key=True, index=True)
    user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
    bssid = Column(String(50), nullable=False)
    ssid = Column(String(50), index=True, nullable=False)
    start_time = Column(DateTime, server_default=func.now(), nullable=False)
    end_time = Column(DateTime, nullable=True)

    user = relationship("User", back_populates="logs")

 

다음과 같이 구성하였으며 user 테이블에서 user_name과 wifilog테이블에서 ssid 컬럼이 추가되었다

 

 

다음과 같이 DB를 구성하였다

이후 Backend API 부터 제작하기로 하였다

 

uses

 

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List

from database import get_db
import schemas
from api import user_api

user = APIRouter(prefix="/user", tags=["user"])

@user.post("/create", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
    db_user = user_api.get_user_by_name(db, user.user_name)
    if db_user:
        raise HTTPException(status_code=400, detail="Username already registered")
    return user_api.create_user(db=db, user=user)

@user.get("/name/{user_name}", response_model=schemas.User)
def read_user_by_name(user_name: str, db: Session = Depends(get_db)):
    db_user = user_api.get_user_by_name(db, user_name=user_name)
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return db_user

@user.get("/id/{user_id}", response_model=schemas.User)
def read_user_by_id(user_id: int, db: Session = Depends(get_db)):
    db_user = user_api.get_user_by_id(db, user_id=user_id)
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return db_user

@user.get("/list", response_model=List[schemas.User])
def read_users(start: int = 0, last: int = 10, db: Session = Depends(get_db)):
    users = user_api.get_all_users(db, start=start, last=last)
    return users

 

from sqlalchemy.orm import Session
import models, schemas

# 새로운 사용자를 생성
def create_user(db: Session, user: schemas.UserCreate):
    db_user = models.User(**user.model_dump())
    
    db.add(db_user)
    db.commit()    
    db.refresh(db_user)
    return db_user

# 전체 사용자 목록
def get_all_users(db: Session, start: int = 0, last: int = 10):
    return db.query(models.User).offset(start).limit(last).all()

# 사용자 id로 사용자 반환
def get_user_by_id(db: Session, user_id: int):
    return db.query(models.User).filter(models.User.id == user_id).first()

# 사용자 id로 사용자 반환
def get_user_by_name(db: Session, user_name: str):
    return db.query(models.User).filter(models.User.user_name == user_name).first()

 

from datetime import datetime
from pydantic import BaseModel

# User 관련 스키마
class UserBase(BaseModel):
    user_name: str

class UserCreate(UserBase):
    pass

class User(UserBase):
    id: int
    user_name: str

    class Config:
        from_attributes = True

 

다음과 같이 만들었으며

 

 

API 문서는 다음과 같다