본문 바로가기
Projects/센서 모니터링 시스템

[센서 모니터링 시스템] 9. 라즈베리파이 Request 구현

by DevJaewoo 2022. 8. 18.
반응형

라즈베리파이 Request 구현

센서 데이터 측정과 서버 API가 준비되었으니 이제 측정한 센서 데이터를 서버로 전송해보자.

 

requests 패키지를 사용할 것이기 때문에 만약 없다면 설치해준다.

pip3 install requests

 

우선 조회 API를 통해 request / response가 잘 되는지 확인하자.

원래 PC에서 무선랜카드로 핫스팟을 틀어서 SSH에 연결했었는데, 인터넷을 찾아보니 Windows10에서 핫스팟을 틀 경우 내부적으로 IP를 변경되어 연결된 기기에서 Windows로 Ping을 못한다고 한다.

그래서 휴대폰에서 핫스팟을 틀고, 라즈베리파이와 PC를 휴대폰에 연결했다.

https://superuser.com/questions/1354338/cant-ping-when-mobile-hotspot-is-enable

 

Can't ping when Mobile Hotspot is enable

In Windows 10, when Mobile Hotspot feature is enabled, my PC become unreachable in the network and can't even Ping on my IP.

superuser.com

 

아무튼 변경된 IP주소로 테스트 Request를 날렸을 때 잘 동작하는것을 볼 수 있다.

ajw@raspberrypi:~/sensor-monitoring-system $ python3
>>> import requests
>>> r = requests.get('http://192.168.166.26:8080/api/1/sensor')
>>> print(r)
<Response [200]>
>>> print(r.json())
{'sensorData': [{'eco2': 12, 'tvoc': 15, 'temp': 1.5, 'accel': {'x': 12.0, 'y': 23.0, 'z': 35.0}, 'createdDate': '2022-08-18T10:18:53.587325'}]}
>>>

 

측정한 센서 데이터를 Dictionary에 넣어 POST Request를 전송해보자.

센서 측정 값이 소수점 18자리까지 나오길래 너무 과한것 같아 셋째 자리에서 반올림했다.

또 가끔 센서 초기화 시 몇 초 동안 0이 측정되는 경우가 있는데, 이런 경우는 전송하지 않도록 했다.

import requests

import smbus
from time import sleep
from CCS811 import CCS811
from MPU6050 import MPU6050

SERVER_IP = '192.168.166.26'
SERVER_PORT = 8080
CLIENT_ID = 1
REQUEST_URL = 'http://{0}:{1}/api/{2}/sensor'.format(SERVER_IP, SERVER_PORT, CLIENT_ID)

i2c = smbus.SMBus(1)

ccs811 = CCS811(i2c)
sensor = MPU6050(i2c)

sleep(0.1)

while True:

        sleep(1)
        
        try:
                [eco2, tvoc] = ccs811.readData()
                accel = sensor.get_accel_data()
                temp = sensor.get_temp_data()
                
                if (eco2 == 0 or accel['x'] == 0):
                        print('Trash value')
                        continue

                print('eCO2: {} TVOC: {} Temp: {}\nAccel: {}'.format(eco2, tvoc, temp, accel))

                json = {
                        'eco2': eco2,
                        'tvoc': tvoc,
                        'temp': round(temp, 2),
                        'accel': {
                                'x': round(accel['x'], 2),
                                'y': round(accel['y'], 2),
                                'z': round(accel['z'], 2)
                        }
                }

                response = requests.post(url = REQUEST_URL, json = json)

        except Exception as e:
                print('Except: {}'.format(e))

 

psql 창에 select 명령어를 치면 센서에서 Request한 데이터가 DB에 잘 저장되는 것을 볼 수 있다.

DB에 저장된 데이터

 

조회 API도 잘 동작하는 것을 볼 수 있다. (잠깐 저장했는데 용량이 5.53KB나 된다...)

Postman API 요청 결과

 

이제 클라이언트에서 조회 API를 사용해 데이터를 받고, 시각화 하는 작업을 해보자.

반응형