본문 바로가기

프로그래밍/IoT

[AWS IoT] aws-iot-device-sdk로 sample client 만들기 (1편)

반응형

함께 Bootcamp를 했었던 동료들과 각자 개발하고 있는 프로젝트에 대해서 공유를 한 적이 있었다.

IoT Service를 개발하는 조직에서 Platform 개발을 하고 있다고 하니, Node.js로도 IoT 개발이 가능한 지 신기해하는 반응이 대다수였다.

 

IoT에서 가장 중요한 것 중 하나가 T(Things)에 해당하는 Device일 텐데

당연히 Device하면 임베디드 개발과 C#과 같은 언어를 사용한 개발이 가장 먼저 떠오르니, 당연한 반응이다.

 

라즈베리파이와 같은 edge 장비의 역할을 할 수 있는 기기가 보편화되면서 다양한 언어로 IoT Device를 구현할 수 있는 방법이 생겼다.

AWS IoT에서 제공하는 aws-iot-device-sdk도 다양한 언어로 제공하고 있다. (링크)

 

aws-iot-device-sdk-js

JavaScript용 AWS IoT 디바이스 SDK는 MQTT 프로토콜을 사용하여 AWS IoT에 access하는 JavaScript용 애플리케이션을 구현할 수 있도록 환경을 제공하고 있다.

실제 sdk 모듈을 확인해보면, mqtt.js 모듈을 wrapping하여 사용하는 것으로서 조금 더 편리하게 사용할 수 있도록 모듈화하였다.

 

sdk 중 Device Class를 활용한 Sample Client를 만들어보겠다.

이 때, aws-iot-device-sdk는 기본적으로 event 형식으로 동작이 이뤄진다.

Sample Client 예시

const awsIoT = require('aws-iot-device-sdk');

// awsIoT Device 객세 생성
const device = awsIoT.device({
      keyPath: 'resources/private.pem.key',
      certPath: 'resources/certificate.pem.crt',
      caPath: 'resources/AmazonRootCA1.pem',
      clientId: 'thingName',
      host: process.env.AWS_IOT_HOST,
      keepalive: 10    // AWS IoT supports kepp-alive values between 5 and 1200
});

// mqtt connect
device.on('connect', (connack) => {
  console.log(connack);
  device.subscribe('topic/A');
  device.publish('topic/B', JSON.stringify({ data: 'test' }), { qos: 1 });
});

// message 수신 event
device.on('message', (topic, payload) => {
	console.log('message', topic, payload.toString());
})

// close event
device.on('close', (err) => err && console.log(err));

// reconnect event
device.on('reconnect', () => { });


// offline event
deive.on('offline', () => { });

// error event
deive.on('error', (error) => error && console.log(error));

기본적인 샘플은 위와 같다.

 

Device 객체 생성

우선은 인증서 정보와 MQTT 연결을 시도할 host 정보, MQTT 연결 시의 clientId로서 ThingName을 입력한다.

주기적인 ping 요청 시간을 sdk에서는 keepalive 옵션으로 관리하고 있기 때문에 서비스 상황에 따라 적절한 값을 입력한다.

이러한 기본 정보를 설정한 뒤, Device Class를 호출하여 Device 객체를 생성하면 된다.

 

Device의 Event 관리

sdk에서 제공하는 event 중 대표적으로는 위의 6가지가 있다.

  • connect : Broker에 최초로 연결을 할 때 발생하는 이벤트이다.
  • message : Broker 상에서 수신하게 되는 메시지가 존재할 경우 발생하는 이벤트이다.
  • close : Broker에러로 인해 다시 재접속을 시도하기 전에 기존의 연결을 종료하는 등 mqtt 연결 종료 이벤트이다.
  • reconnect : 다시 Broker에 연결을 시도하는 재시도 이벤트이다.
  • offline : Broker와의 통신 오류로 인해 접속 실패가 나는 등 mqtt offline 상태가 되면 수신하는 이벤트이다.
  • error : Broker 상에서 에러가 발생한 경우, Error 이벤트를 수신하게 된다. 

Device의 Method

지금 현재 IoT Device의 구현체를 만들고 있기 때문에 기본적인 Publish와 Subscribe이 되어야 한다.

subscribe는 바로 호출 가능한 메소드이며, 구독하고자하는 토픽을 입력하면 된다.

publish는 위의 예시에서와 같이 Topic과 string 형태의 payload를 기본적으로 입력하고 각 상황에 맞춰서 필요한 경우 QoS Level을 설정하여 Publish가 가능하다.


하지만 실제로 위의 방식과 같이 구현을 하기에는 너무 부족함이 많은 코드이기 때문에 아래의 Github에 샘플 클라이언트 파일을 구현하여 commit해두었다.

https://github.com/jaestory/blog_logs/tree/master/IoT/aws-iot-device-sdk-js

 

jaestory/blog_logs

Contribute to jaestory/blog_logs development by creating an account on GitHub.

github.com

1편에서는 기본적인 skeleton을 만드는 것까지로 마무리하고자 한다.

하지만 skeleton 이후의 작업은 실제 서비스 환경에 맞춰서 Publish를 하거나, Message를 수신하여 특정 이벤트를 실행하는 것 등이기 때문에 2편이나 후속 작업이 필요할까에 대한 생각이 들기는 한다.

 

하지만 Skeleton 상에서도 보완할 만한 사항들이 있을 수 있기 때문에

신규 commit이나 추가적인 변경사항이 생길 경우, 해당 내용들을 기반으로 2편을 준비해보겠다.

(추가적으로, 위의 깃 내용이 도움이 되셨다면 star 부탁드립니다.)

반응형