Qt CoAP 개요
제한적 애플리케이션 프로토콜(CoAP)은 제한된 네트워크에서 제한된 장치(예: 마이크로컨트롤러) 간의 M2M 데이터 교환을 위해 특별히 설계된 IoT 프로토콜입니다.
CoAP의 상호 작용 모델은 HTTP의 클라이언트/서버 모델과 유사하지만 HTTP와 달리 UDP와 같은 데이터그램 중심의 연결 없는 전송을 사용하므로 오버헤드가 매우 낮고 주소 지정을 위해 UDP 브로드캐스트와 멀티캐스트를 사용할 수 있습니다. 동시에 가벼운 신뢰성 메커니즘과 보안을 제공합니다.
Qt CoAP CoAP의 클라이언트 측을 구현합니다. 기본적으로 전송 계층은 보안을 위해 QUdpSocket 및 QDtls 을 사용합니다. QCoapConnection 인터페이스를 구현하여 대체 전송을 사용할 수 있습니다.
메시징 모델
CoAP 메시징 모델은 엔드포인트 간의 메시지 교환을 기반으로 합니다. 클라이언트는 서버에 요청을 하고 서버는 응답을 보냅니다. 클라이언트는 리소스를 GET, PUT, POST 및 DELETE할 수 있습니다. 또한 검색 요청을 통해 서버에서 리소스를 검색하거나 멀티캐스트 검색 요청을 통해 로컬 네트워크에서 리소스를 검색할 수도 있습니다. 관찰 요청을 통해 리소스를 구독할 수도 있습니다.
전송의 신뢰성은 메시지를 확인 가능 (CON)으로 표시하여 달성할 수 있습니다. 확인 가능한 메시지는 수신자가 확인 (ACK) 메시지를 보낼 때까지 기본 시간 제한과 재전송 사이의 지수 백오프를 사용하여 재전송됩니다. 수신자가 확인 가능한 메시지를 처리할 수 없는 경우 수신자는 확인 대신 재설정 메시지(RST)로 회신합니다.
안정적인 전송이 필요하지 않은 메시지는 비확인 (NON) 메시지로 보낼 수 있습니다.
Qt CoAP API 사용
클라이언트와 CoAP 서버의 통신은 QCoapClient 클래스를 사용하여 이루어집니다. 여기에는 다양한 CoAP 요청을 보내는 방법과 전송된 요청에 대한 응답이 도착할 때 트리거되는 신호가 포함되어 있습니다. QCoapRequest 클래스는 CoAP 요청을 만드는 데 사용됩니다. 서버의 응답은 QCoapReply 객체로 반환됩니다. 예를 들어
QCoapClient *client = new QCoapClient(); connect(client, &QCoapClient::finished, this, &MyClass::onFinished); connect(client, &QCoapClient::error, this, &MyClass::onError); QCoapRequest request(QUrl("coap://127.0.0.1/test"), QCoapMessage::Confirmable); client->get(request); client->put(request, QByteArray("payload"));
지원되는 기능
리소스 검색
CoAP 검색 요청은 엔드포인트 또는 전체 네트워크에서 사용 가능한 리소스를 쿼리하는 데 사용됩니다. 이는 루프에 사람이 없는 M2M 애플리케이션에 매우 중요합니다. 예를 들어, 홈 또는 빌딩 자동화의 경우 로컬 클라이언트와 서버가 사람의 개입 없이 서로를 찾고 상호 작용할 필요가 있습니다. 리소스 검색을 통해 클라이언트는 네트워크에서 사용 가능한 엔드포인트에 대해 알아볼 수 있습니다.
Qt CoAP 단일 엔드포인트 및 멀티캐스트 그룹에 대한 검색 요청을 지원합니다. 예를 들어, 기본 리소스 검색 진입점인 /.well-known/core
에 대한 검색 요청은 다음과 같은 내용을 반환할 수 있습니다:
RES: 2.05 Content </sensors/temp>;rt="temperature-c";if="sensor";obs, </sensors/light>;rt="light-lux";if="sensor", </firmware/v2.1>;rt="firmware";sz=262144
온도 및 조명 센서용 리소스와 네트워크에서 사용 가능한 펌웨어 리소스가 있음을 나타냅니다. 응답은 CoRE 링크 형식으로 표시됩니다.
특수한 QCoapResourceDiscoveryReply 클래스는 검색 응답을 가져오는 데 사용됩니다:
// This will make a multicast discovery request to the CoAP IPv4 multicast group. QCoapResourceDiscoveryReply *discoverReply = client->discover(); connect(discoverReply, &QCoapResourceDiscoveryReply::discovered, this, &MyClass::onDiscovered);
QCoapResourceDiscoveryReply::discovered 은 네트워크에서 찾은 CoAP 리소스 목록을 반환합니다.
리소스 관찰
관찰 요청은 리소스에 대한 자동 서버 알림을 받는 데 사용됩니다. 클라이언트는 리소스에 관찰 요청을 전송하여 관찰 가능한 리소스의 관찰자가 됩니다. 예를 들어 위 예시의 온도 센서는 obs
속성을 가지고 있으므로 관찰이 가능합니다. 따라서 클라이언트는 관찰 요청을 보내 온도 업데이트를 구독할 수 있습니다.
다음 예제 코드는 Qt CoAP 를 사용하여 관찰 요청을 보내는 방법을 보여줍니다:
QCoapReply *reply = client->observe(QUrl("127.0.0.1/temp")); connect(reply, &QCoapReply::notified, this, &MyClass::onNotified);
특히 관찰 요청의 경우 QCoapReply::notified 신호를 사용하여 CoAP 서버의 알림을 처리할 수 있습니다.
블록 단위 전송
CoAP는 UDP와 같은 데이터그램 전송을 기반으로 하기 때문에 조각화 문제를 일으키지 않고 전송할 수 있는 리소스 표현의 크기에 제한이 있습니다. Qt CoAP 는 단일 CoAP 데이터그램의 페이로드에서 편안하게 전송할 수 있는 것보다 리소스 표현이 큰 상황에 대비하여 블록 단위 전송을 지원합니다.
보안
CoAP에는 다음과 같은 보안 모드가 정의되어 있습니다:
- 사전 공유 키 - 이 모드에서 클라이언트는 자신의 신원과 사전 공유 키를 서버에 전송해야 합니다.
- 원시공개 키 - 클라이언트는 인증서가 없는 비대칭 키 쌍(원시 공개 키)을 가지고 있습니다. 클라이언트는 또한 공개 키에서 계산된 ID와 통신할 수 있는 노드의 ID 목록을 가지고 있습니다. Qt CoAP 는 아직 이 모드를 구현하지 않았습니다.
- 인증서 - 클라이언트는 공통 신뢰 루트에 의해 서명된 X.509 인증서와 비대칭 키 쌍을 가지고 있습니다.
CoAP는 UDP 기반 프로토콜로 설계되었기 때문에 Qt CoAP 모듈은 UDP를 통해 데이터그램 TLS(DTLS)를 기반으로 보안을 구현합니다. 그러나 위에서 언급했듯이 다른 보안 유형으로 사용자 지정 전송을 제공할 수 있습니다.
CoAP 클라이언트를 보호하려면 클라이언트를 만들 때 지원되는 보안 모드 중 하나를 지정해야 합니다:
QCoapClient *client = new QCoapClient(this, QtCoap::PreSharedKey);
QCoapSecurityConfiguration 클래스는 보안 매개변수를 지정하는 데 사용됩니다. 예를 들어, 사전 공유 키 모드에서는 다음 예제 코드를 사용할 수 있습니다:
QCoapSecurityConfiguration config; config.setPreSharedKey("secretPSK"); config.setIdentity("Client_identity"); client->setSecurityConfiguration(config);
그리고 인증서 모드에서:
QCoapClient *client = new QCoapClient(this, QtCoap::Certificate); QList<QSslCertificate> localCertificates, caCertificates; QCoapPrivateKey key; // Initialize the key and certificates QCoapSecurityConfiguration config; config.setLocalCertificateChain(localCertificates); config.setCaCertificates(caCertificates) config.setPrivateKey(key); client->setSecurityConfiguration(config);
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.