IoT core 말고 ec2로도 iot 디바이스와 연결할 수 있게 구성해보려 한다.. 나자신 화이팅!

먼저 디바이스와 통신할 수 있는 프로토콜에 대해 먼저 알아보자.(더보기 클릭)

 

더보기

IoT 통신 프로토콜

  • Bluetooth: 스마트 기기와 페어링하기 위한 웨어러블 기술 제공
  •  WiFi: 많은 양의 데이터를 제어하는 능력과 빠른 데이터 전송 속도(과도한 전력 소모가 단점)
  • ZigBee: 블루투스와 비슷, 산업체를 위해 설계된 느낌, 
  • MQTT IoT: Message Queue Telemety Transport, 원격지에서 모니터링하는 곳, TCP
  • CoAP: Constrained Application Protocol, 제한된 스마트 장치를 위해, HTTP
  • DDS: 고성능의 확장 가능한 실시간 M2M 통신을 위한 표준, 실시간 분산 애플리케이션
  • NFC: 안전한 양방향 통신 연결, 비접촉식 결제 거래
  • Cellular: 더 먼 거리에서 작동해야하는 느낌, 많은 비용과 높은 전력 소비
  • AMQP: 응용 프로그램 계층 프로토콜, Exchange / Message Queue / Binding
  • LoRaWAN: 장거리 광역 네트워크, IoT 프로토콜 광역 네트워크용
  • RFID: 무선 주파수 식별
  • Z-wave: IoT 프로토콜 저전력 RF, 무선 주파수 통신, 주로 홈 자동화 응용 프로그램에 사용
  • Sigfox: Cellular 및 WiFi 속성을 모두 포함
  • 실: 가장 최근의 IoT 프로토콜 중 하나, 홈 자동화 앱에서 사용, IPv6
  • EnOcean: 무선 감지 및 에너지 수확 플랫폼, 다양한 상황에서 응답이 필요할 때

 


AWS IoT Core가 제공하는 디바이스 통신 프로토콜은 MQTT HTTPS 이다.

https://docs.aws.amazon.com/ko_kr/iot/latest/developerguide/protocols.html

 

메시지를 게시하고 구독하기 위한 MQTT / MQTT over WebSocket(WSS) 프로토콜,

메시지를 게시하기 위한 HTTPS 프로토콜을 사용하는 디바이스 및 클라이언트를 지원!

 

MQTT

  • 제약된 디바이스를 위해 설계된 경량의 메시징 프로토콜
  • clientId로 식별되는 디바이스 연결을 지원
  • AWS IoT Device SDK 지원(디바이스를 AWS IoT에 연결할 때 권장되는 방법)
    • 만약 SDK 사용 안하면, 필요한 연결과 통신 보안을 제공하면 됨
  • MQTT QoS level 0과 1만 지원(QoS level 2의 게시 또는 구독 지원 안함..)
    • QoS level 0: 신뢰할 수 있는 통신 링크를 통해 전송되거나 누락되어도 문제 없는 메시지에 이용
    • QoS level 1: 전송한 사람이 PUBACK 응답을 수신해 성공적인 전달을 나타낼 때까지는 완료 안한 것

https://www.hardcopyworld.com/?p=3369

HTTPS

  • HTTP 1.0 또는 1.1 사용해 REST API에 요청하여 메시지 게시 가능
  • clientId 값 지원 안함
  • 클라이언트별 엔드포인트 및 주제별 URL에 대한 POST 요청을 함으로서 메시지를 게시
    • https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1"
    • IoT_data_endpoint: AWS IoT 디바이스 데이터 엔드포인트
    • url_encoded_topic_name: 전송되는 메시지의 전체 topic name

EC2에 MQTT를 올리는 작업을 해보자.

참고로 MQTT 브로커 프로그램에는 ActiveMQ, Apollo, IBM Message, Sight, RabbitMQ, Mosquitto 등이 자주 사용됨.

실습에는 Mosquitto를 사용할 예정!

( https://github.com/mqtt/mqtt.org/wiki/server-support : 브로커 특징 비교 자료)

 

  • EC2에 mosquitto 설치
sudo amazon-linux-extras install epel //epel 설치
sudo yum -y install mosquitto //mosquitto 설치
sudo systemctl start mosquitto && sudo systemctl enable mosquitto //mosquitto 서비스 시작
sudo systemctl status mosquitto // mosquitto 서비스 상태 확인

 

  • Mosquitto 사용

Mosquitto: Message 브로커로 pub&sub 명령어 지원

토픽을 구독하고 메시지를 배포!

mosquitto_sub -d -t my-topic

mosquitto_pub -d -t my-topic -m "message check"

창 두개를 띄워서 한쪽 창에서 sub 먼저 하고 다른 창에서 pub 실행해보자.

 

로그 확인

sudo tail -f /var/log/messages

 

New client가 연결된 것을 볼 수 있다!

 

 

❗ 사실 이렇게만 보면 뭘 했는지 와닿진 않는다.. 메시지를 구독(sub)하고 게시(pub)하는 건 알겠는데.. 실질적으로 IoT에서 어떻게 활용되냐 이말이야.. ❗

iot 실습하다가 Kinesis Data Streams와 Kinesis Data Firehose 차이가 와닿지 않아 개념을 좀 정리해보려 한다..


Amazon Kinesis

  • 실시간 스트리밍 데이터를 손쉽게 수집, 처리 및 분석 가능
  • 모든 규모의 스트리밍 데이터를 비용 효율적으로 처리할 수 있는 핵심 기능, 애플리케이션 요구 사항에 가장 적합한 도구를 선택할 수 있는 유연성 제공
  • 실시간 데이터: (비디오, 오디오, 애플리케이션 로그, 웹 사이트 클릭 스트림, IoT 텔레메트리 등)

Kinesis Video Streams

  • 분석, ML(기계 학습), 재생 및 기타 처리를 위해 커넥티드 디바이스에서 AWS로 비디오를 쉽고 안전하게 스트리밍
  • 수백만 대의 디바이스의 스트리밍 비디오 데이터 수집하는 데 필요한 인프라 자동으로 프로비저닝, 탄력적 스케일링

Kinesis Data Analytics

Kinesis Data Streams

  • 데이터 스트림
  • 기능: https://aws.amazon.com/ko/kinesis/data-streams/features/?nc=sn&loc=2

Kinesis Data Firehose

  • 전송 스트림
  • 기능: https://aws.amazon.com/ko/kinesis/data-firehose/?nc=sn&loc=2&dn=3

 

여기서 문제가 되는 건... Data Streams와 Data Firehose의 차이다!

Video Stream 과 Data Analytics는 이름만 봐도 알 수 있을 정도로 역할이 명확히 나뉘는데...😑


Kinesis Data Stream Console

 

Kinesis Data Firehose Console

소스: Kinesis Data Streams, Direct PUT

대상: OpenSearch Service, Redshift, S3, Coralogix, Datadog, Dynatrace, HTTP 엔드포인트 등... 

Kinesis Data Stream은 실시간으로 data들을 받아들일 수 있는 입구이자 저장소의 역할을 한다.

한 시스템이 실시간으로 데이터를 전송하면 해당 Data Stream을 듣고 있던 다른 시스템이 해당 데이터를 받아 처리

약간 pipeline이자 메시지 큐와 같은 느낌? 

 

Kinesis Data Firehose의 목적은 미리 정의된 대상(Destination)에 데이터를 안전하게 전달하는 것이다.

대상의 경우 S3 bucket, ElasticSearch, Amazon Redshift 등 데이터레이크의 역할을 할 수 있는 다양한 저장소를 의미한다.

중간에 lambda를 이용해 가공하는 작업도 가능!

 

 

❗ 다시 한번 더 정리를 해보면 ❗

  • Data Stream - low latency streaming service / Firehose - data transfer service
  • Data Stream은 길게는 일주일 까지 데이터를 잠시 저장할 수 있지만, Firehose의 경우 데이터 저장의 기능이 없음
  • Data Stream은 Stream에서 데이터를 꺼내와 작업하는 느낌이라면 Firehose는 데이터를 직접 Destination에 전달
  • Data Stream은 여러개의 Consumer를 지정할 수 있지만 Firehose는 단일 Destination을 가짐
  • Data Stream은 샤드 수를 조정하여 수동으로 Scailing, but Firehose는 데이터 요청에 따라 Scailing이 자동으로

sample

이걸 보면 알 수 있을 듯?!

Data Streams의 경우 바로 lambda로 가공을 시작하지만, Data Firehose의 경우 S3의 저장을 한 뒤에 가공을 하네?!

참고 1: https://realyun99.tistory.com/153

참고 2: https://realyun99.tistory.com/154

참고 3: https://realyun99.tistory.com/155

얼마 안남았다...! 마지막 lab!!


  • S3 버킷

버킷을 생성한다.(나머진 default로 진행)

 

  • Kinesis Data Firehose 생성

Browse를 눌러 위에서 생성했던 버킷 지정해준다.

위와 같이 추가 설정을 진행한 후 생성을 클릭

 

  • IoT Core 규칙 생성

위와 같이 규칙 작업을 추가해준다.

 

  • S3 버킷 확인하기

.gz 파일 객체 확인

→ 디바이스의 메시지가 S3 데이터 레이크에 저장되었음을 확인.

 

 

 

❗ 위의 설계도 처럼 사용하기도 하지만 보통 OpenSearch의 경우 비싸 많이 사용하지 않는다. 오히려 S3 뒤쪽으로 분석 쪽 서비스들을 더해 주로 사용하게 될듯! ❗

sample

(S3 + Glue + Athena로 분석하고 QuickSight로 시각화)

참고 1: https://realyun99.tistory.com/153

참고 2: https://realyun99.tistory.com/154

위의 포스팅 부터 확인하고 오세요~


OpenSearch Service

(Apache 2.0 라이선스 하에 제공되는 분산형 커뮤니티 기반 100% 오픈소스 검색 및 분석 제품군)

(실시간 애플리케이션 모니터링, 로그 분석 및 웹 사이트 검색과 같이 다양한 사용 사례에 사용됨)

  • CloudFormation 작업

해당 파일을 다운로드.

cfn.yaml

그 후에 스택을 생성해주자.

파라미터에 SourceIP에는 내 ip를, ThingName에는 저번에  생성했던 iot 디바이스 이름을 넣어주자.

(꽤나 오래 걸린다..)

 

스택 리소스에서 Domain을 클릭해 들어가자.

해당 url에 들어가자.

 

<Stack 생성 완료의 결과물>

- OpenSearch 도메인

- IoT 규칙(opensearch_rule)

- IoT 규칙에서 사용되는 IAM 역할

 

  • OpenSearch 작업

(메뉴 → Discover)

스크립트를 돌리는 상태에서 실행해야함(cloud9)

위와 같은 화면이 보이고 Create index pattern을 클릭하자.

자동으로 데이터가 분석되는 상황을 확인할 수 있다.

 

다시 메뉴 → Discover로 돌아가보면

OpenSearch 대시보드 화면에 데이터가 등록되어 있는지 확인이 가능하다.

 

(메뉴 → Visualize)

Line 선택 → timestamp* 선택

위와 같이 설정해주고 업데이트 클릭

SAVE 버튼 누르고 원하는 title 달아서 저장 가능

(입맛대로 설정을 변경해서 새 그래프를 추가해 사용 사례에 맞는 대시보드로 활용하면 될듯!)

 

 

❗ 세상이 참 좋아졌다는 것을 느낀다😁 ❗

1편에서 장치 설치 하고 오기!

https://realyun99.tistory.com/153

이어서 진행해보자..


Kinesis Data Streams

  • 스트림 생성

 

DynamoDB

  • DB 생성

 

Lambda

  • IAM 역할 생성 - Lambda

  • IAM 역할 생성 - IoT

권한의 경우 알아서 추가해줌.. 그대로 진행하면 됨

 

  • Lambda 함수 생성 및 트리거 추가

역할의 경우 위에서 만들었던 IAM Lambda 역할을 지정해주자.

 

다음으로 트리거 추가를 하자. 먼저 Kinesis!

함수에 코드를 추가해주자.. 추가 후에 꼭 Deploy 버튼 누르기!!!!!!

더보기
from __future__ import print_function
import base64
import boto3
from boto3.dynamodb.conditions import Key, Attr
import json
import os
import traceback

#-----Dynamo Info change here------
TABLE_NAME = os.environ.get('TABLE_NAME', "default")
DDB_PRIMARY_KEY = "deviceid"
DDB_SORT_KEY = "timestamp"
DDB_ATTR = "temp"
#-----Dynamo Info change here------

dynamodb = boto3.resource('dynamodb')
table  = dynamodb.Table(TABLE_NAME)

'''
This Kinesis data(Json Image) is below
{
    "DEVICE_NAME": $device_name,
    "TIMESTAMP": $TimeStamp(yyyy-mm-ddThh:MM:SS),
    "HUMIDITY" : int,
    "TEMPERATURE" : int
}
'''
def checkItem(str_data):
    try:
        #String to Json object
        json_data = json.loads(str_data)
        # adjust your data format
        resDict = {
            DDB_PRIMARY_KEY:json_data['DEVICE_NAME'],
            DDB_SORT_KEY:json_data['TIMESTAMP'],
            "HUMIDITY": json_data['HUMIDITY'],
            "TEMPERATURE": json_data['TEMPERATURE']

        }
        print("resDict:{}".format(resDict))
        return resDict

    except Exception as e:
        print(traceback.format_exc())
        return None

def writeItemInfo(datas):
    ItemInfoDictList = []
    try:
        for data in datas:
            itemDict = checkItem(data)
            if None != itemDict:
                ItemInfoDictList.append(itemDict)
            # if data does not have key info, just pass
            else:
                print("Error data found:{}".format(data))
                pass

    except Exception as e:
        print(traceback.format_exc())
        print("Error on writeItemInfo")

    return ItemInfoDictList

def DynamoBulkPut(datas):
    try:
        putItemDictList = writeItemInfo(datas)
        with table.batch_writer() as batch:
            for putItemDict in putItemDictList:
                batch.put_item(Item = putItemDict)
        return

    except Exception as e:
        print("Error on DynamoBulkPut()")
        raise e

def decodeKinesisData(dataList):
    decodedList = []
    try:
        for data in dataList:
            payload =  base64.b64decode(data['kinesis']['data'])
            print("payload={}".format(payload))
            decodedList.append(payload)

        return decodedList

    except Exception as e:
        print("Error on decodeKinesisData()")
        raise e

#------------------------------------------------------------------------
# call by Lambda here.
#------------------------------------------------------------------------
def lambda_handler(event, context):
    print("lambda_handler start")

    try:
        print("---------------json inside----------------")
        print(json.dumps(event))
        encodeKinesisList = event['Records']
        print(encodeKinesisList)
        decodedKinesisList = decodeKinesisData(encodeKinesisList)
        # Dynamo Put
        if 0 < len(decodedKinesisList):
            DynamoBulkPut(decodedKinesisList)
        else:
            print("there is no valid data in Kinesis stream, all data passed")

        return

    except Exception as e:
        print(traceback.format_exc())
        # This is sample source. When error occur this return success and ignore the error.
        raise e

 

환경 변수 지정을 위해 설정을 들어가자 (구성 → 환경변수)

DynamoDB 테이블을 넣어주자

 

IoT Core 확인

  • 메시지 라우팅 규칙 생성

(메시지 라우팅 → 규칙)

from 뒤에는 아까 생성했던 디바이스의 topic을 넣어준다.

 

IoT와 Kinesis를 연결해준다. IoT 디바이스에서 데이터를 받아와 Kinesis로 흐르게

Role도 아까 생성했던 iot 역할로 지정해준다.

 

현재 iot 디바이스 연결도 잘 되어 있는 것을 볼 수 있음.

 

  • Kinesis Stream 모니터링

또, 위에서 연결했던 Kinesis의 모니터링을 보면 데이터가 잘 들어오는 것을 볼 수 있다.

(지표들 중에서 GetRecords - 합계 | PutRecords - 합계 값이 0이 아닌지 확인)

시간이 좀 지나야 해당 그래프를 볼 수 있음...!

  • DynamoDB 모니터링

라이브 항목 수 가져오기 클릭

항목 탐색을 확인해보자.

 

  • Lambda 모니터링

(Invocations 그래프가 끝에 떨어지는 모양은 내가 cloud9 실행을 멈췄기 때문/ 스크립트 계속 돌리면 그래프 유지됨.)

 

API 용 Lambda 구성

  • Lambda 함수 만들기

해당 코드를 넣어준다.(Deploy 클릭)

더보기
from __future__ import print_function
import boto3
from boto3.dynamodb.conditions import Key
import datetime
import json
import traceback
import os

#-----Dynamo Info change here------
TABLE_NAME = os.environ.get('TABLE_NAME', "default")
DDB_PRIMARY_KEY = "deviceid"
DDB_SORT_KEY = "timestamp"
#-----Dynamo Info change here------

dynamodb = boto3.resource('dynamodb')
table  = dynamodb.Table(TABLE_NAME)

#------------------------------------------------------------------------
def dynamoQuery(deviceid, requestTime):
    print("dynamoQuery start")
    valList = []
    res = table.query(
        KeyConditionExpression=
            Key(DDB_PRIMARY_KEY).eq(deviceid) &
            Key(DDB_SORT_KEY).lt(requestTime),
            ScanIndexForward = False,
            Limit = 30
        )

    for row in res['Items']:
        val = row['TEMPERATURE']
        itemDict = {
            "timestamp":row['timestamp'],
            "value":int(val)
        }
        valList.append(itemDict)

    return valList

#------------------------------------------------------------------------
# call by Lambda here.
#  Event structure : API-Gateway Lambda proxy post
#------------------------------------------------------------------------
def lambda_handler(event, context):
    #Lambda Proxy response back template
    HttpRes = {
        "statusCode": 200,
        "headers": {"Access-Control-Allow-Origin" : "*"},
        "body": "",
        "isBase64Encoded": False
    }

    try:
        print("lambda_handler start")
        print(json.dumps(event))

        # get Parameters
        pathParameters = event.get('pathParameters')
        deviceid = pathParameters["deviceid"]
        requestTime = datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S')

        resItemDict = { deviceid : ""}
        resItemDict[deviceid] = dynamoQuery(deviceid, requestTime)
        HttpRes['body'] = json.dumps(resItemDict)

    except Exception as e:
        print(traceback.format_exc())
        HttpRes["statusCode"] = 500
        HttpRes["body"] = "Lambda error. check lambda log"

    print("response:{}".format(json.dumps(HttpRes)))
    return HttpRes

위에서 했던 것과 같이 DynamoDB 환경변수를 넣어준다.

 

API Gateway

  • REST API 생성

(작업 → 리소스 생성)

(/datas 클릭 후 리소스 생성)

리소스 경로 괄호에 주의하라

(/deviceid에서 매서드 생성)

권한 추가는 확인을 클릭해준다.

위와 같은 화면이 구성되면 완료.

(작업 → CORS 활성화)

/{deviceid} 에서 cors 활성화!

(작업 → API 배포)

/{deviceid} 에서 api 배포를 진행하자.

생성된 url을 복사해두자.

 

DrawGraph.zip을 받고

(js/createGraph.js 파일)

첫번째 줄 device_name에 만들었던 디바이스 입력

두번째 줄 hosturl에 api url 입력

 

다운받았던 폴더에서 html 브라우저에서 실행하면

다음과 같은 그래프가 나오면 성공이다.(해당 그래프 나올 때까지의 시간이 걸릴 수 있음!)

위의 값은 DynamoDB에 저장된 디바이스의 Temperature값을 표시한다.

 

 

❗ 다음엔 실시간 시각화 OpenSearch를 사용해보자. ❗

참고: https://catalog.us-east-1.prod.workshops.aws/workshops/b3e0b830-79b8-4c1d-8a4c-e10406600035/ja-JP/phase1

일본어로 된 workshop 자료라... 최신 버전이 이것밖에 없었따..😥 번역기 돌려서 사용하세요

 


Device Setup

  • Cloud9 인스턴스 생성

서울 리전 기준으로 t3.small 이상으로 잡아야 생성 가능!

이 인스턴스가 디바이스 역할을 해줄 예정(나중에 라즈베리파이로도 진행해보자)

 

  • AWS IoT Device SDK Python v2 설치

아래의 명령어를 Cloud9 인스턴스에 입력하자.

pip3 install --user awsiotsdk
mkdir -p ~/environment/dummy_client/certs/
cd ~/environment/dummy_client/
wget https://awsj-iot-handson.s3-ap-northeast-1.amazonaws.com/aws-iot-core-workshop/dummy_client/device_main.py -O device_main.py

 

IoT Core Setup

  • IoT Core 정의

IoT 설정의 디바이스 데이터 엔드포인트 값을 복사한다.

다음으로 로그 관리를 클릭 하고 로그 설정을 해주자.

IAM 역할은 새로 생성해주자!

 

  • IoT Policy 생성

(side menu → 보안 → 정책)

❗ 현재 정책 설정을 모든 작업 모든 리소스를 허용하게끔 되어 있는데, 이건 테스트 용이니까 광범위하게 설정한 것..

프로젝트를 할 때에는 최소한의 권한으로 설정해둘 것! ❗
보통 최소한의 권한의 경우(workshop 기준, 도쿄 리전)

더보기

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "arn:aws:iot:ap-northeast-1:123456789012:client/${iot:ClientId}"
    },
    {
      "Effect": "Allow",
      "Action": "iot:Publish",
      "Resource": [
        "arn:aws:iot:ap-northeast-1:123456789012:topic/data/${iot:Connection.Thing.ThingName}",
        "arn:aws:iot:ap-northeast-1:123456789012:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update",
        "arn:aws:iot:ap-northeast-1:123456789012:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/get"
      ]
    },
    {
      "Effect": "Allow",
      "Action": "iot:Receive",
      "Resource": [
        "arn:aws:iot:ap-northeast-1:123456789012:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/delta",
        "arn:aws:iot:ap-northeast-1:123456789012:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/accepted",
        "arn:aws:iot:ap-northeast-1:123456789012:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/rejected",
        "arn:aws:iot:ap-northeast-1:123456789012:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/get/accepted",
        "arn:aws:iot:ap-northeast-1:123456789012:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/get/rejected"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Subscribe"
      ],
      "Resource": [
        "arn:aws:iot:ap-northeast-1:123456789012:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/delta",
        "arn:aws:iot:ap-northeast-1:123456789012:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/accepted",
        "arn:aws:iot:ap-northeast-1:123456789012:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/rejected",
        "arn:aws:iot:ap-northeast-1:123456789012:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/get/accepted",
        "arn:aws:iot:ap-northeast-1:123456789012:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/get/rejected"
      ]
    }
  ]
}

 

  • 디바이스 생성

(모든 디바이스 → 사물)

단일 사물 생성

새 인증서 자동 생성(권장)

정책의 경우 위에서 생성했던 정책 클릭

인증서랑 키 파일 다운로드

 

  • Cloud9 인스턴스에 키파일 등록

private.pem.key와 certificate.pem.crt 업로드

아래의 명령어 입력

cd ~/environment/dummy_client
wget https://www.amazontrust.com/repository/AmazonRootCA1.pem -O certs/AmazonRootCA1.pem

 

  • Device SDK

해당 명령어들 터미널에 입력한다.

cd ~/environment/dummy_client/
python3 device_main.py --device_name {Device_name} --endpoint {AWS IoT endpoint_url}

해당 커멘드를 실행하면 dummy_client는 IoT Core에 MQTT로 연결하고 5초 마다 메세지 전송(default)

 

  • Device Test

(테스트 → MQTT 테스트 클라이언트)

아까 위에서 실행했던 커멘드 출력들 중 topic을 알아두자.

해당 topic을 구독하면 device에서 보내는 메시지를 확인할 수 있다.

 

  • Device Shadow 확인

해당 클래식 섀도우에 들어가 디바이스 섀도우 문서 편집을 누른다.

해당 코드를 

{
    "state": {
        "reported": {
            "wait_time": 5
        },
        "desired": {
            "wait_time": 1
        }
    }
}

로 변경하고 업데이트 해준다.

업데이트 후 문서에 "welcome": "aws-iot" 가 남아있으면, 

위 이미지처럼 null 값을 넣어준다. wait_time 값을 변경하면 device가 data를 보내는 빈도가 바뀜.

desired: 디바이스에 지시하고 있는 상태

reported: 디바이스로부터 보고된 상태

delta: desired와 reported 상태에 차이가 있을 때 표시됨

섀도우에서 다시 해당 문서를 wait_time을 2로 변경하면 터미널에서도 확인할 수 있다.

MQTT 테스트 쪽에서 주제를 다시 구독한 후 확인하면 데이터가 전송되는 간격이 변경되었다는 것을 확인할 수 있음.

 

 

❗ 다음 포스팅은 애플리케이션용 DB 만들기에 관해 포스팅 올릴 계획!  ❗

+ Recent posts