This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:examples:storage:network [2015/02/27 13:51] – raivo.sell | et:examples:storage:network [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Andmesalvestus pilve ====== | ||
| + | //Vajalikud teadmised: | ||
| + | [HW] [[et: | ||
| + | [AVR] [[et: | ||
| + | [LIB] [[et: | ||
| + | ===== Teooria ===== | ||
| + | |||
| + | Andmesalvestus pilve tähendab andmete saatmist üle juhtme või juhtmevaba võrgu mõnda välisesse serverisse. Väline server võib olla nii kohalik, oma kodunurgas olev failiserver või siis üldtuntud pilveteenuse pakkuja server. Pilveteenuseid pakuvad paljud suuremaid infotehnoloogiafirmasid ning asjadeinterneti (inglise keeles //Internet of Things//) teenuseid pakkuvad ettevõtted. Osad neist on tasuta ja avatud lähtekoodil põhinevad serverid, teised aga kinnised ja ettevõtetele suunatud tasulised teenused. Mikrokontrolleriga andmete pilve salvestamiseks on vaja teada vastava teenuse spetsiifikat, | ||
| + | |||
| + | Andmete pilve salvestamise peamine eelis on andmete turvaline säilimine ja hilisema andmetöötluse laiad võimalused. Tihti on teenusepakkujatel olemas võimsad tööriistad andmete visualiseerimiseks, | ||
| + | {{ : | ||
| + | ===== Praktika ===== | ||
| + | Andmete salvestamiseks pilve on vaja esiteks valida sobiv pilveteenus või seadistada ise pilveserver. Lihtsam on kasutada olemasolevaid suurfirmade teenused. Samas on küllalt lihtne teha ka ise vastav funktsionaalsus, | ||
| + | Kuna pilveteenuste pakkujate nimekiri pidevalt muutub ja samuti muutuvad nende hinnapoliitika ning funktsionaalsus on järgnev näide tehtud minimalistliku lahendusena, | ||
| + | |||
| + | Näiterakenduses on kasutusel lihtne temperatuuriandur, | ||
| + | |||
| + | Esmalt seadistatakse veebi- ja andmebaasi server, luues tühja andmebaasi ja vastava veebilehe, mis võtab kontrollerilt vastu andmeid ja näitab neid kasutajale tabeli ning graafiku kujul. Graafiku genereerimiseks on kasutatud //Google Visualization// | ||
| + | |||
| + | <code sql> | ||
| + | create database pilvedemo; | ||
| + | </ | ||
| + | |||
| + | <code sql> | ||
| + | CREATE TABLE monitor ( | ||
| + | `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT ' | ||
| + | `event` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Event Date and Time', | ||
| + | `sensor` VARCHAR( 30 ) NOT NULL COMMENT ' | ||
| + | `value` VARCHAR( 10 ) NOT NULL COMMENT ' | ||
| + | INDEX ( `event` , `sensor` ) | ||
| + | ) ENGINE = InnoDB; | ||
| + | </ | ||
| + | |||
| + | Kui andmebaasi loomine õnnestus tuleb luua ka kasutaja ja anda vastavad õigused andmebaasi andmete lugemiseks ja kirjutamiseks. Järgnevas näites on andmebaasi kasutajaks //monitor// ja parooliks //demo//. | ||
| + | Järgnevalt tuleb luua veebiserveri poolt juurdepääsetavasse kataloogi php kood, mis näitab andmebaasis olevaid andmeid tabeli kujul ja samuti salvestab kontrolleri poolt saadetud andmed vastloodud andmebaasi. | ||
| + | |||
| + | <code php> | ||
| + | <? | ||
| + | // Temperatuurianduri lugemite salvestamine andmebaasi ja kuvamine veebis | ||
| + | $dbh = mysql_pconnect(" | ||
| + | $selected = mysql_select_db(" | ||
| + | |||
| + | if (($_GET[" | ||
| + | $SQL = " | ||
| + | VALUES ('" | ||
| + | mysql_query($SQL); | ||
| + | } | ||
| + | |||
| + | $result = mysql_query(" | ||
| + | FROM monitor ORDER BY id ASC"); | ||
| + | |||
| + | while ($row = mysql_fetch_array($result)) { | ||
| + | // Tabeli koostamine | ||
| + | | ||
| + | | ||
| + | | ||
| + | // Graafiku andmete koostamine | ||
| + | $date = date(" | ||
| + | | ||
| + | | ||
| + | } | ||
| + | $chart.= substr_replace($chart ,"", | ||
| + | ?> | ||
| + | |||
| + | </ | ||
| + | <code html> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <meta http-equiv=" | ||
| + | <style type=" | ||
| + | table {font-family: | ||
| + | | ||
| + | th {background:# | ||
| + | border-color: | ||
| + | td {border-width: | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | src=" | ||
| + | ' | ||
| + | </ | ||
| + | | ||
| + | < | ||
| + | google.load(' | ||
| + | google.setOnLoadCallback(drawChart); | ||
| + | |||
| + | function drawChart() { | ||
| + | var data = new google.visualization.DataTable(); | ||
| + | data.addColumn(' | ||
| + | data.addColumn(' | ||
| + | data.addRows([<? | ||
| + | var options = {width: | ||
| + | | ||
| + | var chart = new google.visualization.LineChart( | ||
| + | document.getElementById(' | ||
| + | chart.draw(data, | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | <h1 style=" | ||
| + | Temperatuuri Logi</ | ||
| + | < | ||
| + | <div id=" | ||
| + | </td> | ||
| + | <td> | ||
| + | < | ||
| + | < | ||
| + | <?php echo $tabel?> | ||
| + | </ | ||
| + | </td> | ||
| + | </tr> | ||
| + | </ | ||
| + | Robolabor.ee | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | < | ||
| + | |||
| + | Mikrokontrolleri kood peab ühilduma serveri koodiga ja seda just andmete formaadi ning URL-i osas. | ||
| + | Antud näites on andmete kuvamise URL: http:// | ||
| + | parameeter s on anduri ID ja parameeter v on anduri lugem. Ajatempel pannakse igale sisestusele automaatselt andmete saabumise järgi. | ||
| + | |||
| + | Alljärgnev kood on Kodulabori näitekood, mis vastab eelpool kirjeldatud serveri ja andmebaasi konfiguratsioonile. Kodulabor III puhul tuleb kasutada eraldi Ethernet moodulit, mis on Robootika Kodulabori lisakomplektis. Kodulabor III ühenduse skeem: | ||
| + | ^ Signaal ^ Viik ^ | ||
| + | | SI | PF3 | | ||
| + | | SO | PF2 | | ||
| + | | SCK | PF1 | | ||
| + | | CS | PF0 | | ||
| + | | VCC | +3.3V | | ||
| + | | GND | GND | | ||
| + | |||
| + | <code c> | ||
| + | // Kodulabori temperatuuri lugemi pilve salvestamise näidisprogramm | ||
| + | // Lugem võetakse kord iga 5 sekundi järel ja salvestatakse pilveserveri baasi | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Serveri aadressi defineerimine | ||
| + | #ifdef WEBSERVER_VHOST | ||
| + | #undef WEBSERVER_VHOST | ||
| + | #endif | ||
| + | #define WEBSERVER_VHOST " | ||
| + | |||
| + | // Kodulabor II | ||
| + | //#define ADC_CHANNEL 2 | ||
| + | // Kodulabor III | ||
| + | #define ADC_CHANNEL 14 | ||
| + | |||
| + | // Paketi puhvri suurus | ||
| + | #define BUFFER_SIZE 650 | ||
| + | uint8_t buf[BUFFER_SIZE+1]; | ||
| + | |||
| + | // Põhiprogramm | ||
| + | int main(void) | ||
| + | { | ||
| + | uint16_t time = 0; | ||
| + | |||
| + | // Etherneti kontrolleri käivitamine, | ||
| + | ethernet_init_client(); | ||
| + | ethernet_getDNSIP(); | ||
| + | ethernet_get_server(); | ||
| + | |||
| + | // ADC muunduri seadistamine | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | |||
| + | // Lõputu tsükkel | ||
| + | while (1) | ||
| + | { | ||
| + | uint16_t dat_p,plen; | ||
| + | |||
| + | // Etherneti lingi üleval hoidmine | ||
| + | plen=enc28j60PacketReceive(BUFFER_SIZE, | ||
| + | buf[BUFFER_SIZE]=' | ||
| + | dat_p=packetloop_arp_icmp_tcp(buf, | ||
| + | |||
| + | if(plen == 0) | ||
| + | { | ||
| + | // Iga 5 sekundi tagant serverisse uute andmete saatmine | ||
| + | if(time >= 5000) | ||
| + | { | ||
| + | itoa(thermistor_calculate_celsius(adc_get_average_value( | ||
| + | | ||
| + | |||
| + | client_browse_url(PSTR("/ | ||
| + | PSTR(WEBSERVER_VHOST),& | ||
| + | otherside_www_ip, | ||
| + | | ||
| + | time = 0; | ||
| + | } | ||
| + | _delay_ms(1); | ||
| + | time++; | ||
| + | continue; | ||
| + | } | ||
| + | | ||
| + | if(dat_p==0) | ||
| + | } | ||
| + | } | ||
| + | </ | ||