IoT protocol CoAP 메시지 구조(Message Format) 요약 정리

 CoAP(Constrained Application Protocol)는 제한된 환경에서 M2M(Machine To Machine) 요구사항을 충족하는 웹 프로토콜이며, 이런 특성으로 인해 IoT를 위한 프로토콜로 각광받고 있다고 한다. 본 포스트에서는 이러한 CoAP의 메시지 구조에 대해 알아봤으며, 앞으로 CoAP에 관한 더 많은 포스트를 게재할 예정이다.

CoAP는 RFC 7252에 정의 되어있다.


CoAP (Constrained Application Protocol)

CoAP의 상호 작용 모델은 HTTP의 클라이언트/서버 모델과 유사하다. 

그림 1.

CoAP의 메시지는 각 EndPoint간 UDP를 통해 전송된다.

그림 2.



CoAP Message Format

그림 3. CoAP Message Format

CoAP의 메시지 형식은 위 그림과 같다. 


- Var

CoAP 버전을 의미한다. 값은 0b01이다.

- T (Type)

메시지의 형식을 나타낸다.

  • Confirmable(CON): 0 , ack를 요구하는 메시지
  • Non-confirmable(NON): 1 , ack를 요구하지 않는 메시지
  • Acknowledgement(ACK): 2 , CON 메시지에 대한 응답 메시지
  • Rest(RST): 3 , 메시지가 수신되었으나 올바르게 처리하기 위한 내용이 누락되었음을 나타내는 메시지

메시지의 타입은 아래와 같은 형태의 메시지에 사용된다. Empty 메시지는 일반적인 경우 CON형식은 사용되지 않으나, RST메시지를 유도하기 위해서만 사용된다.

그림 4.


- TKL (Token Length)

Token field의 길이 정보로 값은 0~8 bytes가 사용된다. 9~15는 추후 사용이 예약되어 있으며 현재는 사용하면 안 된다.


- Code 

총 8 bits이며, 3 bits의 class와 5bits의 details로 나눠 있다. 

class는 다음과 같다.

  • Request : 0
  • Success response : 2
  • Client error response : 4
  • Server error response : 5

0.00은 empty message를 의미한다.  상세한 내용은 다음 포스트에서 다룰 예정이다. 


- Message ID

메시지 중복 탐지 및 ACK/RST 형식 메시지를 CON/NON 형식으로 매칭하는데 사용된다. 

Message ID는 CON/NON 메시지를 보내는 쪽에서 생성되며, ACK/RST 응답 메시지를 송신할 때 수신된 Message ID를 사용해야 한다. Message ID는 EXCHANGE_LIFETIME내에서 중복되어서는 안 된다.

그림 5. CoAP 파라미터
EXCHANGE_LIFETIME 내에 동일한 Message ID를 가진 CON 메시지를 수신(전송 오류 등의 원인으로)할 수도 있다. 이 경우 Receiver는 메시의 요청이나 응답을 한 번만 처리해야한다. NON_LIFETIME내에 동일한 Message ID를 가진 중복된 NON 메시지를 수신한 경우에도 중복된 메시지를 묵살하고, 메시지의 요청이나 응답을 한 번만 처리해야한다. 


- Token

Token 필드의 길이는 TKL의 값에 의해 정해진다. Token은 request와 response를 일치시키는데 사용된다. 모든 request에는 client가 생성한 token이 있으며, 서버는 요청 결과를 응답할 때 이 token을 반드시 반향해야 한다. Token은 동시 요청을 구별하기 위한 "request ID"라고 할 수 있다.

그림 6. 즉각적인 메시지 요청/응답

또한 아래 그림과 같이 시간을 두고 요청에 대한 응답을 보내는 경우 Token 값 0x73을 이용해 request와 response를 매칭할 수 있다. 


그림 7. 시차를 둔 메시지 요청/응답

- Option

그림 8. Option format

Option Delta : 이전 Option 번화와 이번 Option 번호화의 차이를 나타낸다.

  • 0~12 - option delta를 나타낸다.
  • 13 - 8 bits extended option delta 필드가 있다는 것을 의미하며, 확장 필드에는 option delta - 13 값이 들어간다. 
  • 14 - 16 bits extended option delta 필드가 있다는 것을 의미하며, 확장 필드에는 option delta - 269 값이 들어간다.
  • 15 - payload marker용으로 예약되어 있으며, 사용해서는 안 된다. 

Option Length: Option Value의 길이를 나타낸다.

  • 0~12 - Option value 길이
  • 13 - 8 bits extended option length 필드가 있다는 것을 의미하며, 확장 필드에는 option length - 13 값이 들어간다.
  • 14 - 16 bits extended option length 필드가 있다는 것을 의미하며, 확장 필드에는 option length - 269 값이 들어간다.
  • 15 - 사용해서는 안 된다.

Option Value: 다음과 같은 option value 형식이 있다. 

  • empty: 길이가 0으로 비어 있다.
  • opaque: opaque 배열.
  • uint: 네트웍 바이트 오더로 음수가 아닌 정수 데이터.
  • string: utf-8 문자열


- 0xff (payload marker)

payload marker는 option의 끝과 payload의 시작을 의미한다. 하지만, option 뒤에 또 다른 새로운 option의 시작을 의미하기도 한다. payload marker가 없으면 payload가 없음을 의미한다. 


- Payload

 request/response에 따라 특정 데이터가 들어간다. 위 그림 6에서와 같이 요청에서는 payload에 'temperature'가 응답에서는 '22.5 C'의 데이터가 들어간다.
payload는 옵션이며 길이는 payload marker에서 UDP datagram의 끝까지의 길이를 사용하여 계산해야 한다. 




관련 포스트

IoT Protocol CoAP 메시지 요청/응답 모델 내용 정리

댓글

이 블로그의 인기 게시물

아두이노(arduino) 심박센서 (heart rate sensor) 심박수 측정 example code

쉽게 설명한 파티클 필터(particle filter) 동작 원리와 예제

간단한 cfar 알고리즘에 대해

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법

python ctypes LoadLibrary로 windows dll 로드 및 함수 호출 예제