정보보안(54회차) 노트


MQTT란?
--MosQuiTTo (사물 인터넷)
  브로커 --연결-- 클라이언트

1. 서버준비

step1
Nginx설치
step2
가상환경만들기
step3
flask설치
step4
gunicorn설치

?를 본인의 만들고 싶은 앱명으로 변경합니다.
0.기본설치
ip addr
sudo hostnamectl set-hostname IPXXX
sudo reboot
hostname
date
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
date
sudo apt -y install lrzsz
sudo apt -y install unzip
sudo apt -y install net-tools
#sudo apt -y install vsftpd
#sudo systemctl enable vsftpd
#sudo nano /etc/vsftpd.conf
#write_enable=YES > write_enable=YES
#sudo systemctl start vsftpd

1.flask설치(학생 설치)
사용자가 master일 경우
pwd
cd /home/master
python
sudo apt update
sudo apt -y install python3-venv
cd ~
mkdir projects
mkdir venvs
cd venvs
python3 -m venv mysite
cd mysite
cd bin
. activate
pip install flask
pip install flask-migrate
pip install flask-wtf
pip install email_validator
pip install flask-markdown
#필요하면 설치해줌
#pip install pymysql
#pip install requests
#pip install RPi.GPIO
#python -c "import RPi.GPIO as GPIO; print(GPIO.VERSION)"

2.기본 환경 설정
cd /home/master/venvs
nano /home/master/venvs/mysite.sh
#!/bin/bash
cd ~/projects/flask
export FLASK_APP=?
export FLASK_DEBUG=true
export APP_CONFIG_FILE=/home/master/projects/flask/config/production.py
. ~/venvs/mysite/bin/activate
nano /home/master/venvs/mysite.env
FLASK_APP=?
FLASK_DEBUG=true
APP_CONFIG_FILE=/home/master/projects/flask/config/production.py
cd /home/master
nano .profile
alias mysite='export FLASK_APP=?;export FLASK_DEBUG=true;export APP_CONFIG_FILE=/home/master/projects/flask/config/production.py;cd ~/projects/flask;. ~/venvs/mysite/bin/activate'
sudo reboot

3.gunicorn설치(조교 설치)
mysite 실행
(mysite)flask위치
pip install gunicorn
로컬에서 개발완료된 파일을 업로드할 예정
cd ~/projects/flask
unzip flask
조교+학생
gunicorn --bind 0:5000 "?:create_app()"

4. 교수설정
cd /etc/systemd/system/
sudo nano mysite.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=master
Group=master
WorkingDirectory=/home/master/projects/flask
EnvironmentFile=/home/master/venvs/mysite.env
ExecStart=/home/master/venvs/mysite/bin/gunicorn \
--workers 2 \
--bind unix:/tmp/mysite.sock \
"?:create_app()"
[Install]
WantedBy=multi-user.target
sudo apt install nginx
cd /etc/nginx/sites-available/
sudo nano mysite
server {
listen 80; server_name 192.168.0.3;
location = /favicon.ico { access_log off; log_not_found off; }
location /static {
alias /home/master/projects/flask/?/static;
}
location / {
include proxy_params;
proxy_pass http://unix:/tmp/mysite.sock;
}
}
cd /etc/nginx/sites-enabled/
sudo rm default
sudo ln -s /etc/nginx/sites-available/mysite
sudo systemctl restart nginx
sudo systemctl restart mysite
sudo systemctl enable nginx
sudo systemctl enable mysite
교수+조교+학생(나중에 실행)
gunicorn --bind unix:/tmp/mysite.sock "?:create_app()"
sudo reboot

5. css적용하기
chmod +x /home/master
chmod +x /home/master/projects
chmod +x /home/master/projects/flask
chmod +x /home/master/projects/flask/?
chmod +x /home/master/projects/flask/?/static

6.사이트확인
http://ra.zero2right.kr
http://ra.zero2right.kr/monitor/sensor
http://ra.zero2right.kr:80XX
http://ra.zero2right.kr:80XX

#추가설정
7. 데이터베이스설치
pip install pymysql gpiozero
sudo apt install default-libmysqlclient-dev build-essential pkg-config -y
pip install mysqlclient
sudo apt -y install mariadb-server
create database master;
CREATE USER 'master'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON master.* TO 'master'@'localhost';
flush privileges;

create database master;
CREATE USER 'master'@'192.168.0.XXX' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON master.* TO 'master'@'192.168.0.XXX';
flush privileges;

create database master;
CREATE USER 'master'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON master.* TO 'master'@'%';
flush privileges;

Mysql에 저장하는 방법
-- MySQL 서버에 접속
mysql -u root -p
-- 데이터베이스 생성
CREATE DATABASE onlinesafe;
-- 데이터베이스 사용
USE onlinesafe;
-- 테이블 생성
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
part varchar(100) NOT NULL,
data FLOAT NOT NULL,
regdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY COMMENT '회원번호',
userid VARCHAR(30) NOT NULL UNIQUE COMMENT '로그인 아이디',
password VARCHAR(255) NOT NULL COMMENT '암호화된 비밀번호',
name VARCHAR(100) NOT NULL COMMENT '이름',
nickname VARCHAR(100) DEFAULT NULL COMMENT '닉네임',
email VARCHAR(150) NOT NULL UNIQUE COMMENT '이메일',
phone VARCHAR(20) DEFAULT NULL COMMENT '휴대폰',
birth DATE DEFAULT NULL COMMENT '생년월일',
gender ENUM('M','F') DEFAULT NULL COMMENT '성별',
role ENUM('admin','manager','user') DEFAULT 'user' COMMENT '권한',
status ENUM('active','inactive','blocked') DEFAULT 'active' COMMENT '회원상태',
last_login DATETIME DEFAULT NULL COMMENT '마지막 로그인',
login_fail_count INT DEFAULT 0 COMMENT '로그인 실패 횟수',
email_verified TINYINT(1) DEFAULT 0 COMMENT '이메일 인증 여부',
remember_token VARCHAR(100) DEFAULT NULL COMMENT '자동로그인 토큰',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '가입일',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP COMMENT '수정일',

deleted_at DATETIME DEFAULT NULL COMMENT '삭제일'
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;

-- 데이터베이스 생성
CREATE DATABASE sensor_data;
-- 데이터베이스 사용
USE sensor_data;
-- 테이블 생성
CREATE TABLE sensor (
id INT AUTO_INCREMENT PRIMARY KEY,
part varchar(100) NOT NULL,
data FLOAT NOT NULL,
regdate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

초음파code
from flask import Flask, render_template
import RPi.GPIO as GPIO
import time
import sqlite3
app = Flask(__name__)
# GPIO 설정
GPIO.setmode(GPIO.BCM)
TRIG = 23 # Trigger 핀
ECHO = 24 # Echo 핀
# 초음파 센서 값을 측정하는 함수
def get_ultrasonic_distance():
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
GPIO.output(TRIG, False)
time.sleep(2)
# 트리거 핀을 HIGH로 설정하여 초음파 신호를 보냄
GPIO.output(TRIG, True)
time.sleep(0.00001)
GPIO.output(TRIG, False)
while GPIO.input(ECHO) == 0:
pulse_start = time.time()
while GPIO.input(ECHO) == 1:
pulse_end = time.time()
pulse_duration = pulse_end - pulse_start
distance = pulse_duration * 17150 # 초음파의 속도 계산 (cm)
distance = round(distance, 2)
return distance
# 데이터베이스에 거리값을 저장하는 함수
def save_to_database(distance):
conn = sqlite3.connect('sensor_data.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS distances (id INTEGER PRIMARY KEY, distance REAL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)''')
cursor.execute('INSERT INTO distances (distance) VALUES (?)', (distance,))
conn.commit()
conn.close()
@app.route('/')
def index():
# 초음파 센서 값 측정
distance = get_ultrasonic_distance()
# 데이터베이스에 값 저장
save_to_database(distance)
# 데이터베이스에서 최신 값을 조회
conn = sqlite3.connect('sensor_data.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM distances ORDER BY timestamp DESC LIMIT 5') # 최근 5개의 데이터 가져오기
data = cursor.fetchall()
conn.close()
return render_template('index.html', distance=distance, data=data)
if __name__ == '__main__':
app.run(debug=True)
{% for row in data %}

{{ row[0] }}
{{ row[1] }}
{{ row[2] }}

{% endfor %}
from flask import Flask, render_template
import RPi.GPIO as GPIO
import time
import mysql.connector
app = Flask(__name__)
# MySQL 데이터베이스 연결 설정
def get_db_connection():
return mysql.connector.connect(
host="localhost",
user="root", # MySQL 사용자명
password="yourpassword", # MySQL 비밀번호
database="sensor_data"
)
참고사이트
1) 라즈베리파이
2) 플라스크
3) 장고
4) 연습용프로그램
5) 부트스트랩

2. 아두이노준비

3. 코딩