---
title: 'Sloj za prikupljanje podataka'
section: 'Concepts'
weight: 1
description: Struktura sloja za prikupljanje podataka u podsustavu Data Platform, njegovi demoni, načela razmjene podataka i interakcija s upravljačkim slojem.
related:
  - architecture
  - architecture/abstract-data-layer
  - protocols
  - equipment
---

import Alert from '@/components/docs/Alert.astro';

## Struktura i sastav sloja za prikupljanje podataka

**Sloj za prikupljanje podataka** ključna je komponenta podsustava Data Platform koja osigurava integraciju s uređajima. Obuhvaća skup specijaliziranih aplikacija, od kojih je svaka projektirana za interakciju s određenim tipom IoT uređaja (mjerila, senzori itd.). Ove aplikacije rade kao mrežne usluge koje preko namjenskih portova obrađuju dolazne veze i upravljaju prijenosom podataka između uređaja i platforme. Ovakva arhitektura jamči skalabilnost i fleksibilnost pri radu s raznorodnom opremom.

<Alert type="note">
  Radi veće sigurnosti i otpornosti, kao i lakše instalacije i nadogradnje, aplikacije su
  zapakirane u Docker kontejnere. Skupom kontejnera upravlja se pomoću
  [tehnologije Docker Compose](https://docs.docker.com/compose/), koja omogućuje objedinjavanje
  povezanih kontejnera u jedinstvenu upravljačku ploču.
</Alert>

Struktura i sastav aplikacija sloja za prikupljanje podataka sažeto su prikazani u nastavku:

```mermaid
flowchart TD
    A(Kućna mjerila potrošnje energije) <-->|Prijenos podataka| B("Demon za prikupljanje podataka (Type-J)")
    C(Industrijska mjerila potrošnje energije) <-->|Prijenos podataka| D("Demon za prikupljanje podataka (Type-T)")
    E(Pametni senzori) <-->|Prijenos podataka| F("Demon za prikupljanje podataka (DDT)")
    subgraph " "
    B("Demon za prikupljanje podataka (Type-J)") <--> I{"Uravnoteženje opterećenja (Pgbouncer)"}
    D("Demon za prikupljanje podataka (Type-T)") <--> I{"Uravnoteženje opterećenja (Pgbouncer)"}
    F("Demon za prikupljanje podataka (DDT)") <--> I{"Uravnoteženje opterećenja (Pgbouncer)"}
    X@{ shape: braces, label: "Komponenta za prozivanje uređaja" }
    end
    I{"Uravnoteženje opterećenja (Pgbouncer)"} <--> J[(DBMS PostgreSQL)]

```

Razmjena podataka s krajnjim uređajima odvija se preko TCP veze, pri čemu svaki demon za prikupljanje podataka (pozadinski proces, daemon) implementira vlastiti aplikacijski protokol razmjene kojim poslužuje određeni tip IoT uređaja.

Ovi demoni imaju nekoliko zajedničkih značajki arhitekture, opisanih u nastavku.

### Značajke arhitekture

- Svaki kontejner sadrži aplikaciju specijaliziranu za određeni protokol.
- Koriste se lagane osnovne slike (image), u osnovnoj konfiguraciji `alpine`, kako bi se dodatno opterećenje svelo na minimum. Ipak, slike se mogu izgraditi i za operacijski sustav korisnika.
- Za upravljanje ovisnostima između usluga (na primjer, pristupom bazi podataka) u konfiguraciji Docker Compose navode se odjeljci `depends_on` i `health-check`.
- Demoni se u konfiguraciji Docker Compose pokreću u više instanci (replika) radi raspodjele opterećenja. Pritom svaki demon za prikupljanje podataka može istodobno posluživati desetke tisuća veza.
- Sustav za uravnoteženje opterećenja (load balancer) – HAProxy ili Nginx Stream – usmjerava promet prema dostupnim demonima pomoću algoritama Round Robin ili Least Connections.
- U okruženjima u oblaku možete dodati automatsko skaliranje na temelju metrika (CPU, broj veza).
- Sva komunikacija s uređajima detaljno se bilježi u datoteke, pa se može analizirati ako se otkriju problemi i kvarovi.

### Načela razmjene podataka

U nastavku je dijagram komunikacijske sesije između IoT uređaja i demona za prikupljanje podataka:

```mermaid
sequenceDiagram
    autonumber
    participant D as IoT device
    participant I as Data collection <br/>daemon
    Note over I,D: Stages of interaction
    D->>I: Session start, authentication
    I-->>D: Sending request parameters
    D->>I: Data acquisition
    I-->>D: Sending the next session time
```

Razmjena podataka organizirana je prema sljedećim načelima:

- **Pokretanje komunikacijske sesije**.  
   Komunikacijsku sesiju uvijek pokreće IoT uređaj. Nakon što uspostavi vezu s demonom za prikupljanje podataka, uređaj šalje identifikacijski paket.

- **Postupak autentifikacije**  
   Demon za prikupljanje podataka autentificira uređaj. Ako je autentifikacija uspješna, demon:
  - Dohvaća spremljenu konfiguraciju uređaja iz baze podataka.
  - Šalje uređaju trenutačne postavke sučelja.

- **Prijenos podataka**  
   Na temelju primljenog zahtjeva uređaj prenosi poslužitelju za prikupljanje podataka:
  - Trenutačna očitanja uređaja.
  - Arhivske zapise (ako postoje).

- **Zakazivanje sljedeće sesije**  
   Kada se primanje podataka završi, demon za prikupljanje podataka:
  - Generira vremensku oznaku sljedeće sesije.
  - Šalje uređaju vremensku oznaku sljedeće sesije.
  - Pokreće zatvaranje veze.

- **Obrada i pohrana podataka**  
   Primljene informacije:
  - Objedinjuju se u strukturirane JSON objekte.
  - Pohranjuju se u posrednoj bazi podataka PostgreSQL.
  - Formatiraju se u skladu sa specifikacijom protokola konkretnog demona.

- **Integracija s upravljačkim slojem**  
   Podaci postaju dostupni gornjoj razini sustava (upravljačkoj komponenti) za:
  - Daljnju analitičku obradu.
  - Vizualizaciju u upravljačkim sučeljima.
  - Generiranje automatiziranih izvješća.

## Interakcija s upravljačkim slojem platforme

### Arhitektura povezivanja komponenti

Demoni za prikupljanje podataka integriraju se sa sustavom najviše razine (upravljačkim slojem) preko posredne baze podataka. Kako bi ta interakcija bila moguća, koristi se Docker kontejner s instaliranim sustavom za upravljanje bazama podataka (DBMS) PostgreSQL.

<Alert type="note">
  Upravljačka komponenta u ovoj bazi podataka pohranjuje svu potrebnu konfiguraciju IoT uređaja
  koji se prozivaju. Demoni za prikupljanje podataka koriste te postavke kako bi uspostavili
  komunikaciju s uređajima i razmjenjivali podatke s njima.
</Alert>

Rezultate uspješne interakcije s uređajima demoni automatski upisuju u namjensku tablicu u istoj bazi podataka, čime se osigurava transparentnost prijenosa podataka između upravljačke razine i uređaja.

Shema interakcije komponenti prikazana je u nastavku:

```mermaid
flowchart LR
A@{ shape: procs, label: "Komponenta za prozivanje uređaja"} -->|Podaci očitanja| B[(DBMS PostgreSQL)]
B[(DBMS PostgreSQL)] -->|Konfiguracija| A@{ shape: procs, label: "Komponenta za prozivanje uređaja"}
B[(DBMS PostgreSQL)] -->|Podaci očitanja| C@{ shape: procs, label: "Upravljačka komponenta"}
C@{ shape: procs, label: "Upravljačka komponenta"} -->|Konfiguracija| B[(DBMS PostgreSQL)]
```

### Konfiguracija uređaja

Konfiguracija uređaja obuhvaća sljedeće informacije:

- **Datumi posljednjih očitanja po arhivama**: satna, dnevna, mjesečna. Ovi parametri pokazuju od kojeg datuma treba očitati podatke odgovarajuće arhive.
- **Kod mjernog uređaja** (za IoT uređaje koji koriste protokol Type-T). Ovaj parametar potreban je samo demonima za prikupljanje podataka koji poslužuju protokol Type-T, a poslužitelju za prikupljanje podataka javlja koji algoritam treba koristiti za rad s uređajem.
- **Brzina serijskog porta** (za IoT uređaje koji rade prema protokolu Type-T). Ovaj parametar javlja IoT uređaju kojom brzinom treba komunicirati s mjerilom. Demon za prikupljanje podataka šalje ga na početku sesije razmjene podataka.
- **Raspored komunikacije**. Upravljačka komponenta upisuje sve rasporede u posrednu bazu podataka, a demon za prikupljanje podataka na temelju primljenih rasporeda izračunava najbliži datum i šalje ga uređaju.
- **Naredbe za upravljanje uređajem**. Ovisno o tipu IoT uređaja i njegovim mogućnostima, upravljačke naredbe obuhvaćaju:
  - Naredbu za ažuriranje softvera telemetrijskog dijela IoT uređaja. Kada primi tu naredbu, uređaj preuzima novi firmver s poslužitelja i ažurira se.
  - Naredbu za očitavanje konfiguracije mjernog uređaja.
  - Naredbu za zatvaranje ili otvaranje ventila (ako ventil postoji i ako ga softver IoT uređaja podržava).
  - Naredbu za postavljanje radnih parametara mjernog uređaja (ovisi o modelu).
  - Naredbu za ponovno pokretanje IoT uređaja.

Glavni dio konfiguracije uređaja pohranjuje se u posrednoj bazi podataka u formatu JSON.

Primjer konfiguracije prikazan je u nastavku:

```json
{
  "settings": "1",
  "day_event": 1706140800,
  "hour_event": 1706140800,
  "month_event": 1673857740,
  "net_address": 58
}
```

Ovdje su `day_event`, `hour_event` i `month_event` vremenske oznake u formatu `unixtime` za posljednje spremljene zapise dnevne, satne i mjesečne arhive, tim redom.

Rasporedi se pohranjuju odvojeno, također u formatu JSON. Sam zapis rasporeda oblikuje se i obrađuje u formatu CRON. Ovakav pristup osigurava fleksibilnost pri definiranju i obradi proizvoljnih rasporeda.

U nastavku je primjer pohrane nekoliko rasporeda za jedan uređaj:

```json
[
  { "crontab": "10 * * * *", "schedule_id": 6 },
  { "crontab": "40 * * * *", "schedule_id": 7 }
]
```

Prema ovim rasporedima, uređaj se treba povezivati 10 i 40 minuta nakon svakog punog sata. U trenutku komunikacije s uređajem demon sam određuje najprikladniji raspored i šalje uređaju najbliži termin.
