AWS IoT는 센서, 액추에이터, 임베디드 마이크로 컨트롤러 또는 스마트 가전과 같은 인터넷에 연결된 디바이스와 AWS Cloud 간에 안전한 양방향 통신을 제공합니다. 이를 통해 여러 디바이스에서 텔레메트리 데이터를 수집하고, 데이터를 저장 및 분석할 수 있습니다. 또한 사용자가 휴대폰이나 태블릿에서 이러한 디바이스를 제어할 수 있는 애플리케이션을 만들 수 있습니다.
디바이스와 AWS IoT 애플리케이션이 서로 메시지를 게시하고 수신할 수 있는 안전한 메커니즘을 제공합니다. MQTT 프로토콜을 직접 사용하거나 MQTT over WebSocket을 사용하여 게시 및 구독할 수 있습니다.
AWS IoT 메시지 브로커는 AWS IoT로/에서 메시지를 보내고 받을 수 있게 하는 게시/구독 브로커 서비스입니다. AWS IoT와 통신할 때 클라이언트는 Sensor/temp/room1과 같은 토픽으로 주소가 지정된 메시지를 보냅니다.
메시지 브로커는 차례로 해당 토픽에 대한 메시지를 받기 위해 등록한 모든 클라이언트에게 메시지를 보냅니다. 메시지를 보내는 행위를 게시(publishing)라고 합니다. 토픽 필터에 대한 메시지를 받기 위해 등록하는 행위를 구독(subscribing)이라고 합니다.
topic 네임스페이스는 각 AWS 계정 및 리전 쌍에 대해 격리됩니다. 예를 들어, 한 AWS 계정의 Sensor/temp/room1 topic은 다른 AWS 계정의 Sensor/temp/room1 topic과 독립적입니다. 이는 리전에 대해서도 마찬가지입니다. us-east-1의 동일한 AWS 계정에 있는 Sensor/temp/room1 topic은 us-east-2의 동일한 topic과 독립적입니다. AWS IoT는 AWS 계정 및 리전 간 메시지 송수신을 지원하지 않습니다.
메시지 브로커는 모든 클라이언트 세션 목록과 각 세션의 구독을 유지합니다. 토픽에 메시지가 게시되면 브로커는 해당 토픽에 매핑되는 구독이 있는 세션을 확인합니다. 그런 다음 브로커는 현재 연결된 클라이언트가 있는 모든 세션으로 게시 메시지를 전달합니다.
TsgcIoTAmazon_MQTT_Client는 AWS IoT에 연결하는 데 사용되는 구성 요소입니다. 하나의 클라이언트는 하나의 디바이스에만 연결할 수 있습니다. 클라이언트는 일반 MQTT 프로토콜을 사용하여 연결하고 X.509 클라이언트 인증서를 사용하여 인증합니다.
AWS IoT에 연결하려면 클라이언트에 다음 속성이 필요합니다:
Amazon.ClientId: 클라이언트의 식별, 선택적.
Amazon.Endpoint: MQTT 클라이언트가 연결할 서버 이름입니다.
Amazon.Port: 기본적으로 포트 8883을 사용합니다. 포트가 443이면 연결하기 위해 자동으로 ALPN을 사용합니다(사용자 지정 Indy 버전 필요).
AWS IoT Core는 MQTT 및 MQTT over WebSocket Secure (WSS) 프로토콜을 사용하여 메시지를 게시하고 구독하는 장치와 클라이언트를 지원합니다. 다음 표는 AWS IoT 장치 엔드포인트가 지원하는 프로토콜과 사용하는 인증 방법 및 포트를 나열합니다.
| 프로토콜 | Authentication | Port | ALPN Protocol Name |
| WebSocket을 통한 MQTT | Signature Version 4 | 443 | |
| WebSocket을 통한 MQTT | Custom Authentication | 443 | |
| MQTT | X.509 client certificate | 443 | x-amzn-mqtt-ca |
| MQTT | X.509 client certificate | 8883 | |
| MQTT | Custom Authentication | 443 | mqtt |
Amazon AWS 콘솔에서 인증서를 생성하고 저장된 경로를 설정해야 합니다.
IOHandler로 OpenSSL을 사용하는 경우 다음 경로에 인증서를 설정해야 합니다
Certificate.Enabled: 인증서를 사용하려면 True로 설정하십시오.
Certificate.CertFile: X.509 클라이언트 인증서 경로입니다.
Certificate.KeyFile: X.509 클라이언트 키 파일의 경로입니다.
SChannel을 IOHandler로 사용할 때, 먼저 PEM 인증서 + Key를 PFX 인증서로 변환하십시오. 이를 위해서는 OpenSSL 바이너리가 필요합니다:
openssl pkcs12 -inkey 884ccf73ff-private.pem.key -in 884ccf73ff-certificate.pem.crt -export -out 884ccf73ff-certificate.pfx
그런 다음 다음 경로를 설정하십시오(키 파일은 인증서에 이미 포함되어 있으므로 설정할 필요가 없습니다).
Certificate.Enabled: 인증서를 사용하려면 True로 설정하십시오.
Certificate.CertFile: PFX 인증서 경로입니다.
Amazon AWS 콘솔에서 사용자를 생성하고 WebSocket 요청에 서명하는 데 사용될 Access 및 Secret 키를 저장해야 합니다.
SignatureV4.Enabled: 이 유형의 인증을 사용하려면 True로 설정하십시오.
SignatureV4.Region: 디바이스가 위치한 리전(예: us-east-1).
SignatureV4.AccessKey: Amazon 콘솔에서 생성되거나 임시 자격 증명으로 얻은 access key입니다.
SignatureV4.SecretKey: amazon 콘솔에서 생성하거나 임시 자격 증명으로 얻은 secret key입니다
SignatureV4.SessionToken: (조건부) 임시 보안 자격 증명을 사용하는 경우 여기에 보안 토큰을 설정하십시오.
OpenSSL_Options: openSSL 라이브러리의 구성입니다.
APIVersion: 어떤 OpenSSL API를 사용할지 정의할 수 있게 합니다.
oslAPI_1_0: API 1.0 OpenSSL을 사용하며, Indy가 지원하는 최신 버전입니다
oslAPI_1_1: API 1.1 OpenSSL을 사용하며, 당사의 사용자 정의 Indy 라이브러리가 필요하고 OpenSSL 1.1.1 라이브러리(TLS 1.3 지원 포함)를 사용할 수 있게 합니다.
oslAPI_3_0: API 3.0 OpenSSL을 사용하며, 사용자 지정 Indy 라이브러리가 필요하고 OpenSSL 3.0.0 라이브러리(TLS 1.3 지원 포함)를 사용할 수 있습니다.
LibPath: 여기에서 openSSL 라이브러리가 위치한 곳을 구성할 수 있습니다.
oslpNone: 이것이 기본값이며, openSSL 라이브러리는 바이너리가 있는 동일한 폴더 또는 알려진 경로에 있어야 합니다.
oslpDefaultFolder: 모든 IDE 퍼스낼리티에 대해 라이브러리가 위치해야 하는 openSSL 경로를 자동으로 설정합니다.
oslpCustomFolder: 이 옵션이 선택된 경우, LibPathCustom 속성에 전체 경로를 정의하십시오.
LibPathCustom: LibPath = oslpCustomFolder일 때 openSSL 라이브러리가 있는 전체 경로를 여기에 정의하십시오.
UnixSymLinks: Unix 시스템에서 SymLinks 로딩을 활성화하거나 비활성화합니다(기본적으로 활성화되어 있으며, OSX64에서는 예외):
oslsSymLinksDefault: 기본적으로 활성화되지만 OSX64에서는 예외입니다(MacOS Monterey 이후 버전 없이 라이브러리를 로드하려고 하면 실패함).
oslsSymLinksLoadFirst: 버전 라이브러리를 로드하기 전에 SymLink를 로드하고 먼저 시도합니다.
oslsSymLinksLoad: 버전 라이브러리를 로드하려고 시도한 후 SymLinks를 로드합니다.
oslsSymLinksDontLoad: SymLinks를 로드하지 않습니다.
*SignatureV4에는 Indy 10.5.7+가 필요합니다
사용자 정의 인증을 사용하면 authorizer 리소스를 사용하여 클라이언트를 인증하고 권한을 부여하는 방법을 정의할 수 있습니다. 장치는 요청의 헤더 필드나 쿼리 매개변수(MQTT over WebSockets 프로토콜의 경우) 또는 MQTT CONNECT 메시지의 user name 및 password 필드(MQTT 및 MQTT over WebSockets 프로토콜의 경우)에 자격 증명을 전달합니다.
CustomAuthentication.Enabled: 이 유형의 Authentication을 사용하려면 True로 설정하십시오.
CustomAuthentication.Parameters: 서버에 전달될 쿼리 매개변수를 여기에 설정하십시오(기본값은 /mqtt)
CustomAuthentication.Headers: 여기에 사용자 지정 헤더 필드를 넣을 수 있습니다.
CustomAuthentication.WebSockets: true로 설정되면 연결은 WebSocket 프로토콜을 통해 작동하고, 그렇지 않으면 일반 TCP를 통해 작동합니다.
MQTTAuthentication.Enabled: mqtt 연결에서 사용자 이름/비밀번호를 전달해야 하는 경우 이 속성을 활성화하십시오
MQTTAuthentication.Username: mqtt 연결의 사용자 이름
MQTTAuthentication.Password: mqtt 연결의 비밀.
클라이언트는 선택적으로 ClientId를 보내 클라이언트 연결을 식별할 수 있으며, 그러면 다른 클라이언트는 이 클라이언트가 연결, 구독, 연결 끊김... 할 때마다 알림을 받기 위해 구독할 수 있습니다.
포트 8883을 사용하여 연결할 수 없고 전송으로 TCP(기본값)를 사용하는 경우, amazon은 "AWS IoT Core policy"를 사용하여 클라이언트 및 구독에 권한 부여를 제공하거나 제공하지 않습니다. 아마도 클라이언트 id를 권한 부여해야 할 것입니다.
Amazon AWS 콘솔에 들어가서 IoT Core로 이동하여 "Secure/Policies" 메뉴에 접근한 다음, IoT Thing에 연결된 정책을 선택하고 끝에서 연결이 어떻게 구성되어 있는지 확인하십시오. 예:
{
"Effect": "Allow",
"Action": [
"iot:Connect"
],
"Resource": [
"arn:aws:iot:us-east-1:222178873557:client/sdk-java",
"arn:aws:iot:us-east-1:222178873557:client/basicPubSub",
"arn:aws:iot:us-east-1:222178873557:client/sdk-nodejs-*"
]
}
이 구성은 ID가 sdk-java, basicPubSub, sdk-nodejs-*인 클라이언트만 연결을 허용함을 의미합니다. 적절히 변경하고 다시 시도하십시오.
여전히 작동하지 않으면 로그를 활성화하고 cloudwatch에서 연결할 수 없는 이유를 확인하십시오.
MQTTHeartBeat: 활성화하면 x초마다 ping을 보내 MQTT 연결을 유지하려고 시도합니다.
Interval: 각 ping 사이의 초 수입니다.
MQTTAuthentication: 활성화하면 MQTT 연결에 username과 password를 포함합니다.
UserName: 사용자의 이름
Password: secret string
WatchDog: 활성화되면 예기치 않은 연결 끊김이 감지될 때 서버에 자동으로 재연결을 시도합니다.
Interval: 재연결 시도 전 초.
Attempts: 최대 재연결 시도 횟수입니다. 0은 무제한을 의미합니다.
LogFile: 활성화하면 소켓 메시지를 로그 파일에 저장합니다(디버깅에 유용). 로그 파일에 대한 액세스는 여러 스레드에서 액세스되는 경우 스레드 안전하지 않습니다.
Enabled: 활성화하면 소켓으로 메시지를 수신하고 보낼 때마다 파일에 저장됩니다.
FileName: 파일 이름의 전체 경로입니다.
Amazon MQTT 구현은 MQTT 버전 3.1.1을 기반으로 하지만 다음과 같이 사양에서 벗어납니다:
AWS IoT에서 Quality of Service(QoS) 0으로 토픽을 구독한다는 것은 메시지가 0회 이상 전달됨을 의미합니다. 메시지가 두 번 이상 전달될 수 있습니다. 두 번 이상 전달되는 메시지는 다른 패킷 ID로 전송될 수 있습니다. 이러한 경우 DUP 플래그가 설정되지 않습니다.
AWS IoT는 QoS 2를 사용한 게시 및 구독을 지원하지 않습니다. AWS IoT 메시지 브로커는 QoS 2가 요청될 때 PUBACK 또는 SUBACK을 보내지 않습니다.
연결 요청에 응답할 때 메시지 브로커는 CONNACK 메시지를 보냅니다. 이 메시지에는 연결이 이전 세션을 재개하는지를 나타내는 플래그가 포함됩니다. 두 MQTT 클라이언트가 동일한 클라이언트 ID로 동시에 연결하면 이 플래그의 값이 올바르지 않을 수 있습니다.
클라이언트가 토픽을 구독할 때, 메시지 브로커가 SUBACK을 보내는 시점과 클라이언트가 새로 일치하는 메시지를 수신하기 시작하는 시점 사이에 지연이 있을 수 있습니다.
MQTT 사양은 게시자가 브로커에게 토픽으로 전송된 마지막 메시지를 보관하고 향후의 모든 토픽 구독자에게 전송하도록 요청하는 규정을 제공합니다. AWS IoT는 보관 메시지를 지원하지 않습니다. 메시지를 보관하도록 요청하면 연결이 끊깁니다.
메시지 브로커는 클라이언트 ID를 사용하여 각 클라이언트를 식별합니다. 클라이언트 ID는 MQTT 페이로드의 일부로 클라이언트에서 메시지 브로커로 전달됩니다. 동일한 클라이언트 ID를 가진 두 클라이언트는 메시지 브로커에 동시에 연결할 수 없습니다. 클라이언트가 다른 클라이언트가 사용 중인 클라이언트 ID를 사용하여 메시지 브로커에 연결하면 두 클라이언트 모두에 CONNACK 메시지가 전송되고 현재 연결된 클라이언트는 연결이 해제됩니다.
드문 경우에, 메시지 브로커가 동일한 논리적 PUBLISH 메시지를 다른 패킷 ID로 다시 보낼 수 있습니다.
메시지 브로커는 메시지와 ACK가 수신되는 순서를 보장하지 않습니다.
먼저 AWS 콘솔에 로그인하여 새 디바이스를 등록하고 이 디바이스에 대한 X.509 인증서를 생성해야 합니다. 완료되면 새 TsgcIoTAmazon_MQTT_Client를 생성하고 AWS IoT Server에 연결할 수 있습니다. 예를 들어:
oClient := TsgcIoTAmazon_MQTT_Client.Create(nil);
oClient.Amazon.Endpoint := 'a2ohgdjqitsmij-ats.iot.us-west-2.amazonaws.com';
oClient.Amazon.ClientId := 'sgcWebSockets';
oClient.Certificate.CertFile := 'amazon-certificate.pem.crt';
oClient.Certificate.KeyFile := 'amazon-private.pem.key';
oClient.OnMQTTConnect := OnMQTTConnectEvent;
oClient.Active := True;
procedure OnMQTTConnect(Connection: TsgcWSConnection; const Session: Boolean; const ReturnCode: TmqttConnReturnCode);
begin
ShowMessage('Connected to AWS');
end;
메시지 브로커는 토픽을 사용하여 게시 클라이언트에서 구독 클라이언트로 메시지를 라우팅합니다. 슬래시(/)는 토픽 계층을 구분하는 데 사용됩니다. 다음 표는 구독할 때 토픽 필터에서 사용할 수 있는 와일드카드를 나열합니다. #은 구독하는 토픽의 마지막 문자여야 합니다. 현재 트리와 모든 하위 트리를 일치시켜 와일드카드로 작동합니다.
예를 들어, Sensor/#에 대한 구독은 Sensor/, Sensor/temp, Sensor/temp/room1에 게시된 메시지를 수신하지만, Sensor에 게시된 메시지는 수신하지 않습니다.
+ 토픽 계층에서 정확히 하나의 항목과 일치합니다. 예를 들어, Sensor/+/room1에 대한 구독은 Sensor/temp/room1, Sensor/moisture/room1 등으로 게시된 메시지를 수신합니다.
oClient := TsgcIoTAmazon_MQTT_Client.Create(nil);
...
oClient.OnSubscribe := OnSubscribeEvent;
vPacketIdentifier := oClient.Subscribe('Sensor/moisture/room1');
procedure OnMQTTSubscribe(Connection: TsgcWSConnection; aPacketIdentifier: Word; aCodes: TsgcWSSUBACKS);
begin
if vPacketIdentifier = aPacketIdentifier then
ShowMessage('Subscribed to topic Sensor/moisture/room1');
end;
// Client, can send a message using Publish method.
oClient.Publish('Sensor/moisture/room1', '{"temp"=10}');
// Messages received from server, are dispatched OnMQTTPublishEvent.
// For extended payload access (string, bytes or stream), use OnMQTTPublishEx.
procedure OnMQTTPublish(Connection: TsgcWSConnection; aTopic, aText: string);
begin
DoLog('Received Message: ' + aTopic + ' ' + aText);
end;
다음 메서드는 예약된 토픽을 구독/게시하는 데 사용됩니다.
Subscribe_ClientConnected(const aClientId: String): 지정된 클라이언트 ID를 가진 MQTT 클라이언트가 AWS IoT에 연결될 때 AWS IoT가 이 토픽에 게시합니다
Subscribe_ClientDisconnected(const aClientId: String): 지정된 클라이언트 ID를 가진 MQTT 클라이언트가 AWS IoT에서 연결을 끊으면 AWS IoT가 이 토픽에 게시합니다
Subscribe_ClientSubscribed(const aClientId: String): 지정된 클라이언트 ID를 가진 MQTT 클라이언트가 MQTT 토픽을 구독하면 AWS IoT가 이 토픽에 게시합니다
Subscribe_ClientUnSubscribed(const aClientId: String): AWS IoT는 지정된 클라이언트 ID를 가진 MQTT 클라이언트가 MQTT 토픽 구독을 해제할 때 이 토픽에 게시합니다
Publish_Rule(const aRuleName, aText: String): 장치 또는 애플리케이션이 이 토픽에 게시하여 규칙을 직접 트리거합니다
Publish_DeleteShadow(const aThingName, aText: String): 디바이스 또는 애플리케이션이 shadow를 삭제하기 위해 이 토픽에 게시합니다
Subscribe_DeleteShadow(const aThingName: String): 장치나 애플리케이션이 shadow를 삭제하기 위해 이 토픽을 구독합니다
Subscribe_ShadowDeleted(const aThingName: String): Device Shadow 서비스는 shadow가 삭제될 때 이 topic에 메시지를 보냅니다
Subscribe_ShadowRejected(const aThingName: String): shadow 삭제 요청이 거부되면 Device Shadow 서비스가 이 토픽으로 메시지를 보냅니다.
Publish_ShadowGet(const aThingName, aText: String): 애플리케이션 또는 thing이 이 topic에 빈 메시지를 게시하여 shadow를 가져옵니다
Subscribe_ShadowGet(const aThingName: String): 애플리케이션 또는 thing이 shadow를 얻기 위해 이 topic을 구독합니다
Subscribe_ShadowGetAccepted(const aThingName: String): shadow 요청이 성공적으로 이루어지면 Device Shadow 서비스가 이 topic에 메시지를 보냅니다
Subscribe_ShadowGetRejected(const aThingName: String): shadow에 대한 요청이 거부될 때 Device Shadow 서비스가 이 토픽으로 메시지를 전송합니다
Publish_ShadowUpdate(const aThingName, aText: String): thing 또는 애플리케이션이 shadow를 업데이트하기 위해 이 토픽에 게시합니다.
Subscribe_ShadowUpdateAccepted(const aThingName: String): Device Shadow 서비스는 shadow에 대한 업데이트가 성공적으로 이루어지면 이 topic에 메시지를 보냅니다
Subscribe_ShadowUpdateRejected(const aThingName: String): Device Shadow 서비스는 shadow에 대한 업데이트가 거부될 때 이 topic으로 메시지를 보냅니다
Subscribe_ShadowUpdateDelta(const aThingName: String): Device Shadow 서비스는 shadow의 reported 및 desired 섹션 간에 차이가 감지될 때 이 토픽에 메시지를 보냅니다
Subscribe_ShadowUpdateDocuments(const aThingName: String): shadow에 대한 업데이트가 성공적으로 수행될 때마다 AWS IoT가 이 토픽에 상태 문서를 게시합니다
persistent 세션은 MQTT 메시지 브로커에 대한 진행 중인 연결을 나타냅니다. 클라이언트가 persistent 세션을 사용하여 AWS IoT 메시지 브로커에 연결하면 메시지 브로커는 클라이언트가 연결 중에 하는 모든 구독을 저장합니다. 클라이언트가 연결을 끊으면 메시지 브로커는 미확인 QoS 1 메시지와 클라이언트가 구독한 토픽에 게시된 새 QoS 1 메시지를 저장합니다. 클라이언트가 persistent 세션에 다시 연결하면 모든 구독이 복원되고 저장된 모든 메시지가 초당 최대 10개의 메시지 속도로 클라이언트에 전송됩니다.
OnMQTTBeforeConnect 이벤트에서 cleanSession 매개변수를 False로 설정하여 MQTT 영구 세션을 생성합니다. 클라이언트에 대한 세션이 없으면 새 영구 세션이 생성됩니다. 클라이언트에 대한 세션이 이미 존재하면 재개됩니다.
장치는 영속 세션이 있는지 확인하기 위해 OnMQTTConnect 이벤트의 Session 속성을 확인해야 합니다. Session이 True이면 영속 세션이 존재하고 저장된 메시지가 클라이언트에게 전달됩니다. Session이 False이면 영속 세션이 없으며 클라이언트는 자신의 topic 필터를 다시 구독해야 합니다.
영구 세션의 기본 만료 기간은 1시간입니다. 만료 기간은 메시지 브로커가 클라이언트 연결 끊김(MQTT disconnect 또는 timeout)을 감지할 때 시작됩니다. 영구 세션 만료 기간은 표준 제한 증가 프로세스를 통해 늘릴 수 있습니다. 클라이언트가 만료 기간 내에 세션을 재개하지 않으면 세션이 종료되고 관련된 저장 메시지가 모두 폐기됩니다. 만료 기간은 대략적이며, 세션은 구성된 기간보다 최대 30분 더 길게(그러나 더 짧지는 않게) 영속화될 수 있습니다.
AWS IoT Core는 Identity Pools를 통해 얻은 Temporary Credentials와 함께 작동할 수 있습니다. 2가지 유형의 Identity가 있습니다:
Unauthenticated 자격 증명을 사용하는 경우, IAM 메뉴에서 자동으로 생성된 UnAuthenticated Role에 정책을 연결하기만 하면 됩니다. 그런 다음 Cognito 서비스가 반환한 Access, Secret Key 및 Token을 설정하여 클라이언트를 구성하십시오.
인증되지 않은 자격 증명을 가져오는 .NET 코드를 아래에서 확인하십시오
CognitoAWSCredentials credentials = new CognitoAWSCredentials(
"us-east-1:cc3c9c48-646d-44ef-bfd5-0c5fb2f0882f", // Identity pool ID
Amazon.RegionEndpoint.USEast1 // Region
);
var identityPoolId = credentials.GetCredentialsAsync();
AmazonCognitoIdentityClient cognitoClient = new AmazonCognitoIdentityClient(
credentials, // the anonymous credentials
Amazon.RegionEndpoint.USEast1 // the Amazon Cognito region
);
GetIdRequest idRequest = new GetIdRequest();
idRequest.AccountId = "222178873557";
idRequest.IdentityPoolId = "us-east-1:cc3c9c48-646d-44ef-bfd5-0c5fb2f0882f";
GetIdResponse idResp = cognitoClient.GetId(idRequest);
string AccessKey = identityPoolId.Result.AccessKey;
string SecretKey = identityPoolId.Result.SecretKey;
string SessionToken = identityPoolId.Result.Token;
string IdentityId = idResp.IdentityId;
인증된 자격 증명, IAM 메뉴에서 자동으로 생성된 Authenticated Role에 정책을 연결하고 AWS IoT Core 정책에서 사용자의 정책을 연결해야 합니다.
따라서 IoT Core policies 메뉴에서 새 정책을 생성하고 새 사용자가 인증할 때마다 이 정책을 해당 사용자에게 연결하십시오.
정책을 연결하거나 lambda 함수를 만들려면 다음 AWS 명령을 사용할 수 있습니다.
aws iot attach-policy --policy-name PolicyName --target us-east-1:XXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Fleet Provisioning 서비스는 다음 MQTT API 작업을 지원합니다:
CreateCertificateFromCsr
인증서를 생성하려면 CertificateSigningRequest를 매개변수로 전달하여 CreateCertificateFromCsr 메서드를 사용하십시오. 이 요청에 대한 응답을 받으려면 먼저 다음 메서드를 구독하십시오: SubscribeCreateCertificateFromCsrResponse 및 SubscribeCreateCertificateFromCsrError
CreateKeysAndCertificate
새 인증서와 키를 생성하려면 CreateKeysAndCertificate 메서드를 사용하십시오. 이 요청에 대한 응답을 받으려면 먼저 SubscribeCreateKeysAndCertificateResponse 및 SubscribeCreateKeysAndCertificateError 메서드를 구독하십시오
RegisterThing
SubscribeEx로 이전에 연 구독을 제거합니다.