YOGYUI

광교아이파크::Bestin 현관카메라 애플 홈킷 연동 (2) - Final 본문

홈네트워크(IoT)/광교아이파크

광교아이파크::Bestin 현관카메라 애플 홈킷 연동 (2) - Final

요겨 2022. 4. 8. 02:00
반응형

[라즈베리파이 환경]

Motherboard Raspberry Pi 4 Model B Rev 1.2
Kernel Linux 5.10.52-v7I+ (armv7I)
Operating System Raspbian GNU/Linux 10 (buster)

5. 라즈베리파이에서 영상 확인

라즈베리파이에서 간단한 영상 확인을 위해 fswebcam 패키지를 설치했다 (참고 링크)

$ sudo apt-get install fswebcam

이미지 획득 명령 실시!

$ fswebcam image.jpg

별다른 오류사항 없이 이미지가 저장되었다

EasyCap 디바이스는 /dev/video0 로 설정된 것 같다

 

$HOME 디렉터리로 가보니 image.jpg 파일이 생성된 것을 볼 수 있다

 

이미지 파일을 열어보니

오우!

현관 카메라의 영상이 제대로 찍혔다

EasyCap이 라즈베리파이에서도 별다른 드라이버 설치없이 동작하는 것을 알 수 있다

 

참고삼아 디바이스의 정보를 한번 쿼리해보자 (udevadm 명령어)

$ sudo udevadm info --query=all /dev/video0
P: /devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1/1-1.1:1.0/video4linux/video0
N: video0
L: 0
S: v4l/by-path/platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.1:1.0-video-index0
S: v4l/by-id/usb-MACROSILICON_AV_TO_USB2.0_20150130-video-index0
E: DEVPATH=/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.1/1-1.1:1.0/video4linux/video0
E: DEVNAME=/dev/video0
E: MAJOR=81
E: MINOR=8
E: SUBSYSTEM=video4linux
E: USEC_INITIALIZED=535757370098
E: ID_V4L_VERSION=2
E: ID_V4L_PRODUCT=AV TO USB2.0
E: ID_V4L_CAPABILITIES=:capture:
E: ID_VENDOR=MACROSILICON
E: ID_VENDOR_ENC=MACROSILICON
E: ID_VENDOR_ID=534d
E: ID_MODEL=AV_TO_USB2.0
E: ID_MODEL_ENC=AV\x20TO\x20USB2.0
E: ID_MODEL_ID=0021
E: ID_REVISION=0121
E: ID_SERIAL=MACROSILICON_AV_TO_USB2.0_20150130
E: ID_SERIAL_SHORT=20150130
E: ID_TYPE=video
E: ID_BUS=usb
E: ID_USB_INTERFACES=:0e0100:0e0200:010100:010200:030000:
E: ID_USB_INTERFACE_NUM=00
E: ID_USB_DRIVER=uvcvideo
E: ID_PATH=platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.1:1.0
E: ID_PATH_TAG=platform-fd500000_pcie-pci-0000_01_00_0-usb-0_1_1_1_0
E: ID_FOR_SEAT=video4linux-platform-fd500000_pcie-pci-0000_01_00_0-usb-0_1_1_1_0
E: COLORD_DEVICE=1
E: COLORD_KIND=camera
E: DEVLINKS=/dev/v4l/by-path/platform-fd500000.pcie-pci-0000:01:00.0-usb-0:1.1:1.0-video-index0 /dev/v4l/by-id/usb-MACROSILICON_AV_TO_USB2.0_20150130-video-index0
E: TAGS=:seat:uaccess:

MACROSILICON이란 중국회사에서 만든 칩셋이 내장된 것 같다 (영상 컨버터 IC에 특화된 기업인듯?)

장치명은 AV TO USB2.0이다 (상당히 직관적이다 ㅎㅎ)

VENDOR_ID=534D와  MODEL_ID=0021 값들은 나중에 udev rule에 alias(symlink) 설정하는데 유용하니 따로 기입해두자

6. ffmpeg + ffserver 환경 구축 및 스트리밍

라즈베리파이에 연결된 카메라의 영상을 실시간으로 네트워크로 스트리밍하는 방법인 일전에 다른 글에서 다룬 적이 있으니 참고

Raspberry Pi - ffmpeg + ffserver 동작환경 설정하기

 

Raspberry Pi - ffmpeg + ffserver 동작환경 설정하기

ffserver는 ffmpeg 패키지 빌드 N-89274-g6b35a83(2018-01-06) 버전부터 제외되었다 때문에 최신 버전 라즈비안에서는 ffserver를 사용할 수 없다 ffserver가 포함된 최종 commit 버전은 2ca65fc이므로 git에서..

yogyui.tistory.com

라즈베리파이로 Apple HomeKit 카메라 만들기 (Homebridge)

 

라즈베리파이로 Apple HomeKit 카메라 만들기 (Homebridge)

라즈베리파이에 장착된 카메라를 애플 홈킷의 카메라 액세서리로 등록해서 집안을 실시간으로 모니터링하는 간단한 방법을 알아보자 구현 방안을 요약하면 다음과 같다 라즈베리파이 + 카메라

yogyui.tistory.com

 

위 링크대로 ffmpeg, ffserver 환경 구축이 완료되었다면, ffserver 구동용 설정 파일을 만들어주자

$ sudo nano /etc/ffserver_bestin_door.conf

파일 내용은 다음과 같이 작성

HTTPPort 8090
HTTPBindAddress 0.0.0.0
MaxHTTPConnections 2000
maxClients 1000
MaxBandwidth 10000

<Feed feed.ffm>
  File /tmp/ff_feed_bestin_door.ffm
  FileMaxSize 200M
</Feed>

<Stream main>
  Feed feed.ffm
  Format mpjpeg
  VideoFrameRate 30
  VideoSize 480x320
  VideoBufferSize 80000
  VideoBitRate 10000
  NoAudio
</Stream>

<Stream stat.html>
  Format status
</Stream>

<Redirect index.html>
  URL http://www.ffmpeg.org/
</Redirect>

8090 포트를 통해 영상을 스트리밍하게 설정했다

※ 스트리밍 테스트를 위해 영상 사이즈는 480x320으로 설정했다 (나중에 변경 가능)

 

작성한 config 파일을 토대로 ffserver를 실행해준다

$ ffserver -f /etc/ffserver_bestin_door.conf

영상을 스트리밍할 웹서버(localhost:8090)는 준비가 되었다

 

이제 ffmpeg로 /dev/video0 디바이스로 들어오는 영상을 ffserver의 feed로 전달해주자 (mpjpeg 포맷으로 인코딩해서 넘겨주게 된다)

$ ffmpeg -i /dev/video0 -r 30 -s 480x320 http://0.0.0.0:8090/feed.ffm

 

웹브라우저(크로미움)를 열어 ffserver 주소로 접속해서 영상이 스트리밍되는지 확인해보자

7. Network 설정

일전에 Home Assistant를 구글 홈과 연동하기 위해 HTTPS 보안연결 연동을 위해 라즈베리파이에 Nginx를 구동해서 사용하고 있었기 때문에, 외부 접근을 위한 설정이 약간 난해해졌다

Bestin 홈네트워크 Flask 웹서버 - Nginx 연동

 

Bestin 홈네트워크 Flask 웹서버 - Nginx 연동

기존에 내가 구현해둔 Bestin 홈네트워크 - Homebridge 연동 코드는 Python의 Flask 패키지를 활용해 웹서버를 구동하게 된다 https://github.com/YOGYUI/HomeNetwork/tree/main/IPark-Gwanggyo GitHub - YOGYUI/..

yogyui.tistory.com

핵심은 8090 포트에서 구동중인 스트리밍서버에 HTTPS로 접근하기 위해 Nginx상에서 8091포트를 리버스 프록시로 잡아주는 것이다 (어차피 보안때문에라도 HTTPS는 구축해두는게 좋긴 하다)

7.1. Nginx conf 파일 수정

/etc/nginx/sites-available/ 경로 내에 작성해둔 .conf 파일에 다음 구문을 추가해준다

server {
    listen 8091;
    listen [::]:8091;
    server_name {공유기의 DDNS}
    
    ssl on;
    ssl_certificate {SSL 인증서 파일 경로}
    ssl_certificate_key {SSL 키 파일 경로}
    
    proxy_buffering off;
    
    location / {
        proxy_pass http://localhost.8090;
        proxy_set_header Host $host;
        proxy_redirect http:// https://;
        proxy_http_version 1.1;
    }
}

certbot을 이용한 SSL 인증서 발급 관련 내용은 링크를 참고하면 된다

 

ipTime 공유기 시스템에서 SSL 인증서 발급하기 (Let's Encrypt)

ipTime 공유기에 연결된 웹서버에 HTTPS (HTTP Secure) 연동을 위해 SSL(Secure Sockets Layer) 인증서를 발급받아보자 ※ Home Assistant와 Google Assistant 연동할 때 반드시 필요한 작업 Synology 계열 제품..

yogyui.tistory.com

 

파일 수정 완료 후 nginx를 재시작해주자

$ sudo service nginx restart

7.2. 공유기 포트포워드 설정

외부에서 접속할 때는 라즈베리파이의 8091 포트로 접근하게 되므로 해당 포트를 포트포워딩해줘야 한다

Home Assistant와 마찬가지로 외부/내부 포트 모두 8091로 뚫어주자

7.3. 방화벽 설정

마지막으로 라즈베리파이에서 8091 포트(TCP에 대해서만)에 대한 방화벽을 해제해줘야 한다

(DMZ가 설정되어 있으면 Pass해도 됨)

$ sudo ufw allow 8091/tcp

방화벽 규칙(rule)이 제대로 설정되었는지 확인해주자

$ sudo ufw status

7.4. 동작확인

외부 기기 (랩탑, 스마트폰 등)에서 공유기 DDNS의 8091포트의 ffserver 스트리밍 url로 접속하여 영상이 실시간으로 나오는지 확인하면 된다

외부 PC의 크롬 브라우저로 접속 테스트

만약 Nginx가 구동되지 않는 환경이라면, 그냥 ffserver 스트리밍 포트 (8090)에 대해서 포트포워드 및 방화벽 설정만 해준뒤 테스트하면 된다

8. Homebridge 연동

애플 홈킷 연동을 위해 Homebridge에 FFMpeg 액세서리를 하나 추가해주자

(관련 내용은 링크 참고)

 

라즈베리파이로 Apple HomeKit 카메라 만들기 (Homebridge)

라즈베리파이에 장착된 카메라를 애플 홈킷의 카메라 액세서리로 등록해서 집안을 실시간으로 모니터링하는 간단한 방법을 알아보자 구현 방안을 요약하면 다음과 같다 라즈베리파이 + 카메라

yogyui.tistory.com

※ Homebridge 액세서리는 Homebridge Camera FFmpeg를 사용했다

 

GitHub - Sunoo/homebridge-camera-ffmpeg: Homebridge Plugin Providing FFmpeg-based Camera Support

Homebridge Plugin Providing FFmpeg-based Camera Support - GitHub - Sunoo/homebridge-camera-ffmpeg: Homebridge Plugin Providing FFmpeg-based Camera Support

github.com

"platforms": [
    {
        "name": "Config",
        "port": 8581,
        "platform": "config"
    },
    {
        "platform": "Camera-ffmpeg",
        "cameras": [
            {
                "name": "doorphone",
                "manufacturer": "Bestin",
                "model": "IDC-800",
                "videoConfig": {
                    "source": "-i {공유기 DDNS}:8091/main",
                    "maxStreams": 2,
                    "maxWidth": 480,
                    "maxHeight": 320,
                    "maxFPS": 30
                }
            }
        ]
    }
]

구성 파일 수정 후 Homebridge를 재시작해서 로그 창에서 Camera-ffmpeg 액세서리가 제대로 활성화되는지 확인해준다

9. 동작 확인

애플 기기의 홈 앱에서 카메라로 영상이 들어오는지 확인해보자

 

홈 앱에 카메라 액세서리는 정상적으로 등록되었고, 스냅샷도 디스플레이되고 있다

 

카메라를 선택하면 꽉 채운 화면으로 영상을 확인할 수 있다

 

정지화면만 있으면 재미없으니 재활용 분리수거하러 갔다오는 길에 동영상 캡쳐를 해봤다 ㅎㅎ

나름 30fps로 설정해놓은 터라 응답성 자체는 나쁘지 않다

화질은 역시나 굉장히 구리지만, 카메라 가까이 얼굴을 대고 찍었을 때는 식별이 가능할 정도라서 큰 불편함은 없을 것 같다


10. 정리

정작 한건 별로 없는데 다루는 범위가 좀 넓다보니 글이 길어져버렸다

도어카메라를 연동하면서 느낀 아쉬운 점들을 기술해보면 다음과 같다

(1) 카메라 전원 공급

앞선 글에서도 언급했듯이, 카메라 전원 (DC +12V)이 상시로 인가되는게 아니라 방문자가 호출 버튼을 누르거나 혹은 집안에서 월패드로 현관 카메라 제어 기능을 활성화해야 홈네트워크 게이트웨이에서 전원을 인가하는 방식이다 

따라서 내가 한 것과 같이 상시로 전원을 인가하지 않는 이상 영상이 들어오지 않게 되는 문제가 있다

 

릴레이랑 라즈베리파이 GPIO를 이용해서 전원을 MQTT 프로토콜로 추가로 인가하는 방식을 고려해볼 수도 있는데, 어차피 그러면 사용자가 명령을 내리지 않는 이상 영상이 들어오지 않는 건 마찬가지라서 사용성이 다소 떨어진다

(2) 음성 연동

당연하게도 Composite NTSC 신호만을 따왔기 때문에 영상만 홈킷으로 받아볼 수 있다

게이트웨이 터미널 블록을 보면 'VOICE' 실크도 분명히 보이기 때문에, 이 신호를 라즈베리파이의 마이크 어댑터에 연결하면 분명히 음성도 주고 받을 수 있을 것 같긴 한데...

굳이 해야되나? 라는 생각이 들어서 깔끔하게 포기! ㅋㅋㅋ

새집으로 이사가면 본격적으로 연동해볼 생각이다 ㅎㅎ

 

(1)-(2)를 종합해보면 현관 카메라의 가장 획기적인 사용법은 아마도

  • 영상 + 음성을 연동한다
  • 외부에서 호출하면 트리거를 발생해준다 (RING 포트가 아마 그 기능을 담당할 수 있을 것 같다)
  • 트리거는 라즈베리파이의 GPIO에 입력해준다
  • 라즈베리파이가 호출 트리거를 받으면 MQTT 서버에 토픽 하나를 발행해준다
  • MQTT 서버를 구독 중인 홈브릿지가 애플 홈 앱에 notification을 발생시켜 준다 (motion detection 등으로)
  • 사용자는 월패드 뿐만 아니라 애플 모바일 기기로 어디서든지 방문자의 얼굴을 확인하고 통화할 수 있다

요정도가 아닐까 싶다...

좀 구질구질하긴 한데, 음성 연동까지 구현하면 확실하게 만들 수 있는 솔루션인 건 분명하다!

 

※ 영상만 받아볼 수 있다고 해도 나름 이리저리 사용처를 찾을 수 있다

예를 들어 영상을 NAS에 저장해서 CCTV로서 활용할 수도 있고, 월패드를 사용하기 힘든 상황 (ex: 해우소에서 근심을 털어버리고 있는 중이라던가)에서 방문객 얼굴 확인 등등...

(3) 화질

아무래도 SD급도 안되는 화질이다보니 유용하게 써먹기가 힘들다

라즈베리파이에 외부 TPU 모듈을 연결해서 object detection + face recognition 뉴럴넷을 올린 뒤에 내 얼굴을 인식하면 자동으로 문이 열리게 만드는 나름 엄청난 솔루션을 만들 수 있기를 기대했는데, 화질 자체가 구려서 잘 될지 의문이긴 하다 (사실 Yolo같은 사물 인식 모델 돌리는데는 충분한 화질이긴 하지만서도 ㅎㅎ;;)

 

정말 오랜만에 만난 컴포지트 비디오 신호를 디지털화해서 애플 홈킷에 스트리밍할 수 있는 방법을 찾아냈다는 데 의의를 두고 이만 마무리해야겠다~

끝~!


P.S.) 월패드에 다른 CCTV 영상 (ex: 지하주차장, 놀이터 등)도 제어하는 기능이 있는데, 이건 아무래도 단지의 네트워크로 전송되는 것으로 추정된다 (게이트웨이에 도어 비디오폰 말고는 다른 영상전송신호 라인을 찾을 수가 없음 ㅠ)

 

[시리즈]

광교아이파크::Bestin 현관카메라 홈킷 연동 (1)
광교아이파크::Bestin 현관카메라 홈킷 연동 (2) - Final

 

 

반응형
Comments