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 메시지 요청/응답 모델 내용 정리

댓글

이 블로그의 인기 게시물

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

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

간단한 cfar 알고리즘에 대해

base64 인코딩 디코딩 예제 c 소스

바로 프로젝트 적용 가능한 FIR Filter (low/high/band pass filter )를 c나 python으로 만들기