# Policy profile

## 디바이스 트윈이란

{% embed url="<https://app.gitbook.com/o/-MYca7uEGmKhEV97YzZW/s/-MYcaEPPtq6ifUkinzY2/iotdevicedev/devicetwin>" %}
위 URL 에서 디바이스 트윈의 개념을 확인하시기 바랍니다.
{% endembed %}

## 디바이스 트윈 데이터

디바이스 트윈은 디바이스의 상태나 서버와 주고 받을 수 있는 메타 정보들을 모두 저장하고 있습니다.

* **디바이스 트윈 예시**&#x20;

```
{
    "deviceId": "aaa",
    "etag": "AAAAAAAAAAY=",
    "deviceEtag": "Nzg3MzM1OTQ=",
    "status": "enabled",
    "statusUpdateTime": "0001-01-01T00:00:00Z",
    "connectionState": "Connected",
    "lastActivityTime": "2021-05-12T00:56:43.0412162Z",
    "cloudToDeviceMessageCount": 0,
    "authenticationType": "sas",
    "x509Thumbprint": {
        "primaryThumbprint": null,
        "secondaryThumbprint": null
    },
    "modelId": "",
    "version": 56,
    "properties": {
        "desired": {
            "policy": {
                "ver": {
                    "maj": 1,
                    "mnr": 1
                },
                "fw": 1.5,
                "brate": 9600,
                "sec": 120,
                "devices": {
                }
            }
        },
        "reported": {
          ...
        }
        ...
    }
}
```

## Policy profile

Policy profile 은 서버에서 IoT 디바이스가 동작하는 방법을 정의할 수 있는 체계입니다. Policy profile 은 \
디지털 트윈에 저장된 후 IoT hub 의 디바이스 트윈 기능을 통해 IoT 디바이스에 전달 될 수 있습니다.

디바이스 트윈에는 다른 정보들이 많이 저장되어 있는데, 이중 policy profile 로 사용되는 곳은 properties.desired.policy 입니다.

* **Policy profile 의 기본 구조**&#x20;

```
"desired": {
    "policy": {
        "ver": {
            "maj": 1,
            "mnr": 0
        },
        "fw": 1.0,
        "brate": 9600,
        "sec": 120,
        "devices": {
        }
    }
}
```

각 필드에 대한 설명은 아래와 같습니다.

| **필드**  | **설명**                                                                                                                                                                                                                                                               |
| ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| policy  | child 의 object 를 파싱해서 펌웨어에서 처리합니다.                                                                                                                                                                                                                                   |
| ver     | <p>Policy profile 의 버전을 나타냅니다. <br>펌웨어는 휘발성 메모리 공간에 현재 내가 실행되고 있는 policy profile 의 버전을 저장하고 있어야 합니다. <br>그 후 서버에서 디바이스 트윈이 변경되었다는 이벤트를 수신하면 이 버전 필드를 비교한 후 <br>펌웨어가 동작하는 설정을 새로 업데이트 해야 합니다.</p>                                                                     |
| fw      | 펌웨어 어플리케이션의 버전 정보입니다. 서버에서 관리하기 위한 값이며 펌웨어에서는 무시할 수 있는 필드입니다.                                                                                                                                                                                                        |
| brate   | <p>시리얼 통신에 필요한 baudrate 를 지정합니다. <br>디지털 컨트롤러(PLC)에 연결하는 IoT 디바이스의 경우 이 필드에 지정된 baudrate 로 디지털 컨트롤러(PLC)와 시리얼 통신하면 됩니다.</p>                                                                                                                                          |
| sec     | <p>데이터 수집 주기를 나타냅니다. <br>마지막 데이터 전송이 완료된 이후 이 필드에 지정된 시간동안 펌웨어 동작이 타이머 이벤트를 기다리거나 sleep() 하면 됩니다.</p>                                                                                                                                                                |
| devices | <p>IoT 디바이스가 여러 데이터 원천에서 데이터를 수집하는 경우 그 원천들을 구분하기 위해서 <br>사용될 수 있습니다. <br>이 필드 아래에는 각 원천마다 어떤 deviceId 를 써야만 하는지 설정되어 있을 것이며, <br>각 원천마다 개별적으로 데이터를 만들고 전송해야 합니다.</p><p>데이터 원천이 나 자신 하나인 경우에도 이 필드는 값을 가질 수 있으며, 이 필드에 지정된 <br>값대로 deviceId 를 설정하고 데이터를 보내야 합니다.</p> |

### devices 필드 값을 사용하는 방법

* **Policy profile 예시**

```
"desired": {
    "policy": {
        "ver": {
            "maj": 1,
            "mnr": 0
        },
        "fw": 1.0,
        "brate": 9600,
        "sec": 120,
        "devices": {
          "sensor1": {
            "idx": 0
          },
          "sensor2": {
            "idx": 1
          }
        }
    }
}
```

예시에는 devices 아래에 2개의 JSON 객체 "sensor1" 과 "sensor2" 가 있습니다. \
각각 idx 라는 필드를 갖고 있으며, idx 필드는 같은 policy profile 내에서 배열에 인덱싱하듯 0부터 시작하는 정수로 순서대로 지정됩니다.

펌웨어는 이 설정으로 2개의 IoT 디바이스 데이터를 만들어야 합니다.

```
{
  "serviceId": "1",
  "deviceId": "sensor1",
  ...
  "contents": {
  ...
  }
}
```

```
{
  "serviceId": "1",
  "deviceId": "sensor2",
  ...
  "contents": {
  ...
  }
}
```

Policy profile 의 sec 주기 마다 위 2개의 데이터를 각각 센서들로부터 얻어서 독립적으로 서버로 전송해야 합니다. 그리고 devices 아래에 있는 sensor1, sensor2 는 각각 deviceId 로 사용합니다.

MODBUS 네트워크가 구성되어 있고 단일 IoT 디바이스로 전체 네트워크에 엑세스 해서 데이터를 얻는 경우 개별 설비 별로 데이터 원천을 명확히 구분을 해야 그랜드뷰에서 제대로 데이터를 활용할 수 있습니다. \
이와 같은 경우 devices 필드로 데이터 원천을 구분합니다.

###

### sec 필드

sec 필드는 펌웨어 입장에서는 단순히 타이머를 기다리거나 sleep() 할 수 있는 값이지만, 전체 서비스 관점에서는 데이터를 수집하는 주기를 뜻합니다. \
\
이 데이터 수집 주기는 사업적인 의사결정 통해 지정이 되는 부분으로, 아래 문서에서 더 자세한 내용을 \
확인하기 바랍니다.

{% content-ref url="/pages/-M\_T9SWh1zRJIGwfPO6O" %}
[데이터 전송 대상과 주기](/meatatron-grandview/iotdevicedev/undefined-1.md)
{% endcontent-ref %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://metatron-grandview.gitbook.io/meatatron-grandview/iotdevicedev/policy-profile.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
