기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS IoT Core MQTT 메시지 게시/구독
AWS IoT Core MQTT 메시징 IPC 서비스를 사용하면와 MQTT 메시지를 주고 받을 수 있습니다 AWS IoT Core. 구성 요소는에 메시지를 게시 AWS IoT Core 하고 주제를 구독하여 다른 소스의 MQTT 메시지에 대해 조치를 취할 수 있습니다. MQTT AWS IoT Core 구현에 대한 자세한 내용은 AWS IoT Core 개발자 안내서의 MQTT를 참조하세요.
참고
이 MQTT 메시징 IPC 서비스를 사용하면와 메시지를 교환할 수 있습니다 AWS IoT Core. 구성 요소 간에 메시지를 교환하는 방법에 대한 자세한 내용은 로컬 메시지 게시/구독 섹션을 참조하세요.
최소 SDK 버전
다음 표에는 MQTT 메시지를 게시하고 구독하는 데 사용해야 AWS IoT Device SDK 하는의 최소 버전이 나열되어 있습니다 AWS IoT Core.
| SDK | 최소 버전 |
|---|---|
|
v1.2.10 |
|
|
v1.5.3 |
|
|
v1.17.0 |
|
|
v1.12.0 |
권한 부여
사용자 지정 구성 요소에서 AWS IoT Core MQTT 메시징을 사용하려면 구성 요소가 주제에 대한 메시지를 보내고 받을 수 있도록 허용하는 권한 부여 정책을 정의해야 합니다. 권한 부여 정책 정의에 대한 자세한 내용은 구성 요소에 IPC 작업을 수행할 수 있는 권한 부여 섹션을 참조하세요.
AWS IoT Core MQTT 메시징에 대한 권한 부여 정책에는 다음과 같은 속성이 있습니다.
IPC 서비스 식별자: aws.greengrass.ipc.mqttproxy
| 연산 | 설명 | 리소스 |
|---|---|---|
|
|
구성 요소가 지정한 MQTT 주제에 대해 AWS IoT Core 에 메시지를 게시하도록 허용합니다. |
모든 주제에 대한 액세스를 허용하는 주제 문자열( |
|
|
구성 요소가 지정한 주제에 AWS IoT Core 대해의 메시지를 구독하도록 허용합니다. |
모든 주제에 대한 액세스를 허용하는 주제 문자열( |
|
|
구성 요소가 지정한 주제에 대한 AWS IoT Core MQTT 메시지를 게시하고 구독하도록 허용합니다. |
모든 주제에 대한 액세스를 허용하는 주제 문자열( |
MQTT 권한 부여 정책의 AWS IoT Core MQTT 와일드카드
MQTT IPC 권한 부여 정책에서 AWS IoT Core MQTT 와일드카드를 사용할 수 있습니다. 구성 요소는 권한 부여 정책에서 허용하는 주제 필터와 일치하는 주제를 게시하고 구독할 수 있습니다. 예를 들어 구성 요소의 권한 부여 정책에서 test/topic/#에 대한 액세스 권한을 부여하는 경우 구성 요소는 test/topic/#을 구독할 수 있으며 test/topic/filter를 게시하고 구독할 수 있습니다.
AWS IoT Core MQTT 권한 부여 정책의 레시피 변수
Greengrass nucleus의 v2.6.0 이상을 사용하는 경우 권한 부여 정책에서 {iot:thingName} 레시피 변수를 사용할 수 있습니다. 이 기능을 사용하면 코어 디바이스 그룹에 대해 단일 권한 부여 정책을 구성할 수 있고, 이 경우 각 코어 디바이스는 자체 이름이 포함된 주제에만 액세스할 수 있습니다. 예를 들어 다음 주제 리소스에 대한 구성 요소 액세스를 허용할 수 있습니다.
devices/{iot:thingName}/messages
자세한 내용은 레시피 변수 및 병합 업데이트에서 레시피 변수 사용을(를) 참조하세요.
권한 부여 정책 예제
다음 권한 부여 정책 예제를 참조하면 구성 요소의 권한 부여 정책을 구성하는 데 도움이 됩니다.
예제한 없는 액세스를 사용하는 권한 부여 정책 예제
다음 권한 부여 정책 예제에서는 구성 요소가 모든 주제를 게시하고 구독할 수 있도록 허용합니다.
예제한된 액세스를 사용하는 권한 부여 정책 예제
다음 권한 부여 정책 예제에서는 구성 요소가 factory/1/events 및 factory/1/actions라는 두 가지 주제를 게시하고 구독할 수 있도록 허용합니다.
예코어 디바이스 그룹에 대한 권한 부여 정책 예제
중요
이 예제에서는 Greengrass nucleus 구성 요소의 v2.6.0 이상에서 사용할 수 있는 기능을 사용합니다. Greengrass nucleus v2.6.0에서는 구성 요소 구성에서 {iot:thingName}과 같은 대부분의 레시피 변수에 대한 지원을 추가합니다.
다음 권한 부여 정책 예제에서는 구성 요소가 구성 요소를 실행하는 코어 디바이스의 이름이 포함된 주제를 게시하고 구독할 수 있도록 허용합니다.
PublishToIoTCore
주제의 AWS IoT Core 에 MQTT 메시지를 게시합니다.
MQTT 메시지를에 게시할 때 초당 100개의 트랜잭션 할당 AWS IoT Core량이 있습니다. 이 할당량을 초과하면 메시지가 Greengrass 디바이스에서 처리를 위해 대기열에 대기됩니다. 또한 초당 512Kb의 데이터 할당량과 초당 20,000개의 게시(일부에서는 2,000개)의 계정 전체 할당량도 있습니다 AWS 리전. AWS IoT Core에서 MQTT 메시지 브로커 한도에 대한 자세한 내용은 AWS IoT Core 메시지 브로커와 프로토콜 한도 및 할당량을 참조하세요.
이러한 할당량을 초과하면 Greengrass 디바이스가 메시지 게시를 제한합니다 AWS IoT Core. 메시지는 메모리의 스풀러에 저장됩니다. 기본적으로 스풀러에 할당된 메모리는 2.5Mb입니다. 스풀러가 채워지면 새 메시지가 거부됩니다. 스풀러의 크기를 늘릴 수 있습니다. 자세한 내용은 Greengrass nucleus 설명서의 구성을(를) 참조하세요. 스풀러가 채워지고 할당된 메모리를 늘려야 하는 상황을 방지하려면 게시 요청을 초당 100개 이하의 요청으로 제한합니다.
애플리케이션에서 메시지를 더 높은 속도로 보내거나 더 큰 메시지를 보내야 하는 경우 스트림 관리자를 사용하여 Kinesis Data Streams로 메시지를 보내는 것이 좋습니다. 스트림 관리자 구성 요소는 AWS 클라우드로 대용량 데이터를 전송하기 위한 것입니다. 자세한 내용은 Greengrass 코어 디바이스에서 데이터 스트림 관리 단원을 참조하십시오.
요청
이 작업의 요청에서는 다음 파라미터를 사용합니다.
topicName(Python:topic_name)-
메시지를 게시할 주제입니다.
qos-
사용할 MQTT QoS입니다. 이 열거형
QOS의 값은 다음과 같습니다.-
AT_MOST_ONCE– QoS 0. MQTT 메시지가 최대 한 번 전송됩니다. -
AT_LEAST_ONCE– QoS 1. MQTT 메시지가 한 번 이상 전송됩니다.
-
payload-
(선택 사항) Blob인 메시지 페이로드입니다.
MQTT 5를 사용할 때 Greengrass nucleus의 v2.10.0 이상에서는 다음 기능을 사용할 수 있습니다. MQTT 3.1.1을 사용하는 경우 이러한 기능은 무시됩니다. 다음 표에는 이러한 기능에 액세스하는 데 사용해야 하는 AWS IoT 디바이스 SDK의 최소 버전이 나열되어 있습니다.
| SDK | 최소 버전 |
|---|---|
| AWS IoT Device SDK for Python |
v1.15.0 |
| AWS IoT Device SDK for Java |
v1.13.0 |
| AWS IoT Device SDK for C++ |
v1.24.0 |
| AWS IoT Device SDK for JavaScript |
v1.13.0 |
payloadFormat-
(선택 사항) 메시지 페이로드의 형식입니다.
payloadFormat을 설정하지 않으면 유형은BYTES인 것으로 가정합니다. 이 열거형의 값은 다음과 같습니다.-
BYTES– 페이로드의 콘텐츠는 이진 bolb입니다. -
UTF8- 페이로드의 콘텐츠는 UTF8 문자열입니다.
-
retain-
(선택 사항) 게시할 때 MQTT 유지 옵션을
true로 설정할지 여부를 나타냅니다. userProperties-
(선택 사항) 전송할 애플리케이션별
UserProperty객체의 목록입니다.UserProperty객체는 다음과 같이 정의됩니다.UserProperty: key: string value: string messageExpiryIntervalSeconds-
(선택 사항) 메시지가 만료되고 서버에 의해 삭제되기 전까지의 시간(초)입니다. 이 값을 설정하지 않으면 메시지가 만료되지 않습니다.
correlationData-
(선택 사항) 요청을 응답과 연결하는 데 사용할 수 있는 요청에 추가된 정보입니다.
responseTopic-
(선택 사항) 응답 메시지에 사용해야 하는 주제입니다.
contentType-
(선택 사항) 메시지의 콘텐츠 유형에 대한 애플리케이션별 식별자입니다.
응답
이 작업의 응답에는 어떠한 정보도 제공하지 않습니다.
예제
다음 예제에서는 사용자 지정 구성 요소 코드에서 이 작업을 직접 호출하는 방법을 보여줍니다.
SubscribeToIoTCore
주제 또는 주제 필터 AWS IoT Core 에서의 MQTT 메시지를 구독합니다. AWS IoT Greengrass 코어 소프트웨어는 구성 요소가 수명 주기 종료에 도달하면 구독을 제거합니다.
이 작업은 이벤트 메시지 스트림을 구독하는 구독 작업입니다. 이 작업을 사용하려면 이벤트 메시지, 오류 및 스트림 종료를 처리하는 함수를 사용하여 스트림 응답 핸들러를 정의합니다. 자세한 내용은 IPC 이벤트 스트림 구독 단원을 참조하십시오.
이벤트 메시지 유형: IoTCoreMessage
요청
이 작업의 요청에서는 다음 파라미터를 사용합니다.
topicName(Python:topic_name)-
구독할 주제입니다. MQTT 주제 와일드카드(
#및+)를 사용하여 여러 주제를 구독할 수 있습니다. qos-
사용할 MQTT QoS입니다. 이 열거형
QOS의 값은 다음과 같습니다.-
AT_MOST_ONCE– QoS 0. MQTT 메시지가 최대 한 번 전송됩니다. -
AT_LEAST_ONCE– QoS 1. MQTT 메시지가 한 번 이상 전송됩니다.
-
응답
이 작업의 응답에는 다음 정보가 포함됩니다.
messages-
MQTT 메시지의 스트림입니다. 이 객체
IoTCoreMessage에는 다음 정보가 포함됩니다.message-
MQTT 메시지입니다. 이 객체
MQTTMessage에는 다음 정보가 포함됩니다.topicName(Python:topic_name)-
메시지가 게시된 주제입니다.
payload-
(선택 사항) Blob인 메시지 페이로드입니다.
MQTT 5를 사용할 때 Greengrass nucleus의 v2.10.0 이상에서는 다음 기능을 사용할 수 있습니다. MQTT 3.1.1을 사용하는 경우 이러한 기능은 무시됩니다. 다음 표에는 이러한 기능에 액세스하는 데 사용해야 하는 AWS IoT 디바이스 SDK의 최소 버전이 나열되어 있습니다.
SDK 최소 버전 AWS IoT Device SDK for Python v2 v1.15.0 AWS IoT Device SDK for Java v2 v1.13.0 AWS IoT Device SDK for C++ v2 v1.24.0 AWS IoT Device SDK for JavaScript v2 v1.13.0 payloadFormat-
(선택 사항) 메시지 페이로드의 형식입니다.
payloadFormat을 설정하지 않으면 유형은BYTES인 것으로 가정합니다. 이 열거형의 값은 다음과 같습니다.-
BYTES– 페이로드의 콘텐츠는 이진 bolb입니다. -
UTF8- 페이로드의 콘텐츠는 UTF8 문자열입니다.
-
retain-
(선택 사항) 게시할 때 MQTT 유지 옵션을
true로 설정할지 여부를 나타냅니다. userProperties-
(선택 사항) 전송할 애플리케이션별
UserProperty객체의 목록입니다.UserProperty객체는 다음과 같이 정의됩니다.UserProperty: key: string value: string messageExpiryIntervalSeconds-
(선택 사항) 메시지가 만료되고 서버에 의해 삭제되기 전까지의 시간(초)입니다. 이 값을 설정하지 않으면 메시지가 만료되지 않습니다.
correlationData-
(선택 사항) 요청을 응답과 연결하는 데 사용할 수 있는 요청에 추가된 정보입니다.
responseTopic-
(선택 사항) 응답 메시지에 사용해야 하는 주제입니다.
contentType-
(선택 사항) 메시지의 콘텐츠 유형에 대한 애플리케이션별 식별자입니다.
예제
다음 예제에서는 사용자 지정 구성 요소 코드에서 이 작업을 직접 호출하는 방법을 보여줍니다.
예제
다음 예제를 사용하여 구성 요소에서 AWS IoT Core MQTT IPC 서비스를 사용하는 방법을 알아봅니다.
다음 예제 레시피에서는 구성 요소가 모든 주제에 게시할 수 있도록 허용합니다.
다음 예제 C++ 애플리케이션은 AWS IoT Core MQTT IPC 서비스를 사용하여 메시지를 게시하는 방법을 보여줍니다 AWS IoT Core.
#include <iostream> #include <aws/crt/Api.h> #include <aws/greengrass/GreengrassCoreIpcClient.h> using namespace Aws::Crt; using namespace Aws::Greengrass; class IpcClientLifecycleHandler : public ConnectionLifecycleHandler { void OnConnectCallback() override { std::cout << "OnConnectCallback" << std::endl; } void OnDisconnectCallback(RpcError error) override { std::cout << "OnDisconnectCallback: " << error.StatusToString() << std::endl; exit(-1); } bool OnErrorCallback(RpcError error) override { std::cout << "OnErrorCallback: " << error.StatusToString() << std::endl; return true; } }; int main() { String message("Hello from the Greengrass IPC MQTT publisher (C++)."); String topic("test/topic/cpp"); QOS qos = QOS_AT_LEAST_ONCE; int timeout = 10; ApiHandle apiHandle(g_allocator); Io::EventLoopGroup eventLoopGroup(1); Io::DefaultHostResolver socketResolver(eventLoopGroup, 64, 30); Io::ClientBootstrap bootstrap(eventLoopGroup, socketResolver); IpcClientLifecycleHandler ipcLifecycleHandler; GreengrassCoreIpcClient ipcClient(bootstrap); auto connectionStatus = ipcClient.Connect(ipcLifecycleHandler).get(); if (!connectionStatus) { std::cerr << "Failed to establish IPC connection: " << connectionStatus.StatusToString() << std::endl; exit(-1); } while (true) { PublishToIoTCoreRequest request; Vector<uint8_t> messageData({message.begin(), message.end()}); request.SetTopicName(topic); request.SetPayload(messageData); request.SetQos(qos); auto operation = ipcClient.NewPublishToIoTCore(); auto activate = operation->Activate(request, nullptr); activate.wait(); auto responseFuture = operation->GetResult(); if (responseFuture.wait_for(std::chrono::seconds(timeout)) == std::future_status::timeout) { std::cerr << "Operation timed out while waiting for response from Greengrass Core." << std::endl; exit(-1); } auto response = responseFuture.get(); if (response) { std::cout << "Successfully published to topic: " << topic << std::endl; } else { // An error occurred. std::cout << "Failed to publish to topic: " << topic << std::endl; auto errorType = response.GetResultType(); if (errorType == OPERATION_ERROR) { auto *error = response.GetOperationError(); std::cout << "Operation error: " << error->GetMessage().value() << std::endl; } else { std::cout << "RPC error: " << response.GetRpcError() << std::endl; } exit(-1); } std::this_thread::sleep_for(std::chrono::seconds(5)); } return 0; }
다음 예제 레시피에서는 구성 요소가 모든 주제를 구독하도록 허용합니다.
다음 예제 C++ 애플리케이션은 AWS IoT Core MQTT IPC 서비스를 사용하여 메시지를 구독하는 방법을 보여줍니다 AWS IoT Core.
#include <iostream> #include <aws/crt/Api.h> #include <aws/greengrass/GreengrassCoreIpcClient.h> using namespace Aws::Crt; using namespace Aws::Greengrass; class IoTCoreResponseHandler : public SubscribeToIoTCoreStreamHandler { public: virtual ~IoTCoreResponseHandler() {} private: void OnStreamEvent(IoTCoreMessage *response) override { auto message = response->GetMessage(); if (message.has_value() && message.value().GetPayload().has_value()) { auto messageBytes = message.value().GetPayload().value(); std::string messageString(messageBytes.begin(), messageBytes.end()); std::string messageTopic = message.value().GetTopicName().value().c_str(); std::cout << "Received new message on topic: " << messageTopic << std::endl; std::cout << "Message: " << messageString << std::endl; } } bool OnStreamError(OperationError *error) override { std::cout << "Received an operation error: "; if (error->GetMessage().has_value()) { std::cout << error->GetMessage().value(); } std::cout << std::endl; return false; // Return true to close stream, false to keep stream open. } void OnStreamClosed() override { std::cout << "Subscribe to IoT Core stream closed." << std::endl; } }; class IpcClientLifecycleHandler : public ConnectionLifecycleHandler { void OnConnectCallback() override { std::cout << "OnConnectCallback" << std::endl; } void OnDisconnectCallback(RpcError error) override { std::cout << "OnDisconnectCallback: " << error.StatusToString() << std::endl; exit(-1); } bool OnErrorCallback(RpcError error) override { std::cout << "OnErrorCallback: " << error.StatusToString() << std::endl; return true; } }; int main() { String topic("test/topic/cpp"); QOS qos = QOS_AT_LEAST_ONCE; int timeout = 10; ApiHandle apiHandle(g_allocator); Io::EventLoopGroup eventLoopGroup(1); Io::DefaultHostResolver socketResolver(eventLoopGroup, 64, 30); Io::ClientBootstrap bootstrap(eventLoopGroup, socketResolver); IpcClientLifecycleHandler ipcLifecycleHandler; GreengrassCoreIpcClient ipcClient(bootstrap); auto connectionStatus = ipcClient.Connect(ipcLifecycleHandler).get(); if (!connectionStatus) { std::cerr << "Failed to establish IPC connection: " << connectionStatus.StatusToString() << std::endl; exit(-1); } SubscribeToIoTCoreRequest request; request.SetTopicName(topic); request.SetQos(qos); auto streamHandler = MakeShared<IoTCoreResponseHandler>(DefaultAllocator()); auto operation = ipcClient.NewSubscribeToIoTCore(streamHandler); auto activate = operation->Activate(request, nullptr); activate.wait(); auto responseFuture = operation->GetResult(); if (responseFuture.wait_for(std::chrono::seconds(timeout)) == std::future_status::timeout) { std::cerr << "Operation timed out while waiting for response from Greengrass Core." << std::endl; exit(-1); } auto response = responseFuture.get(); if (response) { std::cout << "Successfully subscribed to topic: " << topic << std::endl; } else { // An error occurred. std::cout << "Failed to subscribe to topic: " << topic << std::endl; auto errorType = response.GetResultType(); if (errorType == OPERATION_ERROR) { auto *error = response.GetOperationError(); std::cout << "Operation error: " << error->GetMessage().value() << std::endl; } else { std::cout << "RPC error: " << response.GetRpcError() << std::endl; } exit(-1); } // Keep the main thread alive, or the process will exit. while (true) { std::this_thread::sleep_for(std::chrono::seconds(10)); } operation->Close(); return 0; }
다음 예제 레시피에서는 구성 요소가 모든 주제에 게시할 수 있도록 허용합니다.
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.IoTCorePublisherRust", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that publishes MQTT messages to IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.IoTCorePublisherRust:mqttproxy:1": { "policyDescription": "Allows access to publish to all topics.", "operations": ["aws.greengrass#PublishToIoTCore"], "resources": ["*"] } } } } }, "Manifests": [ { "Platform": { "os": "linux", "runtime": "*" }, "Lifecycle": { "run": "{artifacts:path}/publish_to_iot_core" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.IoTCorePublisherRust/1.0.0/publish_to_iot_core", "Permission": { "Execute": "OWNER" } } ] } ] }
다음 Rust 애플리케이션 예제에서는 AWS IoT Core MQTT IPC 서비스를 사용하여 메시지를 게시하는 방법을 보여줍니다 AWS IoT Core.
use gg_sdk::{Qos, Sdk}; fn main() { let sdk = Sdk::init(); sdk.connect().expect("Failed to establish IPC connection"); let message = b"Hello, World"; let topic = "my/topic"; let qos = Qos::AtLeastOnce; sdk.publish_to_iot_core(topic, message, qos) .expect("Failed to publish to topic"); println!("Successfully published to topic: {topic}"); }
다음 예제 레시피에서는 구성 요소가 모든 주제를 구독하도록 허용합니다.
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.IoTCoreSubscriberRust", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that subscribes to MQTT messages from IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.IoTCoreSubscriberRust:mqttproxy:1": { "policyDescription": "Allows access to subscribe to all topics.", "operations": ["aws.greengrass#SubscribeToIoTCore"], "resources": ["*"] } } } } }, "Manifests": [ { "Platform": { "os": "linux", "runtime": "*" }, "Lifecycle": { "run": "{artifacts:path}/subscribe_to_iot_core" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.IoTCoreSubscriberRust/1.0.0/subscribe_to_iot_core", "Permission": { "Execute": "OWNER" } } ] } ] }
다음 Rust 애플리케이션 예제에서는 AWS IoT Core MQTT IPC 서비스를 사용하여 메시지를 구독하는 방법을 보여줍니다 AWS IoT Core.
use gg_sdk::{Qos, Sdk}; use std::{thread, time::Duration}; fn main() { let sdk = Sdk::init(); sdk.connect().expect("Failed to establish IPC connection"); let topic = "my/topic"; let qos = Qos::AtLeastOnce; let callback = |topic: &str, payload: &[u8]| { let message = String::from_utf8_lossy(payload); println!("Received new message on topic {topic}: {message}"); }; let _sub = sdk .subscribe_to_iot_core(topic, qos, &callback) .expect("Failed to subscribe to topic"); println!("Successfully subscribed to topic: {topic}"); // Keep the main thread alive, or the process will exit. loop { thread::sleep(Duration::from_secs(10)); } }
다음 예제 레시피에서는 구성 요소가 모든 주제에 게시할 수 있도록 허용합니다.
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.IoTCorePublisherC", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that publishes MQTT messages to IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.IoTCorePublisherC:mqttproxy:1": { "policyDescription": "Allows access to publish to all topics.", "operations": ["aws.greengrass#PublishToIoTCore"], "resources": ["*"] } } } } }, "Manifests": [ { "Platform": { "os": "linux", "runtime": "*" }, "Lifecycle": { "run": "{artifacts:path}/sample_publish_to_iot_core" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.IoTCorePublisherC/1.0.0/sample_publish_to_iot_core", "Permission": { "Execute": "OWNER" } } ] } ] }
다음 예제 C 애플리케이션은 AWS IoT Core MQTT IPC 서비스를 사용하여 메시지를 게시하는 방법을 보여줍니다 AWS IoT Core.
#include <gg/error.h> #include <gg/ipc/client.h> #include <gg/sdk.h> #include <stdio.h> #include <stdlib.h> int main(void) { gg_sdk_init(); GgError err = ggipc_connect(); if (err != GG_ERR_OK) { fprintf(stderr, "Failed to establish IPC connection.\n"); exit(-1); } GgBuffer message = GG_STR("Hello, World"); GgBuffer topic = GG_STR("my/topic"); uint8_t qos = 1; err = ggipc_publish_to_iot_core(topic, message, qos); if (err != GG_ERR_OK) { fprintf( stderr, "Failed to publish to topic: %.*s\n", (int) topic.len, topic.data ); exit(-1); } printf( "Successfully published to topic: %.*s\n", (int) topic.len, topic.data ); }
다음 예제 레시피에서는 구성 요소가 모든 주제를 구독하도록 허용합니다.
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.IoTCoreSubscriberC", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that subscribes to MQTT messages from IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.IoTCoreSubscriberC:mqttproxy:1": { "policyDescription": "Allows access to subscribe to all topics.", "operations": ["aws.greengrass#SubscribeToIoTCore"], "resources": ["*"] } } } } }, "Manifests": [ { "Platform": { "os": "linux", "runtime": "*" }, "Lifecycle": { "run": "{artifacts:path}/sample_subscribe_to_iot_core" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.IoTCoreSubscriberC/1.0.0/sample_subscribe_to_iot_core", "Permission": { "Execute": "OWNER" } } ] } ] }
다음 예제 C 애플리케이션은 AWS IoT Core MQTT IPC 서비스를 사용하여 메시지를 구독하는 방법을 보여줍니다 AWS IoT Core.
#include <gg/error.h> #include <gg/ipc/client.h> #include <gg/sdk.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> static void on_subscription_response( void *ctx, GgBuffer topic, GgBuffer payload, GgIpcSubscriptionHandle handle ) { (void) ctx; (void) handle; printf( "Received new message on topic %.*s: %.*s\n", (int) topic.len, topic.data, (int) payload.len, payload.data ); } int main(void) { gg_sdk_init(); GgError err = ggipc_connect(); if (err != GG_ERR_OK) { fprintf(stderr, "Failed to establish IPC connection.\n"); exit(-1); } GgBuffer topic = GG_STR("my/topic"); uint8_t qos = 1; GgIpcSubscriptionHandle handle; err = ggipc_subscribe_to_iot_core( topic, qos, on_subscription_response, NULL, &handle ); if (err != GG_ERR_OK) { fprintf( stderr, "Failed to subscribe to topic: %.*s\n", (int) topic.len, topic.data ); exit(-1); } printf( "Successfully subscribed to topic: %.*s\n", (int) topic.len, topic.data ); // Keep the main thread alive, or the process will exit. while (1) { sleep(10); } // To stop subscribing, close the subscription handle. ggipc_close_subscription(handle); }
다음 예제 레시피에서는 구성 요소가 모든 주제에 게시할 수 있도록 허용합니다.
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.IoTCorePublisherCpp", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that publishes MQTT messages to IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.IoTCorePublisherCpp:mqttproxy:1": { "policyDescription": "Allows access to publish to all topics.", "operations": ["aws.greengrass#PublishToIoTCore"], "resources": ["*"] } } } } }, "Manifests": [ { "Platform": { "os": "linux", "runtime": "*" }, "Lifecycle": { "run": "{artifacts:path}/sample_cpp_publish_to_iot_core" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.IoTCorePublisherCpp/1.0.0/sample_cpp_publish_to_iot_core", "Permission": { "Execute": "OWNER" } } ] } ] }
다음 예제 C++ 애플리케이션은 AWS IoT Core MQTT IPC 서비스를 사용하여 메시지를 게시하는 방법을 보여줍니다 AWS IoT Core.
#include <gg/ipc/client.hpp> #include <iostream> int main() { auto &client = gg::ipc::Client::get(); auto error = client.connect(); if (error) { std::cerr << "Failed to establish IPC connection.\n"; exit(-1); } std::string_view message = "Hello, World"; std::string_view topic = "my/topic"; uint8_t qos = 1; error = client.publish_to_iot_core(topic, message, qos); if (error) { std::cerr << "Failed to publish to topic: " << topic << "\n"; exit(-1); } std::cout << "Successfully published to topic: " << topic << "\n"; }
다음 예제 레시피에서는 구성 요소가 모든 주제를 구독하도록 허용합니다.
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.IoTCoreSubscriberCpp", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that subscribes to MQTT messages from IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.IoTCoreSubscriberCpp:mqttproxy:1": { "policyDescription": "Allows access to subscribe to all topics.", "operations": ["aws.greengrass#SubscribeToIoTCore"], "resources": ["*"] } } } } }, "Manifests": [ { "Platform": { "os": "linux", "runtime": "*" }, "Lifecycle": { "run": "{artifacts:path}/sample_cpp_subscribe_to_iot_core" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.IoTCoreSubscriberCpp/1.0.0/sample_cpp_subscribe_to_iot_core", "Permission": { "Execute": "OWNER" } } ] } ] }
다음 예제 C++ 애플리케이션은 AWS IoT Core MQTT IPC 서비스를 사용하여 메시지를 구독하는 방법을 보여줍니다 AWS IoT Core.
#include <gg/ipc/client.hpp> #include <unistd.h> #include <iostream> class ResponseHandler : public gg::ipc::IotTopicCallback { void operator()( std::string_view topic, gg::Buffer payload, gg::ipc::Subscription &handle ) override { (void) handle; std::cout << "Received new message on topic " << topic << ": " << payload << "\n"; } }; int main() { auto &client = gg::ipc::Client::get(); auto error = client.connect(); if (error) { std::cerr << "Failed to establish IPC connection.\n"; exit(-1); } std::string_view topic = "my/topic"; uint8_t qos = 1; static ResponseHandler handler; error = client.subscribe_to_iot_core(topic, qos, handler); if (error) { std::cerr << "Failed to subscribe to topic: " << topic << "\n"; exit(-1); } std::cout << "Successfully subscribed to topic: " << topic << "\n"; // Keep the main thread alive, or the process will exit. while (1) { sleep(10); } }