일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- AWS CLI
- parse
- mac os git error
- JUnit
- mysql executequery error
- xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)
- java 버전 변경
- ssl프로토콜확인
- java 여러개 버전
- LeetCode
- springboottest
- 스프링부트테스트
- java 11
- ssl이란?
- OpenFeign
- Medium
- tls프로토콜확인
- easy
- statement.executequery() cannot issue statements that do not produce result sets.
- aws
- error
- No tests found for given includes
- yum install java
- java version
- log error
- Java 1.8
- java 1.8 11
- java
- xcrun: error: invalid active developer path
- springboot
- Today
- Total
쩨이엠 개발 블로그
AWSIotDeviceProperty 받아오기 ( java ) 본문
AWSIoTDevice에는 shadow 기능이 있다
AWS IoT 콘솔에서 사물 -> 섀도우를 보면 섀도우 문서가 있는데 현재 내가 테스트할 프로퍼티는 REPORT_TOPIC이다
이것을 AWS SDK를 통해서 받아오도록 할 예정이다
섀도우의 desired JSON을 편집하면 sdk를 가진 AWSIoTDevice에서 받고 그 Device에서 reported JSON을 업데이트한다
AWS IoT -> Desired -> AWSIoTDevice
AWS IoT <- Reported <- AWSIoTDevice
섀도우를 사용할 수 있는 방법은 HTTP와 MQTT방식이 있는데 이번에는 MQTTClient를 이용할 예정이다
MQTTClient에 연결하기 위해서는 AWSIoT 콘솔에서의 선작업이 필요하다
1. endpoint 설정
mqttClient에 필요한 endpoint는 AWS IoT 콘솔의 설정탭에서 확인할 수 있다
내 경우는 application.yml의 프로퍼티에 저장해놨다
2. certificateFile 및 privateKeyFile 확인
mqttClient를 connect 하기 위해서는 AWS IoT에서 정책과 인증서가 필요하다
인증서를 만드는 방법은 두가지가 있다
사물을 만들 때 인증서를 만드는 방법과 인증서를 생성한 뒤 사물을 연결하는 방법.
편한대로 하면 된다
인증서 생성을 클릭했을 때 보이는
xxx.cert.pem이 certificateFile
xxx.private.key파일이 privateKeyFile이다
여깃 다운 못받으면 다시 만들어야하니 꼭 다운로드 해놓은 뒤 정책 연결을 클릭한다
정책과 인증서를 연결한뒤 완료를 누르고
원하는 Thing까지 인증서에 연결해놓으면 연결은 완료된다
3. 정책 문서 변경(선택사항)
기본 문서는 전체 다 받겠다는 *이지만 좀더 보안에 신경 쓰기 위해 정책문서를 변경하기로 한다
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:*",
"Resource": "*"
}
]
}
AWS IoT콘솔의 보안 > 정책 탭에서 아까 만든 정책의 개요에 들어가면 보이는 정책 문서를 편집한다
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "arn:aws:iot:ap-northeast-2:xxxxxxxxxx:client/test-client"
},
{
"Effect": "Allow",
"Action": "iot:Publish",
"Resource": "arn:aws:iot:ap-northeast-2:xxxxxxxxxx:topic/$aws/rules/**"
},
{
"Effect": "Allow",
"Action": [
"iot:Publish",
"iot:Receive"
],
"Resource": "arn:aws:iot:ap-northeast-2:xxxxxxxxxx:topic/$aws/things/*/**"
},
{
"Effect": "Allow",
"Action": "iot:Subscribe",
"Resource": "arn:aws:iot:ap-northeast-2:xxxxxxxxxx:topicfilter/$aws/things/*/**"
},
{
"Effect": "Allow",
"Action": [
"iot:GetThingShadow",
"iot:UpdateThingShadow",
"iot:DeleteThingShadow"
],
"Resource": "arn:aws:iot:ap-northeast-2:xxxxxxxxxx:thing/*"
}
]
}
AWS IoT는 단어들이 직관적이라 보기에 편하다
Connect : clientId가 test-client인 connect만 허용한다
Publish : topic명이 $aws/rules/로 시작하는 data만 publish를 허용한다
Receive : Thing에 대한건 다 받겠다 (publish도 마찬가지)
Subscribe : Thing에 대한건 다 받겠다 (shadow/update/accepted 등등 섀도우에 대한 구독)
마지막은 Shadow에 대한 get, update, delete를 허용한다는 정책
사전작업은 끝났다 이제 코드 짜기
필요한 dependency
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-iot-device-sdk-java</artifactId>
<version>1.3.6</version>
</dependency>
AWSIoTDevice 상속할 class
public static class SensorDevice extends AWSIotDevice {
public SensorDevice(String thingName) {
super(thingName);
}
@AWSIotDeviceProperty(name = "REPORT_TOPIC")
public String reportTopic;
public void setReportTopic(String reportTopic) {
log.info("{} : reportTopic setter with {}", thingName, reportTopic);
this.reportTopic = reportTopic;
}
public String getReportTopic() {
log.info("{} : reportTopic getter with {}", thingName, reportTopic);
return reportTopic;
}
}
property 어노테이션의 name을 사용하여 가져올 프로퍼티 이름을 다르게 지을 수 있다
SensorDevice 만들기
Report interval은 1초로 설정하였다 reportTopic을 연결한 1초 뒤에 받아볼 수 있다
private static final long REPORT_INTERVAL = 1000L;
public SensorDevice getDevice(SensorData data, String thingName){
SensorDevice sensorDevice = new SensorDevice(thingName);
sensorDevice.setReportInterval(REPORT_INTERVAL);
return sensorDevice;
}
이제 MqttClient에 연결한다
@Slf4j
@Service
public class AWSPublisher {
private AWSIotMqttClient mqttClient;
...
@PostConstruct
private void initialize() throws Exception {
mqttClient = new AWSIotMqttClient(endpoint, clientId, certificateFile, privateKeyFile);
List<SensorData> deviceList = getList();
for(SensorData data : deviceList){
addDevice(data);
}
mqttClient.connect();
}
private void addDevice(SensorData data) {
SensorDevice awsIotDevice = getDevice(data, getThingName(data));
try {
mqttClient.attach(awsIotDevice);
} catch (AWSIotException e) {
log.error("addDevice Error : {}", e.getMessage());
}
}
clientId는 정책의 Connect 부분의 clientId를 사용하며
certificateFile와 privateKeyFile은 그 파일들의 위치를 설정하면 된다
(참고 : https://github.com/aws/aws-iot-device-sdk-java )
실행한 콘솔 화면
처음에 getter로 null이 뜬 뒤 setter로 AWS IoT의 REPORT_TOPIC이 세팅된다
그 이후 REPORT_INTERVAL인 1초마다 getter를 호출한다
'개발 > AWS' 카테고리의 다른 글
[ AWS ] AWSIotException: TOO_MANY_REQUESTS (0) | 2020.08.05 |
---|---|
[ ec2 ] Java jdk 설치 (0) | 2020.07.21 |
[ AWS CLI] AWS 계정 변경하기 (0) | 2020.06.28 |
AWS RDS 한글깨짐 현상 / 인코딩 오류 (0) | 2020.04.26 |
AWS RDS 생성하기 (0) | 2020.04.25 |