AWS IoT Device
IoT λλ°μ΄μ€ μ°κ²°μ λν΄ μ§μ μ μΌλ‘ λ΄λΉνλ κ²½νμ μμ§λ§ IoT Core 컨νΈλ‘€ νλ μΈ μμ μ μ΄μ΄μ IoT λλ°μ΄μ€μ λν AWS IoT Device SDK for Java v2μ λν΄μ μμ보λλ‘ νκ² μ΅λλ€. λλΆλΆμ μ€λ¬΄μμ IoT λλ°μ΄μ€μ λν SDKλ C λλ νμ΄μ¬μΌλ‘ μμ±λ κ²μ νμ©νκ² μ§λ§ μ΄μ λν κ²½νμ μμΌλ©° C μ νμ΄μ¬μ λ€λ£¨λ κ°λ°μλ μλλ―λ‘ μλ° SDKλ‘ νμΈν΄λ³΄λλ‘ νκ² μ΅λλ€.
IoT λλ°μ΄μ€ λ°μ΄ν° μλν¬μΈνΈ
IoT λλ°μ΄μ€μμ X.509 ν΄λΌμ΄μΈνΈ μΈμ¦μ
μ ν¨κ» MQTT νλ‘ν μ½μ μ¬μ©νμ¬ AWS IoT λ©μμ§ λΈλ‘컀μ μ°κ²°ν λλ Data-ATS
μλν¬μΈνΈλ₯Ό μ¬μ©νκ² λ©λλ€. μ΄ μλν¬μΈνΈ μ£Όμλ AWS IoT Coreμ DescribeEndpoint
λͺ
λ ΉμΌλ‘ νμΈν μ μμμ§λ§ μμλ‘ λ³κ²½λλ μ λ³΄κ° μλλ―λ‘ μΉ μ½μμμ νμΈν΄λ 무방νλ―λ‘ IoT μ°κ³ μμ€ν
μ ν΅ν΄ νΈμ€νΈ μ£Όμ, κ°μΈν€ νμΌ, X.509 ν΄λΌμ΄μΈνΈ μΈμ¦μ κ·Έλ¦¬κ³ λ£¨νΈ CA μΈμ¦μ νμΌμ λ€μ΄λ‘λ λ°κ² λ©λλ€.
λ©μμ§ λΈλ‘컀 μ°κ²° κΆν
μΌλ°μ μΌλ‘ ν΄λΌμ΄μΈνΈ μμ΄λλ μ¬λ¬Ό μ΄λ¦ κ·Έλλ‘ μ¬μ©νλλ‘ λ³΄μ μ μ± μ μ μ©ν©λλ€. λ°λΌμ, MQTT νλ‘ν μ½μ μ¬μ©ν λ X.509 ν΄λΌμ΄μΈνΈ μΈμ¦μμ λ±λ‘λ μ°κ²° μ μ± μΌλ‘ μ μλ ν΄λΌμ΄μΈνΈ μμ΄λλ₯Ό μ¬μ©ν΄μΌ ν©λλ€. ν΄λΌμ΄μΈνΈ μμ΄λλ₯Ό μ¬λ¬Ό μ΄λ¦κ³Ό λμΌνκ² μ¬μ©νλ μ΄μ λ MQTT λ©μμ§ λΈλ‘컀μ λμΌν ν΄λΌμ΄μΈνΈ μμ΄λλ‘ μ°κ²°ν μ μμΌλ―λ‘ μ΄μ μ°κ²°μ΄ ν΄μ λκΈ° λλ¬Έμ λλ€.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "arn:aws:iot:ap-northeast-2:[account-id]:client/${iot:Connection.Thing.ThingName}"
}
]
}
λλ°μ΄μ€ μ°κ²° μν
νλ¦Ώ μΈλ±μ±μ μ¬λ¬Ό μ°κ²°μ νμ±ννλ©΄ IoT Core μμ IoT λλ°μ΄μ€ μ°κ²° μνλ₯Ό λͺ¨λν°λ§νκ² λ©λλ€. νλ¦Ώ μΈλ±μ±μΌλ‘ μ¬λ¬Ό μ°κ²° μνλ₯Ό νμΈ
νκΈ° μν΄μλ MQTT ν΄λΌμ΄μΈνΈ μμ΄λλ₯Ό μ¬λ¬Ό μ΄λ¦κ³Ό λμΌνκ² μ€μ ν΄μΌ ν©λλ€. μμ, λ©μμ§ λΈλ‘컀 μ°κ²° κΆνμμ ν΄λΌμ΄μΈνΈ μμ΄λλ₯Ό μ¬λ¬Ό μ΄λ¦ κ·Έλλ‘ μ¬μ©ν΄μΌνλ μ΄μ κ° λκΈ°λ ν©λλ€. μ°κ²° μνμ λν μμΈ μ΄μ λ μΉ μ½μμ μ¬λ¬Ό μ°κ²°μ± API ν
μ€νΈ
λλ μ¬λ¬Ό νλ μ΄λ ₯
μμ νμΈν μ μμ΅λλ€.
IoT Device Java SDK v2 κΈ°λ° μ°κ²° μ½λ
AWS IoT Device SDKλ‘ IoT λλ°μ΄μ€μμ AWS λ©μμ§ λΈλ‘μ»€λ‘ μ°κ²°μ μνν μ μκ³ Java SDK v2 κΈ°λ°μ μν μ½λ μ€μμ Direct MQTT with X509-based Mutual TLS Method λ₯Ό μ°Έκ³ νμ¬ μμ±ν΄λ³΄μμ΅λλ€. μν μμ λ¬Έμμ λ€λ₯΄κ² AwsIotMqtt5ClientBuilder μλ newMtlsBuilderλΌλ ν¨μκ° μμΌλ―λ‘ newDirectMqttBuilderWithMtlsFromMemory ν¨μλ₯Ό μ¬μ©νλ©΄ λλ©° PEM νμμ λ¬Έμμ΄μ μ½κΈ° μν΄μ Files.readAllBytes
λμ μ JDK 11μμ μΆκ°λ Files.readString
μ λμ νμ©νμ΅λλ€.
IotDevice.javaMqtt5Client client = null; try (IotClient iotClient = IotClient.builder() .credentialsProvider(DefaultCredentialsProvider.create()) .region(Region.AP_NORTHEAST_2) .build()) { DescribeEndpointResponse endpoint = iotClient.describeEndpoint(builder -> builder.endpointType("iot:Data-ATS").build()); String dataAtsEndpoint = endpoint.endpointAddress(); String certificatePem = getPem("certificate.pem"); String privateKey = getPem("privateKey.pem"); String caRoot = getPem("AmazonRootCA1.pem"); ConnectPacket.ConnectPacketBuilder connectProperties = new ConnectPacket.ConnectPacketBuilder() .withClientId("PC"); client = AwsIotMqtt5ClientBuilder .newDirectMqttBuilderWithMtlsFromMemory(dataAtsEndpoint, certificatePem, privateKey) .withCertificateAuthority(caRoot) .withConnectProperties(connectProperties) .build(); client.start(); Thread.sleep(Duration.ofMinutes(5)); } finally { if (client != null) { client.close(); } }
public static String getPem(String filename) {
try {
return Files.readString(Path.of(ClassLoader.getSystemResource(filename).toURI()), StandardCharsets.UTF_8);
} catch (Exception e) {
return "";
}
}
μ°κ²° μ€ν¨μ λν μ€λ₯ μμΈμ λν΄μ μμ보기
IoT λλ°μ΄μ€μ MQTT ν΄λΌμ΄μΈνΈ μ°κ²°μ λν μ½λλ₯Ό μμ±ν΄λ³΄λ κ²½μ° μ°κ²° μ€ν¨μ λν μ€λ₯ μμΈμ λν΄μ μμ보λλ‘ νκ² μ΅λλ€. λͺ¨λ μμΈ μΌμ΄μ€λ₯Ό λ€λ£° μ μμ§λ§ μ κ° κ²½ννλ μΌμ΄μ€λ€μ λ€μκ³Ό κ°μ΅λλ€. μ΄λ¬ν μ€λ₯ μμΈμ 미리 μμλλ©΄ μ½κ² μμΈμ μ°Ύμκ° μ μλλ° λμμ΄ λκΈ°λ ν©λλ€.
LifecycleEvent: no lifecycle events found!
software.amazon.awssdk.crt.CrtRuntimeException: LifecycleEvent: no lifecycle events found! - error code: 38 (aws_last_error: AWS_ERROR_INVALID_STATE(38), An invalid state was encountered.) AWS_ERROR_INVALID_STATE(38)
Mqtt5Clientλ₯Ό μμ±ν λλ Mqtt5ClientOptions.LifecycleEvents
μΈν°νμ΄μ€λ₯Ό ꡬννμ¬ μμ μ£ΌκΈ°μ λν λμμ λΉλμ λ±λ‘ν΄μΌ ν©λλ€. κ·Έλ μ§ μμΌλ©΄ μμ κ°μ΄ λΌμ΄ν μ¬μ΄ν΄μ μ°Ύμ μ μλ€λ μ€λ₯κ° λ°μνλ©° μ°κ²°ν μ μμ΅λλ€.
CONNACK:Client is not authenticated/authorized to send the message
CONNACK:Client is not authenticated/authorized to send the message:30d84af7-ddab-fd2e-7931-2592832a22d5
μ μ€λ₯ λ©μμ§λ onConnectionFailure μ½λ°± ν¨μλ‘ μ λ¬λλ κ²°κ³Όμ ν¬ν¨λλ μ¬μ μ
λλ€. μ΄ λ©μμ§λ ν΄λΌμ΄μΈνΈλ‘ μΈμ¦ν μ μλ€λ κ²μΌλ‘ ν΄λΌμ΄μΈνΈ μμ΄λ(μ¬λ¬Ό μ΄λ¦)μ μ°κ²°λ μΈμ¦μμ μ¬λ°λ₯Έ μ μ±
μ΄ μ°κ²°λμ§ μμμ λ λ°μν μ μμΌλ―λ‘ iot:Connect
μμ
μ λν μ μ±
μ΄ μ°κ²°λ μνκ° μλμ§ μλͺ»λ ν΄λΌμ΄μΈνΈμ λν κΆνμ κ°μ§λμ§ νμΈν΄λ³΄λ©΄ λ©λλ€. λ©μμ§ μ°κ²° κΆνμμ νμΈνλ μ¬λ¬Ό μ΄λ¦μ ν΄λΌμ΄μΈνΈ μμ΄λλ‘ μ°κ²°ν μ μλ κΆνμ κ°μ§λλ‘
ν X.509 ν΄λΌμ΄μΈνΈ μΈμ¦μ μ μ±
μ λ€μκ³Ό κ°μ΅λλ€.
ErrorCode: 5134
onConnectionFailure μ½λ°± κ²°κ³Όκ° ConnAckPacket μ΄ λΉμ΄μκ³ μλ¬ μ½λκ° 5134
λ‘ μ λ¬λλ€λ©΄ μ¬λ¬Όμ μ°κ²°λ μΈμ¦μκ° λΉνμ±ν
μνμΌ μ μμ΅λλ€. μ΄λ―Έ μ°κ²°λ ν΄λΌμ΄μΈνΈμ λν μΈμ¦μλ₯Ό λΉνμ±ννκ±°λ μΈμ¦μ μ μ±
μ λ³κ²½νλλΌλ μ΄λ―Έ μ°κ²°λ ν΄λΌμ΄μΈνΈκ° μ°κ²° ν΄μ λμ§ μμΌλ―λ‘ μμλλ©΄ μ’μ κ² κ°μ΅λλ€.