Notice
Recent Posts
Recent Comments
ยซ   2024/09   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
In Total
๊ด€๋ฆฌ ๋ฉ”๋‰ด

A Joyful AI Research Journey๐ŸŒณ๐Ÿ˜Š

[48] 230308 Ch. 6 Flask๋ฅผ ํ™œ์šฉํ•œ ์„ผ์„œ ์ œ์–ด: 5. Flask ์›นํŽ˜์ด์ง€, 6. IP, Port, Process ๊ฐœ๋… ์žก๊ธฐ, 7. cron๊ณผ daemon ๊ฐœ๋… ์žก๊ธฐ [K-๋””์ง€ํ„ธ ํŠธ๋ ˆ์ด๋‹ 48์ผ] ๋ณธ๋ฌธ

๐ŸŒณBootcamp Revision 2023โœจ/Python, Flask, SQL

[48] 230308 Ch. 6 Flask๋ฅผ ํ™œ์šฉํ•œ ์„ผ์„œ ์ œ์–ด: 5. Flask ์›นํŽ˜์ด์ง€, 6. IP, Port, Process ๊ฐœ๋… ์žก๊ธฐ, 7. cron๊ณผ daemon ๊ฐœ๋… ์žก๊ธฐ [K-๋””์ง€ํ„ธ ํŠธ๋ ˆ์ด๋‹ 48์ผ]

yjyuwisely 2023. 3. 8. 09:11

230308 Wed 48th class

Ch. 6 Flask๋ฅผ ํ™œ์šฉํ•œ ์„ผ์„œ ์ œ์–ด
์ง„๋„: p. 156 ~ (๊ต์žฌ: IoT ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท์„ ์œ„ํ•œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด 4 ์ •์„, ์ €์ž: ์ตœ์ฃผํ˜ธ , ๊น€์žฌ๋ฒ” , ์ •๋™์ง„)
๊ต์žฌ ์ฝ”๋“œ ๊นƒํ—ˆ๋ธŒ: https://github.com/codingspecialist/RaspberryPi4-Book-Example
๊ต์žฌ ์†Œ์Šค ๋ฐ PPT: http://jspstudy.co.kr/main/main.jsp
์ €์ž ์นดํŽ˜: https://cafe.naver.com/metacoding

 

IoT ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท์„ ์œ„ํ•œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด 4 ์ •์„ | ์ตœ์ฃผํ˜ธ - ๊ต๋ณด๋ฌธ๊ณ 

IoT ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท์„ ์œ„ํ•œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด 4 ์ •์„ | ใ€ŽIoT ์‚ฌ๋ฌผ์ธํ„ฐ๋„ท์„ ์œ„ํ•œ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด 4 ์ •์„ใ€์€ ์™•์ดˆ๋ณด๋„ ๋ผ์ฆˆ๋ฒ ๋ฆฌํŒŒ์ด๋ฅผ ์ด์šฉํ•ด ๋‹ค์–‘ํ•œ IoT๋ฅผ ์ง์ ‘ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ „๊ธฐ์ „์ž ๊ธฐ์ดˆ ์›๋ฆฌ๋ถ€ํ„ฐ ์„ผ

product.kyobobook.co.kr

์˜ค๋Š˜ ๋ฐฐ์šด ๊ฒƒ ์ค‘ ๊ธฐ์–ตํ•  ๊ฒƒ์„ ์ •๋ฆฌํ–ˆ๋‹ค.


๋ชฐ๋ž๋˜ ๊ฒƒ

Rendering is a process used in web development that turns website code into the interactive pages users see when they visit a website. The term generally refers to the use of HTML, CSS, and JavaScript codes. The process is completed by a rendering engine, the software used by a web browser to render a web page. Because of its close association with web browsers, rendering engines are commonly referred to as browser engines.

์ฐธ๊ณ : https://www.seobility.net/en/wiki/Rendering

๋ Œ๋”๋ง์ด๋ž€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML ํŒŒ์ผ์„ ๋ฐ›์•„ ๋ธŒ๋ผ์šฐ์ €์— ๋ฟŒ๋ ค์ฃผ๋Š” ๊ณผ์ •์ด๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML ๋ฌธ์„œ๋ฅผ ๋‹ค์šด ๋ฐ›๋Š”๋‹ค.
์ฐธ๊ณ 

Rendering is 
the process that turns the code you write an application in into something that users can interact with on a web page.


Visual Studio Code์—์„œ Flask ์„ค์น˜ ๋ฐฉ๋ฒ• ๋งํฌ๋“ค

https://velog.io/@awesome-hong/VScode์—์„œ-๊ฐ€์ƒํ™˜๊ฒฝ-์„ค์ •-Flask-์„ค์น˜ํ•˜๊ธฐ

https://flask.palletsprojects.com/en/1.1.x/installation/#python-version

 

Installation — Flask Documentation (1.1.x)

Warning: This is an old version. The latest stable version is Version 2.0.x. Installation Python Version We recommend using the latest version of Python 3. Flask supports Python 3.5 and newer, Python 2.7, and PyPy. Dependencies These distributions will be

flask.palletsprojects.com

ํ”Œ๋ผ์Šคํฌ ํŠœํ† ๋ฆฌ์–ผ
https://realpython.com/flask-blueprint/


Ch. 6 Flask๋ฅผ ํ™œ์šฉํ•œ ์„ผ์„œ ์ œ์–ด

01 _ Flask ์„ธํŒ…ํ•˜๊ธฐ
01-1 ๋ผ์ฆˆ๋ฒ ๋ฆฌ 4์—์„œ ์„ค์น˜ํ•˜๊ธฐ
01-2 Flask ์„ค์น˜ํ•˜๊ธฐ

02 _ Flask ์›น์„œ๋ฒ„ ๊ตฌ์ถ•ํ•˜๊ธฐ

03 _ Flask ๋ผ์šฐํŒ…

04 _ Flask LED ์ œ์–ดํ•˜๊ธฐ
04-1 Flask LED ์ œ์–ด ์ •์  ๋ผ์šฐํŒ…
04-2 Flask LED ์ œ์–ด ๋™์  ๋ผ์šฐํŒ…ใ€ˆ์‚ฐํ˜•๊ด„ํ˜ธใ€‰
04-3 Flask LED ์ œ์–ด ๋™์  ๋ผ์šฐํŒ…ใ€ˆ์ฟผ๋ฆฌ์ŠคํŠธ๋งใ€‰

05 _ Flask ์›นํŽ˜์ด์ง€
05-1 Flask, HTML, CSS, Javascript๋ฅผ ์ด์šฉํ•œ ์›นํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ
05-2 fetch() ํ•จ์ˆ˜ ์ดํ•ดํ•˜๊ธฐ
05-3 ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์ดํ•ดํ•˜๊ธฐ

06 _ IP, Port, Process ๊ฐœ๋…์žก๊ธฐ
06-1 IP ๊ฐœ๋…์žก๊ธฐ
06-2 Port ๊ฐœ๋…์žก๊ธฐ
06-3 Process ๊ฐœ๋…์žก๊ธฐ

07 _ cron๊ณผ daemon ๊ฐœ๋…์žก๊ธฐ
07-1 cron(ํฌ๋ก ) ๊ฐœ๋…์žก๊ธฐ
07-2 daemon(๋ฐ๋ชฌ) ๊ฐœ๋…์žก๊ธฐ

08 _ ๊ณต๊ณต๋ฐ์ดํ„ฐ ํ™œ์šฉํ•˜๊ธฐ
08-1 ๊ณต๊ณต๋ฐ์ดํ„ฐ ์‹ ์ฒญํ•˜๊ธฐ
08-2 ๊ณต๊ณต๋ฐ์ดํ„ฐ ๋ถ„์„ํ•˜๊ธฐ
08-3 ํŒŒ์ด์ฌ์„ ํ™œ์šฉํ•˜์—ฌ ์˜จ์Šต๋„ ํ™•์ธํ•˜๊ธฐ
ํ•™์Šต๋ชฉํ‘œ
- Flask๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์›น ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.
- Flask๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์„ผ์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
- IP, Port, Process, Cron, Daemon์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•™์Šต๋‚ด์šฉ
- Flask ์„ธํŒ…ํ•˜๊ธฐ
- Flask ์›น ์„œ๋ฒ„ ๊ตฌ์ถ•ํ•˜๊ธฐ
- Flask ๋ผ์šฐํŒ…
- Flask LED ์ œ์–ดํ•˜๊ธฐ
- Flask ์›น ํŽ˜์ด์ง€
- IP, Port, Process ๊ฐœ๋… ์žก๊ธฐ
- Cron, Daemon ๊ฐœ๋… ์žก๊ธฐ
- ๊ณต๊ณต๋ฐ์ดํ„ฐ ํ™œ์šฉํ•˜๊ธฐ

5 Flask ์›นํŽ˜์ด์ง€

http://localhost:5000/led?state=on
http://localhost:5000/led?state=off

<a href="led?state=on">LED ON</a>
<a href="led?state=off">LED OFF</a>

<button onclick = "led_on()">LED ON</button>

5.1 Flask, HTML, CSS, Javascript๋ฅผ ์ด์šฉํ•œ ์›นํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ 

๊ธฐ๋ณธ ํด๋” ๊ตฌ์„ฑ

webapps
	- ch06
    		- home
        		- static #์ด๋ฆ„ ๋ฐ”๊ฟ”๋„ ๋จ 
            			- templates

home ํด๋”: ์ตœ์ƒ์œ„ root ํด๋”

static ํด๋”: flask์—์„œ๋Š” ํ•ด๋‹น ํด๋”๋ฅผ ๋ฆฌ์†Œ์Šค(์ž์›) ํด๋”๋กœ ์‚ฌ์šฉํ•œ๋‹ค. css, image, media ๋“ฑ์˜ ํŒŒ์ผ์„ ์ €์žฅํ•œ๋‹ค.


templates ํด๋”: html ํŒŒ์ผ ํด๋”์ด๋‹ค. templates ํด๋”๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์˜์‚ฌํ•ญ์€ flask๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ view ๋žœ๋”๋ง์„ ํ•  ๋•Œ html ํŒŒ์ผ์„ ํ˜ธ์ถœํ•˜๋Š”๋ฐ htmlํŒŒ์ผ์€ ๋ฌด์กฐ๊ฑด templates ํด๋”์— ์žˆ๋Š” html ํŒŒ์ผ์„ ํ˜ธ์ถœ ํ•˜๊ฒŒ๋” ์„ค์ •์ด ๋˜์–ด ์žˆ๋‹ค. (์ด๋ฆ„ ์œ ์ง€)

(๋žœ๋”๋ง: ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML ํŒŒ์ผ์„ ๋ฐ›์•„ ๋ธŒ๋ผ์šฐ์ €์— ๋ฟŒ๋ ค์ฃผ๋Š” ๊ณผ์ •์ด๋‹ค.)

01. index.py ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  home ํด๋”์— ์ €์žฅํ•œ๋‹ค.
/home/pi/webapps/ch06/home/index.py

from flask import Flask, request
from flask import render_template
import RPi.GPIO as GPIO

app = Flask(__name__)
GPIO.setmode(GPIO.BOARD) #BOARD๋Š” ์ปค๋„ฅํ„ฐ pin๋ฒˆํ˜ธ ์‚ฌ์šฉ
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)

@app.route("/")
def home():
    return render_template("index.html")

@app.route("/led/on")
def led_on():
    try:
        GPIO.output(8, GPIO.HIGH)
        return "ok"
    except expression as identifier:
        return "fail"

@app.route("/led/off")
def led_off():
    try:
        GPIO.output(8, GPIO.LOW)
        return "ok"
    except expression as identifier:
        return "fail"

if __name__ == "__main__":
    app.run(host="0.0.0.0")

02. index.html ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  home ํด๋” ์•„๋ž˜ templates ํด๋”์— ์ €์žฅํ•œ๋‹ค. 
/home/pi/webapps/ch06/home/templates/index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>HOME NETWORK</title>
    #<!--link rel="stylesheet" href="static/style.css">-->
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
    <div class="container">
        <div class="header">
            <h2>HOME IoT</h2>
        </div>
        <div class="main">
            <div>
                <button onclick="led_on()">LED ON</button>
            </div>
            <div>
                <button onclick="led_off()">LED OFF</button>
            </div>
        </div>
        <div id="result">

        </div>
    </div>
    <script>
        function led_on(){
            fetch("/led/on")
            .then(response=> { console.log(response); return response.text()})
            .then(data=> {
                console.log(data);
                let result = document.querySelector("#result");
                if(data=="ok"){
                    result.innerHTML = "<h1>LED is runinng</h1>";
                }else{
                    result.innerHTML = "<h1>error</h1>";
                }
            });
        }
        function led_off(){
            fetch("/led/off")
            .then(response=> response.text())
            .then(data=> {
                console.log(data);
                let result = document.querySelector("#result");
                if(data=="ok"){  
                    result.innerHTML = "<h1>LED is stopping</h1>";
                }else{
                    result.innerHTML = "<h1>error</h1>";
                }
            });
        }
    </script>
</body>
</html>

03. style.css ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  home ํด๋” ์•„๋ž˜ static ํด๋”์— ์ €์žฅํ•œ๋‹ค. 
/home/pi/webapps/ch06/home/static/style.css

body {
    background-color: antiquewhite;
}

.container {
    width: 700px;
    margin: 0 auto;
    text-align: center;
}

.main {
    display: flex;
}

.main div {
    flex:1;
}

.main div button {
    background-color: rgb(192, 114, 114);
    width:150px;
    height:80px;
    border-radius: 10px;
}

4. ์‹คํ–‰๋ฐฉ๋ฒ•์€ ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ํ•ด๋‹นํด๋”๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ์„ ์ž…๋ ฅํ•œ๋‹ค.

python home.py

VSCode ํˆด์—์„œ ํ„ฐ๋ฏธ๋„(TERMINAL)์„ ์—ด๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

1) ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์—์„œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด์–ด์„œ ํ™•์ธํ•  ๊ฒฝ์šฐ
http://localhost:5000/

2) ๋‹ค๋ฅธ PC์—์„œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์—ด์–ด์„œ ํ™•์ธํ•  ๊ฒฝ์šฐ
http://192.168.0.80:5000/ (์˜ˆ์‹œ์ž„)

์ฃผ์†Œ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์—์„œ ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.
(ex. ์œˆ๋„์šฐ์˜ ๊ฒฝ์šฐ cmd: ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ, ipconfig๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ip์ฃผ์†Œ๊ฐ€ ๋‚˜์˜จ๋‹ค.)

$ ifconfig

์™€์ดํŒŒ์ด๋กœ ์—ฐ๊ฒฐํ–ˆ๋‹ค๋ฉด wlan() ๋ถ€๋ถ„์„ ํ™•์ธํ•˜๋ฉด ๋˜๊ณ , 
๋žœ์œผ๋กœ ์—ฐ๊ฒฐํ–ˆ๋‹ค๋ฉด eth() ๋ถ€๋ถ„์„ ํ™•์ธํ•œ๋‹ค.
wlan(): ์— ์žˆ๋Š” inet์„ ํ™•์ธํ•œ๋‹ค. 
์˜ˆ์‹œ) inet 192.168.0.80

์œˆ๋„์šฐ์˜ ์˜ˆ์‹œ)

3) ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์™€ ์‚ฌ์šฉ์ž PC๊ฐ€ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ์ธ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋ผ์ฆˆ๋ฒ ๋ฆฌ -> ๊ณต์œ ๊ธฐ <- ๋…ธํŠธ๋ถ

๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด์™€ ์‚ฌ์šฉ์ž PC๊ฐ€ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ์ธ ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋ผ์ฆˆ๋ฒ ๋ฆฌ -> ๊ณต์œ ๊ธฐ, ๋…ธํŠธ๋ถ -> ๋‹ค๋ฅธ ๊ณต์œ ๊ธฐ
๋ผ์ฆˆ๋ฒ ๋ฆฌ -> ๊ณต์œ ๊ธฐ, ํœด๋Œ€ํฐ -> (LTE ์‚ฌ์šฉ) ๊ธฐ์ง€๊ตญ 

5. ๊ฒฐ๊ณผํ™”๋ฉด์ž…๋‹ˆ๋‹ค.
6. [LED ON] ๋ฒ„ํŠผ ํด๋ฆญ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

7. [LED OFF] ๋ฒ„ํŠผ ํด๋ฆญ

8. ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. index.py์„ ์ˆ˜์ •ํ•œ๋‹ค. 

@app.route("/led/on")
def led_on():
    try:
        GPIO.output(9, GPIO.HIGH)
        return "ok"
    except expression as identifier:
        return "fail"

output GPIOํ•€ ๋ฒˆํ˜ธ๋ฅผ 9๋ฒˆ์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค. LED๋ฅผ ONํ•˜๋ ค๋Š” ์ˆœ๊ฐ„ GPIO 9๋ฒˆ์— ์—ฐ๊ฒฐ๋œ LED๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋ฏ€๋กœ try๋ถ€๋ถ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  except ๋ถ€๋ถ„์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค. 

์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์ƒํ•˜์ง€ ๋ชปํ•œ ์„œ๋ฒ„ ์˜ค๋ฅ˜๋กœ ์„œ๋ฒ„๊ฐ€ ๋ฉˆ์ถ”๋Š” ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. 

9. ๋‹ค์‹œ ์‹คํ–‰ํ•ด๋ณด๋ฉด error๋ฅผ returnํ•˜๊ฒŒ ๋œ๋‹ค.

$ python index.py

์›นํ”ผ์ด์ง€ ๊ฒฐ๊ณผ ํ™”๋ฉด ํ•˜๋‹จ์— error ๋ฌธ์ž๊ฐ€ ๋‚˜์˜จ๋‹ค.


5.2 fetch() ํ•จ์ˆ˜ ์ดํ•ดํ•˜๊ธฐ

fetch: to go after and bring backget

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์ด๋‹ค. 
ajax๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ํ†ต์‹ ์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. 
(์˜ˆ์ „์—๋Š” ajax ์š”์ฒญ ์‹œ์— jQuery๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์ตœ๊ทผ์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ œ๊ณตํ•˜๋Š” fetch๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.)

fetch๋ฅผ ํ†ตํ•ด์„œ index.py์˜ led_on() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ response๋ฅผ ํ†ตํ•ด์„œ ๋ฐ›๋Š”๋‹ค.
len_on ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ์— ์‹ค์ œ led๊ฐ€ on์ด ๋œ๋‹ค.
์ •์ƒ์ ์œผ๋กœ on์ด ๋˜๋ฉด ok๋ฅผ returnํ•˜๊ฒŒ ๋œ๋‹ค.
return๋œ ๊ฐ’์„ fetch(), then(response) ์ด ๋ถ€๋ถ„์—์„œ then()์ด ๋ฐ›๊ฒŒ ๋œ๋‹ค. 
then()์€ fetch๊ฐ€ ์™„๋ฃŒ๋œ ํ›„์— ํ˜ธ์ถœ์ด ๋œ๋‹ค.


5.3 ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ์ดํ•ดํ•˜๊ธฐ


6 IP, Port, Process ๊ฐœ๋…์žก๊ธฐ
6.1 IP(internet protocol) ๊ฐœ๋…์žก๊ธฐ

IP๋Š” internet protocol์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค์†ก์‹  ํ˜ธ์ŠคํŠธ์™€ ์ˆ˜์‹  ํ˜ธ์ŠคํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋กœ ์ฃผ๊ณ  ๋ฐ›๋Š”๋ฐ ํ•„์š”ํ•œ ํ”„๋กœํ† ์ฝœ(๊ทœ์•ฝ)์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค๋ฐ์ดํ„ฐ๋Š” ํŒจํ‚ท์œผ๋กœ ๋ถ„ํ• ๋˜์–ด ์ „์†ก๋˜๊ณ  ๋ฐ›์€ ์ชฝ์—์„œ๋Š” ๋ถ„ํ• ๋œ ํŒจํ‚ท์„ ์กฐ๋ฆฝํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํŒจํ‚ท ์Šค์œ„์นญ ๋ฐฉ์‹์€ Data๋ฅผ ํŒจํ‚ท์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ „์†กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ ์ „์†ก์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

6.2 Port ๊ฐœ๋…์žก๊ธฐ

Port๋Š” ์ปดํ“จํ„ฐ ๊ฐ„ ์ƒํ˜ธ ํ†ต์‹ ์„ ์œ„ํ•ด ํ”„๋กœํ† ์ฝœ์—์„œ ์ด์šฉํ•˜๋Š” ๊ฐ€์ƒ์˜ ์—ฐ๊ฒฐ ๋‹จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์‹  ํ˜ธ์ŠคํŠธ๊ฐ€ 4๊ฐœ์˜ ์ปดํ“จํ„ฐ์™€ ์„œ๋กœ ๋‹ค๋ฅธ ํ†ต์‹ ์„ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์ตœ์†Œ 4๊ฐœ ์ด์ƒ์˜ Port๋กœ ํ†ต์‹ ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.


6.3 Process ๊ฐœ๋…์žก๊ธฐ

ํ”„๋กœ๊ทธ๋žจ์€ ๋ณด์กฐ ๊ธฐ์–ต์žฅ์น˜(ํ•˜๋“œ๋””์Šคํฌ, SSD)์— ์กด์žฌํ•˜๋ฉฐ ์‹คํ–‰๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ช…๋ น์–ด(์ฝ”๋“œ)์™€ ์ •์ ์ธ ๋ฐ์ดํ„ฐ์˜ ๋ฌถ์Œ์ž…๋‹ˆ๋‹ค์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๋ช…๋ น์–ด์™€ ์ •์  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌ๋˜๋ฉด ์ƒ๋ช…์ด ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค์ฆ‰ ํ”„๋กœ์„ธ์Šค๋ž€ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.
01. /home/pi/webapps/ch06/process/process.py ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

https://github.com/codingspecialist/RaspberryPi4-Book-Example/blob/master/ch06/process/process.py

from flask import Flask, request
import RPi.GPIO as GPIO

app = Flask(__name__)

LED = 8
GPIO.setmode(GPIO.BOARD) #BOARD๋Š” ์ปค๋„ฅํ„ฐ pin๋ฒˆํ˜ธ ์‚ฌ์šฉ
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)

@app.route("/led/<state>")
def led(state):
    if(state == "on"):
        GPIO.output(LED, GPIO.HIGH)
        return "LED ON"
    elif(state == "off"):
        GPIO.output(LED, GPIO.LOW)
        return "LED OFF"
    else:
        return "error"
    

if __name__ == "__main__":
    app.run(host="0.0.0.0")
02. ์‹คํ–‰ํ•ด๋ด…๋‹ˆ๋‹ค.

03. ์‹คํ–‰์„ ํ•˜๊ฒŒ ๋˜๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
04. ์ƒˆ๋กœ์šด ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ  ํฌ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. -f (์ž์„ธํžˆ ๋ณด๊ธฐ ์˜ต์…˜)
$ ps -f

05. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ™•์ธํ•ด๋ด…๋‹ˆ๋‹ค. -e: ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ™•์ธํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.

06. | grep์„ ์ด์šฉํ•˜์—ฌ process.py ํ”„๋กœ์„ธ์Šค๋งŒ ํ™•์ธํ•œ๋‹ค.

$ ps -ef | grep process.py
 
07. netstat ๋ช…๋ น์–ด๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ™•์ธํ•ด๋ด…๋‹ˆ๋‹ค.

ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
sudo kill [PID]

PID๊ฐ€ 2172๋ฒˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

The persistent identifier (PID) uniquely identifies a persistent object in any content server.


7 cron๊ณผ daemon ๊ฐœ๋…์žก๊ธฐ
7.1 cron(ํฌ๋ก ) ๊ฐœ๋…์žก๊ธฐ (์ž๋™ํ™”)

cron์€ ์ฃผ๊ธฐ์ ์ธ ์‹คํ–‰์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค์˜ˆ๋ฅผ ๋“ค์–ด ๋งค์ผ ์•„์นจ 7์‹œ๊ฐ€ ๋˜๋ฉด led๋ฅผ ์ž‘๋™์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด cron์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
$ crontab -1
no crontab for pi

The cron command-line utility is a job scheduler on Unix-like operating systems. Users who set up and maintain software environments use cron to schedule jobs, also known as cron jobs, to run periodically at fixed times, dates, or intervals. 

webapps
	- ch06
    		- cron
        		- led.py

 

# -*- encoding: utf-8 -*-

import RPi.GPIO as GPIO
import time

GPIO.cleanup() #ํ•œ๊ธ€

LED = 8
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)

try:
    num = 0
    while(True):
        time.sleep(1)
        GPIO.output(LED, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(LED, GPIO.LOW)
        num = num + 1
        if(num == 5):
            GPIO.cleanup()
            break
except KeyboardInterrupt:
    GPIO.cleanup()


7.2 daemon(๋ฐ๋ชฌ) ๊ฐœ๋…์žก๊ธฐ

cron์ด ์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด daemon์€ ๊ณ„์† ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. LED๋ฅผ ๋ผ์ฆˆ๋ฒ ๋ฆฌ ํŒŒ์ด๋ฅผ ์žฌ๋ถ€ํŒ…ํ–ˆ์„ ๋•Œ ๋ถ€ํ„ฐ ์ข…๋ฃŒ ์‹œ๊นŒ์ง€ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•จ๊ณผ ๋™์‹œ์— ๊ณ„์†์ ์ธ ๋™์ž‘์„ ์›ํ•œ๋‹ค๋ฉด daemon์œผ๋กœ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
webapps
	- ch06
    		- daemon
        		- led2.py

# ํ•ด๋‹น ํŒŒ์ผ์„ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‹คํ–‰ํ•  ๋•Œ python ์‹คํ–‰ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•˜๋ผ
#! /usr/bin/env python #๊ผญ ์ฒจ๋ถ€ํ•œ๋‹ค. ํŒŒ์ด์ฌ ๋ฒ„์ „์ด 3.4๋ผ๋ฉด ๋’ค์— python3.4๋ผ๊ณ  ์ ๋Š”๋‹ค.
import RPi.GPIO as GPIO
import time

GPIO.cleanup()

LED = 8
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LED, GPIO.OUT, initial=GPIO.LOW)

try:
    num = 0
    while(True):
        time.sleep(1)
        GPIO.output(LED, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(LED, GPIO.LOW)
        num = num + 1
        if(num == 5):
            GPIO.cleanup()
            break
except KeyboardInterrupt:
    GPIO.cleanup()

fi
 -> ์ด ๋ถ€๋ถ„์— ์‹คํ–‰ํ•  ๊ตฌ๋ฌธ์„ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค. ๋งˆ์ง€๋ง‰์—” &์„ ๋ถ™์ธ๋‹ค.
exit 0


728x90
๋ฐ˜์‘ํ˜•
Comments