요 근래에 서버/DB 사용을 위해 파이어베이스를 다뤄보고 있는데 여러모로 쓸만 한 것 같습니다.
이번시간에는 라즈베리파이 카메라 v2로 주기적으로 사진을 촬영하고 이미지를 파이어베이스의 storage에 저장하는 코드를 작성해보겠습니다.
처음에 파이어베이스의 realtime database와 firestore database, 그리고 storage의 차이가 뭔지 몰랐는데 이미지파일은 DB에 저장이 안되는 것 같습니다.
(검색해보니까 이렇게 나오네요)
이제 순서대로 이 예제를 실행해보겠습니다.
라즈베리파이 카메라 연결
일단 라즈베리파이에 카메라를 연결해야합니다. 연결하고 라즈베리파이 configuration->interface에서 카메라를 enable 시켜준 뒤 잘 연결이 되었는지 아래 명령어로 확인합니다.
만약 supported 값은 1인데 detected가 0이라면 정상적으로 연결되지 않은 것입니다.
vcgencmd get_camera
그리고 firebase-admin 패키지를 설치하고 주기적으로 사진을 찍는 스케쥴을 관리하기 위해 스케줄 패키지를 설치해줍니다.
sudo pip3 install firebase-admin
sudo pip3 install schedule
이제 파이어베이스 홈페이지에서 간단하게 설정을 해줘야 하는데, 우리가 필요한 건 프로젝트 ID, 비공개 키, 스토리지 주소입니다.
차례대로 설정단계를 알아보겠습니다.
파이어베이스 프로젝트 생성
파이어베이스 storage생성 전 프로젝트 생성단계는 간단하므로 넘어가겠습니다. 프로젝트 ID는 프로젝트 생성 후 프로젝트 목록을 보시면 프로젝트 이름과 아래에 작게 아이디가 적혀있습니다.
파이어베이스 Admin SDK 키 생성
이제 키를 발급받아야하는데, 파이썬에서 프로그래밍으로 파이어베이스와 연동하기 위해 일종의 자격 증명서 같은 전용 "키"의 역할을 합니다.
프로젝트로 들어간 뒤 왼쪽 배너의 톱니바퀴-> 프로젝트 설정으로 들어갑니다. 파이썬을 사용하므로 구성 스니펫을 파이썬으로 체크한 뒤 비공개 키를 생성합니다. 키를 다운받아놓고 본인이 잘 기억할만한 폴더에 저장해 둡니다.(까먹거나 잃어버리면 안됩니다..;)
라즈베리파이에서 이 키를 사용해야 하므로 이제 그 키를 라즈베리파이의 디렉토리에 복사를 해야합니다.
삼바를 통해 json파일을 넘겨주고 아무 디렉토리에 저장시켜줍니다.
파이어베이스 storage생성
왼쪽 배너에서 storage를 클릭하고 새 스토리지를 생성하는데, 이 때 보안규칙, 위치설정 등은 기본 디폴트로 진행합니다.
완료를 누르면 "버킷 생성중" 메시지가 뜨고 생성이 완료됩니다. 창을 보면 ~~appspot.com 주소가 있는데 파이어베이스 스토리지의 주소라고 보시면됩니다.
이제 라즈베리파이에서 파이어베이스 연동을 위해 필요한 프로젝트ID, 비공개 키, 스토리지 주소까지 모두 준비가 완료되었습니다.
라즈베리파이 코드 작성 및 실행
자칫 헷갈릴 수 있으므로 코드 작성 전에 코드에 필요한 정보들을 나열하고 넘어가겠습니다.
1. 프로젝트 ID : 프로젝트 생성 후 프로젝트 목록에 나와있음
2. Admin SDK 키 : .json키 파일을 삼바를 통해 라즈베리파이 디렉토리에 저장합니다.
저는 /home/pi/Downloads(생성폴더)에 저장시켜 놨습니다.
3. 스토리지 주소 : 파이어베이스 storage에 들어가면 gs://키정보.appspot.com 이 있는데 이 정보도 이용합니다.
4. 스토리지 디렉토리 이름 : 프로그래밍으로 본인이 지정한 이름의 폴더를 파이어베이스 저장소에 만들 수 있습니다.
5. 사진 찍고 저장할 디렉토리 이름 : 주기별로 사진을 찍고 저장할 디렉토리입니다. 저는 /home/pi/image_store로 만들어주었습니다.
이제 코드를 살펴볼 차례입니다. 기본적인 틀은 다른분들의 코드와 공식 문서를 참고하여 작성했습니다.
웬만한 중요 부분은 주석으로 보충 설명하였고 64~69행 설정으로 사진을 찍고 삭제하는 주기를 조절할 수 있습니다.
파일명은 현재 년/월/일로 시/분/초로 나타냈습니다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
# _*_ coding: utf-8 _*_
from picamera import PiCamera
from time import sleep
import datetime
import sys, os
import requests
import firebase_admin
from firebase_admin import credentials
from firebase_admin import storage
from uuid import uuid4
import schedule
PROJECT_ID = "project-8965d"
#my project id
cred = credentials.Certificate("/home/pi/Downloads/(키 이름).json") #(키 이름 ) 부분에 본인의 키이름을 적어주세요.
default_app = firebase_admin.initialize_app(cred,{'storageBucket':f"{PROJECT_ID}.appspot.com"})
#버킷은 바이너리 객체의 상위 컨테이너이다. 버킷은 Storage에서 데이터를 보관하는 기본 컨테이너이다.
bucket = storage.bucket()#기본 버킷 사용
def fileUpload(file):
blob = bucket.blob('image_store/'+file) #저장한 사진을 파이어베이스 storage의 image_store라는 이름의 디렉토리에 저장
#new token and metadata 설정
new_token = uuid4()
metadata = {"firebaseStorageDownloadTokens": new_token} #access token이 필요하다.
blob.metadata = metadata
#upload file
blob.upload_from_filename(filename='/home/pi/image_store/'+file, content_type='image/png') #파일이 저장된 주소와 이미지 형식(jpeg도 됨)
#debugging hello
print("hello ")
print(blob.public_url)
def execute_camera():
#사진찍기
#중복없는 파일명 만들기
basename = "smr"
suffix = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") + '.png'
filename = "_".join([basename, suffix])
camera = PiCamera()
camera.resolution = (640, 480)
camera.start_preview()
#이미지에 텍스트를 새겨 넣자.
camera.annotate_text = "Smart Mirror"
camera.annotate_text_size = 20
sleep(5)
#사진을 찍어서 저장한다. 파일의 중복되지 않도록 날짜시간을 넣어서 만듬
camera.capture('/home/pi/image_store/' + filename)
#사진 파일을 파이어베이스에 업로드 한다.
fileUpload(filename)
#로컬 하드의 사진을 삭제한다.
camera.stop_preview()
camera.close()
#메모리 카드의 파일을 정리 해 주자.
def clearAll():
#제대로 할려면 용량 체크 하고 먼저 촬영된 이미지 부터 지워야 할것 같지만 여기선 폴더안에 파일을 몽땅 지우자.
path = '/home/pi/image_store'
os.system('rm -rf %s/*' % path)
#10초 마다 실행
schedule.every(10).seconds.do(execute_camera)
#10분에 한번씩 실행
#schedule.every(10).minutes.do(execute_camera)
#매 시간 마다 실행
schedule.every().hour.do(clearAll)
#기타 정해진 시간에 실행/매주 월요일에 실행/매주 수요일 몇시에 실행 등의 옵션이 있다.
while True:
schedule.run_pending()
sleep(1)
|
cs |
이제 실행해봅니다. 위 코드를 test.py라는 이름으로 작성했다고 한다면 다음처럼 실행하면됩니다.
sudo python test.py
주의할점으로 제 환경 기준으로 커맨드 창에서 코드를 작성하고 실행해보니 계속 오류가 떴었습니다.
No module name firebase_admin 이라는 오류가 뜨면 sudo pip install firebase_admin으로 다시 깔아주면(파이썬3버전이 아닌 1버전) 오류는 사라집니다.
여기까지 진행하고 정상 진행이 되면 상관없으나 에러가 나시는 분들은 당황하지 마시고 화면 상단의 산딸기 모양을 클릭하고 개발 탭에서 토니IDE에 소스를 복붙해서 실행해봅니다. (아마 잘 되실겁니다.) 토니 IDE는 기본으로 깔려있고 그냥 가벼운 비쥬얼 스튜디오라고 생각하시면됩니다.
이제 다시 실행해봅니다 !!
출력되는 "hello"는 제가 그냥 정상작동되는지를 확인하기 위해 넣은 코드입니다. 잘 작동한다면 이렇게 출력되겠죠??
20초동안 두 장만 촬영하고 프로그램을 중지 해 보겠습니다.
이제 파이어베이스 storage에 정상적으로 저장되었는지 볼까요??
이렇게 이미지 업로드 폴더가 생겼고
클릭해보면 두장의 사진이 잘 저장되어있음을 알 수 있습니다~~
아무거나 클릭해보면 사진화면이 잘 나오는걸 확인할 수 있어요.(TMI: 카메라에 비친 인공눈물 박스)
안드로이드와 연동하는 시스템을 목표로 파이어베이스를 사용하시는 분들은 위 그림 오른쪽 처럼 사진파일의 메타 데이터들도 쉽게 이용할 수 있습니다.
관련 예제를 본 것 같은데 다음에 한번 시도해 보겠습니다.
이상입니다~
'라즈베리파이' 카테고리의 다른 글
라즈베리파이 카메라로 동영상 스트리밍 하기(UV4L) (2) | 2021.04.29 |
---|---|
라즈베리파이 카메라로 동영상 스트리밍 하기(mjpg-streamer) (30) | 2021.04.14 |
라즈베리파이의 웹서버를 데스크탑에서 접근하기 (0) | 2021.04.07 |
라즈베리파이와 PC간 파일 전송을 위한 SAMBA설치 (0) | 2021.03.02 |
라즈베리파이 MariaDB설치+ 윈도우에서 DB연동하기 (2) | 2021.03.02 |