# 센서 데이터 로깅 및 분석

센서 데이터를 수집하고 분석하는 것은 IoT 시스템에서 매우 중요한 부분이다. Yocto 프로젝트는 이러한 작업을 용이하게 할 수 있는 도구와 프레임워크를 제공한다. 본 장에서는 Yocto 프로젝트를 활용하여 센서 데이터를 로깅하고 분석하는 방법에 대해 상세히 설명하겠다.

#### 센서 데이터 로깅

센서 데이터 로깅이란 센서로부터 수집된 데이터를 저장하는 과정을 의미한다. 이 데이터는 이후 분석을 위해 사용될 수 있다. 데이터 로깅을 구현하기 위해서는 다음과 같은 단계를 거쳐야 한다.

**1. 센서 드라이버 통합**

센서 드라이버는 센서로부터 데이터를 읽어오는 역할을 한다. Yocto 프로젝트를 통해 센서 드라이버를 통합하려면, 메타 레이어에 드라이버를 추가하고 빌드 시스템에 포함시켜야 한다.

```bitbake
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

SRC_URI += "file://my_sensor_driver.patch"

do_kernel_configme_append() {
    echo 'CONFIG_MY_SENSOR_DRIVER=m' >> ${B}/.config
}
```

**2. 데이터 수집 애플리케이션 개발**

데이터를 읽어오고 파일에 저장하는 애플리케이션을 개발한다. 예를 들어, C언어로 작성된 간단한 데이터 수집 코드가 있을 수 있다.

```c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

#define SENSOR_DEVICE "/dev/my_sensor"

int main() {
    int fd = open(SENSOR_DEVICE, O_RDONLY);
    if (fd < 0) {
        perror("Failed to open sensor device");
        return -1;
    }

    char buffer[128];
    ssize_t bytesRead = read(fd, buffer, sizeof(buffer) - 1);
    if (bytesRead < 0) {
        perror("Failed to read sensor data");
        close(fd);
        return -1;
    }

    buffer[bytesRead] = '\0';
    printf("Sensor data: %s\n", buffer);

    FILE *logFile = fopen("/var/log/sensor_data.log", "a");
    if (logFile == NULL) {
        perror("Failed to open log file");
        close(fd);
        return -1;
    }

    fprintf(logFile, "Sensor data: %s\n", buffer);
    fclose(logFile);
    close(fd);

    return 0;
}
```

**3. 시스템 서비스로 데이터 로거 설정**

수집 애플리케이션을 시스템 서비스로 설정하여 주기적으로 데이터를 수집할 수 있도록 한다. systemd를 이용하여 서비스 파일을 작성한다.

```ini
[Unit]
Description=Sensor Data Logger

[Service]
ExecStart=/usr/bin/my_sensor_logger
Restart=always

[Install]
WantedBy=multi-user.target
```

서비스 파일을 Yocto 레시피에 포함시키고 시스템에 설치되도록 한다.

```bitbake
DESCRIPTION = "Sensor Data Logger"
LICENSE = "GPL-2.0"
SRC_URI = "file://my_sensor_logger.c file://my_sensor_logger.service"

do_compile() {
    oe_runmake
}

do_install() {
    install -d ${D}${bindir}
    install -m 0755 my_sensor_logger ${D}${bindir}

    install -d ${D}${systemd_system_unitdir}
    install -m 0644 ${WORKDIR}/my_sensor_logger.service${D}${systemd_system_unitdir}
}

FILES_${PN} += "${systemd_system_unitdir}"
```

#### 분석

센서 데이터가 수집되고 로깅되면, 이 데이터를 분석하여 유의미한 정보를 도출할 수 있다. 분석 방법은 데이터의 종류와 분석 목적에 따라 다양한다.

**1. 데이터 전처리**

저장된 로그 파일에서 데이터를 읽어와 전처리를 수행한다. 예를 들어, Python을 사용하여 로그 파일을 읽어올 수 있다.

```python
import pandas as pd

log_file = "/var/log/sensor_data.log"
data = pd.read_csv(log_file, names=["timestamp", "sensor_data"], sep=" ")

data = data.dropna()
```

**2. 기본 통계 분석**

전처리된 데이터에 대해 기본적인 통계 분석을 수행한다.

```python
statistics = data.describe()
print(statistics)
```

**3. 데이터 시각화**

matplotlib 또는 seaborn 라이브러리를 사용하여 데이터를 시각화한다.

```python
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 5))
plt.plot(data["timestamp"], data["sensor_data"])
plt.xlabel("Time")
plt.ylabel("Sensor Data")
plt.title("Sensor Data Over Time")
plt.show()
```

#### 고급 분석

기본적인 통계 분석 및 시각화 이외에도 고급 분석 기법을 사용하여 더 심층적인 통찰을 얻을 수 있다.

**1. 이상 탐지**

센서 데이터에서 이상 현상을 탐지하는 것은 중요한 작업이다. 예를 들어, 머신 러닝 알고리즘을 사용하여 이상 탐지를 수행할 수 있다. scikit-learn 라이브러리를 사용하여 간단한 이상 탐지 예제를 구현할 수 있다.

```python
from sklearn.ensemble import IsolationForest

sensor_data = data["sensor_data"].values.reshape(-1, 1)

model = IsolationForest(contamination=0.01)
model.fit(sensor_data)

data['anomaly'] = model.predict(sensor_data)

plt.figure(figsize=(10, 5))
plt.plot(data["timestamp"], data["sensor_data"], label='Sensor Data')
anomalies = data[data['anomaly'] == -1]
plt.scatter(anomalies["timestamp"], anomalies["sensor_data"], color='red', label='Anomalies')
plt.xlabel("Time")
plt.ylabel("Sensor Data")
plt.title("Sensor Data with Anomalies")
plt.legend()
plt.show()
```

**2. 예측 분석**

센서 데이터를 이용하여 미래 값을 예측할 수도 있다. 이를 위해 시계열 예측 모델인 ARIMA 모델을 사용할 수 있다.

```python
from statsmodels.tsa.arima_model import ARIMA

model = ARIMA(data['sensor_data'], order=(5, 1, 0))
model_fit = model.fit(disp=0)

forecast, stderr, conf_int = model_fit.forecast(steps=10)
print(forecast)
```

#### 클라우드 연동

센서 데이터를 클라우드에 업로드하여 원격에서 데이터에 접근하고 분석하는 것도 가능한다.

**1. 클라우드 서비스 선택**

AWS IoT, Microsoft Azure IoT, Google Cloud IoT 등 다양한 클라우드 서비스 중 하나를 선택한다. 여기에서는 AWS IoT를 예로 들어 설명한다.

**2. AWS IoT 설정**

AWS 콘솔에서 IoT 코어를 설정하고, 디바이스를 등록한다. 등록된 디바이스의 인증서를 다운로드하여 Yocto 빌드 시스템에 추가한다.

```python
import json
import time
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient

client = AWSIoTMQTTClient("myClientID")
client.configureEndpoint("myEndpoint", 8883)
client.configureCredentials("rootCA.pem", "private.pem.key", "certificate.pem.crt")

client.connect()

def upload_data(sensor_data):
    message = {
        'timestamp': time.time(),
        'sensor_data': sensor_data
    }
    client.publish("my/topic", json.dumps(message), 1)

# 예제에서는 무작위 숫자를 사용했지만 실제 센서 데이터를 사용하라.
import random

while True:
    sensor_data = random.uniform(20.0, 25.0)
    upload_data(sensor_data)
    time.sleep(5)
```

***

이 장에서는 Yocto 프로젝트를 활용하여 센서 데이터를 로깅하고 분석하는 전 과정에 대해 다루었다. 센서 드라이버 통합, 데이터 수집 애플리케이션 개발, 시스템 서비스 설정, 기본 및 고급 분석, 클라우드 연동 등 다양한 주제를 포괄하였다. 이러한 방법들을 통해 IoT 시스템에서 센서 데이터를 효과적으로 활용할 수 있을 것이다.
