개요

CoAP(Constrained Application Protocol)은 센서 네트워크 프로토콜 형식으로 디자인 되었으며 현재 RFC에 등록되어 있다. 주로 IoT(Internet of Thing) 시대의 네트워크 프로토콜로 인식되며 분류된다.

  • 저전력 지향 프로토콜
  • 주로 센서 데이터 전달 목적
  • 비동기적인 요청/응답 디자인 구조

CoAP 규격

CoAP 메시지는 위 그림과 같이 간단한 바이너리 포맷으로 인코딩 된다. 메시지는 4바이트 고정 헤더를 포함한다. 이어서 0에서 8바이트 길이의 토큰이 위치한다. 그 다음으로는 옵션이 온다. 페이로드가 있는 경우, 그 다음부터 데이터그램 끝까지 배치된다.

필드 비트 설명
v 2 버전을 의미. 현재 버전은 1로 이진수 01이어야 함
T 2 메시지 타입을 의미. 0 : 확인형, 1 : 비확인형, 2 : 승인, 3 : 리셋
TKL 토큰 필드의 길이를 나타냄. 단위는 바이트이며 0 ~ 8 까지의 값을 사용할 수 있음
Code 8 3비트는 클래스, 5비트는 자세한 내용을 의미.
Message ID 메시지 ID는 중복 확인 및 확인성/비확인성 메시지에 대한 짝으로서 승인/리셋 메시지에 사용
Token TKL에 따라 메시지 헤더 다음에 Token 값이 존재
Options Token에 이어서 옵션들이 올 수 있는데, 메시지 끝에 도달하였거나, 페이로드 마커로 더 이상 옵션이 없음을 알 수 있음
Payload Marker 페이로드 마커는 0xFF이며, 이후 페이로드는 데이터그램의 끝까지 위치

CoRE Link Format

IETF CoRE 워킹그룹에서는 RFC-6690, Constrained RESTful Environments(CoRE) Link Format 표준을 만들었다. Link Format 표준은 M2M 노드가 다른 노드를 찾거나 연계 동작을 할 수 있도록, 노드가 가지고 있는 자원이나 속성을 제공하는 포멧을 정의한다. 이는 기존의 HTTP 웹의 Web Linking 표준을 M2M 환경에 맞게 확장한 것이다. 링크들은 HTTP Link 헤더 필드 대신에 메시지 페이로드로서 전달되며, 리소스를 탐색할 수 있는 디폴트 인터페이스인 “./well-known/core”가 정의되었다.

Attribute

CoRE Link Format의 Attribute들은 RFC-5988을 기반하여 몇가지 속성을 더 추가하였다.

속성 설명
rt Resource Type
if Interface Description
sz Maximum Size Estimate
ct Content Type

Content Type

CoAP에서 Content Type은 payload로 보내지는 데이터의 타입을 명시한다. 해당 타입은 기존 HTTP 프로토콜에서 사용하던 Internet media types와 동일하다.

Internet media type Identifier
text/plain (UTF-8) 0
text/xml (UTF-8) 1
text/csv (UTF-8) 2
text/html (UTF-8) 3
image/gif 21
image/jpeg 22
image/png 23
image/tiff 24
audio/raw 25
video/raw 26
application/link-format [I-D.ietf-core-link-format] 40
application/xml 41
application/octet-stream 42
application/rdf+xml 43
application/soap+xml 44
application/atom+xml 45
application/xmpp+xml 46
application/exi 47
application/x-bxml 48
application/fastinfoset 49
application/soap+fastinfoset 50
application/json 51

Well-Known Interface

CoRE에서의 자원 검색은 자원들의 연결 리스트를 반환하는 well-known URI를 통해 가능하다. GET /.well-known/core를 수행하면 서버에서 제공 가능한 링크의 집합을 반환한다. 이 링크는 서버가 가지고 있는 자원들 뿐만 아니라 연결된 다른 서버가 가지고 있는 자원들도 포함될 수 있다.

libcoap을 이용한 테스트

C 언어로 제작된 libcoap을 이용하여 실제 coap 프로토콜을 이용한 데이터 전송 테스트를 해본다.

libcoap 다운로드

http://sourceforge.net/projects/libcoap/

본 문서가 작성될 때엔 libcoap-4.1.1 버전을 사용하였다.

$ wget http://downloads.sourceforge.net/project/libcoap/coap-18/libcoap-4.1.1.tar.gz

libcoap 컴파일

$ tar xzf libcoap-4.1.1.tar.gz 
$ cd libcoap-4.1.1 
$ ./configure 
$ make 

libcoap 예제 테스트

libcoap을 컴파일하게되면 examples 디렉토리에 coap-server와 coap-client 실행파일이 생성된다. 간단히 로컬에서 테스트 해본다.

$ ./coap-server &
$ ./coap-client -m get coap://127.0.0.1/.well-known/core

위와 같이 실행하면 다음과 같은 결과가 출력된다.

v:1 t:0 tkl:0 c:1 id:33442
</>;title="General Info";ct=0,</time>;if="clock";rt="Ticks";title="Internal Clock";ct=0;obs,</async>;ct=0

참고