쩨이엠 개발 블로그

AWSIotDeviceProperty 받아오기 ( java ) 본문

개발/AWS

AWSIotDeviceProperty 받아오기 ( java )

쩨이엠 2020. 6. 3. 17:15
728x90
반응형

 

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를 호출한다

 

 

728x90
반응형

'개발 > 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
Comments