Onvif Event Handling은 두 가지 방식이 있다
첫 번째) Real-time Pull-Point Notification Interface
두번째) Notification Streaming Interface
세번째) Basic Notification Interface
처음 공부할 때 읽고 지금 다시보니 놓친 부분이 많이 보여서,
늦은 정리를 하려고 한다
규격은 Onvif Core와 WS-BaseNofitication, WS-Topics를 참고하였다
규격을 해석하며 정리한거라 개인 생각이 많이 들어가있음을 유의하길 바란다.
1. Event Handling이란
규격 내용을 최대한 인용하면서 정리하려고 한다.
Onvif Core 규격의 4절에 잠깐, 9절에 본격적으로 설명 되어있다
Event Handling은 Device에서 발생하는 이벤트들을 어떻게 받을거냐?에 대한 명세다
위에서 잠깐 언급한 방식으로 이벤트를 핸들링할 수 있다
4.6 Event Handling
Firewall traversal, according to WS-BaseNotification, is handled through a PullPoint notification pattern. This
pattern, however, does not allow real-time notification. Hence, this specification defines an alternative PullPoint
communication pattern and service interface. The PullPoint pattern allows a client residing behind a firewall to
receive real-time notifications while utilizing the WS-BaseNotification framework.
WS-BaseNotification 규격에서는 원래 방화벽 문제를 해결하기 위해 PullPoint 방식을 다뤘는데,
이게 실시간으로 받아오는건 아니다 보니까,
Onvif 규격에서는 실시간으로 받을 수 있는 방법을 추가한 모양이다.
아무튼, 요 Event Handling의 목적은
클라이언트가 방화벽 뒤에 있어도, Device의 이벤트들을 잘 알려주자로 생각된다
그러면 이벤트 2벤트하는데 정확히 무슨 의미일까

9. Event Handling
An event is an action or occurrence detected by a device that a client can subscribe to.
Onvif에서 말하는 이벤트는 어떤 action이나 device에 감지된 발생 정보를 뜻한다
요즘 카메라 자체에 사람 감지 이런 기능이 들어가 있기도 한데, 그런 것도 포함 가능하다
정리하자면, Device에 감지된 정보를 방화벽을 뚫고 클라이언트에게 잘 알려주자 ㅋ
이거다
2. 첫 번째) Real-Time Pull-Point Notification Interface
위에서 잠깐 언급한 Event Handling의 첫 번째 방식이다
단어 자체로만 보면 실시간으로 Pull-Point Notification(이하 알림) 인터페이스를 정의한 내용이다

이 방식은 다음과 같은 방법으로 사용할 수 있다
1) 클라이언트가 Device에게 pull pont를 요청한다
(CreatePullPointSubscriptionRequest 커맨드를 사용)
2) device는 클라이언트가 요청한 내용에 대해 응답을 보낸다
3) 요청이 수락되면 응답이 올텐데, 인스턴스화 된 pull point의 Endpoint를 포함한다
4) PullPoint 생성 후에는 Renew나 Unsubscribe 커맨드를 사용하여 상태 관리를 할 수 있다
이 방식은 클라이언트가 먼저 Device에게 요청하면,
그 때 Device가 즉각적으로 바로 응답을 보내는 방식이다.
This may cause unnecessary load by e.g. activating multiple motion detectors and similar without need.
실시간으로 이벤트를 받고 싶다면 다른 방식 쓰는걸 추천한다
3.두 번째) Notification Streaming Interface
말 그대로 Streaming 에 관련된 인터페이스다
우리가 아는 영상 스트리밍 그거 맞다
RTP 패킷들을 이벤트 전송 형태로 받을 수 있는데, 메시지 payload가 포함되는 것 같다
자세한 내용은 Onvif Media 규격을 참고하길 바란다
4. 세 번째) Basic Notification Interface
사실 얘땜에 정리하기로 마음 먹었다
기본 알림 인터페이스(?) 이 형식은 아래 3가지 용어를 알면 이해하기 쉽다
Client
NotificationConsumer interface를 구현하는 쪽
NotificationConsumer : 이벤트를 받고 싶어하는 쪽/Subscribe 요청 보내는 쪽
Event Service
NotificationProducer interface를 구현하는 쪽
NotificationProducer : Consumer로부터 subscribe 요청을 받는 쪽
Subscription Manager
BaseSubscriptionManager interface를 구현하는 쪽
(Base)SubscriptionManager : Subscription 리소스들을 관리하고 메시지로 정의
단어가 생소해서 어렵겠지만 WS-BaseNotification 규격을 읽어보면 아~ 하게 된다
그림으로 보면 아래와 같다.

Subscription 생성 과정
1) client는 이벤트 서비스를 위해 연결을 맺는다 (Subscribe 요청을 보낸다)
2) Event Service는 Subscribe 요청을 받고, 이 정보를 인스턴스화여
Subscription Manager가 기억하도록 한다
3) Subscribe 응답을 줄 때, Endpoint Address를 포함하여 준다
Subscription 종료 과정
종료는 아래 두 가지 형식으로 할 수 있다
1) Unsubscribe 메시지를 통하여 해지하는 방법
2) Client가 설정한 만료시간에 따라 자동적으로 Subscription Manager가 destroy 해주는 방법
Event 받는 방법
Event Service는 Client에게 이벤트 정보를 Notify 메시지를 통해 전달한다 (one-way방식)
Subscription을 갱신하는 과정
위에서 종료 과정 설명시 만료 시간이 있다고 언급을 했는데,
그렇다면 계속 Subscription을 유지하고 싶다면 갱신도 해줘야 한다는 거다
The SubscriptionManager is automatically destroyed when the termination time is reached. RenewRequests can be initiated by the client in order to postpone the termination time. The client can also explicitly terminate the SubscriptionManager by sending an UnsubscribeRequest.
갱신은 Renew 요청을 통해 할 수 있당
5. Notification Information
그럼 이렇게 Event 정보를 받으면 여기엔 무슨 정보가 있는지가 슬슬 궁금해진다
언제 발생한건지?(when?)
누가 이벤트를 만들었는지? (who?)
무슨 이벤트인지? (what?)
등등...
이 정보들은 이벤트 발생 시 Event Serivce가 보내준 Notify 메시지에 다 담겨있다.

"when"
이건 아래에 첨부한 그림에서 볼 수 있겠지만, time 을 포함하는 element에 포함된다
UTC 시간 방식을 사용하는듯
"who"
who는 두 부분으로 나뉜다
1) ProducerReference element에 포함
: WS-Endpoint에는 device나 service에 대한 내용이 있는데,
이 element를 통해 누가 보낸건지 명시를 해야한다고 한다
2) Souce element에 포함
: WS-Endpoint 내에 포함되는 것은 같은데, Source라는 element로 포함하여
한개 또는 여러개로 표기할 수 있다고 한다
"what"
얘는 아래 두 가지 element가 사용된다 (같이)
1) Topic element
: Topic element는 Event의 카테고리 같은 걸 표기할 수 있다
2) Data element
: Data element는 Event의 상세한 내용을 설명 할 수 있다
• UtcTime represents the time when the event described by the message occurred.
• Topic and Source items uniquely identify the source of an event
• Data contains one or more values describing the event
• An optional Key item may extend the Source identifier
인용 문구를 참고하길 바란다.

이건 예시 그림인데,
Topic을 보아하니 PTZ 이벤트를 클라이언트가 Subscribe를 한 모양이다
해당 이벤트는 PTZ Preset에 끝까지 도달해서 온 알림일 것이고,
발생 시간은 UtcTime 파라미터에 포함된다
또한 Source와 Data Element로 상세한 항목을 확인 가능한 것까지 볼 수 있다
정말 오랜만에 쓴 글인데... 요즘 일이 너무 바빠서
틈틈이 작성하다보니 글의 흐름이 자꾸 끊긴다ㅜㅜ
Onvif 규격을 처음부터 끝까지 다 읽어보고 싶었는데, 올해안에 할 수 있을지 의문이다