OS DB transmit

[Raspberry Pi] 운영체제 라즈비안(Raspbian)에서 윈도우(Window) MySQL DB로 값 전송, 저장하기

땅콩새싹 2020. 10. 20. 18:14
반응형

운영체제 라즈비안(Raspbian)에서 윈도우(Window) MySQL DB로 값 전송, 저장하기

 


 
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
31
from random import *
import time
import pymysql
 
count = 0
sensor_value = 0
index = 1
while(1):
    i = randint(100,999)
    sensor_value=sensor_value+i
    time.sleep(1)
    count=count+1
 
    if count==5:
        conn = pymysql.Connect(host='IPv4 주소', user='raspberryPi',
            password='1234', db='sensor_data', charset='utf8')
        curr = conn.cursor()
        res=sensor_value/5
        sql = "insert into value1 values('"+str(index)+"',
            "+"'192.168.xxx.xx','"+str(res)+"')"
 
        print(sql)
        print(curr.execute(sql))
        conn.commit()
        count=0
        sensor_value=0
        index += 1
        curr.close()
        conn.close()
        conn = None
        curr = None

이번에는 RaspberryPi에서 출력되는 Data값을 Window OS에 MySQL DB로 전송해 저장하는 것을 해보겠습니다.

원래는 RaspberryPi에 센서를 연결해서 출력되는 값을 전송하는 것이 목표이지만 지금은 간략하게 방법만 알아보기 위해 100~999까지의 수를 랜덤으로 1초마다 불러와 그 값을 5초에 한번 평균을 내어 그 평균 값을 DB로 전송해 보도록 하겠습니다.

먼저 랜덤 값을 뽑아내는 부분부터 보겠습니다. 랜덤한 값을 뽑아주기 위해 random 모듈을 import 했습니다. 그리고 1초마다 시간을 지연시켜 주기 위해 time도 import해 주었습니다. 그리고 count변수는 1초마다 count를 1씩 증가시켜 5초가 되면 그 평균값을 계산해 주기 위해 넣었습니다. sensor_value는 5초까지의 값을 모두 더해서 저장해 주기 위해 선언했습니다. index는 MySQL에 저장할 때 인덱스값을 primary key로 1부터 출력하기 위해 선언했습니다.

그리고 while문으로 들어가서 randint()함수를 이용해 랜덤한 값이 100~999 사이에서 출력되도록 해주고 while문이 한번 돌 때마다 sensor_value에 그 값을 더해줍니다. 그리고 time.sleep(1)을 통해 1초마다 지연시켜 주어 1초에 한번 값이 출력될 수 있도록 했습니다. 그리고 1초가 지날 때 마다 count값도 1씩 증가시켜 주었습니다.

그리고 count값이 5가 된다면  Connect문을  통해 MySQL과 연결 해 주었습니다. Connect문에 들어가는 인자들은 DB 설명에서 다시 언급하겠습니다. MySQL과 연결 해 주었다면 cursor()를 통해 conn문과 연결 해 줍니다. 그리고 sensor_value에 저장된 값을 5로 나누어 주어 5초 동안의 평균값을 res변수에 저장하고 sql문을 통해 index값 그리고 ip주소, res에 저장된 평균값을 MySQL에 만들어 놓은 table에 맞추어 전송하게 됩니다.

print(sql)은 값이 잘 출력되나 확인하기 위해 넣어 주었고 execute()를 통해 값이 잘 전송된다면 화면에 '1'이 출력되기 때문에 확인하기 위해 print해 주었습니다. 그리고 그 아래쪽은 while문이 한바퀴 돌 때 index값만 1 증가시키고 나머지는 전부 초기화 시켜 주었습니다.

 


 

다음은 MySQL쪽으로 넘어가 보겠습니다. MySQL에서 root계정으로 접속한 후 위에서 설명한 코드의 Connect문의 인자에서 필요한 user와 password를 생성해 주어야 합니다. MySQL의 상단바 메뉴의 Server를 누르면 Users and Privileges라는 메뉴가 있습니다. 거기로 들어가게 되면

이런 창이 뜨게 됩니다. 여기서 사용할 Login Name과 Password를 설정 해 주고 위의 메뉴에 Administrative Roles로 들어가서 DBA에 체크를 해 주면 전부 체크가 됩니다. 그 다음 우측 하단 Apply를 누르면 User를 생성하고 권한을 부여해 Connect할 준비가 된 것입니다.

정리를 해보면

MySQL root로 접속 -> 상단바 Server -> Users and Privileges -> LoginName & Password 설정 -> Administrative Roles -> DBA 클릭 -> Apply -> Rasberry Pi에서 Connect문에 user와 password 설정한 값으로 입력(Connect문에서 ip는 window os cmd에서 ipconfig를 통해 나온 IPv4 주소를 입력해 주어야 합니다.)

여기까지 해 주었다면 다음은 Database와 table을 생성 해 줄 차례입니다.

1
2
3
4
5
6
7
create database sensor_data;
use sensor_data;
create table value1(
id int primary key not null,
ip varchar(20not null,
value int not null
);

MySQL에서 저는 database 이름을 sensor_data로 create해 주었습니다.

그리고 table은 index값을 저장해 줄 id(primary key로 받음), ip주소를 저장해 줄 ip(varchar(20), 랜덤값의 평균을 저장해 줄 value(int) 이렇게 3가지의 table을 만들어 주었습니다.

table이 생성된 모습

우측에 database와 table이 생성된 것을 확인할 수 있습니다.

 

그리고 RasberryPi로 돌아와 맨 위에 설명했던 코드를 Run 시켜줍니다. 여기까지 문제 없이 잘 됬다면 터미널창에

이런식으로 sql문과 execute로 전송이 잘 되고 있다는 1이 5초마다 출력이 됩니다.

 

그리고 MySQL에서 table을 조회해 보면 

실시간으로 값이 저장되는 것을 확인할 수 있습니다.

 

주의할 점은 코드에서 index초기값을 1로 설정해 줬기 때문에 중간에 database로 전송을 stop하고 다시 실행시켜 줄 때 index값이 다시 1로 인식되기 때문에 에러가 납니다. 그 때는 table을 확인해서 index값이 몇번까지 들어왔나 확인 해 보고 index값을 그 다음값으로 입력해 주고 다시 동작시켜야 값이 잘 들어갑니다.

반응형