이번 실습에서는 수집된 온도가 25도를 넘어갈 경우, AWS SNS를 통해 경고 이메일을 전송하는 IoT 백엔드를 AWS IoT Core, AWS Lambda, Amazon SNS 서비스를 이용하여 구축한다.
IoT 서비스 아키텍처
다음 예와 같은 주제 ARN을 클립보드에 복사합니다.
arn:aws:sns:ap-northeast-2:123456789012:temerature_warning_topic
build.gradle 파일을 열고 다음 의존성을 추가하고, 변경사항을 반영합니다.
dependencies {
...
implementation 'com.google.code.gson:gson:2.9.0'
...
}
src/main/java/helloworld/App.java 파일을 아래 코드로 대체하고, AccessKey, SecretKey, topicArn을 여러분의 설정 값으로 변경하세요
package helloworld;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.AmazonSNSClientBuilder;
import com.amazonaws.services.sns.model.PublishRequest;
import com.amazonaws.services.sns.model.PublishResult;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
public class App implements RequestHandler<Object, String> {
public String handleRequest(Object input, Context context) {
context.getLogger().log("Input: " + input);
String json = ""+input;
JsonParser parser = new JsonParser();
JsonElement element = parser.parse(json);
JsonElement state = element.getAsJsonObject().get("state");
JsonElement reported = state.getAsJsonObject().get("reported");
String temperature = reported.getAsJsonObject().get("temperature").getAsString();
double temp = Double.valueOf(temperature);
final String AccessKey="AKIA435ITC3CFRXUR4XX";
final String SecretKey="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";
final String topicArn="arn:aws:sns:ap-northeast-2:884579964612:MyTopic";
BasicAWSCredentials awsCreds = new BasicAWSCredentials(AccessKey, SecretKey);
AmazonSNS sns = AmazonSNSClientBuilder.standard()
.withRegion(Regions.AP_NORTHEAST_2)
.withCredentials( new AWSStaticCredentialsProvider(awsCreds) )
.build();
final String msg = "*Temperature Critical*\n" + "Your device temperature is " + temp + "C";
final String subject = "Critical Warning";
if (temp >= 26.0) {
PublishRequest publishRequest = new PublishRequest(topicArn, msg, subject);
PublishResult publishResponse = sns.publish(publishRequest);
}
return subject+ "temperature = " + temperature + "!";
}
}
데이터 창에 다음 JSON 문자열을 입력하고 Run 클릭
{
"state":
{
"reported":
{
"temperature":26.0, "LED":"OFF"
}
}
}
SQL 문 구성 페이지에서 SQL 문 란에 다음 쿼리를 입력합니다.
SELECT * FROM '$aws/things/MyMKRWiFi1010/shadow/update/accepted'
검토 및 생성 페이지에서 단계별 내용을 검토 후에 생성을 선택합니다.