YOGYUI

힐스테이트 광교산::도어폰 카메라 - 애플 홈킷 연동 (3) 본문

홈네트워크(IoT)/힐스테이트 광교산

힐스테이트 광교산::도어폰 카메라 - 애플 홈킷 연동 (3)

요겨 2022. 7. 29. 20:00
반응형

 

5. 도어폰 RS-485 패킷 분석

DOOR RJ-45 연결부의 4,5번 라벨은 각각 'EXTDEV-1B', 'EXTDEV-1A'로, 신호를 찍어보면 시리얼 통신이 이뤄지고 있는 것을 알 수 있다

힐스테이트 광교산::도어폰 카메라 - 애플 홈킷 연동 (1)

 

힐스테이트 광교산::도어폰 카메라 - 애플 홈킷 연동 (1)

1. 시스템 분석 현관문 옆에 매립되어 있는 도어폰은 카메라와 마이크가 장착되어 있으며, 영상과 음성이 거실의 월패드로 전송된다 (초인종을 호출했을 때 방문자의 사진이 월패드에 기록된다)

yogyui.tistory.com

USB-to-RS485 컨버터를 연결해서 패킷을 살펴보자

(라즈베리파이에 연결 후, 파이썬 테스트 스크립트로 바이트스트림 수신)

import time
import datetime
from SerialComm import *

def log(message: str):
    now = datetime.datetime.now()
    h = now.hour
    m = now.minute
    s = now.second
    us = now.microsecond
    timestamp = '[%02d:%02d:%02d.%06d]' % (h, m, s, us)
    print(timestamp + ' ' + message)

class Parser:
    buffer: bytearray
    max_buffer_size: int = 200

    def __init__(self, ser: SerialComm):
        self.buffer = bytearray()
        self.serial = ser
        self.serial.sig_recv_data.connect(self.onRecvData)

    def onRecvData(self, data: bytes):
        if len(self.buffer) > self.max_buffer_size:
            self.buffer.clear()
        self.buffer.extend(data)
        self.parseBuffer()

    def parseBuffer(self):
        idx = self.buffer.find(0xF7)
        if idx > 0:
            self.buffer = self.buffer[idx:]
        if len(self.buffer) >= 3:
            packet_length = self.buffer[1]
            if len(self.buffer) >= packet_length:
                if self.buffer[packet_length - 1] == 0xEE:
                    packet = self.buffer[:packet_length]
                    packet_str = ' '.join(['%02X' % x for x in packet])
                    log(packet_str)
                    self.buffer = self.buffer[packet_length:]

if __name__ == '__main__':
    ser = SerialComm()
    parser = Parser(ser)

    def printMenu():
        if ser.isConnected():
            print('Connected ({}, {})'.format(ser.port, ser.baudrate))
            print('0: Disconnect, 1: Terminate')
        else:
            print('0: Connect, 1: Terminate')

    def loop(clear: bool = True):
        if clear:
            os.system('clear')
        printMenu()
        sysin = sys.stdin.readline()
        try:
            head = int(sysin.split('\n')[0])
        except Exception:
            loop()
            return
        
        if ser.isConnected():
            if head == 0:
                ser.disconnect()
                loop()
            elif head == 1:
                ser.release()
            else:
                loop()
        else:
            if head == 0:
                ser.connect('/dev/ttyUSB0', 9600)
                loop()
            elif head == 1:
                ser.release()
            else:
                loop()
    
    loop()

터미널로 패킷을 찍어보니...


[16:12:39.416701] F7 0B 01 19 01 40 10 00 00 B5 EE
[16:12:39.479806] F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
[16:12:39.688245] F7 0B 01 19 01 40 20 00 00 85 EE
[16:12:39.736912] F7 0C 01 19 04 40 20 00 02 02 87 EE
[16:12:39.864281] F7 0B 01 19 01 40 30 00 00 95 EE
[16:12:39.928382] F7 0B 01 19 04 40 30 00 02 92 EE
[16:12:39.960338] F7 0B 01 19 01 40 40 00 00 E5 EE
[16:12:40.008238] F7 0B 01 19 04 40 40 00 02 E2 EE
[16:12:40.055956] F7 0B 01 19 01 40 60 00 00 C5 EE
[16:12:40.103746] F7 0C 01 19 04 40 60 00 02 02 C7 EE
[16:12:40.232234] F7 0B 01 1F 01 40 10 00 00 B3 EE
[16:12:40.312336] F7 1C 01 1F 04 40 10 00 11 01 00 08 00 00 00 00 02 12 01 00 00 00 00 00 00 02 AA EE
[16:12:40.407973] F7 0B 01 1F 01 40 20 00 00 83 EE
[16:12:40.488345] F7 1C 01 1F 04 40 20 00 21 01 00 00 00 00 00 00 02 22 01 00 00 00 00 00 00 02 92 EE
[16:12:40.599996] F7 0B 01 1F 01 40 30 00 00 93 EE
[16:12:40.664482] F7 1C 01 1F 04 40 30 00 31 01 00 00 00 00 00 00 02 32 01 00 00 00 00 00 00 02 82 EE
[16:12:40.775206] F7 0B 01 1F 01 40 40 00 00 E3 EE
[16:12:40.855962] F7 1C 01 1F 04 40 40 00 41 01 00 00 00 00 00 00 02 42 01 00 00 00 00 00 00 02 F2 EE
[16:12:40.952391] F7 0B 01 1F 01 40 60 00 00 C3 EE
[16:12:41.031843] F7 1C 01 1F 04 40 60 00 61 01 00 00 00 00 00 00 02 62 01 00 00 00 00 00 00 02 D2 EE
[16:12:42.327763] F7 0B 01 19 01 40 10 00 00 B5 EE
[16:12:42.391701] F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
[16:12:42.424432] F7 0B 01 19 01 40 10 00 00 B5 EE
[16:12:42.488451] F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
[16:12:42.519975] F7 0B 01 19 01 40 10 00 00 B5 EE
[16:12:42.584643] F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
[16:12:42.616441] F7 0B 01 19 01 40 20 00 00 85 EE
[16:12:42.663472] F7 0C 01 19 04 40 20 00 02 02 87 EE
[16:12:42.696520] F7 0B 01 19 01 40 20 00 00 85 EE
[16:12:42.759948] F7 0C 01 19 04 40 20 00 02 02 87 EE
[16:12:42.775900] F7 0B 01 19 01 40 30 00 00 95 EE
[16:12:42.839554] F7 0B 01 19 04 40 30 00 02 92 EE
[16:12:42.871613] F7 0B 01 19 01 40 40 00 00 E5 EE
[16:12:42.920112] F7 0B 01 19 04 40 40 00 02 E2 EE
[16:12:42.968013] F7 0B 01 19 01 40 60 00 00 C5 EE
[16:12:43.015668] F7 0C 01 19 04 40 60 00 02 02 C7 EE
[16:12:43.047735] F7 0B 01 19 01 40 60 00 00 C5 EE
[16:12:43.111842] F7 0C 01 19 04 40 60 00 02 02 C7 EE
[16:12:43.142880] F7 0B 01 1F 01 40 10 00 00 B3 EE
[16:12:43.228635] F7 1C 01 1F 04 40 10 00 11 01 00 08 00 00 00 00 02 12 01 00 00 00 00 00 00 02 AA EE
[16:12:43.255212] F7 0B 01 1F 01 40 10 00 00 B3 EE
[16:12:43.335367] F7 1C 01 1F 04 40 10 00 11 01 00 08 00 00 00 00 02 12 01 00 00 00 00 00 00 02 AA EE
[16:12:43.367316] F7 0B 01 1F 01 40 20 00 00 83 EE
[16:12:43.447941] F7 1C 01 1F 04 40 20 00 21 01 00 00 00 00 00 00 02 22 01 00 00 00 00 00 00 02 92 EE
[16:12:43.479548] F7 0B 01 1F 01 40 20 00 00 83 EE
[16:12:43.543627] F7 1C 01 1F 04 40 20 00 21 01 00 00 00 00 00 00 02 22 01 00 00 00 00 00 00 02 92 EE
[16:12:43.575525] F7 0B 01 1F 01 40 30 00 00 93 EE
[16:12:43.655227] F7 1C 01 1F 04 40 30 00 31 01 00 00 00 00 00 00 02 32 01 00 00 00 00 00 00 02 82 EE
[16:12:43.687785] F7 0B 01 1F 01 40 30 00 00 93 EE
[16:12:43.751696] F7 1C 01 1F 04 40 30 00 31 01 00 00 00 00 00 00 02 32 01 00 00 00 00 00 00 02 82 EE
[16:12:43.783800] F7 0B 01 1F 01 40 40 00 00 E3 EE
[16:12:43.863646] F7 1C 01 1F 04 40 40 00 41 01 00 00 00 00 00 00 02 42 01 00 00 00 00 00 00 02 F2 EE
[16:12:43.896017] F7 0B 01 1F 01 40 40 00 00 E3 EE
[16:12:43.960268] F7 1C 01 1F 04 40 40 00 41 01 00 00 00 00 00 00 02 42 01 00 00 00 00 00 00 02 F2 EE
[16:12:43.992093] F7 0B 01 1F 01 40 60 00 00 C3 EE
[16:12:44.071081] F7 1C 01 1F 04 40 60 00 61 01 00 00 00 00 00 00 02 62 01 00 00 00 00 00 00 02 D2 EE
[16:12:44.103157] F7 0B 01 1F 01 40 60 00 00 C3 EE
[16:12:44.167113] F7 1C 01 1F 04 40 60 00 61 01 00 00 00 00 00 00 02 62 01 00 00 00 00 00 00 02 D2 EE
[16:12:45.239334] F7 0B 01 19 01 40 10 00 00 B5 EE
[16:12:45.303840] F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
[16:12:45.511093] F7 0B 01 19 01 40 20 00 00 85 EE
[16:12:45.559673] F7 0C 01 19 04 40 20 00 02 02 87 EE
[16:12:45.688978] F7 0B 01 19 01 40 30 00 00 95 EE
[16:12:45.735254] F7 0B 01 19 04 40 30 00 02 92 EE
[16:12:45.782665] F7 0B 01 19 01 40 40 00 00 E5 EE
[16:12:45.831473] F7 0B 01 19 04 40 40 00 02 E2 EE
[16:12:45.879235] F7 0B 01 19 01 40 60 00 00 C5 EE
[16:12:45.927119] F7 0C 01 19 04 40 60 00 02 02 C7 EE
[16:12:46.054615] F7 0B 01 1F 01 40 10 00 00 B3 EE
[16:12:46.135430] F7 1C 01 1F 04 40 10 00 11 01 00 08 00 00 00 00 02 12 01 00 00 00 00 00 00 02 AA EE
[16:12:46.230590] F7 0B 01 1F 01 40 20 00 00 83 EE
[16:12:46.310744] F7 1C 01 1F 04 40 20 00 21 01 00 00 00 00 00 00 02 22 01 00 00 00 00 00 00 02 92 EE
[16:12:46.423233] F7 0B 01 1F 01 40 30 00 00 93 EE
[16:12:46.487610] F7 1C 01 1F 04 40 30 00 31 01 00 00 00 00 00 00 02 32 01 00 00 00 00 00 00 02 82 EE
[16:12:46.598155] F7 0B 01 1F 01 40 40 00 00 E3 EE
[16:12:46.679089] F7 1C 01 1F 04 40 40 00 41 01 00 00 00 00 00 00 02 42 01 00 00 00 00 00 00 02 F2 EE
[16:12:46.775512] F7 0B 01 1F 01 40 60 00 00 C3 EE
[16:12:46.855081] F7 1C 01 1F 04 40 60 00 61 01 00 00 00 00 00 00 02 62 01 00 00 00 00 00 00 02 D2 EE
[16:12:48.150744] F7 0B 01 19 01 40 10 00 00 B5 EE
[16:12:48.214715] F7 0D 01 19 04 40 10 00 02 02 02 B4 EE
[16:12:48.422691] F7 0B 01 19 01 40 20 00 00 85 EE
[16:12:48.472259] F7 0C 01 19 04 40 20 00 02 02 87 EE
[16:12:48.598788] F7 0B 01 19 01 40 30 00 00 95 EE
[16:12:48.646339] F7 0B 01 19 04 40 30 00 02 92 EE
[16:12:48.694320] F7 0B 01 19 01 40 40 00 00 E5 EE
[16:12:48.742429] F7 0B 01 19 04 40 40 00 02 E2 EE
[16:12:48.773962] F7 0B 01 19 01 40 60 00 00 C5 EE


하...

네번째 바이트가 0x19 혹은 0x1F로, 조명/아울렛 RS-485 포트에서 후킹한 신호와 완전히 동일한 패킷인 것을 알 수 있었다

힐스테이트 광교산::조명 제어 RS-485 패킷 분석 (1)

 

힐스테이트 광교산::조명 제어 RS-485 패킷 분석 (1)

이사짐 정리도 대충 끝났겠다, 이제 본격적으로 홈네트워크 작업을 해보자! 1. 월패드 제어 통신 포트 살펴보기 며칠전에 거실 월패드를 뜯어본 뒤 대충 구조는 파악했고, 이번엔 케이블에 부착

yogyui.tistory.com

 

월패드에서 '현관문 열기'를 눌렀을 때 


F7 0E 01 1E 02 43 11 04 00 04 FF FF B6 EE

F7 0E 01 1E 02 43 11 04 00 04 FF FF B6 EE


네 번째 바이트가 0x1E인 패킷이 300ms 간격으로 두 번 연속 보이는 것도 동일했다

(어차피 이 패킷으로 도어락이 열리진 않고, I/O 제어를 통해 무선송신 모듈을 건드려줘야 정상적으로 열린다)

 

아무래도 도어폰이 현관 도어락과 연동된 모델에 한해서 해당 패킷이 문을 열어주는 기능을 하는게 아닌가 하는 뇌피셜을 가동해본다.. (실제로 이 패킷으로 제어되는 하드웨어를 본 적이 없으니 알 수가 있나 ㅠ)


어쨌든 결론...

도어폰의 RS-485 포트의 신호는 기존에 분석해서 사용하고 있던 조명/아울렛 포트의 신호와 완전히 동일하기 때문에, 다른 용도로 사용할 수는 없을 것 같다

(도어폰 상품 설명에 카메라 각도 조절이 된다길래 시리얼 통신으로 되나 싶었지... ㅠ_ㅠ)

 

괜히 시간낭비한 것 같긴 하지만, 확인하지 않고 넘어가는 것보다는 확실히 짚고 넘어가는게 속이 편하다 ^^;

 

이제 음성신호만 연동하면 도어폰 카메라 작업도 마무리할 수 있다~

 

반응형
Comments