요 근래에 서버/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 = (640480)
    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: 카메라에 비친 인공눈물 박스)

 

 

안드로이드와 연동하는 시스템을 목표로 파이어베이스를 사용하시는 분들은 위 그림 오른쪽 처럼 사진파일의 메타 데이터들도 쉽게 이용할 수 있습니다.

관련 예제를 본 것 같은데 다음에 한번 시도해 보겠습니다.

 

이상입니다~

 

+ Recent posts