AWS IoT의 Thing Shadow를 부담없이 시도해보기 with mosquitto

17510 단어 awsIoTmosquittoAWS
AWS IoT를 여러가지 시험해 보았습니다만, 자주(잘) 보는 Thing Shadow에 관해서는 설명문만으로는 금방 핀 때 없었습니다. 우선 shadow를 만져 보면, 구조나 할 수 있는 것의 이미지가 붙었습니다.
간단하게 요점을 5개 씁니다.
  • Thing Shadow는, 디바이스의 상태를 관리할 수 있는 기능.
  • Thing Shadow에서 사용할 수 있는 topic명은, 미리 정해져 있다. (기사 투고 시점에서 11 개 ⇒ 일단 전부 시도한 결과를 아래에 썼습니다)
  • Thing Shadow에 디바이스 상태를 보내려면, JSON 형식으로 "state"섹션을 기술한 것을 publish 한다.
  • 위의 "state"섹션에는 장치의 현재 상태를 알리는 "보고 된"섹션과 장치에 대한 지시를 알리는 "desired"섹션이 있습니다.
  • Thing Shadow에의 subscribe에 의해 받은 JSON 파일에는, 디바이스 상태 "state"외에 타임 스탬프 등의 "metadata"가 포함된다.

  • 여기에서는 부담없이 mosquitto를 사용하여 시도한 결과를 올립니다.

    전제 조건은
    · mosquitto-clients를 이용하여 AWS IoT와의 Pub/Sub가 되어 있는 것
    htps : // m / TKYK38 / ms / 2 또는 19b27503f6에 0dfc84
    입니다.

    AWS 콘솔에서 섀도우 문서를 열어 둡니다.



    이것을 열면서 작업하면 상태가 업데이트되는 곳을 잘 이해할 수 있습니다.
    (IoT 콘솔 > 관리 > 사물 > 섀도우로 열 수 있습니다)


    publish용 샘플 스크립트



    pub.shadow.sh
    #!/bin/bash
    
    endpoint=`aws iot describe-endpoint`
    
    keydir=/home/ubuntu/iot_sdk
    
    ### update
    topic=\$aws/things/EC2_ubuntu/shadow/update
    
    ### get
    #topic=\$aws/things/EC2_ubuntu/shadow/get
    
    ### delete
    #topic=\$aws/things/EC2_ubuntu/shadow/delete
    
    #ifile=shadow.desired.json
    ifile=shadow.reported.json
    
    mosquitto_pub --cafile ${keydir}/root-CA.crt --cert ${keydir}/EC2_ubuntu.cert.pem --key ${keydir}/EC2_ubuntu.private.key -h "${endpoint}" -p 8883 -q 1 -t ${topic} -i mosquitto_pub -f ${ifile}
    

    subscribe용 샘플 스크립트



    sub.shadow.sh
    endpoint=`aws iot describe-endpoint`
    
    keydir=/home/ubuntu/iot_sdk
    
    topic=\$aws/things/EC2_ubuntu/shadow/update
    #topic=\$aws/things/EC2_ubuntu/shadow/update/accepted
    #topic=\$aws/things/EC2_ubuntu/shadow/update/documents
    #topic=\$aws/things/EC2_ubuntu/shadow/update/rejected
    #topic=\$aws/things/EC2_ubuntu/shadow/update/delta
    #topic=\$aws/things/EC2_ubuntu/shadow/get
    #topic=\$aws/things/EC2_ubuntu/shadow/get/accepted
    #topic=\$aws/things/EC2_ubuntu/shadow/get/rejected
    #topic=\$aws/things/EC2_ubuntu/shadow/delete
    #topic=\$aws/things/EC2_ubuntu/shadow/delete/accepted
    #topic=\$aws/things/EC2_ubuntu/shadow/delete/rejected
    
    mosquitto_sub --cafile ${cadir}/root-CA.crt --cert ${keydir}/tmp.cert.txt --key ${keydir}/tmp.private.txt -h "${endpoint}" -p 8883 -q 1 -t ${topic}
    

    디바이스 상태를 알리는 JSON 샘플



    shadow.reported.json
    {
        "state" : {
            "reported" : {
                "color" : "yellow",
                "power" : "on"
             }
         }
    }
    

    장치에 지시(상태 업데이트)를 위한 JSON 샘플



    shadow.desired.json
    {
        "state" : {
            "desired" : {
                "color" : "red",
                "power" : "on"
             }
         }
    }
    

    장치 상태 업데이트 /update



    /update/accepted를 sub한 상태에서 /update에 shadow.reported.json을 pub



    다음과 같은 JSON을 subscribe 할 수 있다.
    {"state":{"reported":{"color":"yellow","power":"on"}},"metadata":{"reported":{"color":{"timestamp":1512807898},"power":{"timestamp":1512807898}}},"version":13,"timestamp":1512807898}
    

    /update/documents를 sub한 상태에서 /update에 shadow.reported.json을 pub



    다음과 같은 JSON을 subscribe 할 수 있다.
    {"previous":{"state":{"desired":{"color":"red","power":"on"},"reported":{"color":"blue","power":"on"}},"metadata":{"desired":{"color":{"timestamp":1512805884},"power":{"timestamp":1512805884}},"reported":{"color":{"timestamp":1512808170},"power":{"timestamp":1512808170}}},"version":17},"current":{"state":{"desired":{"color":"red","power":"on"},"reported":{"color":"blue","power":"on"}},"metadata":{"desired":{"color":{"timestamp":1512805884},"power":{"timestamp":1512805884}},"reported":{"color":{"timestamp":1512808184},"power":{"timestamp":1512808184}}},"version":18},"timestamp":1512808184}
    

    /update/rejected를 sub한 상태에서 /update에 shadow.reported.json을 pub



    예를 들어, "reported"를 "report"로 변경하고 pub 해 보면 다음과 같은 에러(JSON)를 subscribe 할 수 있다.
    {"code":400,"message":"State contains an invalid node: 'report'"}
    

    /update/delta를 sub한 상태에서 /update에 shadow.reported.json을 pub



    reported와 desired의 차이가 있는 경우에 subscribe 할 수 있다.
    {"version":21,"timestamp":1512808331,"state":{"color":"red"},"metadata":{"color":{"timestamp":1512805884}}}
    

    디바이스 상태 얻기 /get



    /get/accepted 를 sub한 상태에서, /get에 메세지를 pub 한다



    /get에 pub하면, desired와 reported 양쪽 모두의 정보를 subscribe 할 수 있다.
    (/get에 pub하는 메세지는 무엇이든 좋다.)
    {"state":{"desired":{"color":"red","power":"on"},"reported":{"color":"yellow","power":"on"}},"metadata":{"desired":{"color":{"timestamp":1512805884},"power":{"timestamp":1512805884}},"reported":{"color":{"timestamp":1512808392},"power":{"timestamp":1512808392}}},"version":23,"timestamp":1512808573}
    

    /get/rejected 를 sub한 상태에서, /get에 메세지를 pub 한다



    shadow가 존재하지 않는 상태에서/get에 pub하면 다음과 같은 에러(JSON)를 subscribe 할 수 있다.
    {"code":404,"message":"No shadow exists with name: 'EC2_ubuntu'"}
    

    장치 상태 삭제 /delete



    /delete/accepted 를 sub한 상태에서 /delete에 메시지를 pub



    shadow가 삭제되면 다음과 같은 JSON을 subscribe 할 수 있습니다.
    {"version":23,"timestamp":1512809286}
    

    /delete/rejected 를 sub한 상태에서 /delete에 메시지를 pub



    shadow가 존재하지 않는 상태에서 shadow를 삭제하려고 하면 다음과 같은 에러(JSON)를 subscribe 할 수 있다.
    {"code":404,"message":"No shadow exists with name: 'EC2_ubuntu'"}
    

    참고 정보



    AWS IoT 개발자 가이드입니다.
    Thing Shadow의 MQTT 주제

    좋은 웹페이지 즐겨찾기