축소형 스마트팜을 만들려고 합니다.
아두이노는 ESP8266모델을 이용했습니다.
아두이노는 server로 부터 보낸 값을 받아야합니다 . mqtt는 subscribe로 값을 콜백함수로 반환합니다.
아두이노에서 server로 센서 값을 보냅니다. 요기서 한가지 의문점이 듭니다. 아두이노 센서값도 mqtt로 통해서 서버로 센서 값을 보내면 안될까?
mqtt로 센서값을 보내는 것 도하나의 방법이지만 MQTT 사용한 목적은 아두이노가 외부 IP로 지정할 수 없어서 서버로 부터 아두이노한테 값을 전달하는 수단입니다.
하지만 아두이노가 서버로 데이터을 전달할 수 있는 방법은 많이 있습니다. 그 중 하나 restapi로 사용하는 것 입니다.
restapi?
월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식이다 (출처 나무위키)
REST의 구성
URL
HTTP METHOD
Representations
REST의 특징
1. Unifrom
URL로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일
2. Stateless
상태정보를 따로 저장하고 관리하지 않습니다.
3. Cacheable
웹에서 사용하는 기존 인프라를 그대로 활용이 가능합니다.
4. Self-descriptiveness
REST API 메시지만 보고도 이를 쉽게 이핼 할 수 있는 자체 표현 구조로 되어 있다는 것 입니다.
5. Client - Server 구조
클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로간 의존성이 줄어들게 됩니다.
6. 계층형 구조
네트워크 기반의 중간매체를 사용할 수 있게 합니다.
즉 http통신 이용해서 다른 소프트웨어랑 통신하는 방법입니다.
- GET --> 조회
- POST --> 업데이트 --> 요청할때마다 새로운 자원 갱신
- PUT --> 업데이트 --> 요청할때 기존에 있는 자원 갱신
- DELETE --> 삭제
이처럼 4가지 방식으로 통신 할 수 있습니다
아두이노는 GET으로 통해 서버에 있는 아두이노에 대한 정보을 알 수 있습니다.
#include <ArduinoJson.h> // data --> json
StaticJsonDocument<200> doc;
HTTPClient http;
http.begin("웹서버 DNS"); //Specify request destination
int httpCode = http.GET();
if (httpCode < 400) { //Check the returning code
String payload = http.getString(); //Get the request response payload
Serial.println(payload); //Print the response payload
auto error = deserializeJson(doc, payload);
id = doc["id"]; // 서버에서 JSON 형식으로 키 : 값 형식으로 보냈습니다.
soil = doc["soil"];
}
아두이노는 조회한 데이터을 가지고 서버한테 센서값을 POST을 통해 데이터 값을 계속 전달하는 방식을 사용합니다.
REST 통신을 하기 위해서는 값을 표준화된 데이터 형식이어야합니다. 표준 데이터 형식중 JSON으로 값을 전달할려고 합니다.
아두이노 라이브러리중 ArduinoJson이라는 라이브러리을 이용해서 JSON값 형태로 바꿀수가 있습니다.
#include <ArduinoJson.h> // data --> json
StaticJsonDocument <200> data;
data["JSON key"] = JSON VALUES;
data["JSON key"] = JSON VALUES;
data["JSON key"]=JSON VALUES;
data["JSON key"] = JSON VALUES;
String output;
serializeJsonPretty(data, output); --> JSON형식으로 바꿉니다.
서버(django)
views.py
from django.core import serializers
import json
def post(request):
data = json.loads(request.body) --> body에 JSON값을 객체에 옮깁니다.
JSON_VALUE1 = data['JSON_KEY1']
JSON_VALUE2 = data['JSON_KEY2']
JSON_VALUE3 = data['JSON_KEY3']
context = { 'JSON_VALUE1' : JSON_VALUE1,
'JSON_VALUE2' : JSON_VALUE2,
'JSON_VALUE3' : JSON_VALUE3
}
return render(request, 'post.html', context)
// 자신이 만든 app폴더 안에 templates폴더 안에 post.html 만들어서 context값을 전달해 테스트했습니다
post.html
<h1>{{ JSON_VALUES1 }}</h1>
<h1>{{ JSON_VALUES2 }}</h1>
<h1>{{ JSON_VALUES3 }}</h1>
POST 값을 주는 방법은 POSTMAN 프로그램을 이용하면 쉽게 POST값을 전달 할 수 있습니다.
www.postman.com/ postman 공식 홈페이지 입니다
이제 DB을 구성할려고 합니다 그림과 같이 구성할려고 합니다.
DB의 종류
관계형 DB (RDB)
가장 흔하게 볼 수 있고 처음에 DB라고 생각 이미지가 관계형 DB에 가깝습니다. 데이터베이스로서 컬럼과 열로 표현되는 테이블간의 관계를 나타낼 때 사용합니다. SQL을 통해서 접근하기 편리합니다.
Ex) Oracle, Mysql,Maria DB,MS-SQL,Derby 등등
NoSQL(Not only SQL)
영어을 해석 하면 SQL뿐만 아니라 다른 특성까지도 지원 해주는 데이터 베이스입니다.
대용량 데이터를 다루거나 데이터 분산 처리, 유연한 데이터 모델링이 가능하며. Cloud Computing에 적합합니다.
계층형 데이터베이스 : 데이터간의 관계가 트리 구조인 데이터 모델 사용
네트워크형 데이터베이스 : 데이터간의 다양한 관계가 그물망과 같은 모델 사용
우리는 DB을 관계형 DB을 설정하도록 하겠습니다 테이블과 테이블 관계가 나타내기 위해서 RDB로 사용합니다.
관계형 DB에도 여러가지 관계형 DB가 있습니다 .
저는 대중적으로 가장 많이 사용하고 있는 Mysql로 사용했습니다 .
Mysql 서버을 사용하기 위해서 GCP에서 리눅스서버을 한개 만듭니다.
Mysql 설치하는 과정
sudo apt-get update
sudo apt-get install mysql-server
sudo mysql_secure_installation
Mysql 접속하기
sudo mysql -u root -p
MYSQL 사용법
CREATE DATABASES [이름]; #데이터 베이스 만들기
SHOW DATABASES; # 데이터 베이스 보기
use [만들었던 DB]; # db 사용하기
SHOW TABLES; # 테이블 보기
desc [테이블명] # 테이블 속성보고
DJango와 연동하기위해서 계정을 만들어야 합니다.
create user '아이디'@'%' identified by '비밀번호'; // 계정 생성
권한 부여
grant all privileges on *.* to '아이디'@'%'; // 모든 데이터베이스의 모든 테이블에 대한 권한 부여(*.* 이 모든 테이블이란 뜻이다.)
grant all privileges on DB이름.* to '아이디'@'%'; // 특정 DB에 대한 모든 권한 부여.
grant select, insert, update on DB이름.* to '아이디'@'%'; // 특정 DB에 대한 특정 권한(select,insert,update) 부여.
FLUSH PRIVILEGES; // 변경한 권한을 즉시 반영시켜주는 명령어
테이블을 생성 할때 기본키을 필수적으로 줘야합니다. 기본키가 없으면 django에서 DB을 사용하기에 에러가 일어날 수 있습니다. 만약에 안줬다면 models.py에서 기본키을 줘야 합니다.
DB과 DJango과 연동하는 방법
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '데이터베이스명',
'USER': '계정 이름',
'PASSWORD': '계정 패스워드',
'HOST': 'DB 주소(GCP DB서버 IP)',
'PORT' : '3306'
}
}
DJango에서 db에 있는 테이블을 구조을 파이썬 소스로 바꿔주는 명령어가 있습니다.
python manage.py inspectdb > models.py
models.py --> 연동하고 싶은 [자신이 만든 app] 폴더 안에 models.py와 교체 하면 됩니다.
python manage.py makemigrations [자신이 만든app] # models.py에 있는 소스코드을 명세화하는 과정
python mange.py migrate #makemigrations으로 만든 명세화된 파일을 django에 입력하는 과정
만약에 makemigrations에서 오류가 일어나면 해결법
1. migrations폴더 안에 있는 명세화 소스코드가 있는파일 삭제 후 makegirateions
2. You are trying to add a non-nullable field '필드명' 이런 오류가 나타난다면 해당 필드에
name(필드명) = models.CharField(null=True,default='') 빨간색 값을 추가해주면 해결할 수 있습니다.
django MYSQL 사용하기
당연히 settings.py 에서 자신이 만든 app을 넣어야합니다.
자신이 만든 project --> settings.py에
아래에 있는 글을 복사해서 자신의 db에 맞게 수정하시면 됩니다.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '데이터베이스 이름',
'USER': '계정명',
'PASSWORD': '계정 비밀번호',
'HOST': 'Mysql 서버 ip or localhost',
'PORT' : '3306'
}
}
Mysql에 있는 DB--> Table의 값을 이쁘게 변형시켜줍니다. 해당 models.py --> 자신이 만든 app 폴더에 넣어 줍니다.
DJango ORM으로 DB데이터 활용하기
[models.py --> 있는 클래스 이름].objects.all() --> 테이블 전체 데이터 가져오기 (기본 키 기준으로)
[models.py --> 있는 클래스 이름].objects.values() --> 테이블 데이터 가져오기
에러가 생길 수 있습니다. 하지만 제가 여러 에러을 경험하면서 그냥 맘편하게 다 지우고 다시 mysql
연결하는 것이 빠른 것 같습니다.
wayhome25.github.io/django/2017/04/01/django-ep9-crud/
그 밖에 여러가지 ORM 명령어 입니다.
'스마트팜' 카테고리의 다른 글
아두이노 형변환 (0) | 2021.01.29 |
---|---|
아두이노 인증 (0) | 2021.01.29 |
웹 서버 구축 하기 - 2 (0) | 2021.01.26 |
웹 서버 구축 하기 - 1 (0) | 2021.01.07 |
스마트팜 아쿠아포닉스 (0) | 2020.12.21 |