이전 과정을 통해 API Gateway, Lambda, 데이터베이스를 연결하였다. 이 장은 스마트폰에서 측정된 온도정보를 클라우드 데이터베이스에 저장하는 기능을 구현한다.
서버 코드 변경
Lambda 함수를 API가 호출되면 데이터베이스에 온도정보를 저장할 수 있도록 코드를 수정한다.
import psycopg2
import json
from datetime import datetime
def lambda_handler(event, context):
query_parameters = event.get('queryStringParameters', {})
# 이름, 온도, 날짜정보 수신
name = query_parameters.get('name', None)
temperature = query_parameters.get('temperature', None)
date = query_parameters.get('date', None)
# 파라미터가 없다면 오류 반환
if name is None or temperature is None or date is None:
return {
'statusCode': 400,
'body': json.dumps(f'parameter error {name}, {temperature}, {date}')
}
# 문자열을 적절한 형태로 변환
temperature = float(temperature)
date = datetime.strptime(date, "%Y-%m-%d %H:%M:%S")
try:
# 데이터베이스 연결
conn = psycopg2.connect(
host = "호스트 주소",
database = "데이터베이스 이름",
user = "유저 이름",
password = "마스터 비밀번호"
)
except:
return {
'statusCode': 401,
'body': json.dumps('Database Connect Error')
}
with conn.cursor() as curs:
try:
# 온도정보 저장
curs.execute("""INSERT INTO "TemperatureInformation" (name, temperature, date) values (%s, %s, %s);""", (name, temperature, date))
# 트랜잭션 테이블에 반영
curs.execute("commit;")
except:
return {
'statusCode': 402,
'body': json.dumps('Insert Error')
}
return {
'statusCode': 200,
'body': json.dumps('Success Data Insert')
}
이후 다음 URL을 사용해 API 호출을 테스트해보면 Success Data Insert가 화면에 나타나고, pgAdmin4에 온도정보가 올바르게 저장된것을 확인할 수 있다.
API 스테이지 URL + /ts100_resource?name=TS100-12345&temperature=36.5&date=2011-11-11 11:11:11
온도 정보 클라우드에 저장
각 플랫폼별 클라우드 데이터베이스에 온도정보를 저장하는 방법에 대해 설명한다.
Raspberry Pi(Python)
클라우드에 온도정보를 저장하기 위해 API 호출 관련 모듈을 추가한다.
# API 호출 관련 라이브러리
import requests
이후 API 호출 함수를 작성한다.
def send_cloud(temperature, date):
# String으로 변환
convert_date = date.strftime("%Y-%m-%d %H:%M:%S")
convert_temperature = str(temperature)
# URL 생성
base_url = "API 스테이지 URL"
url_params = {'name': selected_device.name, 'date': convert_date, 'temperature': convert_temperature}
my_url = f"{base_url}?name={url_params['name']}&date={url_params['date']}&temperature={url_params['temperature']}"
print(my_url)
# URL 인코딩
encoded_url = requests.utils.requote_uri(my_url)
# HTTP GET 요청
response = requests.get(encoded_url)
# 상태 확인
if response.status_code in range(200, 300):
print("Success")
elif response.status_code in range(400, 500):
print("Error")
else:
print("Default Error")
바나나 체온계로부터 온도정보를 수신했을 떄 API호출하는 메서드를 추가 후 실행하면 온도정보가 클라우드에 저장되는 코드가 실행되는것을 확인할 수 있다.
# 온도정보 변환하는 함수
def parse_temperature_information(data: bytearray):
global cursor
# 온도정보 변환
temperature = temperature_calculate(data[1], data[2], data[3], data[4])
array_slice = data[5:]
date_array = list(map(int, array_slice))
# 날짜정보 변환
date = date_calculate(date_array)
# 온도, 날짜정보 출력
print(date)
print(temperature)
# 데이터베이스에 저장
cursor.execute("INSERT INTO TEMPERATURE (name, temperature, date) VALUES (?, ?, ?)", (selected_device.name, temperature, date))
conn.commit()
# 클라우드에 저장(추가된 부분)
send_cloud(temperature, date)
클라우드 데이터베이스 정보 확인
클라우드에 저장된 온도정보 확인을 위해 pgAdmin4를 실행해 Tables 우클릭 → Query Tool을 클릭해 Query Tool 화면으로 전환한다.
Query문을 다음과 같이 작성한 후 실행버튼을 클릭하면 1초단위로 온도정보가 클라우드 데이터베이스에 저장되어있는것을 확인할 수 있다.
select * from "TemperatureInformation";
온도정보 필터링
특정 조건을 만족하는 온도정보를 출력하는 방법에 대해 설명한다. 체온의 정상 범위인 36 ~ 37.5℃ 내에 있는 온도정보를 확인하기 위해 SQL문을 아래와 같이 작성한다.
select * from "TemperatureInformation" where temperature >= 36.0 and temperature <= 37.5;
SQL문을 작성하고 실행하면 다음과 같이 정상 온도범위의 온도정보만 출력되는것을 확인할 수 있다.
Last updated