본문으로 건너뛰기

홈채널 응용

웹앱으로 사무실이나 집에 있는 장치들을 제어하는 상황을 가정할 경우, 웹앱과 특정 장치를 포함하여 홈채널에 연결된 모든 장치들이 서로의 정보를 공유하는 방법의 구현이 필요합니다. IO시그널이 바로 이런 기능을 편리하게 구현하도록 돕는 시스템입니다. 하지만 구현 방식이 정해진건 아니고 여러가지 상황에 따라 다양한 패턴을 적용 할 수 있습니다. 이때 참고 할 수 있는 방법론 중 하나가 #searh 와 #notify 시그널링 모델입니다.

찾기와 알림(#search and #notify) 모델

가령 원격 제어가 가능한 조명장치와 이를 제어할 수 있는 웹앱(Web App)을 가정하여 구체적인 구현 규칙을 정의해 보겠습니다. 참고로 공개된 아두이노 IOSignal 라이브러리에 포함된 예제가 홈채널 #search 와 #notify 를 활용한 실제 예제입니다. 해당 예제코드를 자신의 아두이노 보드에 업로딩 한 뒤 호환되는 웹앱을 통해 제어가 가능합니다. 예제를 통한 웹앱 데모체험은 별도의 문서로 소개드리겠습니다. 본 글을 참고하시면 예제 소스를 이해하는데 도움이 될 수 있습니다.

1. 조명 장치(아두이노)의 시그널링 구현

장치는 처음 서버 접속시 홈채널을 통해 자신의 CID를 알리고, 별도 요청이 있을때마다 CID를 알립니다.

  1. 서버 연결후 통신준비가 되면 => “#search” (토픽이 search 이고 채널이 생략된 홈채널)을 구독합니다.
  2. 서버 연결후 통신준비가 되면 => 홈채널 “#notify” 로 자신의 CID를 전송합니다.
  3. #search 채널로부터 시그널을 수신하면 => 자신의 CID를 “#notify” 채널로 전송합니다.

2. 웹앱(웹브라우저)의 시그널링 구현

웹앱은 서버 접속시 CID 찾기를 뜻하는 #search 시그널을 보내고, #notify채널을 구독하여 CID를 수신합니다.

  1. 서버 연결후 통신준비가 되면 => “#notify” 채널을 구독합니다. CID를 수신하기 위해서입니다.
  2. 서버 연결후 통신준비가 되면 => “#search” 채널에 시그널을 보냅니다.
  3. “#notify”채널로부터 시그널이 수신되면 => CID 정보로 장치 목록을 생성합니다.

위의 과정을 통해, 웹앱은 홈채널에 새로 연결되거나 이미 연결되어있는 장치들의 CID 목록을 수신할 수 있습니다. CID같은 기본정보 들은 공용 채널을 이용한 멀티캐스트 시그널을 통해 다수의 장치들이 동시에 수신 하는것이 효과적입니다. 하지만, 이후에 특정 장치로 부터 세부 정보를 수신하거나 제어신호를 보낼 경우엔 멀티캐스트 시그널보다는 1:1 통신이 효과적입니다. 이때문에 장치와의 소통용 CID를 획득한 이후에는 유니캐스트(1:1) 시그널로 소통하는 것이 효과적입니다. 그러나 어떤 특정 장치 정보가 다수의 장치에게 동시에 알려지는게 좋은 경우도 있습니다. 이럴때 사용하는것이 CID구독 발행입니다. 참고로 채널 구독과 CID구독은 둘다 멀티캐스트입니다. CID구독을 별도로 사용하는 이유는 채널구독과 달리 CID구독은 해당 장치만 독점적으로 발행이 가능한 점과 서버에서 상태관리 기능을 제공하기 때문입니다.

3. 웹앱에서 특정 장치간의 UI획득

장치를 제어하기 위해선 장치가 어떤 제어를 허용하는지 웹앱에서 알아야합니다. 가령 전등을 “on” , “off”, “toggle” 해주는 3개의 명령으로 작동되는 장치인 경우, 웹앱에서 이 정보를 먼저 알아야 할 것 입니다. 일단 이런 제어용 정보를 통칭하여 UI 라고 부르겠습니다. UI정보는 웹앱 내부에 내장 하거나, 서버로 부터 수신하거나, 장치로 부터 수신할 수 도 있습니다. 여기서는 장치에 구현된 간단한 UI를 정보를 웹앱에서 수신하여 처리하는 경우를 가정해 보겠습니다. 웹앱이 장치 CID를 획득한 뒤 아래의 두가지 방식으로 해당 장치로 부터 UI정보를 획득할 수 있습니다. 하나는 1:1 시그널로 주고 받는방법[A]과 나머지는 CID구독 발행[B]을 사용하는 방식입니다.

  • A. 웹앱과 장치 모두 유니캐스트 사용시
    • 웹앱이 자신의 CID가 메시지(payload)이고 태그가 “장치CID@ui” 인 유니캐스트 시그널을 전송합니다.
    • 장치측 데이타 핸들러에 태그가 “@ui”인 시그널이 도착합니다. 페이로드에 포함된 웹CID를 보관합니다.
    • 위에서 수신된 웹앱CID 로 ui정보를 페이로드로 포함하여 태그가 “웹앱CID@ui” 인 유니캐스트 시그널을 보냅니다.
    • 웹앱은 “@ui” 태그로 도착한 시그널의 페이로드에서 ui정보를 얻습니다.
  • B. CID구독 및 발행으로 알리는 방법
    • 웹앱은 “장치CID@$ui”태그로 구독합니다.
    • 장치는 준비가 되면 CID발행으로 자신의 UI정보를 발행합니다.
    • 리테인 사용시 CID발행 태그는 “@$ui”입니다.
    • 기존 및 이후 해당 CID구독자 모두에게 최신 UI 정보가 전달됩니다.

4. 특정 장치 상태정보의 공유

위에서는 매우 단순한 UI정보를 수신했습니다. 이후 웹앱에서 “on”,”off”,”toggle”같은 제어명령을 호출할 수 있고 장치의 내부 상태가 변경되게됩니다. 그리고 대부분의 경우 이 상태정보는 웹앱과 공유되어야합니다. 문제는 대부분의 경우 하나가 아닌 다수의 장치나 다수의 웹앱 모두가 이 정보를 공유해야 한다는 점입니다. 이때 유용한 시그널링 방식이 이미 소개한 CID구독 발행입니다. 해당 CID를 구독한 장치는 정확히 해당 장치가 보낸 시그널을 구분할 수 있게되고, 다수의 장치가 동시에 상태정보를 공유할 수 있게됩니다. 즉, CID구독 발행은 채널구독의 멀티캐스팅 효과와 CID의 독점성이 합쳐진 방식으로 볼 수 있습니다.

  • 장치는 자신의 상태변경시마다 CID발행 시그널을 보냅니다.
    • 태그가 “@$state”인 시그널로 상태정보를 CID발행 합니다. (“$”를 포함하여 리테인기능 적용시)
  • 특정 장치의 상태 정보를 공유할 장치들은 CID구독으로 수신합니다.
    • “장치CID@$state” 태그로 CID구독을 합니다.
    • 핸들러 태그가 “장치CID@$state” 인 경우 페이로드로 포함된 ui정보를 사용합니다.

5. 서버의 상태정보 공유기능

위에서 사용된 태그 내부의 “ui” 같은 토픽 이름은 개발자가 임의로 선택할 수 있습니다. 하지만 CID구독 및 CID발행 태그의 토픽이 예약어 “state” 인 경우 (“@state” 과 “@$state” ) 서버에서 몇가지 자동화 기능을 제공합니다. 가령 해당 CID의 접속이 끊긴 경우 해당 구독자들에게 해당 장치를 대신하여 페이로드가 “close” 인 시그널을 보내줍니다.

본 글에서 소개된 내용은 아두이노 공개 라이브러리 예제 코드로 확인 가능하므로 해당 소스를 참고하시기 바랍니다.

6. 아두이노 예제로 웹앱 제어 체험하기 요약

  • 아두이노 라이브러리 매니저에서 IOSignal을 검색하여 IO시그널 라이브러리를 설치합니다. ( 설치 중 Boho, Crypto 등 도 함께 설치할지 물을때 yes로 선택해 주셔야합니다.)
  • 일부 예제에 사용되는 외부 라이브러리(IR Remote 등)도 함께 설치해주셔야 합니다.
  • 보유중인 아두이노 보드에 예제 소스를 업로딩합니다.
    • 예제마다 별도의 부품(버튼, IR수신모듈 등,LED, 릴레이)이 필요한경우가 있습니다.
  • 동일한 공유기에 연결된 웹브라우저로 https://remocon.kr (리모컨 앱)에 접속합니다.
  • 웹앱은 모던 웹브라우저 사용이 가능한 PC, 노트북, 스마트폰, 테블릿 모두에서 실행 가능합니다.

아두이노 예제소스 및 웹앱을 통한 제어 체험 방법은 별도로 소개드리겠습니다.