CoAP(Constrained Application Protocol)은 자원 제약 IoT 디바이스를 위한 RESTful 경량 프로토콜이다. RFC 7252로 표준화됐으며 HTTP와 유사하지만 UDP 기반으로 훨씬 가볍다.
CoAP vs HTTP vs MQTT 비교
| 항목 | CoAP | HTTP | MQTT |
|---|
| 전송 | UDP | TCP | TCP |
| 헤더 크기 | 4바이트 | 수십~수백 바이트 | 2바이트 |
| 모델 | 요청-응답 (REST) | 요청-응답 | 발행-구독 |
| 멀티캐스트 | 지원 | 미지원 | 미지원 |
| 관찰 (구독) | 지원 | 미지원 | 기본 기능 |
| 보안 | DTLS | TLS | TLS |
CoAP 메시지 구조
CoAP 헤더 (4바이트):
┌──┬────┬────┬──────────────────┐
│Ver│Type│TKL │ Code (8bit) │
│2b │2b │4b │ Class.Detail │
├───┴────┴────┴──────────────────┤
│ Message ID (16bit) │
├────────────────────────────────┤
│ Token (0~8 bytes) │
├────────────────────────────────┤
│ Options (TLV) │
├────────────────────────────────┤
│ 0xFF │ Payload │
└─────────┴──────────────────────┘
Type: CON(확인), NON(비확인), ACK(응답), RST(리셋)
Code: 0.00=EMPTY, 0.01=GET, 0.02=POST, 2.05=Content
Python CoAP 예시 (aiocoap)
python
import asyncio
import aiocoap
async def coap_client():
protocol = await aiocoap.Context.create_client_context()
# GET 요청
request = aiocoap.Message(code=aiocoap.GET,
uri='coap://sensor.local/temperature')
response = await protocol.request(request).response
print(f"온도: {response.payload.decode()}")
# PUT으로 설정 변경
payload = b'{"threshold": 30}'
request = aiocoap.Message(code=aiocoap.PUT,
payload=payload,
uri='coap://sensor.local/config')
response = await protocol.request(request).response
# Observe (지속적 모니터링)
obs_request = aiocoap.Message(code=aiocoap.GET,
uri='coap://sensor.local/temperature',
observe=0)
obs = protocol.request(obs_request)
async for response in obs.observation:
print(f"실시간 온도: {response.payload.decode()}")
asyncio.run(coap_client())
CoAP 리소스 디렉토리
CoAP 멀티캐스트 디스커버리:
GET coap://224.0.1.187/.well-known/core
응답 예시 (RFC 6690 Link Format):
</sensors/temp>;rt="temperature-c";if="sensor",
</actuators/fan>;rt="fan-speed";if="actuator"
관련 문서