1. Firebase는 구글에서 운영하는 인터넷 관련 BaaS서비스라고 볼 수 있다. BaaS에 대한 정의는 링크를 참고한다. 각 온라인 서비스 프로바이더의 분류는 아래 그림을 참고하면 된다.
- 첫째, 우리는 IPv4 시스템의 한계로 인해 개별 기기에 공인IP를 가질 수 없다.
- 둘째, 이는 몇 개 안되는 공인IP 아래에 공유기를 연결해 사설 IP를 만들어내 사용해야 함을 의미한다.
- 셋째, 사설 IP를 사용하는 디바이스가 운용하는 서비스에 접근하려면 네트워크의 개념을 이해하고 있어야 한다.
- 넷째, 이 중 가장 기본인 공인 IP에서 사설 IP로 연계를 하기 위한 과정인 포트포워딩에 대해 이해하고 있어야 한다.
- 다섯째, 모바일 통신에서는 각 모바일 통신사가 권한을 가지고 있는 모바일 통신망 NAT의 구조에 대해 이해하고 있어야 한다.
- 여섯째, 하지만 이를 도전한 사람들은 NAT를 통해 역으로 모바일 디바이스나 모바일 통신망을 통해 테더링을 하고 있는 디바이스에서 운용하는 서비스에 접근하는 것은 모바일 서비스를 제공하는 통신사의 권한부여 없이는 불가능하다는 사실을 수십 수백번의 시도 끝에 알게 된다. 통신사는 그걸 지원할 생각이 없다.
- 일곱째, 일반적으로 통신은 서버와 클라이언트로 구성되고, 서버가 서비스를 열면, 클라이언트가 접근하는 형태로 서비스가 되는데, 위의 설명과 같은 이유들로 서버가 서비스를 해도 클라이언트가 접근을 할 수가 없거나, 그 과정이 매우 어렵다는데 있다.
- 여덟째, 따라서, 우리는 구글 계정과 간단한 세팅만으로 쉽게 사용할 수 있는 Firebase라는 중간 단계의 Realtime Database 서비스를 이용해 이 곳에 데이터를 올리고, 이 곳에 접근해서 데이터를 읽어가는 형태의 서비스를 구상하게 된 것이다.
- 참고로, Firebase는 Realtime Database만 지원되는 것이 아니고, 인증, 앱체크, 데이터베이스, 스토리지, 호스팅, 함수 서비스, 머신러닝, 분석 등 엄청나게 다양한 서비스를 지원하고 있으며, 충분한 용량을 무료로 제공하므로, 개발단계나 테스트 단계에서는 무료라고 봐도 무방하다.
- 어쨌든 사람들이 해당 서비스를 사용하고, 그 서비스를 이용해 부가가치를 만들어내야 자신들도 먹고 살 수 있음을 잘 알고 있는 것이고, 그런 사람들이 많으면 많을수록 좋으니 이렇게 제공되는 기본 서비스들을 통해서 우리 같은 초보개발자들이 마음 놓고 테스트를 진행해볼 수 있다는 것이다.
- 이는 오픈소스 진영의 라이프사이클이 잘 돌아가고 있고, 그 안에 있는 사람들이 아직 건재하게 생존해 있다는 것으로 증명된 사실이며, 사실 구글도 그런 문화를 통해 성장해왔으니, 그런 서비스를 통해 자신들의 생태계를 더욱 확장하는 방법을 알고 있는 것은 어찌보면 매우 당연한 일이다.
2. Github Pages는 HTML, CSS, JavaScript로 대변되는 정적 웹페이지에 대한 서비스를 무료로 제공하고 있다. 정적 웹페이지는 서버측에서 클라이언트의 특정한 요청에 대해 프로세스를 진행하고 그 결과물을 제공해주는 동적웹페이지(WAS서버, 데이터베이스, 로그인 기능 등이 추가됨)와 달리 단순히 웹페이지만 제공한다.
- 첫째, 이 프로젝트가 제공하는 것은 Firebase의 Realtime Database가 아니라 이를 활용하여 스마트팜의 정보를 지구 반대편에서도 확인하고 원격으로 제어할 수 있는 서비스이다.
- 둘째, 서버에 클라이언트가 직접 접근할 수 있는 서비스가 가장 직관적이며 빠르지만, 서버를 스스로 구축하는 부분에 대한 개인 역량의 문제, 네트워크의 접근성 제약에 따른 한계 등 다양한 형태의 제약조건이 많으므로, 이를 극복하면서도 그럴싸한 서비스를 제공할 필요가 있다.
- 셋째, Github Pages는 이러한 서비스를 제공하는데 가장 쉬운 서비스를 무료로 제공하고 있다.
- 넷째, Github 자체는 전세계 사람들이 참여하고 있으므로, 이번 기회를 통해 이 생태계를 이해하게 된다면, 소프트웨어 관련 프로젝트를 진행할 때 든든한 지원군을 얻게 되는 셈이다.
- 다섯째, 당연히 웹페이지도 무료로 배포되며, 자신만의 포트폴리오를 만들고 관리하는데 매우 훌륭한 도구이다.
- 여섯째, 일단 웹페이지로 구현된 것은 WebViewer라는 기능을 통해 쉽게 앱으로도 구현할 수 있다.
- 일곱째, 부수적으로 W3Schools등의 사이트를 Github와 함께 활용함으로써 웹을 이용한 서비스를 구축하는 다양한 방법들을 공부하고, 관련 역량을 키워나갈 수 있다.
* 핀 설명 자료
- 첫째, 다른 라즈베리파이가 라즈비안이라는 리눅스 OS를 사용하는 컴퓨터(MPU, 마이크로 프로세서 유닛을 사용하는)인 반면에 피코는 펌웨어(파이썬 펌웨어, 자바스크립트 펌웨어 등)를 올려서 주로 피지컬 컴퓨팅용으로 사용하는 장비(MCU, 마이크로 컨트롤러를 사용하는)이다. 이는 아두이노 우노와 같은 반복적인 일을 하는데 최적화 되어 있음을 의미한다.
- 둘째, 아두이노 우노와의 차이점은 아두이노 우노의 경우 C, C++을 사용하므로 가볍게 사용할 수 있지만, 사용 언어가 요즘 세대에게 익숙하지 않다는 점이 있는데 반해 라즈베리파이 피코의 경우 어떤 펌웨어를 업로드 하느냐에 따라 마이크로 파이썬이나 자바스크립트 등을 선택해서 사용할 수 있고, 상대적으로 고급 언어를 사용할 수 있다는 점이 장점이다.
- 셋째, 마이크로 파이썬을 사용할 경우 https://micropython.org/download/rp2-pico-w/ 링크에서 최신 버전을 다운로드 받은 다음 피코에 업로드 하면 된다. 업로드는 피코의 Bootsel 버튼을 누른 상태에서 컴퓨터에 USB케이블을 꽂으면 피코가 외장 디스크로 인식이 되고, 내 컴퓨터에서 다운로드 받은 펌웨어 파일을 업로드 하기만 하면 된다.
- 넷째, Pico W는 마이크로 컨트롤러이지만 WiFi모듈이 실장되어 있어, 주변에 와이파이 공유기가 있다면, 바로 공유기(2.4GHz)에 접속해 인터넷과 연결할 수 있다.
- 다섯째, 조도, 온도, 습도 센서를 비롯한 다양한 형태의 센서로부터 값을 받아와서 Firebase로 전송이 가능하므로, 어떤 장치를 만들더라도 해당 시스템만 이해하고 있으면 확장이 가능하다.
- 여섯째, 반도체 이슈 이후로 각 싱글보드 컴퓨터의 가격이 폭등하였는데, 피코는 여전히 저렴하다. 일반 피코는 4달러, 피코 W는 6달러 수준이고, 국내에서도 큰 차이 없이 구매할 수 있으므로, 더욱 매력적이다.
- 일곱째, 블루투스를 이용한 스마트팜은 근거리에서만 활용이 가능하며 진정한 의미의 IoT라고 볼 수 없는데, 피코 W는 이점을 굉장히 쉬운 방법으로 극복할 수 있으며, ESP32, ESP8266보드에 비해서 사용성이 용이하다.
test.mp4
KakaoTalk_20221231_232521289.mp4
2022-12-31.14-44-34.mp4
2023-01-01.11-23-27.mp4
3. Pico에 연결되어 있는 엘이디의 초록색은 LED On, Fan Off, 하늘색은 LED On, Fan On, 파란색은 LED Off, Fan On, 꺼지면 LED Off, Fan Off
KakaoTalk_20230101_130414591.mp4
12. false로 기본 설정되어 있는데, 이곳을 클릭하여 true로 바꿔주고 '게시'버튼을 누르면 누구나 접근해서 데이터를 읽고 쓸 수 있다. 추후 보안 및 트래픽에 따른 결제비용 증가에 영향을 줄 수 있으니, 테스트 할 때만 true로 설정하고, 실제 사용할 때는 읽고 쓰는 권한을 false로 바꾸고 접근한 사람의 사용자 권한에 따라 사용하거나, 엑세스 토큰을 부여받아 사용할 수 있도록 해야한다.
13. 다음으로 이 Realtime Database를 실제로 사용하기 위해서 관련 config 내용을 얻어야 한다. 프로젝트 개요-기어 버튼-프로젝트 설정으로 가서 내 웹앱에 firebase를 추가하는 버튼을 눌러 세팅을 완료하고, config 정보를 얻어낸다. 한 번 세팅을 완료하면 세팅을 삭제하기 전까지는 계속 해당 config를 사용할 수 있다.
14. firebase config 정보를 가져온다. 아래의 최종 이미지 안에 있는 firebaseConfig 내부의 값만 복사해서 내 웹의 web/public/js/firebase.js파일의 해당 부분에 붙여넣으면 자신의 Realtime Database에 접근해서 온도, 습도, 조도, LED제어, Fan제어를 위한 데이터를 주고 받는 smartFarm 제어용 웹 서비스를 바로 이용할 수 있다.
- Firebase 사용 요금제는 아래 링크를 참고하면 되며, 테스트 용도로는 비용이 따로 들지 않는다고 봐도 무방하다.
https://firebase.google.com/pricing?authuser=0&hl=ko
1. 개발 IDE로는 Thonny를 사용한다. 펌웨어 링크로 들어가서 view raw를 눌러 펌웨어를 다운로드 받고, 피코 W의 bootsel버튼을 누르고 USB케이블을 연결하면 활성화되는 피코 폴더(파일관리자-내PC-피코 W 드라이브)에 복사해서 넣는다.
2. Thonny 설치 후 Run-Configure Interpreter-Interpreter에서 'MicroPython (Raspberry Pi Pico)'를 선택하고 연결된 Port를 선택해야 피코에 마이크로파이썬을 사용해 프로그래밍을 하여 업로드 할 수 있다.
7. 따라서 Firebase 인증 토큰을 발급받는데 사용하는 라이브러리를 쓸 수 없고, Firebase RTDB의 규칙을 false로 해 놓을 경우 토큰을 통한 쓰기, 읽기 권한을 획득할 방법이 없어 규칙을 항상 true로 해놓고 사용해야 하는 불편함이 있다. 추후 피코의 내부 메모리 용량이 늘어난 제품이 나오면 해결될 문제로 보인다.
9. Thonny로 실행을 하면 각각의 파일들을 원하는대로 실행할 수 있지만, 아두이노처럼 전원을 넣으면 바로 해당 코드가 실행되게 하기 위해서는 파일명을 반드시 main.py로 지정해줘야 합니다.
- boot.py
from machine import Pin
from utime import sleep
led = Pin(27, Pin.OUT)
led.on()
sleep(0.2)
led.off()
sleep(0.2)
led.on()
sleep(0.2)
led.off()
sleep(0.2)
led.on()
sleep(0.2)
led.off()
sleep(0.2)
import main11. 아래 캡쳐의 17번째 줄 wlan.connect의 파라메터에는 자신의 와이파이 SSID, Password를 입력해 놓으면 자동으로 와이파이에 접속이 됩니다. 27번째줄 url에는 자신이 만든 Firebase RTDB의 주소로 수정해주세요.
- base.py
from machine import Pin, I2C
import network
import time
import urequests
import random
# 제어할 핀 번호 설정
from machine import Pin
led = Pin(26, Pin.OUT)
fan = Pin(27, Pin.OUT)
# 와이파이 연결하기
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
wlan.connect("<SSID>", "<Password>")
print("Waiting for Wi-Fi connection", end="...")
while not wlan.isconnected():
print(".", end="")
time.sleep(1)
else:
print(wlan.ifconfig())
print("WiFi is Connected")
# RTDB주소
url = "<자신의 Firebase RTDB주소>"
# DB 내역 가져오기
response = urequests.get(url+".json").json()
# byte형태의 데이터를 json으로 변경했기 때문에 메모리를 닫아주는 일을 하지 않아도 됨
# print(response)
# print(response['smartFarm'])
# print(response['smartFarm']['led'])
while True:
# 현재 DB의 정보를 가져옴
response = urequests.get(url+".json").json()
# 현재 DB의 led 키 값의 상태에 따라 led 26번을 제어
if (response['smartFarm']['led'] == 0) :
led.value(1)
else :
led.value(0)
# 현재 DB의 fan 키 값의 상태에 따라 led 27번을 제어
if (response['smartFarm']['fan'] == 0) :
fan.value(1)
else :
fan.value(0)
# 객체 교체하기, patch는 특정 주소의 데이터가 변경됨
myobj = {'light': random.randrange(0, 100), 'temp': random.randrange(0, 50), 'mois': random.randrange(0,100)}
urequests.patch(url+"smartFarm.json", json = myobj).json()


































