간단한 단계별 예제 - AWS IoT Events

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

간단한 단계별 예제

이 예제에서는 AWS CLI 명령을 사용하여 AWS IoT Events API를 호출하여 엔진의 두 가지 상태, 즉 정상 상태와 과압 상태를 모델링하는 감지기를 생성합니다.

엔진에서 측정된 압력이 특정 임계값을 초과하면 모델은 과압 상태로 전환하고 Amazon Simple Notification Service(SNS) 메시지를 보내 기술자에게 상태를 알립니다. 압력 판독값이 3회 연속 임계값 아래로 떨어지면 모델은 정상 상태로 돌아가고 상태가 해결되었음을 확인하는 Amazon SNS 메시지를 하나 더 보냅니다. 비선형 복구 단계 또는 일회성 변칙 복구 측정값 발생 시 과압/정상 메시지가 끊길 가능성을 없애려면 압력 판독값이 임계값 아래로 3회 연속 측정된 값이 필요합니다.

다음은 감지기 생성 단계의 개요입니다.

입력을 생성합니다.

디바이스와 프로세스를 모니터링하려면 원격 측정 데이터를 AWS IoT Events로 보낼 방법이 있어야 합니다. 이를 위해 메시지를 입력으로 AWS IoT Events에 전송합니다. 여러 가지 방법으로 이 작업을 수행할 수 있습니다.

  • BatchPutMessage 작업을 사용합니다. 이 방법은 간단하지만 디바이스나 프로세스가 SDK 또는 AWS CLI를 통해 AWS IoT Events API에 액세스할 수 있어야 합니다.

  • AWS IoT Core에서 메시지 데이터를 AWS IoT Events로 전달하는 AWS IoT Core 규칙 엔진용 AWS IoT Events 작업 규칙을 작성하세요. 이렇게 하면 입력이 이름으로 식별됩니다. 디바이스 또는 프로세스에서 AWS IoT Core로 메시지를 보낼 수 있거나 이미 전송하고 있는 경우 이 방법을 사용하세요. 이 방법을 사용하면 일반적으로 장치의 컴퓨팅 성능이 덜 필요합니다.

  • AWS IoT Analytics에서 데이터 세트 생성 작업을 사용하여 데이터 세트 콘텐츠가 자동으로 전송되는 AWS IoT Events 입력을 지정하는 contentDeliveryRules(으)로 데이터 세트를 생성합니다. AWS IoT Analytics에서 집계되거나 분석된 데이터를 기반으로 디바이스 또는 프로세스를 제어하려면 이 방법을 사용하세요.

디바이스에서 이러한 방식으로 데이터를 전송하려면 먼저 하나 이상의 입력을 정의해야 합니다. 이렇게 하려면 각 입력에 이름을 지정하고 입력이 모니터링하는 수신 메시지 데이터의 필드를 지정하세요.

감지기 모델 생성

상태를 사용하여 감지기 모델(장비 또는 프로세스의 모델)을 생성합니다. 각 상태에 대해 수신되는 입력을 평가하여 중요 이벤트를 탐지하는 조건부(부울) 논리를 정의합니다. 이벤트가 탐지될 경우 모델이 상태를 변경하거나 다른 AWS 서비스를 사용하여 사용자 지정 구축 또는 미리 정의된 작업을 시작할 수 있습니다. 특정 상태가 시작 또는 종료할 때 또한 선택적으로 특정 조건이 충족될 때 작업을 시작하는 추가 이벤트를 정의할 수 있습니다.

여러 디바이스 또는 프로세스 모니터링

여러 디바이스 또는 프로세스를 모니터링하고 각 디바이스를 개별적으로 추적하려면 각 입력에 특정 디바이스를 식별하거나 입력이 들어오는 프로세스를 식별하는 필드를 지정하세요. CreateDetectorModelkey 필드를 참조하세요. 새 디바이스가 식별되면 (key로 식별되는 입력 필드에 새 값이 표시됨) 감지기 인스턴스가 생성됩니다. 새 감지기 인스턴스는 해당 감지기 모델이 업데이트되거나 삭제될 때까지 해당 특정 디바이스에서 들어오는 입력에 계속 응답합니다. 입력 key 필드의 고유 값 수만큼 고유한 감지기(인스턴스)가 있습니다.

단일 디바이스 또는 프로세스 모니터링

단일 프로세스를 모니터링하는 경우 (여러 디바이스 또는 하위 프로세스가 입력을 보내는 경우에도) 고유한 식별 key 필드를 지정하지 마세요. 이 경우 첫 번째 입력이 도착하면 단일 감지기(인스턴스)가 생성됩니다. 예를 들어 집 내부의 각 방에는 온도 센서가 있지만 집 전체를 냉난방하는 HVAC 장치는 하나뿐일 수 있습니다. 따라서 각 방의 사용자가 자신의 의견(입력)이 수용되기를 원하더라도 이를 단일 프로세스로만 제어할 수 있습니다.

디바이스 또는 프로세스의 메시지를 감지기 모델에 입력으로 전송

디바이스 또는 프로세스에서 메시지를 입력에서 AWS IoT Events 감지기에 입력으로 전송하는 몇 가지 방법을 설명했습니다. 입력을 생성하고 감지기 모델을 구축했으면 이제 데이터 전송을 시작할 준비가 되었습니다.

참고

감지기 모델을 생성하거나 기존 감지기 모델을 업데이트하면 신규 또는 업데이트된 감지기 모델이 메시지를 수신하고 감지기(인스턴스) 생성을 시작하기까지 몇 분이 걸립니다. 감지기 모델이 업데이트되면 이 기간 동안 이전 버전에 기반한 동작이 계속 나타날 수 있습니다.

디바이스 데이터를 캡처하기 위한 입력 생성

예를 들어 다음 형식으로 메시지를 전송한다고 가정해 보겠습니다.

{ "motorid": "Fulton-A32", "sensorData": { "pressure": 23, "temperature": 47 } }

다음 AWS CLI 명령을 사용하여 pressure 데이터를 캡처하고 (메시지를 보낸 특정 디바이스를 식별하는) motorid 입력을 만들 수 있습니다.

aws iotevents create-input --cli-input-json file://pressureInput.json

파일 pressureInput.json에는 다음이 포함되어 있습니다.

{ "inputName": "PressureInput", "inputDescription": "Pressure readings from a motor", "inputDefinition": { "attributes": [ { "jsonPath": "sensorData.pressure" }, { "jsonPath": "motorid" } ] } }

직접 입력을 생성할 때는 먼저 디바이스 또는 프로세스에서 예제 메시지를 JSON 파일로 수집해야 합니다. 이를 사용해 콘솔 또는 CLI에서 입력을 생성할 수 있습니다.

디바이스 상태를 나타내는 감지기 모델을 생성하세요.

디바이스 데이터를 캡처하기 위한 입력 생성에서 모터의 압력 데이터를 보고하는 메시지를 기반으로 input을(를) 만들었습니다. 예제를 계속하기 위해 모터의 과압 상황에 대응하는 감지기 모델을 살펴보겠습니다.

Normal” 및 “Dangerous”의 두 가지 상태를 생성합니다. 각 감지기(인스턴스)는 생성될 때 "Normal" 상태로 전환됩니다. 인스턴스는 keymotorid”에 대한 고유한 값을 가진 입력이 도착하면 생성됩니다.

감지기 인스턴스가 70 이상의 압력 판독값을 수신하면 "Dangerous" 상태로 전환되고 Amazon SNS 메시지를 경고로 보냅니다. 압력 측정값이 정상(70 미만)으로 3회 연속 입력되면 감지기는 "Normal" 상태로 돌아가고 다른 Amazon SNS 메시지를 모두 지우기 상태로 보냅니다.

이 예제 감지기 모델은 정의에 Amazon 리소스 이름(ARN)이 "targetArn": "arn:aws:sns:us-east-1:123456789012:underPressureAction""targetArn": "arn:aws:sns:us-east-1:123456789012:pressureClearedAction"(으)로 표시된 두 개의 Amazon SNS 주제를 생성했다고 가정합니다.

자세한 내용은 Amazon Simple Notification Service 개발자 안내서를 참조하세요. 더 구체적인 설명은 Amazon Simple Notification Service API 참조CreateTopic 작업을 참조하세요.

또한 이 예에서는 적절한 권한을 가진 AWS Identity and Access Management (IAM) 역할을 생성했다고 가정합니다. 이 역할의 ARN은 감지기 모델 정의에 "roleArn": "arn:aws:iam::123456789012:role/IoTEventsRole"와(과) 같이 표시됩니다. 에 대한 권한 설정 AWS IoT Events의 단계에 따라 이 역할을 생성하고 역할의 ARN을 감지기 모델 정의의 적절한 위치에 복사하세요.

다음 AWS CLI 명령을 사용하여 감지기 모델을 생성할 수 있습니다.

aws iotevents create-detector-model --cli-input-json file://motorDetectorModel.json

파일 "motorDetectorModel.json"에는 다음이 포함되어 있습니다.

{ "detectorModelName": "motorDetectorModel", "detectorModelDefinition": { "states": [ { "stateName": "Normal", "onEnter": { "events": [ { "eventName": "init", "condition": "true", "actions": [ { "setVariable": { "variableName": "pressureThresholdBreached", "value": "0" } } ] } ] }, "onInput": { "transitionEvents": [ { "eventName": "Overpressurized", "condition": "$input.PressureInput.sensorData.pressure > 70", "actions": [ { "setVariable": { "variableName": "pressureThresholdBreached", "value": "$variable.pressureThresholdBreached + 3" } } ], "nextState": "Dangerous" } ] } }, { "stateName": "Dangerous", "onEnter": { "events": [ { "eventName": "Pressure Threshold Breached", "condition": "$variable.pressureThresholdBreached > 1", "actions": [ { "sns": { "targetArn": "arn:aws:sns:us-east-1:123456789012:underPressureAction" } } ] } ] }, "onInput": { "events": [ { "eventName": "Overpressurized", "condition": "$input.PressureInput.sensorData.pressure > 70", "actions": [ { "setVariable": { "variableName": "pressureThresholdBreached", "value": "3" } } ] }, { "eventName": "Pressure Okay", "condition": "$input.PressureInput.sensorData.pressure <= 70", "actions": [ { "setVariable": { "variableName": "pressureThresholdBreached", "value": "$variable.pressureThresholdBreached - 1" } } ] } ], "transitionEvents": [ { "eventName": "BackToNormal", "condition": "$input.PressureInput.sensorData.pressure <= 70 && $variable.pressureThresholdBreached <= 1", "nextState": "Normal" } ] }, "onExit": { "events": [ { "eventName": "Normal Pressure Restored", "condition": "true", "actions": [ { "sns": { "targetArn": "arn:aws:sns:us-east-1:123456789012:pressureClearedAction" } } ] } ] } } ], "initialStateName": "Normal" }, "key" : "motorid", "roleArn": "arn:aws:iam::123456789012:role/IoTEventsRole" }

감지기에 메시지를 입력으로 전송

이제 디바이스에서 보낸 메시지의 중요 필드를 식별하는 입력이 정의되었습니다(디바이스 데이터를 캡처하기 위한 입력 생성 참조). 이전 섹션에서는 모터의 과압 이벤트에 반응하는 detector model을(를) 생성했습니다(디바이스 상태를 나타내는 감지기 모델을 생성하세요. 참조).

예제를 완료하려면 디바이스(이 경우에는 AWS CLI가 설치된 컴퓨터)의 메시지를 감지기에 입력으로 보내세요.

참고

감지기 모델을 생성하거나 기존 감지기 모델을 업데이트하면 새 또는 업데이트된 감지기 모델이 메시지를 수신하고 감지기(인스턴스)를 생성하기 시작하기까지 몇 분 정도 걸립니다. 감지기 모델을 업데이트하면 이 기간 동안 이전 버전에 기반한 동작이 계속 나타날 수 있습니다.

다음 AWS CLI 명령을 사용하여 임계값을 위반하는 데이터가 포함된 메시지를 보내세요.

aws iotevents-data batch-put-message --cli-input-json file://highPressureMessage.json --cli-binary-format raw-in-base64-out

파일 “highPressureMessage.json”에는 다음이 포함되어 있습니다.

{ "messages": [ { "messageId": "00001", "inputName": "PressureInput", "payload": "{\"motorid\": \"Fulton-A32\", \"sensorData\": {\"pressure\": 80, \"temperature\": 39} }" } ] }

전송되는 각 메시지에서 messageId을(를) 변경해야 합니다. 변경하지 않으면 AWS IoT Events 시스템에서 메시지의 중복을 제거합니다. AWS IoT Events는 최근 5분 이내에 전송된 다른 메시지와 messageID 동일한 메시지가 있는 경우 메시지를 무시합니다.

이때 모터 "Fulton-A32"의 이벤트를 모니터링하기 위한 감지기(인스턴스)가 생성됩니다. 이 감지기는 생성되었을 때의 "Normal" 상태로 들어갑니다. 하지만 임계값을 초과하는 압력 값을 보냈기 때문에 즉시 "Dangerous" 상태로 전환됩니다. 그러면 감지기는 ARN이 arn:aws:sns:us-east-1:123456789012:underPressureAction인 Amazon SNS 엔드포인트로 메시지를 전송합니다.

다음 AWS CLI 명령을 실행하여 압력 임계값 미만의 데이터가 포함된 메시지를 보내세요.

aws iotevents-data batch-put-message --cli-input-json file://normalPressureMessage.json --cli-binary-format raw-in-base64-out

파일 normalPressureMessage.json에는 다음이 포함되어 있습니다.

{ "messages": [ { "messageId": "00002", "inputName": "PressureInput", "payload": "{\"motorid\": \"Fulton-A32\", \"sensorData\": {\"pressure\": 60, \"temperature\": 29} }" } ] }

5분 이내에 BatchPutMessage 명령을 호출할 때마다 파일의 messageId을(를) 변경해야 합니다. 메시지를 두 번 더 보내세요. 메시지가 세 번 전송되면 모터 “Fulton-A32”의 감지기(인스턴스)가 Amazon SNS 엔드포인트 "arn:aws:sns:us-east-1:123456789012:pressureClearedAction"(으)로 메시지를 보내고 "Normal" 상태를 다시 입력합니다.

참고

BatchPutMessage를 사용하여 한 번에 여러 메시지를 보낼 수 있습니다. 하지만 이러한 메시지가 처리되는 순서는 보장되지 않습니다. 메시지(입력)가 순서대로 처리되도록 하려면 메시지를 한 번에 하나씩 보내고 API가 호출될 때마다 응답 성공을 기다리세요.

다음은 이 섹션에 설명된 감지기 모델 예제로 생성된 SNS 메시지 페이로드의 예시입니다.

“압력 임계값 위반” 이벤트 발생 시

IoT> { "eventTime":1558129816420, "payload":{ "actionExecutionId":"5d7444df-a655-3587-a609-dbd7a0f55267", "detector":{ "detectorModelName":"motorDetectorModel", "keyValue":"Fulton-A32", "detectorModelVersion":"1" }, "eventTriggerDetails":{ "inputName":"PressureInput", "messageId":"00001", "triggerType":"Message" }, "state":{ "stateName":"Dangerous", "variables":{ "pressureThresholdBreached":3 }, "timers":{} } }, "eventName":"Pressure Threshold Breached" }

“정상 압력 복원” 이벤트 발생 시

IoT> { "eventTime":1558129925568, "payload":{ "actionExecutionId":"7e25fd38-2533-303d-899f-c979792a12cb", "detector":{ "detectorModelName":"motorDetectorModel", "keyValue":"Fulton-A32", "detectorModelVersion":"1" }, "eventTriggerDetails":{ "inputName":"PressureInput", "messageId":"00004", "triggerType":"Message" }, "state":{ "stateName":"Dangerous", "variables":{ "pressureThresholdBreached":0 }, "timers":{} } }, "eventName":"Normal Pressure Restored" }

타이머를 정의한 경우 해당 타이머의 현재 상태는 SNS 메시지 페이로드에도 표시됩니다.

메시지 페이로드에는 메시지가 전송된 시점 (즉, SNS 작업이 실행된 시점)의 감지기(인스턴스) 상태에 대한 정보가 포함됩니다. https://docs.aws.amazon.com/iotevents/latest/apireference/API_iotevents-data_DescribeDetector.html 작업을 사용하여 감지기 상태에 대한 유사한 정보를 얻을 수 있습니다.