Andmesalvestus pilve

Vajalikud teadmised: [HW] Kontrollermoodul, [HW] Kasutajaliidese moodul,
[AVR] Analoog-digitaalmuundur, [LIB] Andurid, [LIB] Ethernet

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, suhtlusprotokolli ja turvalise andmeedastuse parameetreid. Andmete salvestus toimub üldjuhul üle tavalise interneti liidese Ethernet ja andmeedastus protokollina kasutusel TCP/IP protokoll.

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, analüüsiks ja esitlemisel. Selliste tööriistadega on mugav tekitada veebilehti, mis näitavad graafilise diagrammina andmeid, mis on tegelikult kogutud mikrokontrolleri poolt. Igal soovijal on ka ise võimalus pilveteenuse server tööle panna ja oma andmeid sinna salvestama hakata. Võimalus on kasutada mõningaid avatud lähtekoodiga platvorme või teha ise lihtne rakendus. Isetegemise puhul nõuab see täiendavaid ressursse serveri riistvara, võrguühenduste ja ka oma oskuste ning aja näol. Veebileht andmete kuvamiseks ja 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, eriti kui mingi server on juba olemas ja on eelnevad kokkupuuted veebilehtede loomise ning andmebaassüsteemidega. Kuna pilveteenuste pakkujate nimekiri pidevalt muutub ja samuti muutuvad nende hinnapoliitika ning funktsionaalsus on järgnev näide tehtud minimalistliku lahendusena, kus serveriks on kasutatud olemasolevat veebiserverit, kus jookseb Apache2, PHP5 ja MySQL andmebaasimootor. Antud näite järgi on alati võimalik lahendust keerukamaks ja täiuslikumaks teha, juhendeid kuidas andmebaasipõhiseid veebilehti teha ja andmeid visualiseerida on internetis väga palju.

Näiterakenduses on kasutusel lihtne temperatuuriandur, mis salvestab teatud ajaintervalli järel temperatuuri ja edastab selle pilveserverile. Kommunikatsiooniks on kasutusel juhtmega Etherneti liides. Lahendus koosneb kahest osast: mikrokontrolleri tarkvara ja veebiserveri tarkvara.

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 API-t. Andmebaasi loomiseks võib kasutada serveri veebiliidest phpMyadmin või lihtsalt mysql kliendiprogrammi. Antud näites on loodud andmebaas pilvedemo ja sinna tabel nimega monitor.

CREATE DATABASE pilvedemo;
CREATE TABLE monitor (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'unique ID',
`event` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Event Date and Time',
`sensor` VARCHAR( 30 ) NOT NULL COMMENT 'Sensor ID',
`value` VARCHAR( 10 ) NOT NULL COMMENT 'Measured Sensor Value',
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.

<?php 
// Temperatuurianduri lugemite salvestamine andmebaasi ja kuvamine veebis
$dbh = mysql_pconnect("localhost" , "user", "password");
$selected = mysql_select_db("pilvedemo",$dbh);
 
if (($_GET["s"])&&($_GET["v"])){
   $SQL = "INSERT INTO monitor (sensor,value) 
            VALUES ('".$_GET["s"]."', '".$_GET["v"]."')";    
    mysql_query($SQL);
}
 
$result = mysql_query("SELECT date(event) aeg,sensor,value 
                        FROM monitor ORDER BY id ASC");
 
while ($row = mysql_fetch_array($result)) {
   // Tabeli koostamine
   $tabel .= '<tr><td>'.$row["aeg"].'</td>'."\n";
   $tabel .= '<td>'.$row["sensor"].'</td>'."\n";
   $tabel .= '<td>'.$row["value"].'</td></tr>'."\n"; 
   // Graafiku andmete koostamine
   $date = date("Y,m,d", strtotime($row["aeg"]));
   $mod_date = substr_replace($date, intval(substr($date, 5,2))-1, 5,2) ;
   $chart.= "\t\t[new Date(" . $mod_date . ")," . $row["value"] . "],\n";
}
$chart.= substr_replace($chart ,"",-2); // Viimase elemendi tagant koma eemaldamine
?>
<!DOCTYPE html>
<html>
<head>
  <title>Pilvesalvestuse demoserver</title>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> 
  <style type="text/css">
   table {font-family: verdana,arial,sans-serif; font-size:11px; color:#333333; 
                                                               border-width:1px;}
   th {background:#b5cfd2; border-width:1px; padding:8px; border-style:solid; 
                                                          border-color: #999999;}
   td {border-width:1px; padding:8px; border-style:solid; border-color: #999999;}
  </style>
 
   <script type="text/javascript" 
    src="https://www.google.com/jsapi?autoload={'modules':[{'name':'visualization',
                                      'version':'1','packages':['corechart']}]}">
   </script>
 
   <script type="text/javascript">	
	  google.load('visualization', '1', {packages: ['corechart']});
	  google.setOnLoadCallback(drawChart);
 
	  function drawChart() {
	    var data = new google.visualization.DataTable();
	    data.addColumn('date', 'X');
	    data.addColumn('number', 'Välistemp.');
	    data.addRows([<?php echo "\n".$chart?>]);
	    var options = {width:500,height:300,hAxis:{title:'Aeg',format:'dd.MM'},
	    	    	   vAxis:{title:'Temp. C'}};
	    var chart = new google.visualization.LineChart(
	    document.getElementById('temp_chart'));
	    chart.draw(data, options);
	  }
	  </script>    
</head>
 
<body>
    <h1 style="font-family:verdana,arial,sans-serif;font-size:26px;color:#333333;">
    Temperatuuri Logi</h1>
    <table><tr><td>
    <div id="temp_chart"></div>
    </td>
    <td>
    <table>
      <tr><th>Aeg</th><th>Andur</th><th>Lugem</th></tr>
	<?php echo $tabel?>
    </table>
    </td>
    </tr>
    </table>
    Robolabor.ee
</body>
</html>

 

Mikrokontrolleri kood peab ühilduma serveri koodiga ja seda just andmete formaadi ning URL-i osas. Antud näites on andmete kuvamise URL: http://robolabor.ee/pilvedemo/index.php ja andmete lisamise URL: http://robolabor.ee/pilvedemo/index.php?s=<id>&v=<lugem> 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
// Kodulabori temperatuuri lugemi pilve salvestamise näidisprogramm
// Lugem võetakse kord iga 5 sekundi järel ja salvestatakse pilveserveri baasi
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdlib.h>
#include <adc.h>
#include <module/sensors.h>
#include <module/ethernet.h>
 
// Serveri aadressi defineerimine
#ifdef WEBSERVER_VHOST
    #undef WEBSERVER_VHOST
#endif
#define WEBSERVER_VHOST "robolabor.ee"
 
// 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, IP hankimine
    ethernet_init_client();
    ethernet_getDNSIP();
    ethernet_get_server();
 
    // ADC muunduri seadistamine
    adc_init(ADC_REF_AVCC, ADC_PRESCALE_8);
 
    // Lõputu tsükkel
    while (1)
    {
        uint16_t dat_p,plen;
 
        // Etherneti lingi üleval hoidmine
        plen=enc28j60PacketReceive(BUFFER_SIZE, buf);
        buf[BUFFER_SIZE]='\0';
        dat_p=packetloop_arp_icmp_tcp(buf,plen);
 
        if(plen == 0)
        {
            // Iga 5 sekundi tagant serverisse uute andmete saatmine
            if(time >= 5000)
            {
                itoa(thermistor_calculate_celsius(adc_get_average_value(
                                                 ADC_CHANNEL, 4)),urlvarstr,10);
 
                client_browse_url(PSTR("/pilvedemo/?s=1&v="),urlvarstr,
                      PSTR(WEBSERVER_VHOST),&browserresult_callback,
                      otherside_www_ip,otherside_www_gwmac);
 
                time = 0;
            }
            _delay_ms(1);
            time++;
            continue;
        }
 
        if(dat_p==0)   udp_client_check_for_dns_answer(buf,plen); // plen!=0
    }
}
et/examples/storage/network.txt · Last modified: 2020/07/20 09:00 by 127.0.0.1
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0