<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://www.raspibo.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PaoloPatruno</id>
	<title>raspibo - Contributi utente [it]</title>
	<link rel="self" type="application/atom+xml" href="https://www.raspibo.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PaoloPatruno"/>
	<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php/Speciale:Contributi/PaoloPatruno"/>
	<updated>2026-05-30T07:49:18Z</updated>
	<subtitle>Contributi utente</subtitle>
	<generator>MediaWiki 1.35.5</generator>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7281</id>
		<title>Gruppo Meteo/HowTo/server-centos</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7281"/>
		<updated>2020-07-13T07:38:17Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* istallazione sistema operativo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installazione RMAP server su centos 8 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
 dnf -y install epel-release&lt;br /&gt;
 dnf install yum-plugin-copr&lt;br /&gt;
 dnf copr enable simc/stable&lt;br /&gt;
 dnf copr enable pat1/rmap&lt;br /&gt;
 dnf config-manager --set-enabled PowerTool&lt;br /&gt;
 dnf groupinstall rmap&lt;br /&gt;
 dnf install mosquitto mosquitto-auth-plug&lt;br /&gt;
 dnf install arkimet&lt;br /&gt;
&lt;br /&gt;
 useradd rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
dnf module disable postgresql:10&lt;br /&gt;
dnf module enable postgresql:12&lt;br /&gt;
dnf install postgresql-server postgresql-contrib&lt;br /&gt;
dnf install python3-psycopg2&lt;br /&gt;
&lt;br /&gt;
postgresql-setup --initdb --unit postgresql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
Collect static files from django apps:&lt;br /&gt;
&lt;br /&gt;
 mkdir global_static&lt;br /&gt;
 export DJANGO_SETTINGS_MODULE=rmap.settings&lt;br /&gt;
 django-admin collectstatic&lt;br /&gt;
 rmdir global_static&lt;br /&gt;
&lt;br /&gt;
 yum install python3-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 SecRuleEngine On&lt;br /&gt;
 &lt;br /&gt;
 #The first SecAction initializes the state, in this case by IP address.&lt;br /&gt;
 #The second SecAction deprecates the counter by 1 every 60 second.&lt;br /&gt;
 #This is setting the base rate of our rate limit&lt;br /&gt;
 #Then the Header definition ensures a header is set whenever a request&lt;br /&gt;
 #is rate limited, giving a hint to the client that they shouldn’t try&lt;br /&gt;
 #again for 10 seconds. This is obviously just a guide and a lot of&lt;br /&gt;
 #clients don’t implement it (and it’s really only valid on a 503 status&lt;br /&gt;
 #anyway) so it’s a little bit of wishful thinking really.&lt;br /&gt;
 #Then we define a neat ErrorDocument for the 509 response to give a better clue to the client about what is happening.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /borinud&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   # whitelist localhost&lt;br /&gt;
   #SecRule REMOTE_ADDR &amp;quot;@contains 127.0.0.1&amp;quot; &amp;quot;id:1,phase:1,nolog,allow,ctl:ruleEngine=Off&amp;quot;&lt;br /&gt;
   SecRule REMOTE_ADDR &amp;quot;^127.0.0.1$&amp;quot; nolog,allow,id:1&lt;br /&gt;
 &lt;br /&gt;
   # initialise the state based on ip address&lt;br /&gt;
   SecAction id:2,initcol:IP=%{REMOTE_ADDR}&lt;br /&gt;
 &lt;br /&gt;
   # set the base rate to one per 15 minutes&lt;br /&gt;
   SecAction id:3,deprecatevar:IP.CALLS_LIMIT=1/900&lt;br /&gt;
 &lt;br /&gt;
   # if greater then burst_rate_limit then pause set RATELIMITED var and then return 503&lt;br /&gt;
   SecRule IP:CALLS_LIMIT &amp;quot;@gt 60&amp;quot; &amp;quot;id:4,phase:2,pause:300,deny,status:503,setenv:RATELIMITED,skip:1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   # if above rule doesnt match increment the count&lt;br /&gt;
   SecAction id:5,setvar:IP.CALLS_LIMIT=+1&lt;br /&gt;
 &lt;br /&gt;
   # set a header when ratelimited&lt;br /&gt;
   Header always set Retry-After &amp;quot;10&amp;quot; env=RATELIMITED&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 ErrorDocument 503 &amp;quot;Service Unavailable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 dnf install arkimet arkimet-postprocessor-suite&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
 mkdir /var/log/arkimet&lt;br /&gt;
 chown -R arkimet:arkimet /var/log/arkimet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create file /etc/arkimet/scan/bufr_generic_mobile_rmap.py:&lt;br /&gt;
&lt;br /&gt;
 from arkimet.scan.bufr import Scanner, read_area_mobile, read_proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 def scan(msg, md):&lt;br /&gt;
    if msg.report == &amp;quot;mobile&amp;quot;:&lt;br /&gt;
        area = read_area_mobile(msg)&lt;br /&gt;
        proddef = read_proddef(msg)&lt;br /&gt;
        if area:&lt;br /&gt;
            md[&amp;quot;area&amp;quot;] = {&amp;quot;style&amp;quot;: &amp;quot;GRIB&amp;quot;, &amp;quot;value&amp;quot;: area}&lt;br /&gt;
        if proddef:&lt;br /&gt;
            md[&amp;quot;proddef&amp;quot;] = {&amp;quot;style&amp;quot;: &amp;quot;GRIB&amp;quot;, &amp;quot;value&amp;quot;: proddef}&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Scanner.register(&amp;quot;generic&amp;quot;, scan, priority=1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash&lt;br /&gt;
&lt;br /&gt;
 dnf install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 #rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cd /etc/monit.d/&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdaten&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
&lt;br /&gt;
AL MOMENTO NON DISPONIBILE SU CENTOS 8&lt;br /&gt;
NOT AVAILABLE ON CENTOS 8&lt;br /&gt;
&lt;br /&gt;
 dnf install arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
&lt;br /&gt;
= Installazione RMAP server su centos 7 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 yum install yum-plugin-copr&lt;br /&gt;
 yum copr enable simc/stable&lt;br /&gt;
&lt;br /&gt;
 #cd /tmp&lt;br /&gt;
 #wget http://rmap.it/repo/rmap/yum-packages-centos.list&lt;br /&gt;
 #yum -y install &amp;lt; yum-packages-centos.list&lt;br /&gt;
 &lt;br /&gt;
 yum groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
yum install postgresql-server postgresql-contrib&lt;br /&gt;
yum install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
 yum install python34-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 add &lt;br /&gt;
 exclude=mosquitto&lt;br /&gt;
 in &lt;br /&gt;
 /etc/yum.repos.d/epel.repo&lt;br /&gt;
&lt;br /&gt;
 wget &amp;quot;http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo&amp;quot; -o /etc/yum.repos.d/mqtt.repo&lt;br /&gt;
 yum install mosquitto libmosquitto-devel libmosquittopp-devel mosquitto-clients&lt;br /&gt;
 mkdir git&lt;br /&gt;
 cd git&lt;br /&gt;
 git clone https://github.com/jpmens/mosquitto-auth-plug.git&lt;br /&gt;
 cp  config.mk.in  config.mk&lt;br /&gt;
 emacs config.mk  (disable mysql; enable http)   &lt;br /&gt;
 &lt;br /&gt;
apply this patch:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff --git a/auth-plug.c b/auth-plug.c&lt;br /&gt;
index 744f115..a36c039 100644&lt;br /&gt;
--- a/auth-plug.c&lt;br /&gt;
+++ b/auth-plug.c&lt;br /&gt;
@@ -585,6 +585,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
         * id to bypass ACL checks (or have a username/client id that cannot&lt;br /&gt;
         * publish or receive messages to its own place in the hierarchy).&lt;br /&gt;
         */&lt;br /&gt;
+       /*&lt;br /&gt;
        if(username &amp;amp;&amp;amp; strpbrk(username, &amp;quot;+#/&amp;quot;)){&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous username \&amp;quot;%s\&amp;quot;&amp;quot;, username);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
@@ -594,6 +595,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous client id \&amp;quot;%s\&amp;quot;&amp;quot;, clientid);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
        }&lt;br /&gt;
+       */&lt;br /&gt;
 &lt;br /&gt;
        _log(LOG_DEBUG, &amp;quot;mosquitto_auth_acl_check(..., %s, %s, %s, %s)&amp;quot;,&lt;br /&gt;
                clientid ? clientid : &amp;quot;NULL&amp;quot;,&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 cp auth-plug.so /usr/lib64/&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 yum install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7280</id>
		<title>Gruppo Meteo/HowTo/server-centos</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7280"/>
		<updated>2020-07-13T07:29:38Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* istallazione sistema operativo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installazione RMAP server su centos 8 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository:&lt;br /&gt;
 yum -y install epel-release&lt;br /&gt;
&lt;br /&gt;
 dnf install yum-plugin-copr&lt;br /&gt;
 dnf copr enable simc/stable&lt;br /&gt;
 dnf copr enable pat1/rmap&lt;br /&gt;
 dnf config-manager --set-enabled PowerTools&lt;br /&gt;
&lt;br /&gt;
 dnf install mosquitto mosquitto-auth-plug&lt;br /&gt;
 dnf install arkimet&lt;br /&gt;
&lt;br /&gt;
 dnf install python3-rmap&lt;br /&gt;
 dnf install python3-pika python3-simplejson python3-django-classy-tags python3-iso8601 python3-pyparsing python3-requests python3-cairo ython3-nominatim python3-plyer python3-django-cors-headers&lt;br /&gt;
 &lt;br /&gt;
 #dnf groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
dnf module disable postgresql:10&lt;br /&gt;
dnf module enable postgresql:12&lt;br /&gt;
dnf install postgresql-server postgresql-contrib&lt;br /&gt;
dnf install python3-psycopg2&lt;br /&gt;
&lt;br /&gt;
postgresql-setup --initdb --unit postgresql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
Collect static files from django apps:&lt;br /&gt;
&lt;br /&gt;
 mkdir global_static&lt;br /&gt;
 export DJANGO_SETTINGS_MODULE=rmap.settings&lt;br /&gt;
 django-admin collectstatic&lt;br /&gt;
 rmdir global_static&lt;br /&gt;
&lt;br /&gt;
 yum install python3-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 SecRuleEngine On&lt;br /&gt;
 &lt;br /&gt;
 #The first SecAction initializes the state, in this case by IP address.&lt;br /&gt;
 #The second SecAction deprecates the counter by 1 every 60 second.&lt;br /&gt;
 #This is setting the base rate of our rate limit&lt;br /&gt;
 #Then the Header definition ensures a header is set whenever a request&lt;br /&gt;
 #is rate limited, giving a hint to the client that they shouldn’t try&lt;br /&gt;
 #again for 10 seconds. This is obviously just a guide and a lot of&lt;br /&gt;
 #clients don’t implement it (and it’s really only valid on a 503 status&lt;br /&gt;
 #anyway) so it’s a little bit of wishful thinking really.&lt;br /&gt;
 #Then we define a neat ErrorDocument for the 509 response to give a better clue to the client about what is happening.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /borinud&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   # whitelist localhost&lt;br /&gt;
   #SecRule REMOTE_ADDR &amp;quot;@contains 127.0.0.1&amp;quot; &amp;quot;id:1,phase:1,nolog,allow,ctl:ruleEngine=Off&amp;quot;&lt;br /&gt;
   SecRule REMOTE_ADDR &amp;quot;^127.0.0.1$&amp;quot; nolog,allow,id:1&lt;br /&gt;
 &lt;br /&gt;
   # initialise the state based on ip address&lt;br /&gt;
   SecAction id:2,initcol:IP=%{REMOTE_ADDR}&lt;br /&gt;
 &lt;br /&gt;
   # set the base rate to one per 15 minutes&lt;br /&gt;
   SecAction id:3,deprecatevar:IP.CALLS_LIMIT=1/900&lt;br /&gt;
 &lt;br /&gt;
   # if greater then burst_rate_limit then pause set RATELIMITED var and then return 503&lt;br /&gt;
   SecRule IP:CALLS_LIMIT &amp;quot;@gt 60&amp;quot; &amp;quot;id:4,phase:2,pause:300,deny,status:503,setenv:RATELIMITED,skip:1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   # if above rule doesnt match increment the count&lt;br /&gt;
   SecAction id:5,setvar:IP.CALLS_LIMIT=+1&lt;br /&gt;
 &lt;br /&gt;
   # set a header when ratelimited&lt;br /&gt;
   Header always set Retry-After &amp;quot;10&amp;quot; env=RATELIMITED&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 ErrorDocument 503 &amp;quot;Service Unavailable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 dnf install arkimet arkimet-postprocessor-suite&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
 mkdir /var/log/arkimet&lt;br /&gt;
 chown -R arkimet:arkimet /var/log/arkimet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create file /etc/arkimet/scan/bufr_generic_mobile_rmap.py:&lt;br /&gt;
&lt;br /&gt;
 from arkimet.scan.bufr import Scanner, read_area_mobile, read_proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 def scan(msg, md):&lt;br /&gt;
    if msg.report == &amp;quot;mobile&amp;quot;:&lt;br /&gt;
        area = read_area_mobile(msg)&lt;br /&gt;
        proddef = read_proddef(msg)&lt;br /&gt;
        if area:&lt;br /&gt;
            md[&amp;quot;area&amp;quot;] = {&amp;quot;style&amp;quot;: &amp;quot;GRIB&amp;quot;, &amp;quot;value&amp;quot;: area}&lt;br /&gt;
        if proddef:&lt;br /&gt;
            md[&amp;quot;proddef&amp;quot;] = {&amp;quot;style&amp;quot;: &amp;quot;GRIB&amp;quot;, &amp;quot;value&amp;quot;: proddef}&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Scanner.register(&amp;quot;generic&amp;quot;, scan, priority=1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash&lt;br /&gt;
&lt;br /&gt;
 dnf install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 #rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cd /etc/monit.d/&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdaten&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
&lt;br /&gt;
AL MOMENTO NON DISPONIBILE SU CENTOS 8&lt;br /&gt;
NOT AVAILABLE ON CENTOS 8&lt;br /&gt;
&lt;br /&gt;
 dnf install arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
&lt;br /&gt;
= Installazione RMAP server su centos 7 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 yum install yum-plugin-copr&lt;br /&gt;
 yum copr enable simc/stable&lt;br /&gt;
&lt;br /&gt;
 #cd /tmp&lt;br /&gt;
 #wget http://rmap.it/repo/rmap/yum-packages-centos.list&lt;br /&gt;
 #yum -y install &amp;lt; yum-packages-centos.list&lt;br /&gt;
 &lt;br /&gt;
 yum groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
yum install postgresql-server postgresql-contrib&lt;br /&gt;
yum install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
 yum install python34-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 add &lt;br /&gt;
 exclude=mosquitto&lt;br /&gt;
 in &lt;br /&gt;
 /etc/yum.repos.d/epel.repo&lt;br /&gt;
&lt;br /&gt;
 wget &amp;quot;http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo&amp;quot; -o /etc/yum.repos.d/mqtt.repo&lt;br /&gt;
 yum install mosquitto libmosquitto-devel libmosquittopp-devel mosquitto-clients&lt;br /&gt;
 mkdir git&lt;br /&gt;
 cd git&lt;br /&gt;
 git clone https://github.com/jpmens/mosquitto-auth-plug.git&lt;br /&gt;
 cp  config.mk.in  config.mk&lt;br /&gt;
 emacs config.mk  (disable mysql; enable http)   &lt;br /&gt;
 &lt;br /&gt;
apply this patch:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff --git a/auth-plug.c b/auth-plug.c&lt;br /&gt;
index 744f115..a36c039 100644&lt;br /&gt;
--- a/auth-plug.c&lt;br /&gt;
+++ b/auth-plug.c&lt;br /&gt;
@@ -585,6 +585,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
         * id to bypass ACL checks (or have a username/client id that cannot&lt;br /&gt;
         * publish or receive messages to its own place in the hierarchy).&lt;br /&gt;
         */&lt;br /&gt;
+       /*&lt;br /&gt;
        if(username &amp;amp;&amp;amp; strpbrk(username, &amp;quot;+#/&amp;quot;)){&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous username \&amp;quot;%s\&amp;quot;&amp;quot;, username);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
@@ -594,6 +595,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous client id \&amp;quot;%s\&amp;quot;&amp;quot;, clientid);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
        }&lt;br /&gt;
+       */&lt;br /&gt;
 &lt;br /&gt;
        _log(LOG_DEBUG, &amp;quot;mosquitto_auth_acl_check(..., %s, %s, %s, %s)&amp;quot;,&lt;br /&gt;
                clientid ? clientid : &amp;quot;NULL&amp;quot;,&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 cp auth-plug.so /usr/lib64/&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 yum install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7279</id>
		<title>Gruppo Meteo/HowTo/server-centos</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7279"/>
		<updated>2020-07-13T07:28:55Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* istallazione sistema operativo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installazione RMAP server su centos 8 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository:&lt;br /&gt;
 yum -y install epel-release&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 dnf install yum-plugin-copr&lt;br /&gt;
 dnf copr enable simc/stable&lt;br /&gt;
 dnf copr enable pat1/rmap&lt;br /&gt;
 dnf config-manager --set-enabled PowerTools&lt;br /&gt;
&lt;br /&gt;
 dnf install mosquitto mosquitto-auth-plug&lt;br /&gt;
 dnf install arkimet&lt;br /&gt;
&lt;br /&gt;
 dnf install python3-rmap&lt;br /&gt;
 dnf install python3-pika python3-simplejson python3-django-classy-tags python3-iso8601 python3-pyparsing python3-requests python3-cairo ython3-nominatim python3-plyer python3-django-cors-headers&lt;br /&gt;
 &lt;br /&gt;
 #dnf groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
dnf module disable postgresql:10&lt;br /&gt;
dnf module enable postgresql:12&lt;br /&gt;
dnf install postgresql-server postgresql-contrib&lt;br /&gt;
dnf install python3-psycopg2&lt;br /&gt;
&lt;br /&gt;
postgresql-setup --initdb --unit postgresql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
Collect static files from django apps:&lt;br /&gt;
&lt;br /&gt;
 mkdir global_static&lt;br /&gt;
 export DJANGO_SETTINGS_MODULE=rmap.settings&lt;br /&gt;
 django-admin collectstatic&lt;br /&gt;
 rmdir global_static&lt;br /&gt;
&lt;br /&gt;
 yum install python3-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 SecRuleEngine On&lt;br /&gt;
 &lt;br /&gt;
 #The first SecAction initializes the state, in this case by IP address.&lt;br /&gt;
 #The second SecAction deprecates the counter by 1 every 60 second.&lt;br /&gt;
 #This is setting the base rate of our rate limit&lt;br /&gt;
 #Then the Header definition ensures a header is set whenever a request&lt;br /&gt;
 #is rate limited, giving a hint to the client that they shouldn’t try&lt;br /&gt;
 #again for 10 seconds. This is obviously just a guide and a lot of&lt;br /&gt;
 #clients don’t implement it (and it’s really only valid on a 503 status&lt;br /&gt;
 #anyway) so it’s a little bit of wishful thinking really.&lt;br /&gt;
 #Then we define a neat ErrorDocument for the 509 response to give a better clue to the client about what is happening.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /borinud&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   # whitelist localhost&lt;br /&gt;
   #SecRule REMOTE_ADDR &amp;quot;@contains 127.0.0.1&amp;quot; &amp;quot;id:1,phase:1,nolog,allow,ctl:ruleEngine=Off&amp;quot;&lt;br /&gt;
   SecRule REMOTE_ADDR &amp;quot;^127.0.0.1$&amp;quot; nolog,allow,id:1&lt;br /&gt;
 &lt;br /&gt;
   # initialise the state based on ip address&lt;br /&gt;
   SecAction id:2,initcol:IP=%{REMOTE_ADDR}&lt;br /&gt;
 &lt;br /&gt;
   # set the base rate to one per 15 minutes&lt;br /&gt;
   SecAction id:3,deprecatevar:IP.CALLS_LIMIT=1/900&lt;br /&gt;
 &lt;br /&gt;
   # if greater then burst_rate_limit then pause set RATELIMITED var and then return 503&lt;br /&gt;
   SecRule IP:CALLS_LIMIT &amp;quot;@gt 60&amp;quot; &amp;quot;id:4,phase:2,pause:300,deny,status:503,setenv:RATELIMITED,skip:1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   # if above rule doesnt match increment the count&lt;br /&gt;
   SecAction id:5,setvar:IP.CALLS_LIMIT=+1&lt;br /&gt;
 &lt;br /&gt;
   # set a header when ratelimited&lt;br /&gt;
   Header always set Retry-After &amp;quot;10&amp;quot; env=RATELIMITED&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 ErrorDocument 503 &amp;quot;Service Unavailable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 dnf install arkimet arkimet-postprocessor-suite&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
 mkdir /var/log/arkimet&lt;br /&gt;
 chown -R arkimet:arkimet /var/log/arkimet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create file /etc/arkimet/scan/bufr_generic_mobile_rmap.py:&lt;br /&gt;
&lt;br /&gt;
 from arkimet.scan.bufr import Scanner, read_area_mobile, read_proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 def scan(msg, md):&lt;br /&gt;
    if msg.report == &amp;quot;mobile&amp;quot;:&lt;br /&gt;
        area = read_area_mobile(msg)&lt;br /&gt;
        proddef = read_proddef(msg)&lt;br /&gt;
        if area:&lt;br /&gt;
            md[&amp;quot;area&amp;quot;] = {&amp;quot;style&amp;quot;: &amp;quot;GRIB&amp;quot;, &amp;quot;value&amp;quot;: area}&lt;br /&gt;
        if proddef:&lt;br /&gt;
            md[&amp;quot;proddef&amp;quot;] = {&amp;quot;style&amp;quot;: &amp;quot;GRIB&amp;quot;, &amp;quot;value&amp;quot;: proddef}&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Scanner.register(&amp;quot;generic&amp;quot;, scan, priority=1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash&lt;br /&gt;
&lt;br /&gt;
 dnf install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 #rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cd /etc/monit.d/&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdaten&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
&lt;br /&gt;
AL MOMENTO NON DISPONIBILE SU CENTOS 8&lt;br /&gt;
NOT AVAILABLE ON CENTOS 8&lt;br /&gt;
&lt;br /&gt;
 dnf install arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
&lt;br /&gt;
= Installazione RMAP server su centos 7 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 yum install yum-plugin-copr&lt;br /&gt;
 yum copr enable simc/stable&lt;br /&gt;
&lt;br /&gt;
 #cd /tmp&lt;br /&gt;
 #wget http://rmap.it/repo/rmap/yum-packages-centos.list&lt;br /&gt;
 #yum -y install &amp;lt; yum-packages-centos.list&lt;br /&gt;
 &lt;br /&gt;
 yum groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
yum install postgresql-server postgresql-contrib&lt;br /&gt;
yum install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
 yum install python34-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 add &lt;br /&gt;
 exclude=mosquitto&lt;br /&gt;
 in &lt;br /&gt;
 /etc/yum.repos.d/epel.repo&lt;br /&gt;
&lt;br /&gt;
 wget &amp;quot;http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo&amp;quot; -o /etc/yum.repos.d/mqtt.repo&lt;br /&gt;
 yum install mosquitto libmosquitto-devel libmosquittopp-devel mosquitto-clients&lt;br /&gt;
 mkdir git&lt;br /&gt;
 cd git&lt;br /&gt;
 git clone https://github.com/jpmens/mosquitto-auth-plug.git&lt;br /&gt;
 cp  config.mk.in  config.mk&lt;br /&gt;
 emacs config.mk  (disable mysql; enable http)   &lt;br /&gt;
 &lt;br /&gt;
apply this patch:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff --git a/auth-plug.c b/auth-plug.c&lt;br /&gt;
index 744f115..a36c039 100644&lt;br /&gt;
--- a/auth-plug.c&lt;br /&gt;
+++ b/auth-plug.c&lt;br /&gt;
@@ -585,6 +585,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
         * id to bypass ACL checks (or have a username/client id that cannot&lt;br /&gt;
         * publish or receive messages to its own place in the hierarchy).&lt;br /&gt;
         */&lt;br /&gt;
+       /*&lt;br /&gt;
        if(username &amp;amp;&amp;amp; strpbrk(username, &amp;quot;+#/&amp;quot;)){&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous username \&amp;quot;%s\&amp;quot;&amp;quot;, username);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
@@ -594,6 +595,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous client id \&amp;quot;%s\&amp;quot;&amp;quot;, clientid);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
        }&lt;br /&gt;
+       */&lt;br /&gt;
 &lt;br /&gt;
        _log(LOG_DEBUG, &amp;quot;mosquitto_auth_acl_check(..., %s, %s, %s, %s)&amp;quot;,&lt;br /&gt;
                clientid ? clientid : &amp;quot;NULL&amp;quot;,&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 cp auth-plug.so /usr/lib64/&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 yum install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=VideoConfDoveSiamo&amp;diff=7275</id>
		<title>VideoConfDoveSiamo</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=VideoConfDoveSiamo&amp;diff=7275"/>
		<updated>2020-04-30T15:07:39Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: Creata pagina con ' Per la sera del 30 Aprile 2020 ci troviamo: * https://meet.jit.si/raspibo  se non ci trovi riconsulta questa pagina'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Per la sera del 30 Aprile 2020 ci troviamo:&lt;br /&gt;
* https://meet.jit.si/raspibo&lt;br /&gt;
&lt;br /&gt;
se non ci trovi riconsulta questa pagina&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7271</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7271"/>
		<updated>2020-04-07T07:11:03Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Anagrafica */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.3 =&lt;br /&gt;
== Storia del documento ==&lt;br /&gt;
2019/06/18 v. 2.3 : aggiunte specifiche JSRPC&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
              &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
              &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
              &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;],&lt;br /&gt;
        &amp;quot;51&amp;quot;:[&amp;quot;B11211&amp;quot;,&amp;quot;B11212&amp;quot;,&amp;quot;B11213&amp;quot;,&amp;quot;B11214&amp;quot;,&amp;quot;B11215&amp;quot;,&amp;quot;B11216&amp;quot;],&lt;br /&gt;
        &amp;quot;52&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
              &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: se true riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server (default false)&lt;br /&gt;
* char datalevel: &amp;quot;sample&amp;quot; o &amp;quot;report&amp;quot;; prima parte del path di pubblicazione su MQTT per i dati (default &amp;quot;report&amp;quot;)&lt;br /&gt;
* char network: &amp;quot;fixed&amp;quot; o &amp;quot;mobile&amp;quot;; prima parte del path di pubblicazione su MQTT per i dati (default &amp;quot;fixed&amp;quot;)&lt;br /&gt;
* int lat: latitudine espressa con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* int lon: longitudine espressa con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* char mqttmaintpath: prima parte del path di pubblicazione su MQTT per i messaggi di funzionamento (default &amp;quot;maint&amp;quot;)&lt;br /&gt;
* int  sampletime: intervallo tra le misure in secondi (default 900)&lt;br /&gt;
* char mqttserver:  server MQTT (default &amp;quot;rmap.cc&amp;quot;)&lt;br /&gt;
* char mqttuser: MQTT user ( no default)&lt;br /&gt;
* char mqttpass: MQTT password ( no default)&lt;br /&gt;
* char ntpserver:  NTP server (no default)&lt;br /&gt;
* array int[6] date: set date and time [esempio: 2014,2,10,18,45,18] (no default)&lt;br /&gt;
* array byte mac[6]: ethernet mac address (esempio: use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.) (no default)&lt;br /&gt;
* bool save: if true save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server (default false)&lt;br /&gt;
* array sens:&lt;br /&gt;
** char tr: timerange (esempio: &amp;quot;1,0,60&amp;quot;) (no default)&lt;br /&gt;
** char lev: level (esempio &amp;quot;1,-,-,-&amp;quot;) (no default)&lt;br /&gt;
** char var: variabile tabella B (esempio &amp;quot;B13011&amp;quot;) (no default)&lt;br /&gt;
** any ext: configurazione relativa a una implementazione specifica di un sensore nella stazione OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;mqttuser&amp;quot;:&amp;quot;myuser&amp;quot;, &amp;quot;mqttpass&amp;quot;:&amp;quot;mypassword&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;datalevel&amp;quot;:&amp;quot;report&amp;quot;, &amp;quot;network&amp;quot;:&amp;quot;fixed&amp;quot;, &amp;quot;lon&amp;quot;:1112345, &amp;quot;lat&amp;quot;:4412345}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;1,0,60&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;1,-,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B130111&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;254,0,0&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;105,2000,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B12101&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server (opzionale)&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta terminerà con la stringa &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere la chiave &amp;quot;t&amp;quot; nel payload.&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?time&lt;br /&gt;
risposta:&lt;br /&gt;
 19/06/18,13:06:59+00 please set topic&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
Elenco stazioni indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stations'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stations'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Covid19/Come_produrre_schermi_facciali_di_protezione&amp;diff=7263</id>
		<title>Covid19/Come produrre schermi facciali di protezione</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Covid19/Come_produrre_schermi_facciali_di_protezione&amp;diff=7263"/>
		<updated>2020-03-27T18:08:19Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Altri How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Da dove partire =&lt;br /&gt;
== Link utili da cui partire ==&lt;br /&gt;
&lt;br /&gt;
=== Articoli scientifici ===&lt;br /&gt;
=== Altri materiali tecnico scientifici ===&lt;br /&gt;
=== Altri How To ===&lt;br /&gt;
* https://nabilbd.com/how-we-are-making-diy-faceshield-for-dcotors/?fbclid=IwAR28P__CjdDmCqpfgw81to6l1Sm8aM3K3WYxQ4-kA1QjyRCrfktg-uJrHQU&lt;br /&gt;
* http://makernexuswiki.com/index.php?title=3D_printed_face_shields&lt;br /&gt;
* https://twitter.com/DrLukeTC/status/1242954678838706177&lt;br /&gt;
* https://www.prusaprinters.org/prints/25857-prusa-protective-face-shield-rc2&lt;br /&gt;
* http://daniepstein.com/daniepstein/3d-printable-face-shield/&lt;br /&gt;
* https://www.facebook.com/groups/opensourcecovid19medicalsupplies/permalink/677950066348722/&lt;br /&gt;
* https://grabcad.com/library/covid19-face-shield-for-cnc-router-1&lt;br /&gt;
* https://ldnmachines.weebly.com/project-zero-covid---face-shield.html&lt;br /&gt;
* https://www.thingiverse.com/thing:4239688&lt;br /&gt;
&lt;br /&gt;
== Idee a ruota libera ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Risorse =&lt;br /&gt;
* Materiali&lt;br /&gt;
* Tecnologie per la fabbricazione&lt;br /&gt;
&lt;br /&gt;
= Problematiche =&lt;br /&gt;
* sanificazione&lt;br /&gt;
* usabilità&lt;br /&gt;
&lt;br /&gt;
= How To =&lt;br /&gt;
&lt;br /&gt;
== Schermo modello ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* peso&lt;br /&gt;
* dimensioni&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;br /&gt;
&lt;br /&gt;
== Schermo modello ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* peso&lt;br /&gt;
* dimensioni&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7262</id>
		<title>Covid19/Come farsi una mascherina in casa</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7262"/>
		<updated>2020-03-27T18:02:32Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Controllati */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Da dove partire =&lt;br /&gt;
== Link utili da cui partire ==&lt;br /&gt;
&lt;br /&gt;
=== Articoli scientifici ===&lt;br /&gt;
&lt;br /&gt;
==== Da controllare ====&lt;br /&gt;
&lt;br /&gt;
Studi sull'efficacia delle mascherine chirurgiche nel&lt;br /&gt;
contrasto alla diffusione di virus in una comunità&lt;br /&gt;
&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/20088690&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/19652172&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/22280120&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Controllati ====&lt;br /&gt;
* https://www.nejm.org/doi/10.1056/NEJMc2004973&lt;br /&gt;
* https://multimedia.3m.com/mws/media/409903O/respiratory-protection-against-biohazards.pdf&lt;br /&gt;
* https://academic.oup.com/annweh/article/54/7/789/202744&lt;br /&gt;
&lt;br /&gt;
=== Altri materiali tecnico scientifici ===&lt;br /&gt;
=== Altri How To ===&lt;br /&gt;
&lt;br /&gt;
== Idee a ruota libera ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Risorse =&lt;br /&gt;
* Materiali&lt;br /&gt;
* Tecnologie per la fabbricazione&lt;br /&gt;
&lt;br /&gt;
= Problematiche =&lt;br /&gt;
* sanificazione&lt;br /&gt;
* umidità&lt;br /&gt;
&lt;br /&gt;
= How To =&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7261</id>
		<title>Covid19/Come farsi una mascherina in casa</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7261"/>
		<updated>2020-03-27T17:31:52Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Controllati */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Da dove partire =&lt;br /&gt;
== Link utili da cui partire ==&lt;br /&gt;
&lt;br /&gt;
=== Articoli scientifici ===&lt;br /&gt;
&lt;br /&gt;
==== Da controllare ====&lt;br /&gt;
&lt;br /&gt;
Studi sull'efficacia delle mascherine chirurgiche nel&lt;br /&gt;
contrasto alla diffusione di virus in una comunità&lt;br /&gt;
&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/20088690&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/19652172&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/22280120&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Controllati ====&lt;br /&gt;
* https://www.nejm.org/doi/10.1056/NEJMc2004973&lt;br /&gt;
* https://multimedia.3m.com/mws/media/409903O/respiratory-protection-against-biohazards.pdf&lt;br /&gt;
&lt;br /&gt;
=== Altri materiali tecnico scientifici ===&lt;br /&gt;
=== Altri How To ===&lt;br /&gt;
&lt;br /&gt;
== Idee a ruota libera ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Risorse =&lt;br /&gt;
* Materiali&lt;br /&gt;
* Tecnologie per la fabbricazione&lt;br /&gt;
&lt;br /&gt;
= Problematiche =&lt;br /&gt;
* sanificazione&lt;br /&gt;
* umidità&lt;br /&gt;
&lt;br /&gt;
= How To =&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7260</id>
		<title>Covid19/Come farsi una mascherina in casa</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7260"/>
		<updated>2020-03-27T10:48:26Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Controllati */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Da dove partire =&lt;br /&gt;
== Link utili da cui partire ==&lt;br /&gt;
&lt;br /&gt;
=== Articoli scientifici ===&lt;br /&gt;
&lt;br /&gt;
==== Da controllare ====&lt;br /&gt;
&lt;br /&gt;
Studi sull'efficacia delle mascherine chirurgiche nel&lt;br /&gt;
contrasto alla diffusione di virus in una comunità&lt;br /&gt;
&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/20088690&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/19652172&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/22280120&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Controllati ====&lt;br /&gt;
* https://www.nejm.org/doi/10.1056/NEJMc2004973&lt;br /&gt;
&lt;br /&gt;
=== Altri materiali tecnico scientifici ===&lt;br /&gt;
=== Altri How To ===&lt;br /&gt;
&lt;br /&gt;
== Idee a ruota libera ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Risorse =&lt;br /&gt;
* Materiali&lt;br /&gt;
* Tecnologie per la fabbricazione&lt;br /&gt;
&lt;br /&gt;
= Problematiche =&lt;br /&gt;
* sanificazione&lt;br /&gt;
* umidità&lt;br /&gt;
&lt;br /&gt;
= How To =&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7259</id>
		<title>Covid19/Come farsi una mascherina in casa</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7259"/>
		<updated>2020-03-27T09:00:46Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Controllati = */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Da dove partire =&lt;br /&gt;
== Link utili da cui partire ==&lt;br /&gt;
&lt;br /&gt;
=== Articoli scientifici ===&lt;br /&gt;
&lt;br /&gt;
==== Da controllare ====&lt;br /&gt;
&lt;br /&gt;
Studi sull'efficacia delle mascherine chirurgiche nel&lt;br /&gt;
contrasto alla diffusione di virus in una comunità&lt;br /&gt;
&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/20088690&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/19652172&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/22280120&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Controllati ====&lt;br /&gt;
&lt;br /&gt;
=== Altri materiali tecnico scientifici ===&lt;br /&gt;
=== Altri How To ===&lt;br /&gt;
&lt;br /&gt;
== Idee a ruota libera ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Risorse =&lt;br /&gt;
* Materiali&lt;br /&gt;
* Tecnologie per la fabbricazione&lt;br /&gt;
&lt;br /&gt;
= Problematiche =&lt;br /&gt;
* sanificazione&lt;br /&gt;
* umidità&lt;br /&gt;
&lt;br /&gt;
= How To =&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Covid19/Come_produrre_schermi_facciali_di_protezione&amp;diff=7258</id>
		<title>Covid19/Come produrre schermi facciali di protezione</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Covid19/Come_produrre_schermi_facciali_di_protezione&amp;diff=7258"/>
		<updated>2020-03-27T08:59:12Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Altri How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Da dove partire =&lt;br /&gt;
== Link utili da cui partire ==&lt;br /&gt;
&lt;br /&gt;
=== Articoli scientifici ===&lt;br /&gt;
=== Altri materiali tecnico scientifici ===&lt;br /&gt;
=== Altri How To ===&lt;br /&gt;
* https://nabilbd.com/how-we-are-making-diy-faceshield-for-dcotors/?fbclid=IwAR28P__CjdDmCqpfgw81to6l1Sm8aM3K3WYxQ4-kA1QjyRCrfktg-uJrHQU&lt;br /&gt;
* http://makernexuswiki.com/index.php?title=3D_printed_face_shields&lt;br /&gt;
* https://twitter.com/DrLukeTC/status/1242954678838706177&lt;br /&gt;
* https://www.prusaprinters.org/prints/25857-prusa-protective-face-shield-rc2&lt;br /&gt;
* http://daniepstein.com/daniepstein/3d-printable-face-shield/&lt;br /&gt;
* https://www.facebook.com/groups/opensourcecovid19medicalsupplies/permalink/677950066348722/&lt;br /&gt;
* https://grabcad.com/library/covid19-face-shield-for-cnc-router-1&lt;br /&gt;
* https://ldnmachines.weebly.com/project-zero-covid---face-shield.html&lt;br /&gt;
&lt;br /&gt;
== Idee a ruota libera ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Risorse =&lt;br /&gt;
* Materiali&lt;br /&gt;
* Tecnologie per la fabbricazione&lt;br /&gt;
&lt;br /&gt;
= Problematiche =&lt;br /&gt;
* sanificazione&lt;br /&gt;
* usabilità&lt;br /&gt;
&lt;br /&gt;
= How To =&lt;br /&gt;
&lt;br /&gt;
== Schermo modello ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* peso&lt;br /&gt;
* dimensioni&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;br /&gt;
&lt;br /&gt;
== Schermo modello ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* peso&lt;br /&gt;
* dimensioni&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7257</id>
		<title>Covid19/Come farsi una mascherina in casa</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7257"/>
		<updated>2020-03-27T08:58:31Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Altri How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Da dove partire =&lt;br /&gt;
== Link utili da cui partire ==&lt;br /&gt;
&lt;br /&gt;
=== Articoli scientifici ===&lt;br /&gt;
&lt;br /&gt;
==== Da controllare ====&lt;br /&gt;
&lt;br /&gt;
Studi sull'efficacia delle mascherine chirurgiche nel&lt;br /&gt;
contrasto alla diffusione di virus in una comunità&lt;br /&gt;
&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/20088690&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/19652172&lt;br /&gt;
 - https://www.ncbi.nlm.nih.gov/pubmed/22280120&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Controllati =====&lt;br /&gt;
&lt;br /&gt;
=== Altri materiali tecnico scientifici ===&lt;br /&gt;
=== Altri How To ===&lt;br /&gt;
&lt;br /&gt;
== Idee a ruota libera ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Risorse =&lt;br /&gt;
* Materiali&lt;br /&gt;
* Tecnologie per la fabbricazione&lt;br /&gt;
&lt;br /&gt;
= Problematiche =&lt;br /&gt;
* sanificazione&lt;br /&gt;
* umidità&lt;br /&gt;
&lt;br /&gt;
= How To =&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Covid19/Come_produrre_schermi_facciali_di_protezione&amp;diff=7256</id>
		<title>Covid19/Come produrre schermi facciali di protezione</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Covid19/Come_produrre_schermi_facciali_di_protezione&amp;diff=7256"/>
		<updated>2020-03-27T08:57:20Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Altri How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Da dove partire =&lt;br /&gt;
== Link utili da cui partire ==&lt;br /&gt;
&lt;br /&gt;
=== Articoli scientifici ===&lt;br /&gt;
=== Altri materiali tecnico scientifici ===&lt;br /&gt;
=== Altri How To ===&lt;br /&gt;
* https://nabilbd.com/how-we-are-making-diy-faceshield-for-dcotors/?fbclid=IwAR28P__CjdDmCqpfgw81to6l1Sm8aM3K3WYxQ4-kA1QjyRCrfktg-uJrHQU&lt;br /&gt;
&lt;br /&gt;
== Idee a ruota libera ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Risorse =&lt;br /&gt;
* Materiali&lt;br /&gt;
* Tecnologie per la fabbricazione&lt;br /&gt;
&lt;br /&gt;
= Problematiche =&lt;br /&gt;
* sanificazione&lt;br /&gt;
* usabilità&lt;br /&gt;
&lt;br /&gt;
= How To =&lt;br /&gt;
&lt;br /&gt;
== Schermo modello ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* peso&lt;br /&gt;
* dimensioni&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;br /&gt;
&lt;br /&gt;
== Schermo modello ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* peso&lt;br /&gt;
* dimensioni&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7254</id>
		<title>Covid19/Come farsi una mascherina in casa</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7254"/>
		<updated>2020-03-26T11:47:15Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Altri How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Da dove partire =&lt;br /&gt;
== Link utili da cui partire ==&lt;br /&gt;
&lt;br /&gt;
=== Articoli scientifici ===&lt;br /&gt;
=== Altri materiali tecnico scientifici ===&lt;br /&gt;
=== Altri How To ===&lt;br /&gt;
* http://makernexuswiki.com/index.php?title=3D_printed_face_shields&lt;br /&gt;
* https://twitter.com/DrLukeTC/status/1242954678838706177&lt;br /&gt;
* https://www.prusaprinters.org/prints/25857-prusa-protective-face-shield-rc2&lt;br /&gt;
* http://daniepstein.com/daniepstein/3d-printable-face-shield/&lt;br /&gt;
* https://www.facebook.com/groups/opensourcecovid19medicalsupplies/permalink/677950066348722/&lt;br /&gt;
* https://grabcad.com/library/covid19-face-shield-for-cnc-router-1&lt;br /&gt;
* https://ldnmachines.weebly.com/project-zero-covid---face-shield.html&lt;br /&gt;
&lt;br /&gt;
== Idee a ruota libera ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Risorse =&lt;br /&gt;
* Materiali&lt;br /&gt;
* Tecnologie per la fabbricazione&lt;br /&gt;
&lt;br /&gt;
= Problematiche =&lt;br /&gt;
* sanificazione&lt;br /&gt;
* umidità&lt;br /&gt;
&lt;br /&gt;
= How To =&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7253</id>
		<title>Covid19/Come farsi una mascherina in casa</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7253"/>
		<updated>2020-03-26T11:20:45Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Altri How To */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Da dove partire =&lt;br /&gt;
== Link utili da cui partire ==&lt;br /&gt;
&lt;br /&gt;
=== Articoli scientifici ===&lt;br /&gt;
=== Altri materiali tecnico scientifici ===&lt;br /&gt;
=== Altri How To ===&lt;br /&gt;
* http://makernexuswiki.com/index.php?title=3D_printed_face_shields&lt;br /&gt;
* https://twitter.com/DrLukeTC/status/1242954678838706177&lt;br /&gt;
&lt;br /&gt;
== Idee a ruota libera ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Risorse =&lt;br /&gt;
* Materiali&lt;br /&gt;
* Tecnologie per la fabbricazione&lt;br /&gt;
&lt;br /&gt;
= Problematiche =&lt;br /&gt;
* sanificazione&lt;br /&gt;
* umidità&lt;br /&gt;
&lt;br /&gt;
= How To =&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Covid19/Come_produrre_schermi_facciali_di_protezione&amp;diff=7252</id>
		<title>Covid19/Come produrre schermi facciali di protezione</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Covid19/Come_produrre_schermi_facciali_di_protezione&amp;diff=7252"/>
		<updated>2020-03-26T10:49:21Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: Creata pagina con '= Da dove partire = == Link utili da cui partire ==  === Articoli scientifici === === Altri materiali tecnico scientifici === === Altri How To ===  == Idee a ruota libera ==  ...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Da dove partire =&lt;br /&gt;
== Link utili da cui partire ==&lt;br /&gt;
&lt;br /&gt;
=== Articoli scientifici ===&lt;br /&gt;
=== Altri materiali tecnico scientifici ===&lt;br /&gt;
=== Altri How To ===&lt;br /&gt;
&lt;br /&gt;
== Idee a ruota libera ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Risorse =&lt;br /&gt;
* Materiali&lt;br /&gt;
* Tecnologie per la fabbricazione&lt;br /&gt;
&lt;br /&gt;
= Problematiche =&lt;br /&gt;
* sanificazione&lt;br /&gt;
* usabilità&lt;br /&gt;
&lt;br /&gt;
= How To =&lt;br /&gt;
&lt;br /&gt;
== Schermo modello ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* peso&lt;br /&gt;
* dimensioni&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;br /&gt;
&lt;br /&gt;
== Schermo modello ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* peso&lt;br /&gt;
* dimensioni&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7251</id>
		<title>Covid19/Come farsi una mascherina in casa</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Covid19/Come_farsi_una_mascherina_in_casa&amp;diff=7251"/>
		<updated>2020-03-26T10:37:21Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: Creata pagina con '= Da dove partire = == Link utili da cui partire ==  === Articoli scientifici === === Altri materiali tecnico scientifici === === Altri How To ===  == Idee a ruota libera ==  ...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Da dove partire =&lt;br /&gt;
== Link utili da cui partire ==&lt;br /&gt;
&lt;br /&gt;
=== Articoli scientifici ===&lt;br /&gt;
=== Altri materiali tecnico scientifici ===&lt;br /&gt;
=== Altri How To ===&lt;br /&gt;
&lt;br /&gt;
== Idee a ruota libera ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Risorse =&lt;br /&gt;
* Materiali&lt;br /&gt;
* Tecnologie per la fabbricazione&lt;br /&gt;
&lt;br /&gt;
= Problematiche =&lt;br /&gt;
* sanificazione&lt;br /&gt;
* umidità&lt;br /&gt;
&lt;br /&gt;
= How To =&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;br /&gt;
&lt;br /&gt;
== Mascherina fatta con ... ==&lt;br /&gt;
=== Caratteristiche ===&lt;br /&gt;
* durata&lt;br /&gt;
* potere filtrante&lt;br /&gt;
* riutilizzabilità&lt;br /&gt;
&lt;br /&gt;
=== Materiali ===&lt;br /&gt;
&lt;br /&gt;
=== Costruzione ===&lt;br /&gt;
&lt;br /&gt;
=== Utilizzo ===&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Covid19&amp;diff=7250</id>
		<title>Covid19</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Covid19&amp;diff=7250"/>
		<updated>2020-03-26T10:25:10Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: Creata pagina con ' '''Qui trovi tutti i progetti relativi al Corona Virus: {{Special:PrefixIndex/Covid19/ |hideredirects=1}}''''&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
'''Qui trovi tutti i progetti relativi al Corona Virus: {{Special:PrefixIndex/Covid19/ |hideredirects=1}}'''&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7249</id>
		<title>Gruppo Meteo/HowTo/server-centos</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7249"/>
		<updated>2020-03-10T17:21:53Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* apache */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installazione RMAP server su centos 8 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 dnf install yum-plugin-copr&lt;br /&gt;
 dnf copr enable simc/stable&lt;br /&gt;
 dnf copr enable pat1/rmap&lt;br /&gt;
 dnf config-manager --set-enabled PowerTools&lt;br /&gt;
&lt;br /&gt;
 dnf install mosquitto mosquitto-auth-plug&lt;br /&gt;
 dnf install arkimet&lt;br /&gt;
&lt;br /&gt;
 dnf install python3-rmap&lt;br /&gt;
 dnf install python3-pika python3-simplejson python3-django-classy-tags python3-iso8601 python3-pyparsing python3-requests python3-cairo ython3-nominatim python3-plyer python3-django-cors-headers&lt;br /&gt;
 &lt;br /&gt;
 #dnf groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
dnf module disable postgresql:10&lt;br /&gt;
dnf module enable postgresql:12&lt;br /&gt;
dnf install postgresql-server postgresql-contrib&lt;br /&gt;
dnf install python3-psycopg2&lt;br /&gt;
&lt;br /&gt;
postgresql-setup --initdb --unit postgresql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
Collect static files from django apps:&lt;br /&gt;
&lt;br /&gt;
 mkdir global_static&lt;br /&gt;
 export DJANGO_SETTINGS_MODULE=rmap.settings&lt;br /&gt;
 django-admin collectstatic&lt;br /&gt;
 rmdir global_static&lt;br /&gt;
&lt;br /&gt;
 yum install python3-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 SecRuleEngine On&lt;br /&gt;
 &lt;br /&gt;
 #The first SecAction initializes the state, in this case by IP address.&lt;br /&gt;
 #The second SecAction deprecates the counter by 1 every 60 second.&lt;br /&gt;
 #This is setting the base rate of our rate limit&lt;br /&gt;
 #Then the Header definition ensures a header is set whenever a request&lt;br /&gt;
 #is rate limited, giving a hint to the client that they shouldn’t try&lt;br /&gt;
 #again for 10 seconds. This is obviously just a guide and a lot of&lt;br /&gt;
 #clients don’t implement it (and it’s really only valid on a 503 status&lt;br /&gt;
 #anyway) so it’s a little bit of wishful thinking really.&lt;br /&gt;
 #Then we define a neat ErrorDocument for the 509 response to give a better clue to the client about what is happening.&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /borinud&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
   # whitelist localhost&lt;br /&gt;
   #SecRule REMOTE_ADDR &amp;quot;@contains 127.0.0.1&amp;quot; &amp;quot;id:1,phase:1,nolog,allow,ctl:ruleEngine=Off&amp;quot;&lt;br /&gt;
   SecRule REMOTE_ADDR &amp;quot;^127.0.0.1$&amp;quot; nolog,allow,id:1&lt;br /&gt;
 &lt;br /&gt;
   # initialise the state based on ip address&lt;br /&gt;
   SecAction id:2,initcol:IP=%{REMOTE_ADDR}&lt;br /&gt;
 &lt;br /&gt;
   # set the base rate to one per 15 minutes&lt;br /&gt;
   SecAction id:3,deprecatevar:IP.CALLS_LIMIT=1/900&lt;br /&gt;
 &lt;br /&gt;
   # if greater then burst_rate_limit then pause set RATELIMITED var and then return 503&lt;br /&gt;
   SecRule IP:CALLS_LIMIT &amp;quot;@gt 60&amp;quot; &amp;quot;id:4,phase:2,pause:300,deny,status:503,setenv:RATELIMITED,skip:1&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
   # if above rule doesnt match increment the count&lt;br /&gt;
   SecAction id:5,setvar:IP.CALLS_LIMIT=+1&lt;br /&gt;
 &lt;br /&gt;
   # set a header when ratelimited&lt;br /&gt;
   Header always set Retry-After &amp;quot;10&amp;quot; env=RATELIMITED&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 ErrorDocument 503 &amp;quot;Service Unavailable&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 dnf install arkimet arkimet-postprocessor-suite&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
 mkdir /var/log/arkimet&lt;br /&gt;
 chown -R arkimet:arkimet /var/log/arkimet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create file /etc/arkimet/scan/bufr_generic_mobile_rmap.py:&lt;br /&gt;
&lt;br /&gt;
 from arkimet.scan.bufr import Scanner, read_area_mobile, read_proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 def scan(msg, md):&lt;br /&gt;
    if msg.report == &amp;quot;mobile&amp;quot;:&lt;br /&gt;
        area = read_area_mobile(msg)&lt;br /&gt;
        proddef = read_proddef(msg)&lt;br /&gt;
        if area:&lt;br /&gt;
            md[&amp;quot;area&amp;quot;] = {&amp;quot;style&amp;quot;: &amp;quot;GRIB&amp;quot;, &amp;quot;value&amp;quot;: area}&lt;br /&gt;
        if proddef:&lt;br /&gt;
            md[&amp;quot;proddef&amp;quot;] = {&amp;quot;style&amp;quot;: &amp;quot;GRIB&amp;quot;, &amp;quot;value&amp;quot;: proddef}&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Scanner.register(&amp;quot;generic&amp;quot;, scan, priority=1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash&lt;br /&gt;
&lt;br /&gt;
 dnf install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 #rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cd /etc/monit.d/&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdaten&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
&lt;br /&gt;
AL MOMENTO NON DISPONIBILE SU CENTOS 8&lt;br /&gt;
NOT AVAILABLE ON CENTOS 8&lt;br /&gt;
&lt;br /&gt;
 dnf install arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
&lt;br /&gt;
= Installazione RMAP server su centos 7 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 yum install yum-plugin-copr&lt;br /&gt;
 yum copr enable simc/stable&lt;br /&gt;
&lt;br /&gt;
 #cd /tmp&lt;br /&gt;
 #wget http://rmap.it/repo/rmap/yum-packages-centos.list&lt;br /&gt;
 #yum -y install &amp;lt; yum-packages-centos.list&lt;br /&gt;
 &lt;br /&gt;
 yum groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
yum install postgresql-server postgresql-contrib&lt;br /&gt;
yum install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
 yum install python34-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 add &lt;br /&gt;
 exclude=mosquitto&lt;br /&gt;
 in &lt;br /&gt;
 /etc/yum.repos.d/epel.repo&lt;br /&gt;
&lt;br /&gt;
 wget &amp;quot;http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo&amp;quot; -o /etc/yum.repos.d/mqtt.repo&lt;br /&gt;
 yum install mosquitto libmosquitto-devel libmosquittopp-devel mosquitto-clients&lt;br /&gt;
 mkdir git&lt;br /&gt;
 cd git&lt;br /&gt;
 git clone https://github.com/jpmens/mosquitto-auth-plug.git&lt;br /&gt;
 cp  config.mk.in  config.mk&lt;br /&gt;
 emacs config.mk  (disable mysql; enable http)   &lt;br /&gt;
 &lt;br /&gt;
apply this patch:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff --git a/auth-plug.c b/auth-plug.c&lt;br /&gt;
index 744f115..a36c039 100644&lt;br /&gt;
--- a/auth-plug.c&lt;br /&gt;
+++ b/auth-plug.c&lt;br /&gt;
@@ -585,6 +585,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
         * id to bypass ACL checks (or have a username/client id that cannot&lt;br /&gt;
         * publish or receive messages to its own place in the hierarchy).&lt;br /&gt;
         */&lt;br /&gt;
+       /*&lt;br /&gt;
        if(username &amp;amp;&amp;amp; strpbrk(username, &amp;quot;+#/&amp;quot;)){&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous username \&amp;quot;%s\&amp;quot;&amp;quot;, username);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
@@ -594,6 +595,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous client id \&amp;quot;%s\&amp;quot;&amp;quot;, clientid);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
        }&lt;br /&gt;
+       */&lt;br /&gt;
 &lt;br /&gt;
        _log(LOG_DEBUG, &amp;quot;mosquitto_auth_acl_check(..., %s, %s, %s, %s)&amp;quot;,&lt;br /&gt;
                clientid ? clientid : &amp;quot;NULL&amp;quot;,&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 cp auth-plug.so /usr/lib64/&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 yum install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7248</id>
		<title>Gruppo Meteo/HowTo/server-centos</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7248"/>
		<updated>2020-03-10T17:14:24Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Arkimet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installazione RMAP server su centos 8 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 dnf install yum-plugin-copr&lt;br /&gt;
 dnf copr enable simc/stable&lt;br /&gt;
 dnf copr enable pat1/rmap&lt;br /&gt;
 dnf config-manager --set-enabled PowerTools&lt;br /&gt;
&lt;br /&gt;
 dnf install mosquitto mosquitto-auth-plug&lt;br /&gt;
 dnf install arkimet&lt;br /&gt;
&lt;br /&gt;
 dnf install python3-rmap&lt;br /&gt;
 dnf install python3-pika python3-simplejson python3-django-classy-tags python3-iso8601 python3-pyparsing python3-requests python3-cairo ython3-nominatim python3-plyer python3-django-cors-headers&lt;br /&gt;
 &lt;br /&gt;
 #dnf groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
dnf module disable postgresql:10&lt;br /&gt;
dnf module enable postgresql:12&lt;br /&gt;
dnf install postgresql-server postgresql-contrib&lt;br /&gt;
dnf install python3-psycopg2&lt;br /&gt;
&lt;br /&gt;
postgresql-setup --initdb --unit postgresql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
Collect static files from django apps:&lt;br /&gt;
&lt;br /&gt;
 mkdir global_static&lt;br /&gt;
 export DJANGO_SETTINGS_MODULE=rmap.settings&lt;br /&gt;
 django-admin collectstatic&lt;br /&gt;
 rmdir global_static&lt;br /&gt;
&lt;br /&gt;
 yum install python3-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 dnf install arkimet arkimet-postprocessor-suite&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
 mkdir /var/log/arkimet&lt;br /&gt;
 chown -R arkimet:arkimet /var/log/arkimet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create file /etc/arkimet/scan/bufr_generic_mobile_rmap.py:&lt;br /&gt;
&lt;br /&gt;
 from arkimet.scan.bufr import Scanner, read_area_mobile, read_proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 def scan(msg, md):&lt;br /&gt;
    if msg.report == &amp;quot;mobile&amp;quot;:&lt;br /&gt;
        area = read_area_mobile(msg)&lt;br /&gt;
        proddef = read_proddef(msg)&lt;br /&gt;
        if area:&lt;br /&gt;
            md[&amp;quot;area&amp;quot;] = {&amp;quot;style&amp;quot;: &amp;quot;GRIB&amp;quot;, &amp;quot;value&amp;quot;: area}&lt;br /&gt;
        if proddef:&lt;br /&gt;
            md[&amp;quot;proddef&amp;quot;] = {&amp;quot;style&amp;quot;: &amp;quot;GRIB&amp;quot;, &amp;quot;value&amp;quot;: proddef}&lt;br /&gt;
    else:&lt;br /&gt;
        return False&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 Scanner.register(&amp;quot;generic&amp;quot;, scan, priority=1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash&lt;br /&gt;
&lt;br /&gt;
 dnf install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 #rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cd /etc/monit.d/&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdaten&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
&lt;br /&gt;
AL MOMENTO NON DISPONIBILE SU CENTOS 8&lt;br /&gt;
NOT AVAILABLE ON CENTOS 8&lt;br /&gt;
&lt;br /&gt;
 dnf install arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
&lt;br /&gt;
= Installazione RMAP server su centos 7 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 yum install yum-plugin-copr&lt;br /&gt;
 yum copr enable simc/stable&lt;br /&gt;
&lt;br /&gt;
 #cd /tmp&lt;br /&gt;
 #wget http://rmap.it/repo/rmap/yum-packages-centos.list&lt;br /&gt;
 #yum -y install &amp;lt; yum-packages-centos.list&lt;br /&gt;
 &lt;br /&gt;
 yum groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
yum install postgresql-server postgresql-contrib&lt;br /&gt;
yum install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
 yum install python34-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 add &lt;br /&gt;
 exclude=mosquitto&lt;br /&gt;
 in &lt;br /&gt;
 /etc/yum.repos.d/epel.repo&lt;br /&gt;
&lt;br /&gt;
 wget &amp;quot;http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo&amp;quot; -o /etc/yum.repos.d/mqtt.repo&lt;br /&gt;
 yum install mosquitto libmosquitto-devel libmosquittopp-devel mosquitto-clients&lt;br /&gt;
 mkdir git&lt;br /&gt;
 cd git&lt;br /&gt;
 git clone https://github.com/jpmens/mosquitto-auth-plug.git&lt;br /&gt;
 cp  config.mk.in  config.mk&lt;br /&gt;
 emacs config.mk  (disable mysql; enable http)   &lt;br /&gt;
 &lt;br /&gt;
apply this patch:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff --git a/auth-plug.c b/auth-plug.c&lt;br /&gt;
index 744f115..a36c039 100644&lt;br /&gt;
--- a/auth-plug.c&lt;br /&gt;
+++ b/auth-plug.c&lt;br /&gt;
@@ -585,6 +585,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
         * id to bypass ACL checks (or have a username/client id that cannot&lt;br /&gt;
         * publish or receive messages to its own place in the hierarchy).&lt;br /&gt;
         */&lt;br /&gt;
+       /*&lt;br /&gt;
        if(username &amp;amp;&amp;amp; strpbrk(username, &amp;quot;+#/&amp;quot;)){&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous username \&amp;quot;%s\&amp;quot;&amp;quot;, username);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
@@ -594,6 +595,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous client id \&amp;quot;%s\&amp;quot;&amp;quot;, clientid);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
        }&lt;br /&gt;
+       */&lt;br /&gt;
 &lt;br /&gt;
        _log(LOG_DEBUG, &amp;quot;mosquitto_auth_acl_check(..., %s, %s, %s, %s)&amp;quot;,&lt;br /&gt;
                clientid ? clientid : &amp;quot;NULL&amp;quot;,&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 cp auth-plug.so /usr/lib64/&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 yum install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7242</id>
		<title>Gruppo Meteo/HowTo/server-centos</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7242"/>
		<updated>2020-02-13T14:40:25Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Arkimet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installazione RMAP server su centos 8 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 dnf install yum-plugin-copr&lt;br /&gt;
 dnf copr enable simc/stable&lt;br /&gt;
 dnf copr enable pat1/rmap&lt;br /&gt;
 dnf config-manager --set-enabled PowerTools&lt;br /&gt;
&lt;br /&gt;
 dnf install mosquitto mosquitto-auth-plug&lt;br /&gt;
 dnf install arkimet&lt;br /&gt;
&lt;br /&gt;
 dnf install python3-rmap&lt;br /&gt;
 dnf install python3-pika python3-simplejson python3-django-classy-tags python3-iso8601 python3-pyparsing python3-requests python3-cairo ython3-nominatim python3-plyer python3-django-cors-headers&lt;br /&gt;
 &lt;br /&gt;
 #dnf groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
dnf module disable postgresql:10&lt;br /&gt;
dnf module enable postgresql:12&lt;br /&gt;
dnf install postgresql-server postgresql-contrib&lt;br /&gt;
dnf install python3-psycopg2&lt;br /&gt;
&lt;br /&gt;
postgresql-setup --initdb --unit postgresql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
Collect static files from django apps:&lt;br /&gt;
&lt;br /&gt;
 mkdir global_static&lt;br /&gt;
 export DJANGO_SETTINGS_MODULE=rmap.settings&lt;br /&gt;
 django-admin collectstatic&lt;br /&gt;
 rmdir global_static&lt;br /&gt;
&lt;br /&gt;
 yum install python3-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 dnf install arkimet arkimet-postprocessor-suite&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
 mkdir /var/log/arkimet&lt;br /&gt;
 chown -R arkimet:arkimet /var/log/arkimet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash&lt;br /&gt;
&lt;br /&gt;
 dnf install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 #rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cd /etc/monit.d/&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdaten&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
&lt;br /&gt;
AL MOMENTO NON DISPONIBILE SU CENTOS 8&lt;br /&gt;
NOT AVAILABLE ON CENTOS 8&lt;br /&gt;
&lt;br /&gt;
 dnf install arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
&lt;br /&gt;
= Installazione RMAP server su centos 7 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 yum install yum-plugin-copr&lt;br /&gt;
 yum copr enable simc/stable&lt;br /&gt;
&lt;br /&gt;
 #cd /tmp&lt;br /&gt;
 #wget http://rmap.it/repo/rmap/yum-packages-centos.list&lt;br /&gt;
 #yum -y install &amp;lt; yum-packages-centos.list&lt;br /&gt;
 &lt;br /&gt;
 yum groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
yum install postgresql-server postgresql-contrib&lt;br /&gt;
yum install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
 yum install python34-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 add &lt;br /&gt;
 exclude=mosquitto&lt;br /&gt;
 in &lt;br /&gt;
 /etc/yum.repos.d/epel.repo&lt;br /&gt;
&lt;br /&gt;
 wget &amp;quot;http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo&amp;quot; -o /etc/yum.repos.d/mqtt.repo&lt;br /&gt;
 yum install mosquitto libmosquitto-devel libmosquittopp-devel mosquitto-clients&lt;br /&gt;
 mkdir git&lt;br /&gt;
 cd git&lt;br /&gt;
 git clone https://github.com/jpmens/mosquitto-auth-plug.git&lt;br /&gt;
 cp  config.mk.in  config.mk&lt;br /&gt;
 emacs config.mk  (disable mysql; enable http)   &lt;br /&gt;
 &lt;br /&gt;
apply this patch:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff --git a/auth-plug.c b/auth-plug.c&lt;br /&gt;
index 744f115..a36c039 100644&lt;br /&gt;
--- a/auth-plug.c&lt;br /&gt;
+++ b/auth-plug.c&lt;br /&gt;
@@ -585,6 +585,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
         * id to bypass ACL checks (or have a username/client id that cannot&lt;br /&gt;
         * publish or receive messages to its own place in the hierarchy).&lt;br /&gt;
         */&lt;br /&gt;
+       /*&lt;br /&gt;
        if(username &amp;amp;&amp;amp; strpbrk(username, &amp;quot;+#/&amp;quot;)){&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous username \&amp;quot;%s\&amp;quot;&amp;quot;, username);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
@@ -594,6 +595,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous client id \&amp;quot;%s\&amp;quot;&amp;quot;, clientid);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
        }&lt;br /&gt;
+       */&lt;br /&gt;
 &lt;br /&gt;
        _log(LOG_DEBUG, &amp;quot;mosquitto_auth_acl_check(..., %s, %s, %s, %s)&amp;quot;,&lt;br /&gt;
                clientid ? clientid : &amp;quot;NULL&amp;quot;,&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 cp auth-plug.so /usr/lib64/&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 yum install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7241</id>
		<title>Gruppo Meteo/HowTo/server-centos</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7241"/>
		<updated>2020-02-13T14:32:30Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Arkimet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installazione RMAP server su centos 8 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 dnf install yum-plugin-copr&lt;br /&gt;
 dnf copr enable simc/stable&lt;br /&gt;
 dnf copr enable pat1/rmap&lt;br /&gt;
 dnf config-manager --set-enabled PowerTools&lt;br /&gt;
&lt;br /&gt;
 dnf install mosquitto mosquitto-auth-plug&lt;br /&gt;
 dnf install arkimet&lt;br /&gt;
&lt;br /&gt;
 dnf install python3-rmap&lt;br /&gt;
 dnf install python3-pika python3-simplejson python3-django-classy-tags python3-iso8601 python3-pyparsing python3-requests python3-cairo ython3-nominatim python3-plyer python3-django-cors-headers&lt;br /&gt;
 &lt;br /&gt;
 #dnf groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
dnf module disable postgresql:10&lt;br /&gt;
dnf module enable postgresql:12&lt;br /&gt;
dnf install postgresql-server postgresql-contrib&lt;br /&gt;
dnf install python3-psycopg2&lt;br /&gt;
&lt;br /&gt;
postgresql-setup --initdb --unit postgresql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
Collect static files from django apps:&lt;br /&gt;
&lt;br /&gt;
 mkdir global_static&lt;br /&gt;
 export DJANGO_SETTINGS_MODULE=rmap.settings&lt;br /&gt;
 django-admin collectstatic&lt;br /&gt;
 rmdir global_static&lt;br /&gt;
&lt;br /&gt;
 yum install python3-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
 mkdir /var/log/arkimet&lt;br /&gt;
 chown -R arkimet:arkimet /var/log/arkimet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash&lt;br /&gt;
&lt;br /&gt;
 dnf install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 #rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cd /etc/monit.d/&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdaten&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
&lt;br /&gt;
AL MOMENTO NON DISPONIBILE SU CENTOS 8&lt;br /&gt;
NOT AVAILABLE ON CENTOS 8&lt;br /&gt;
&lt;br /&gt;
 dnf install arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
&lt;br /&gt;
= Installazione RMAP server su centos 7 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 yum install yum-plugin-copr&lt;br /&gt;
 yum copr enable simc/stable&lt;br /&gt;
&lt;br /&gt;
 #cd /tmp&lt;br /&gt;
 #wget http://rmap.it/repo/rmap/yum-packages-centos.list&lt;br /&gt;
 #yum -y install &amp;lt; yum-packages-centos.list&lt;br /&gt;
 &lt;br /&gt;
 yum groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
yum install postgresql-server postgresql-contrib&lt;br /&gt;
yum install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
 yum install python34-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 add &lt;br /&gt;
 exclude=mosquitto&lt;br /&gt;
 in &lt;br /&gt;
 /etc/yum.repos.d/epel.repo&lt;br /&gt;
&lt;br /&gt;
 wget &amp;quot;http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo&amp;quot; -o /etc/yum.repos.d/mqtt.repo&lt;br /&gt;
 yum install mosquitto libmosquitto-devel libmosquittopp-devel mosquitto-clients&lt;br /&gt;
 mkdir git&lt;br /&gt;
 cd git&lt;br /&gt;
 git clone https://github.com/jpmens/mosquitto-auth-plug.git&lt;br /&gt;
 cp  config.mk.in  config.mk&lt;br /&gt;
 emacs config.mk  (disable mysql; enable http)   &lt;br /&gt;
 &lt;br /&gt;
apply this patch:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff --git a/auth-plug.c b/auth-plug.c&lt;br /&gt;
index 744f115..a36c039 100644&lt;br /&gt;
--- a/auth-plug.c&lt;br /&gt;
+++ b/auth-plug.c&lt;br /&gt;
@@ -585,6 +585,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
         * id to bypass ACL checks (or have a username/client id that cannot&lt;br /&gt;
         * publish or receive messages to its own place in the hierarchy).&lt;br /&gt;
         */&lt;br /&gt;
+       /*&lt;br /&gt;
        if(username &amp;amp;&amp;amp; strpbrk(username, &amp;quot;+#/&amp;quot;)){&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous username \&amp;quot;%s\&amp;quot;&amp;quot;, username);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
@@ -594,6 +595,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous client id \&amp;quot;%s\&amp;quot;&amp;quot;, clientid);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
        }&lt;br /&gt;
+       */&lt;br /&gt;
 &lt;br /&gt;
        _log(LOG_DEBUG, &amp;quot;mosquitto_auth_acl_check(..., %s, %s, %s, %s)&amp;quot;,&lt;br /&gt;
                clientid ? clientid : &amp;quot;NULL&amp;quot;,&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 cp auth-plug.so /usr/lib64/&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 yum install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7240</id>
		<title>Gruppo Meteo/HowTo/server-centos</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7240"/>
		<updated>2020-02-12T15:59:27Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Arkiweb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installazione RMAP server su centos 8 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 dnf install yum-plugin-copr&lt;br /&gt;
 dnf copr enable simc/stable&lt;br /&gt;
 dnf copr enable pat1/rmap&lt;br /&gt;
 dnf config-manager --set-enabled PowerTools&lt;br /&gt;
&lt;br /&gt;
 dnf install mosquitto mosquitto-auth-plug&lt;br /&gt;
 dnf install arkimet&lt;br /&gt;
&lt;br /&gt;
 dnf install python3-rmap&lt;br /&gt;
 dnf install python3-pika python3-simplejson python3-django-classy-tags python3-iso8601 python3-pyparsing python3-requests python3-cairo ython3-nominatim python3-plyer python3-django-cors-headers&lt;br /&gt;
 &lt;br /&gt;
 #dnf groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
dnf module disable postgresql:10&lt;br /&gt;
dnf module enable postgresql:12&lt;br /&gt;
dnf install postgresql-server postgresql-contrib&lt;br /&gt;
dnf install python3-psycopg2&lt;br /&gt;
&lt;br /&gt;
postgresql-setup --initdb --unit postgresql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
Collect static files from django apps:&lt;br /&gt;
&lt;br /&gt;
 mkdir global_static&lt;br /&gt;
 export DJANGO_SETTINGS_MODULE=rmap.settings&lt;br /&gt;
 django-admin collectstatic&lt;br /&gt;
 rmdir global_static&lt;br /&gt;
&lt;br /&gt;
 yum install python3-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash&lt;br /&gt;
&lt;br /&gt;
 dnf install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 #rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cd /etc/monit.d/&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdaten&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
&lt;br /&gt;
AL MOMENTO NON DISPONIBILE SU CENTOS 8&lt;br /&gt;
NOT AVAILABLE ON CENTOS 8&lt;br /&gt;
&lt;br /&gt;
 dnf install arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
&lt;br /&gt;
= Installazione RMAP server su centos 7 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 yum install yum-plugin-copr&lt;br /&gt;
 yum copr enable simc/stable&lt;br /&gt;
&lt;br /&gt;
 #cd /tmp&lt;br /&gt;
 #wget http://rmap.it/repo/rmap/yum-packages-centos.list&lt;br /&gt;
 #yum -y install &amp;lt; yum-packages-centos.list&lt;br /&gt;
 &lt;br /&gt;
 yum groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
yum install postgresql-server postgresql-contrib&lt;br /&gt;
yum install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
 yum install python34-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 add &lt;br /&gt;
 exclude=mosquitto&lt;br /&gt;
 in &lt;br /&gt;
 /etc/yum.repos.d/epel.repo&lt;br /&gt;
&lt;br /&gt;
 wget &amp;quot;http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo&amp;quot; -o /etc/yum.repos.d/mqtt.repo&lt;br /&gt;
 yum install mosquitto libmosquitto-devel libmosquittopp-devel mosquitto-clients&lt;br /&gt;
 mkdir git&lt;br /&gt;
 cd git&lt;br /&gt;
 git clone https://github.com/jpmens/mosquitto-auth-plug.git&lt;br /&gt;
 cp  config.mk.in  config.mk&lt;br /&gt;
 emacs config.mk  (disable mysql; enable http)   &lt;br /&gt;
 &lt;br /&gt;
apply this patch:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff --git a/auth-plug.c b/auth-plug.c&lt;br /&gt;
index 744f115..a36c039 100644&lt;br /&gt;
--- a/auth-plug.c&lt;br /&gt;
+++ b/auth-plug.c&lt;br /&gt;
@@ -585,6 +585,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
         * id to bypass ACL checks (or have a username/client id that cannot&lt;br /&gt;
         * publish or receive messages to its own place in the hierarchy).&lt;br /&gt;
         */&lt;br /&gt;
+       /*&lt;br /&gt;
        if(username &amp;amp;&amp;amp; strpbrk(username, &amp;quot;+#/&amp;quot;)){&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous username \&amp;quot;%s\&amp;quot;&amp;quot;, username);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
@@ -594,6 +595,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous client id \&amp;quot;%s\&amp;quot;&amp;quot;, clientid);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
        }&lt;br /&gt;
+       */&lt;br /&gt;
 &lt;br /&gt;
        _log(LOG_DEBUG, &amp;quot;mosquitto_auth_acl_check(..., %s, %s, %s, %s)&amp;quot;,&lt;br /&gt;
                clientid ? clientid : &amp;quot;NULL&amp;quot;,&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 cp auth-plug.so /usr/lib64/&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 yum install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7239</id>
		<title>Gruppo Meteo/HowTo/server-centos</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7239"/>
		<updated>2020-02-12T15:53:11Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Cron */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installazione RMAP server su centos 8 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 dnf install yum-plugin-copr&lt;br /&gt;
 dnf copr enable simc/stable&lt;br /&gt;
 dnf copr enable pat1/rmap&lt;br /&gt;
 dnf config-manager --set-enabled PowerTools&lt;br /&gt;
&lt;br /&gt;
 dnf install mosquitto mosquitto-auth-plug&lt;br /&gt;
 dnf install arkimet&lt;br /&gt;
&lt;br /&gt;
 dnf install python3-rmap&lt;br /&gt;
 dnf install python3-pika python3-simplejson python3-django-classy-tags python3-iso8601 python3-pyparsing python3-requests python3-cairo ython3-nominatim python3-plyer python3-django-cors-headers&lt;br /&gt;
 &lt;br /&gt;
 #dnf groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
dnf module disable postgresql:10&lt;br /&gt;
dnf module enable postgresql:12&lt;br /&gt;
dnf install postgresql-server postgresql-contrib&lt;br /&gt;
dnf install python3-psycopg2&lt;br /&gt;
&lt;br /&gt;
postgresql-setup --initdb --unit postgresql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
Collect static files from django apps:&lt;br /&gt;
&lt;br /&gt;
 mkdir global_static&lt;br /&gt;
 export DJANGO_SETTINGS_MODULE=rmap.settings&lt;br /&gt;
 django-admin collectstatic&lt;br /&gt;
 rmdir global_static&lt;br /&gt;
&lt;br /&gt;
 yum install python3-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash&lt;br /&gt;
&lt;br /&gt;
 dnf install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 #rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cd /etc/monit.d/&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdaten&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Installazione RMAP server su centos 7 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 yum install yum-plugin-copr&lt;br /&gt;
 yum copr enable simc/stable&lt;br /&gt;
&lt;br /&gt;
 #cd /tmp&lt;br /&gt;
 #wget http://rmap.it/repo/rmap/yum-packages-centos.list&lt;br /&gt;
 #yum -y install &amp;lt; yum-packages-centos.list&lt;br /&gt;
 &lt;br /&gt;
 yum groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
yum install postgresql-server postgresql-contrib&lt;br /&gt;
yum install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
 yum install python34-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 add &lt;br /&gt;
 exclude=mosquitto&lt;br /&gt;
 in &lt;br /&gt;
 /etc/yum.repos.d/epel.repo&lt;br /&gt;
&lt;br /&gt;
 wget &amp;quot;http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo&amp;quot; -o /etc/yum.repos.d/mqtt.repo&lt;br /&gt;
 yum install mosquitto libmosquitto-devel libmosquittopp-devel mosquitto-clients&lt;br /&gt;
 mkdir git&lt;br /&gt;
 cd git&lt;br /&gt;
 git clone https://github.com/jpmens/mosquitto-auth-plug.git&lt;br /&gt;
 cp  config.mk.in  config.mk&lt;br /&gt;
 emacs config.mk  (disable mysql; enable http)   &lt;br /&gt;
 &lt;br /&gt;
apply this patch:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff --git a/auth-plug.c b/auth-plug.c&lt;br /&gt;
index 744f115..a36c039 100644&lt;br /&gt;
--- a/auth-plug.c&lt;br /&gt;
+++ b/auth-plug.c&lt;br /&gt;
@@ -585,6 +585,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
         * id to bypass ACL checks (or have a username/client id that cannot&lt;br /&gt;
         * publish or receive messages to its own place in the hierarchy).&lt;br /&gt;
         */&lt;br /&gt;
+       /*&lt;br /&gt;
        if(username &amp;amp;&amp;amp; strpbrk(username, &amp;quot;+#/&amp;quot;)){&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous username \&amp;quot;%s\&amp;quot;&amp;quot;, username);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
@@ -594,6 +595,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous client id \&amp;quot;%s\&amp;quot;&amp;quot;, clientid);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
        }&lt;br /&gt;
+       */&lt;br /&gt;
 &lt;br /&gt;
        _log(LOG_DEBUG, &amp;quot;mosquitto_auth_acl_check(..., %s, %s, %s, %s)&amp;quot;,&lt;br /&gt;
                clientid ? clientid : &amp;quot;NULL&amp;quot;,&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 cp auth-plug.so /usr/lib64/&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 yum install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7238</id>
		<title>Gruppo Meteo/HowTo/server-centos</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7238"/>
		<updated>2020-02-12T15:24:02Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Monit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installazione RMAP server su centos 8 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 dnf install yum-plugin-copr&lt;br /&gt;
 dnf copr enable simc/stable&lt;br /&gt;
 dnf copr enable pat1/rmap&lt;br /&gt;
 dnf config-manager --set-enabled PowerTools&lt;br /&gt;
&lt;br /&gt;
 dnf install mosquitto mosquitto-auth-plug&lt;br /&gt;
 dnf install arkimet&lt;br /&gt;
&lt;br /&gt;
 dnf install python3-rmap&lt;br /&gt;
 dnf install python3-pika python3-simplejson python3-django-classy-tags python3-iso8601 python3-pyparsing python3-requests python3-cairo ython3-nominatim python3-plyer python3-django-cors-headers&lt;br /&gt;
 &lt;br /&gt;
 #dnf groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
dnf module disable postgresql:10&lt;br /&gt;
dnf module enable postgresql:12&lt;br /&gt;
dnf install postgresql-server postgresql-contrib&lt;br /&gt;
dnf install python3-psycopg2&lt;br /&gt;
&lt;br /&gt;
postgresql-setup --initdb --unit postgresql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
Collect static files from django apps:&lt;br /&gt;
&lt;br /&gt;
 mkdir global_static&lt;br /&gt;
 export DJANGO_SETTINGS_MODULE=rmap.settings&lt;br /&gt;
 django-admin collectstatic&lt;br /&gt;
 rmdir global_static&lt;br /&gt;
&lt;br /&gt;
 yum install python3-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash&lt;br /&gt;
&lt;br /&gt;
 dnf install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 #rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 cd /etc/monit.d/&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Installazione RMAP server su centos 7 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 yum install yum-plugin-copr&lt;br /&gt;
 yum copr enable simc/stable&lt;br /&gt;
&lt;br /&gt;
 #cd /tmp&lt;br /&gt;
 #wget http://rmap.it/repo/rmap/yum-packages-centos.list&lt;br /&gt;
 #yum -y install &amp;lt; yum-packages-centos.list&lt;br /&gt;
 &lt;br /&gt;
 yum groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
yum install postgresql-server postgresql-contrib&lt;br /&gt;
yum install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
 yum install python34-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 add &lt;br /&gt;
 exclude=mosquitto&lt;br /&gt;
 in &lt;br /&gt;
 /etc/yum.repos.d/epel.repo&lt;br /&gt;
&lt;br /&gt;
 wget &amp;quot;http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo&amp;quot; -o /etc/yum.repos.d/mqtt.repo&lt;br /&gt;
 yum install mosquitto libmosquitto-devel libmosquittopp-devel mosquitto-clients&lt;br /&gt;
 mkdir git&lt;br /&gt;
 cd git&lt;br /&gt;
 git clone https://github.com/jpmens/mosquitto-auth-plug.git&lt;br /&gt;
 cp  config.mk.in  config.mk&lt;br /&gt;
 emacs config.mk  (disable mysql; enable http)   &lt;br /&gt;
 &lt;br /&gt;
apply this patch:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff --git a/auth-plug.c b/auth-plug.c&lt;br /&gt;
index 744f115..a36c039 100644&lt;br /&gt;
--- a/auth-plug.c&lt;br /&gt;
+++ b/auth-plug.c&lt;br /&gt;
@@ -585,6 +585,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
         * id to bypass ACL checks (or have a username/client id that cannot&lt;br /&gt;
         * publish or receive messages to its own place in the hierarchy).&lt;br /&gt;
         */&lt;br /&gt;
+       /*&lt;br /&gt;
        if(username &amp;amp;&amp;amp; strpbrk(username, &amp;quot;+#/&amp;quot;)){&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous username \&amp;quot;%s\&amp;quot;&amp;quot;, username);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
@@ -594,6 +595,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous client id \&amp;quot;%s\&amp;quot;&amp;quot;, clientid);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
        }&lt;br /&gt;
+       */&lt;br /&gt;
 &lt;br /&gt;
        _log(LOG_DEBUG, &amp;quot;mosquitto_auth_acl_check(..., %s, %s, %s, %s)&amp;quot;,&lt;br /&gt;
                clientid ? clientid : &amp;quot;NULL&amp;quot;,&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 cp auth-plug.so /usr/lib64/&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 yum install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7237</id>
		<title>Gruppo Meteo/HowTo/server-centos</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7237"/>
		<updated>2020-02-12T14:21:15Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* apache */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installazione RMAP server su centos 8 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 dnf install yum-plugin-copr&lt;br /&gt;
 dnf copr enable simc/stable&lt;br /&gt;
 dnf copr enable pat1/rmap&lt;br /&gt;
 dnf config-manager --set-enabled PowerTools&lt;br /&gt;
&lt;br /&gt;
 dnf install mosquitto mosquitto-auth-plug&lt;br /&gt;
 dnf install arkimet&lt;br /&gt;
&lt;br /&gt;
 dnf install python3-rmap&lt;br /&gt;
 dnf install python3-pika python3-simplejson python3-django-classy-tags python3-iso8601 python3-pyparsing python3-requests python3-cairo ython3-nominatim python3-plyer python3-django-cors-headers&lt;br /&gt;
 &lt;br /&gt;
 #dnf groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
dnf module disable postgresql:10&lt;br /&gt;
dnf module enable postgresql:12&lt;br /&gt;
dnf install postgresql-server postgresql-contrib&lt;br /&gt;
dnf install python3-psycopg2&lt;br /&gt;
&lt;br /&gt;
postgresql-setup --initdb --unit postgresql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
Collect static files from django apps:&lt;br /&gt;
&lt;br /&gt;
 mkdir global_static&lt;br /&gt;
 export DJANGO_SETTINGS_MODULE=rmap.settings&lt;br /&gt;
 django-admin collectstatic&lt;br /&gt;
 rmdir global_static&lt;br /&gt;
&lt;br /&gt;
 yum install python3-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash&lt;br /&gt;
&lt;br /&gt;
 dnf install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 #rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Installazione RMAP server su centos 7 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 yum install yum-plugin-copr&lt;br /&gt;
 yum copr enable simc/stable&lt;br /&gt;
&lt;br /&gt;
 #cd /tmp&lt;br /&gt;
 #wget http://rmap.it/repo/rmap/yum-packages-centos.list&lt;br /&gt;
 #yum -y install &amp;lt; yum-packages-centos.list&lt;br /&gt;
 &lt;br /&gt;
 yum groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
yum install postgresql-server postgresql-contrib&lt;br /&gt;
yum install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
 yum install python34-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 add &lt;br /&gt;
 exclude=mosquitto&lt;br /&gt;
 in &lt;br /&gt;
 /etc/yum.repos.d/epel.repo&lt;br /&gt;
&lt;br /&gt;
 wget &amp;quot;http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo&amp;quot; -o /etc/yum.repos.d/mqtt.repo&lt;br /&gt;
 yum install mosquitto libmosquitto-devel libmosquittopp-devel mosquitto-clients&lt;br /&gt;
 mkdir git&lt;br /&gt;
 cd git&lt;br /&gt;
 git clone https://github.com/jpmens/mosquitto-auth-plug.git&lt;br /&gt;
 cp  config.mk.in  config.mk&lt;br /&gt;
 emacs config.mk  (disable mysql; enable http)   &lt;br /&gt;
 &lt;br /&gt;
apply this patch:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff --git a/auth-plug.c b/auth-plug.c&lt;br /&gt;
index 744f115..a36c039 100644&lt;br /&gt;
--- a/auth-plug.c&lt;br /&gt;
+++ b/auth-plug.c&lt;br /&gt;
@@ -585,6 +585,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
         * id to bypass ACL checks (or have a username/client id that cannot&lt;br /&gt;
         * publish or receive messages to its own place in the hierarchy).&lt;br /&gt;
         */&lt;br /&gt;
+       /*&lt;br /&gt;
        if(username &amp;amp;&amp;amp; strpbrk(username, &amp;quot;+#/&amp;quot;)){&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous username \&amp;quot;%s\&amp;quot;&amp;quot;, username);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
@@ -594,6 +595,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous client id \&amp;quot;%s\&amp;quot;&amp;quot;, clientid);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
        }&lt;br /&gt;
+       */&lt;br /&gt;
 &lt;br /&gt;
        _log(LOG_DEBUG, &amp;quot;mosquitto_auth_acl_check(..., %s, %s, %s, %s)&amp;quot;,&lt;br /&gt;
                clientid ? clientid : &amp;quot;NULL&amp;quot;,&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 cp auth-plug.so /usr/lib64/&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 yum install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7236</id>
		<title>Gruppo Meteo/HowTo/server-centos</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/server-centos&amp;diff=7236"/>
		<updated>2020-02-12T11:00:26Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installazione RMAP server su centos 8 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 dnf install yum-plugin-copr&lt;br /&gt;
 dnf copr enable simc/stable&lt;br /&gt;
 dnf copr enable pat1/rmap&lt;br /&gt;
 dnf config-manager --set-enabled PowerTools&lt;br /&gt;
&lt;br /&gt;
 dnf install mosquitto mosquitto-auth-plug&lt;br /&gt;
 dnf install arkimet&lt;br /&gt;
&lt;br /&gt;
 dnf install python3-rmap&lt;br /&gt;
 dnf install python3-pika python3-simplejson python3-django-classy-tags python3-iso8601 python3-pyparsing python3-requests python3-cairo ython3-nominatim python3-plyer python3-django-cors-headers&lt;br /&gt;
 &lt;br /&gt;
 #dnf groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
dnf module disable postgresql:10&lt;br /&gt;
dnf module enable postgresql:12&lt;br /&gt;
dnf install postgresql-server postgresql-contrib&lt;br /&gt;
dnf install python3-psycopg2&lt;br /&gt;
&lt;br /&gt;
postgresql-setup --initdb --unit postgresql&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
 yum install python3-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash&lt;br /&gt;
&lt;br /&gt;
 dnf install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 #rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Installazione RMAP server su centos 7 =&lt;br /&gt;
&lt;br /&gt;
== istallazione sistema operativo ==&lt;br /&gt;
&lt;br /&gt;
useradd rmap&lt;br /&gt;
&lt;br /&gt;
add epel repository&lt;br /&gt;
&lt;br /&gt;
 cd /etc/yum.repos.d&lt;br /&gt;
 wget http://rmap.it/repo/rmap/rmapcentos.repo&lt;br /&gt;
&lt;br /&gt;
 yum install yum-plugin-copr&lt;br /&gt;
 yum copr enable simc/stable&lt;br /&gt;
&lt;br /&gt;
 #cd /tmp&lt;br /&gt;
 #wget http://rmap.it/repo/rmap/yum-packages-centos.list&lt;br /&gt;
 #yum -y install &amp;lt; yum-packages-centos.list&lt;br /&gt;
 &lt;br /&gt;
 yum groupinstall rmap&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/selinux/config&lt;br /&gt;
&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
/etc/tmpfiles.d/rmap.conf&lt;br /&gt;
 d /run/wsgirmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/rmap 0755 rmap rmap -&lt;br /&gt;
 d /var/run/httpd 0755 rmap rmap -&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap&lt;br /&gt;
 chmod go+rx /rmap&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/crond&lt;br /&gt;
 CRONDARGS=-s -m off&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/log/rmap&lt;br /&gt;
 chown -R rmap:rmap /var/log/rmap&lt;br /&gt;
&lt;br /&gt;
== postgresql ==&lt;br /&gt;
yum install postgresql-server postgresql-contrib&lt;br /&gt;
yum install python-psycopg2&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/pg_hba.conf&lt;br /&gt;
&lt;br /&gt;
 # TYPE  DATABASE        USER            ADDRESS                 METHOD                                                                &lt;br /&gt;
 &lt;br /&gt;
 # &amp;quot;local&amp;quot; is for Unix domain socket connections only                                                                                  &lt;br /&gt;
 # allow postgres user to use &amp;quot;ident&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             postgres                                ident&lt;br /&gt;
 # allow all other users to use &amp;quot;md5&amp;quot; authentication on Unix sockets                                                                   &lt;br /&gt;
 local   all             all                                     md5&lt;br /&gt;
 # IPv4 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             127.0.0.1/32            md5&lt;br /&gt;
 # IPv6 local connections:                                                                                                             &lt;br /&gt;
 host    all             all             ::1/128                 md5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/var/lib/pgsql/data/postgresql.conf&lt;br /&gt;
&lt;br /&gt;
 max_connections = 100&lt;br /&gt;
 shared_buffers = 128MB&lt;br /&gt;
 work_mem = 100MB&lt;br /&gt;
 maintenance_work_mem = 200MB&lt;br /&gt;
 effective_cache_size = 1GB&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 mkdir /etc/systemd/system/postgresql.service.d/&lt;br /&gt;
/etc/systemd/system/postgresql.service.d/rmap.conf&lt;br /&gt;
 [Service]&lt;br /&gt;
 &lt;br /&gt;
 # Location of database directory&lt;br /&gt;
 Environment=PGDATA=/rmap/pgsql/data&lt;br /&gt;
&lt;br /&gt;
 mkdir /rmap/pgsql/&lt;br /&gt;
 chown postgres:postgres /rmap/pgsql/&lt;br /&gt;
 mv /var/lib/pgsql/data /rmap/pgsql/&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 initdb&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
 systemctl enable postgresql.service&lt;br /&gt;
 systemctl start postgresql.service&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmapadmin&lt;br /&gt;
 createdb --owner=rmapadmin rmapadmin&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
/etc/rmap/rmap-site.cfg&lt;br /&gt;
 [database]&lt;br /&gt;
 DATABASE_ENGINE = 'postgresql_psycopg2' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.                     &lt;br /&gt;
 DATABASE_NAME = 'rmapadmin'             # Or path to database file if using sqlite3.                                                  &lt;br /&gt;
 DATABASE_USER = 'rmapadmin'             # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_PASSWORD = 'rmapadmin'         # Not used with sqlite3.                                                                      &lt;br /&gt;
 DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.                                   &lt;br /&gt;
 DATABASE_PORT = '5432'                  # Set to empty string for default. Not used with sqlite3.                                     &lt;br /&gt;
&lt;br /&gt;
 rmapctrl --syncdb&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 su - postgres&lt;br /&gt;
 createuser -P -e rmap&lt;br /&gt;
 createdb --owner=rmap report_fixed&lt;br /&gt;
 createdb --owner=rmap report_mobile&lt;br /&gt;
 createdb --owner=rmap sample_fixed&lt;br /&gt;
 createdb --owner=rmap sample_mobile&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 exit&lt;br /&gt;
&lt;br /&gt;
== apache ==&lt;br /&gt;
&lt;br /&gt;
 yum install python34-mod_wsgi&lt;br /&gt;
&lt;br /&gt;
 useradd -r rmap&lt;br /&gt;
 mkdir /home/rmap&lt;br /&gt;
 chown rmap:rmap /home/rmap&lt;br /&gt;
 &lt;br /&gt;
 mkdir /rmap/cache&lt;br /&gt;
 chown rmap:rmap /rmap/cache&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.modules.d/00-mpm.conf&lt;br /&gt;
 LoadModule mpm_worker_module modules/mod_mpm_worker.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mpm_worker_module&amp;gt;&lt;br /&gt;
 #StartServers          2&lt;br /&gt;
 #MaxClients          150&lt;br /&gt;
 #MinSpareThreads      25&lt;br /&gt;
 #MaxSpareThreads      75&lt;br /&gt;
 #ThreadsPerChild      25&lt;br /&gt;
 #MaxRequestsPerChild   0&lt;br /&gt;
 ServerLimit         16&lt;br /&gt;
 StartServers         2&lt;br /&gt;
 MaxRequestWorkers  150&lt;br /&gt;
 MinSpareThreads     10&lt;br /&gt;
 MaxSpareThreads     35&lt;br /&gt;
 ThreadsPerChild     15&lt;br /&gt;
 MaxRequestWorkers      240&lt;br /&gt;
 MaxConnectionsPerChild 10000&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.conf&lt;br /&gt;
 ServerName rmap.it&lt;br /&gt;
 &lt;br /&gt;
 WSGISocketPrefix /run/wsgirmap/rmap&lt;br /&gt;
 WSGIDaemonProcess www.rmap.cc user=rmap group=rmap maximum-requests=100 graceful-timeout=200 processes=10 threads=5 request-timeout=180 socket-timeout=180 header-buffer-  size=65000&lt;br /&gt;
 WSGIProcessGroup www.rmap.cc&lt;br /&gt;
 WSGIApplicationGroup %{GLOBAL}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80 &amp;gt;&lt;br /&gt;
    ServerName rmap.it&lt;br /&gt;
    ServerAlias rmap.cc rmapv.rmap.cc rmapv.rmap.it www.rmap.cc www.rmapv.rmap.cc www.rmap.it www.rmapv.rmap.it localhost localhost.localdomain 127.0.0.1 partecipa.rainbolife.eu&lt;br /&gt;
    Include conf.d/rmap.inc&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/rmap.inc&lt;br /&gt;
 &lt;br /&gt;
 Alias /download /var/www/html/download&lt;br /&gt;
 Alias /repo     /var/www/html/repo&lt;br /&gt;
 Alias /showroom /var/www/html/showroom&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 #Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&lt;br /&gt;
 #&amp;lt;Directory &amp;quot;/usr/lib/python2.7/site-packages/django/contrib/admin/static/admin&amp;quot;&amp;gt;&lt;br /&gt;
 #	    Require all granted&lt;br /&gt;
 #&amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /static   /usr/share/rmap/static&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/static&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /media /usr/share/rmap/media&lt;br /&gt;
 &amp;lt;Directory /usr/share/rmap/media&amp;gt;&lt;br /&gt;
        Require all granted&lt;br /&gt;
        SetHandler None&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 WSGIScriptAlias / /usr/bin/rmap.wsgi&lt;br /&gt;
 #WSGIImportScript /usr/bin/rmap.wsgi process-group=%{GLOBAL} application-group=%{GLOBAL}&lt;br /&gt;
 #WSGIPythonPath /path/to/mysite.com&lt;br /&gt;
 &lt;br /&gt;
 #WSGIDaemonProcess rmap processes=5 threads=5&lt;br /&gt;
 #WSGIDaemonProcess rmap&lt;br /&gt;
 #WSGIProcessGroup rmap&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory /usr/bin&amp;gt;&lt;br /&gt;
 &amp;lt;Files rmap.wsgi&amp;gt;&lt;br /&gt;
 Require all granted&lt;br /&gt;
 &amp;lt;/Files&amp;gt;&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /auth&amp;gt;&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 chkconfig httpd on&lt;br /&gt;
 service httpd start&lt;br /&gt;
&lt;br /&gt;
== Arkimet ==&lt;br /&gt;
&lt;br /&gt;
 useradd  -r arkimet&lt;br /&gt;
 mkdir /home/arkimet&lt;br /&gt;
 chown arkimet:arkimet /home/arkimet&lt;br /&gt;
 mkdir /rmap/arkimet/&lt;br /&gt;
 chown -R arkimet:arkimet /rmap/arkimet/&lt;br /&gt;
&lt;br /&gt;
/etc/sysconfig/arkimet&lt;br /&gt;
 DATASET_CONFIG=&amp;quot;/rmap/arkimet/arkimet.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE questa ultima modifica si perde con un aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
add in /etc/arkimet/scan-bufr/generic.lua&lt;br /&gt;
    local area = nil&lt;br /&gt;
    if report:enqc() == &amp;quot;mobile&amp;quot;&lt;br /&gt;
    then&lt;br /&gt;
        area = bufr_read_area_mobile(msg)&lt;br /&gt;
    else&lt;br /&gt;
        area = bufr_read_area_fixed(msg)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
ATTENZIONE ATTENZIONE: questa ultima modifica è da fare a ogni aggiornamento del pacchetto&lt;br /&gt;
&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 chkconfig arkimet on&lt;br /&gt;
 service arkimet start&lt;br /&gt;
&lt;br /&gt;
== Sincronizzazione DB ==&lt;br /&gt;
&lt;br /&gt;
=== Server di origine ===&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --dumpdata &amp;gt; dumpdata.json&lt;br /&gt;
&lt;br /&gt;
rimuovere le prime righe che non sono json&lt;br /&gt;
&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///report_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; report_mobile.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_fixed?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_fixed.bufr&lt;br /&gt;
 dbadb export --dsn=&amp;quot;mysql:///sample_mobile?user=rmap&amp;amp;password=****&amp;quot; &amp;gt; sample_mobile.bufr&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Server di destinazione ===&lt;br /&gt;
&lt;br /&gt;
Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap)&lt;br /&gt;
&lt;br /&gt;
 rmapctrl --loaddata=dumpdata.json&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_fixed&amp;quot; report_fixed.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/report_mobile&amp;quot; report_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_mobile&amp;quot; sample_mobile.bufr&lt;br /&gt;
 dbadb import --wipe-first --dsn=&amp;quot;postgresql://rmap:***@localhost/sample_fixed&amp;quot; sample_fixed.bufr&lt;br /&gt;
&lt;br /&gt;
 cd /usr/share/rmap/&lt;br /&gt;
 rsync -av utente@serverorigine:/usr/share/rmap/media .&lt;br /&gt;
&lt;br /&gt;
== Mosquitto ==&lt;br /&gt;
&lt;br /&gt;
 add &lt;br /&gt;
 exclude=mosquitto&lt;br /&gt;
 in &lt;br /&gt;
 /etc/yum.repos.d/epel.repo&lt;br /&gt;
&lt;br /&gt;
 wget &amp;quot;http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo&amp;quot; -o /etc/yum.repos.d/mqtt.repo&lt;br /&gt;
 yum install mosquitto libmosquitto-devel libmosquittopp-devel mosquitto-clients&lt;br /&gt;
 mkdir git&lt;br /&gt;
 cd git&lt;br /&gt;
 git clone https://github.com/jpmens/mosquitto-auth-plug.git&lt;br /&gt;
 cp  config.mk.in  config.mk&lt;br /&gt;
 emacs config.mk  (disable mysql; enable http)   &lt;br /&gt;
 &lt;br /&gt;
apply this patch:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
diff --git a/auth-plug.c b/auth-plug.c&lt;br /&gt;
index 744f115..a36c039 100644&lt;br /&gt;
--- a/auth-plug.c&lt;br /&gt;
+++ b/auth-plug.c&lt;br /&gt;
@@ -585,6 +585,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
         * id to bypass ACL checks (or have a username/client id that cannot&lt;br /&gt;
         * publish or receive messages to its own place in the hierarchy).&lt;br /&gt;
         */&lt;br /&gt;
+       /*&lt;br /&gt;
        if(username &amp;amp;&amp;amp; strpbrk(username, &amp;quot;+#/&amp;quot;)){&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous username \&amp;quot;%s\&amp;quot;&amp;quot;, username);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
@@ -594,6 +595,7 @@ int mosquitto_auth_acl_check(void *userdata, const char *clientid, const char *u&lt;br /&gt;
                _log(MOSQ_LOG_NOTICE, &amp;quot;ACL denying access to client with dangerous client id \&amp;quot;%s\&amp;quot;&amp;quot;, clientid);&lt;br /&gt;
                return MOSQ_DENY_ACL;&lt;br /&gt;
        }&lt;br /&gt;
+       */&lt;br /&gt;
 &lt;br /&gt;
        _log(LOG_DEBUG, &amp;quot;mosquitto_auth_acl_check(..., %s, %s, %s, %s)&amp;quot;,&lt;br /&gt;
                clientid ? clientid : &amp;quot;NULL&amp;quot;,&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
 cp auth-plug.so /usr/lib64/&lt;br /&gt;
 mkdir /etc/mosquitto/conf.d&lt;br /&gt;
 mkdir /rmap/mosquitto&lt;br /&gt;
 chown mosquitto:mosquitto /rmap/mosquitto&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/conf.d/rmap.conf&lt;br /&gt;
 persistent_client_expiration 1d&lt;br /&gt;
 allow_anonymous true&lt;br /&gt;
 password_file /etc/mosquitto/pwfile&lt;br /&gt;
 acl_file /etc/mosquitto/aclfile&lt;br /&gt;
 log_type error&lt;br /&gt;
 log_type warning&lt;br /&gt;
 auth_plugin /usr/lib64/auth-plug.so&lt;br /&gt;
 auth_opt_backends http&lt;br /&gt;
 auth_opt_http_hostname localhost&lt;br /&gt;
 auth_opt_http_ip 127.0.0.1&lt;br /&gt;
 auth_opt_http_port 80&lt;br /&gt;
 auth_opt_http_getuser_uri /auth/auth&lt;br /&gt;
 auth_opt_http_superuser_uri /auth/superuser&lt;br /&gt;
 auth_opt_http_aclcheck_uri /auth/acl&lt;br /&gt;
 persistence true&lt;br /&gt;
 persistence_location /rmap/mosquitto/&lt;br /&gt;
&lt;br /&gt;
/etc/mosquitto/aclfile&lt;br /&gt;
 topic read #&lt;br /&gt;
 topic write test/#&lt;br /&gt;
 &lt;br /&gt;
 # This only affects clients with username &amp;quot;rmap&amp;quot;.&lt;br /&gt;
 user rmap&lt;br /&gt;
 topic #&lt;br /&gt;
  &lt;br /&gt;
 pattern write rmap/%u/#&lt;br /&gt;
 pattern write sample/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write report/%u/#&lt;br /&gt;
 pattern write fixed/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write mobile/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write maint/%u/#&lt;br /&gt;
 &lt;br /&gt;
 pattern write rpc/%u/#&lt;br /&gt;
&lt;br /&gt;
remove everythings and add in /etc/mosquitto/mosquitto.conf&lt;br /&gt;
 include_dir /etc/mosquitto/conf.d&lt;br /&gt;
 pid_file /var/run/mosquitto.pid&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 touch /etc/mosquitto/pwfile&lt;br /&gt;
&lt;br /&gt;
 chkconfig mosquitto on&lt;br /&gt;
 service mosquitto start&lt;br /&gt;
&lt;br /&gt;
if the package use systemd:&lt;br /&gt;
create /etc/systemd/system/mosquitto.service.d/rmap.conf&lt;br /&gt;
 [Service] &lt;br /&gt;
 Restart=always &lt;br /&gt;
 RestartSec=15&lt;br /&gt;
&lt;br /&gt;
if the package use systemV:&lt;br /&gt;
/etc/monit.d/mosquitto&lt;br /&gt;
&lt;br /&gt;
 check process mosquitto with pidfile /var/run/mosquitto.pid&lt;br /&gt;
    start program = &amp;quot;/etc/init.d/mosquitto restart&amp;quot;&lt;br /&gt;
    stop program = &amp;quot;/etc/init.d/mosquitto stop&amp;quot;&lt;br /&gt;
    if failed host localhost port 1883 timeout 30 seconds retry 3 then restart&lt;br /&gt;
&lt;br /&gt;
== Rabbitmq ==&lt;br /&gt;
&lt;br /&gt;
 curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash&lt;br /&gt;
 wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 rpm -Uvh erlang-solutions-1.0-1.noarch.rpm&lt;br /&gt;
 yum install rabbitmq-server&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
in /etc/rabbitmq/rabbitmq.config&lt;br /&gt;
&lt;br /&gt;
 [&lt;br /&gt;
   {rabbit, &lt;br /&gt;
     [&lt;br /&gt;
       {auth_backends, [rabbit_auth_backend_internal, rabbit_auth_backend_http]},&lt;br /&gt;
       {loopback_users, []}&lt;br /&gt;
     ]&lt;br /&gt;
   },&lt;br /&gt;
   {rabbitmq_auth_backend_http,&lt;br /&gt;
     [{user_path,     &amp;quot;http://localhost/auth/user&amp;quot;},&lt;br /&gt;
       {vhost_path,    &amp;quot;http://localhost/auth/vhost&amp;quot;},&lt;br /&gt;
       {resource_path, &amp;quot;http://localhost/auth/resource&amp;quot;}&lt;br /&gt;
     ]&lt;br /&gt;
   }&lt;br /&gt;
 ].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_auth_backend_http&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_management_visualiser&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel&lt;br /&gt;
 rabbitmq-plugins enable rabbitmq_shovel_management&lt;br /&gt;
&lt;br /&gt;
 chkconfig rabbitmq-server on&lt;br /&gt;
 service rabbitmq-server start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
login at management interface with user &amp;quot;guest&amp;quot; and password &amp;quot;guest&amp;quot;&lt;br /&gt;
on overview page use import definition to configure exchange, queue and users&lt;br /&gt;
with the same management interface remove &amp;quot;guest&amp;quot; user and login with a new real user&lt;br /&gt;
&lt;br /&gt;
Per attivare uno showell:&lt;br /&gt;
 rabbitmqctl set_parameter shovel report_mobile '{&amp;quot;src-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;src-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@rmap.cc&amp;quot;, &amp;quot;src-queue&amp;quot;: &amp;quot;report_mobile_saved&amp;quot;, &lt;br /&gt;
 &amp;quot;dest-protocol&amp;quot;: &amp;quot;amqp091&amp;quot;, &amp;quot;dest-uri&amp;quot;: &amp;quot;amqp://rmap:&amp;lt;password&amp;gt;@&amp;quot;, &amp;quot;dest-queue&amp;quot;: &amp;quot;report_mobile&amp;quot;}'&lt;br /&gt;
&lt;br /&gt;
problema non risolto:&lt;br /&gt;
se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta.&lt;br /&gt;
https://www.rabbitmq.com/shovel-dynamic.html&lt;br /&gt;
bisognerebbe riuscire a settare &amp;quot;user_id&amp;quot; tramite il parametro &amp;quot;dest-publish-properties&amp;quot; nel formato json sopra ma non funziona&lt;br /&gt;
&lt;br /&gt;
== Monit ==&lt;br /&gt;
&lt;br /&gt;
 yum install monit&lt;br /&gt;
&lt;br /&gt;
comment everithings and add in /etc/monitrc&lt;br /&gt;
 set daemon  60              # check services at 1-minute intervals&lt;br /&gt;
 set log syslog&lt;br /&gt;
 set httpd port 5925 and&lt;br /&gt;
    allow rmap:&amp;lt;password&amp;gt;        # require user 'admin' with password 'monit'&lt;br /&gt;
    allow @monit           # allow users of group 'monit' to connect (rw)&lt;br /&gt;
    allow @users readonly  # allow users of group 'users' to connect readonly&lt;br /&gt;
 include /etc/monit.d/*&lt;br /&gt;
&lt;br /&gt;
 rm /etc/monit.d/logging&lt;br /&gt;
&lt;br /&gt;
 wget https://raw.githubusercontent.com/r-map/rmap/master/server/etc/monit.d/rmap&lt;br /&gt;
&lt;br /&gt;
 chkconfig monit on&lt;br /&gt;
 service monit start&lt;br /&gt;
&lt;br /&gt;
== Cron ==&lt;br /&gt;
&lt;br /&gt;
 cd /etc/cron.d&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/arpae_aq_ckan&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/dballe2arkimet&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/luftdatem&lt;br /&gt;
 https://raw.githubusercontent.com/r-map/rmap/master/server/etc/cron.d/rmap_generate_summary_cache&lt;br /&gt;
&lt;br /&gt;
== Arkiweb ==&lt;br /&gt;
 yum install arkimet arkiweb&lt;br /&gt;
&lt;br /&gt;
/etc/httpd/conf.d/arkiweb.conf&lt;br /&gt;
&lt;br /&gt;
 ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/&lt;br /&gt;
 Alias /arkiweb  /var/www/html/arkiweb&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/lib64/arkiweb&amp;quot;&amp;gt;&lt;br /&gt;
        AllowOverride None&lt;br /&gt;
        Options +ExecCGI&lt;br /&gt;
 &lt;br /&gt;
        Order allow,deny&lt;br /&gt;
        Allow from all&lt;br /&gt;
 &lt;br /&gt;
        # ARKIWEB_CONFIG is mandatory!&lt;br /&gt;
        SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config&lt;br /&gt;
        &lt;br /&gt;
 &lt;br /&gt;
        Require all granted&lt;br /&gt;
 &lt;br /&gt;
        # Authentication (optional)&lt;br /&gt;
        #&lt;br /&gt;
        # Basic authentication example:&lt;br /&gt;
        # SetEnv ARKIWEB_RESTRICT REMOTE_USER&lt;br /&gt;
        # AuthType Basic&lt;br /&gt;
        # AuthUserFile /etc/arkiweb.passwords&lt;br /&gt;
        # require valid-user&lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Alias /arkiwebjs/ /usr/share/arkiweb/public/&lt;br /&gt;
 &amp;lt;Directory &amp;quot;/usr/share/arkiweb/public&amp;quot;&amp;gt;&lt;br /&gt;
           #Require all granted&lt;br /&gt;
           AllowOverride None&lt;br /&gt;
 &lt;br /&gt;
           Order allow,deny&lt;br /&gt;
           Allow from all&lt;br /&gt;
 &lt;br /&gt;
           Require all granted&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 mkdir /var/www/html/arkiweb/&lt;br /&gt;
 cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html&lt;br /&gt;
&lt;br /&gt;
/rmap/arkimet/arkiweb.config&lt;br /&gt;
&lt;br /&gt;
 [arpav]&lt;br /&gt;
 bounding = POLYGON ((12.3693200000000001 44.9166299999999978, 11.3025699999999993 45.0306599999999975, 11.0090299999999992 45.2172600000000031, 10.8328900000000008 45.3717499999999987, 10.7659300000000009 45.5176999999999978, 11.8763699999999996 46.4992599999999996, 12.4241600000000005 46.6514799999999994, 12.7082800000000002 46.5699699999999979, 13.0772700000000004 45.6406399999999977, 12.3693200000000001 44.9166299999999978))&lt;br /&gt;
 filter = product: BUFR:t=arpav&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = arpav&lt;br /&gt;
 path = http://arkiserver:8090/dataset/arpav&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [meteonetwork]&lt;br /&gt;
 bounding = POLYGON ((12.0994399999999995 43.7931499999999971, 9.8880599999999994 44.5129299999999972, 9.4983599999999999 44.6443500000000029, 9.4705399999999997 44.6982100000000031, 9.4444999999999997 44.9392799999999966, 9.4909800000000004 45.0587200000000010, 11.8647899999999993 46.5125900000000030, 12.1300000000000008 46.5499999999999972, 12.9021600000000003 45.6111099999999965, 12.7495600000000007 43.9628200000000007, 12.6686999999999994 43.8718500000000020, 12.6577099999999998 43.8649699999999996, 12.0994399999999995 43.7931499999999971))&lt;br /&gt;
 filter = product: BUFR:t=mnw&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = meteonetwork&lt;br /&gt;
 path = http://arkiserver:8090/dataset/meteonetwork&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=spdsra or BUFR:t=locali or BUFR:t=agrmet or BUFR:t=profe or BUFR:t=simnpr or BUFR:t=simnbo or BUFR:t=rer or BUFR:t=simc or BUFR:t=urbane or BUFR:t=arpae or BUFR:t=boa or BUFR:t=cer or BUFR:t=provpc or BUFR:t=syrep or BUFR:t=umsuol&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [opendata-aq-er]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=arpae-aq&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = opendata-aq-er&lt;br /&gt;
 path = http://arkiserver:8090/dataset/opendata-er&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [luftdaten]&lt;br /&gt;
 bounding = POLYGON ((1.1372199999999999 4.4391400000000001, 8.4514200000000006 44.2992399999999975, 9.2314900000000009 44.8656700000000015, 9.5297699999999992 45.0566800000000001, 9.7055399999999992 45.0605199999999968, 11.8957999999999995 44.9680000000000035, 12.1221499999999995 44.9429000000000016, 12.2213899999999995 44.8950600000000009, 12.7393999999999998 43.9584699999999984, 1.1372199999999999 4.4391400000000001))&lt;br /&gt;
 filter = product: BUFR:t=luftdaten&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = luftdaten&lt;br /&gt;
 path = http://arkiserver:8090/dataset/luftdaten&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_fixed]&lt;br /&gt;
 bounding = POLYGON ((11.2500000000000000 44.3458499999999987, 11.2939500000000006 44.5252300000000005, 11.5576200000000000 44.8620999999999981, 11.6186500000000006 44.8371899999999997, 11.6233599999999999 44.6534600000000026, 11.6230100000000007 44.6530500000000004, 11.2500000000000000 44.3458499999999987))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [report_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = report_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/report_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 [sample_fixed]&lt;br /&gt;
 bounding = POLYGON ((0.0000000000000000 0.0000000000000000, 9.1569500000000001 45.4436499999999981, 9.1570599999999995 45.4440700000000035, 11.6006800000000005 46.3956500000000034,   11.6742399999999993 46.4202500000000029, 11.6745000000000001 46.4202900000000014, 11.6747899999999998 46.4201400000000035, 12.4200400000000002 44.1349099999999979, 12.4458099999999998  43.9353399999999965, 12.5000000000000000 41.8999999999999986, 0.0000000000000000 0.0000000000000000))&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=fixed or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_fixed&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_fixed&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;br /&gt;
 &lt;br /&gt;
 [sample_mobile]&lt;br /&gt;
 filter = product: BUFR:t=rmap or BUFR:t=mobile or BUFR:t=arpae&lt;br /&gt;
 index = reftime, area, product, origin, proddef&lt;br /&gt;
 name = sample_mobile&lt;br /&gt;
 path = http://arkiserver:8090/dataset/sample_mobile&lt;br /&gt;
 postprocess = json, bufr, bufr-filter&lt;br /&gt;
 replace = yes&lt;br /&gt;
 server = http://arkiserver:8090&lt;br /&gt;
 step = daily&lt;br /&gt;
 type = remote&lt;br /&gt;
 unique = reftime, area, product, origin, proddef&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/StimaWiFi&amp;diff=7235</id>
		<title>Gruppo Meteo/HowTo/StimaWiFi</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo/StimaWiFi&amp;diff=7235"/>
		<updated>2020-02-10T21:05:07Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* opzione sensore SDS011 per le polveri */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= HowTo per Stima-wifi =&lt;br /&gt;
&lt;br /&gt;
[[File:stima_wifi.jpg|none|400px|thumb|left|Stima wifi con Honeywell HPM e sensore Temperatura e Umidità]] &amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Elenco materiali ===&lt;br /&gt;
&lt;br /&gt;
* [https://www.homotix.it/vendita/wemos-schede-cpu/wemos-mini-v310 Wemos D1 mini V3]&lt;br /&gt;
* [https://www.homotix.it/vendita/wemos/oled-shield-v110-for-wemos-mini  OLED Shield V2.0.0 for Wemos D1 mini]&lt;br /&gt;
* [https://www.homotix.it/vendita/wemos-shield-alimentazione/power-shield Wemos DC Power Shield V1.1.0]&lt;br /&gt;
* [https://www.homotix.it/vendita/wemos-shield-prototipazione-cavi/wemos-protoboard wemos protoboard]&lt;br /&gt;
* [https://www.homotix.it/vendita/connettori-morsettiere/connettore-strip-maschio-poli-12mm connettore strip maschio 12mm]&lt;br /&gt;
* [https://www.homotix.it/vendita/wemos-shield-prototipazione-cavi/connettori connettori] (quando necessari)&lt;br /&gt;
&lt;br /&gt;
NOTA BENE&lt;br /&gt;
&lt;br /&gt;
In particolare il sensore Honeywell HPMA richiede una alimentazione a 5V stabilizzata e molto precisa&lt;br /&gt;
&lt;br /&gt;
Alimentazione per distanze fino a circa 50m. dall'alimentazione di rete a 220V:&lt;br /&gt;
* [https://www.homotix.it/vendita/alimentatori/alimentatore-12v-2a Alimentatore-12v-2a]&lt;br /&gt;
* cavo bipolare della lunghezza opportuna&lt;br /&gt;
&lt;br /&gt;
==== Sensore polveri Sensirion SPS30 ====&lt;br /&gt;
[[File:sps30_overview.jpg]]&lt;br /&gt;
* [https://www.sensirion.com/en/environmental-sensors/particulate-matter-sensors-pm25/ sps30]&lt;br /&gt;
* https://it.rs-online.com/web/p/sensori-di-qualita-dell-aria/1862540/&lt;br /&gt;
&lt;br /&gt;
===== in alternativa =====&lt;br /&gt;
* [http://www.plantower.com/en/content/?108.html Plantower pms5003]&lt;br /&gt;
&lt;br /&gt;
===== in alternativa =====&lt;br /&gt;
* [https://it.rs-online.com/web/p/sensori-di-luce-e-colore/1454279/ Honeywell HPM-115S0]&lt;br /&gt;
* [https://it.rs-online.com/web/p/wire-to-board-cable-assemblies/1250750/ Cavo connessione PicoBlade Molex 8 vie]&lt;br /&gt;
&lt;br /&gt;
===== in alternativa =====&lt;br /&gt;
* [https://www.homotix.it/vendita/sensori-polveri-sottili/sensore-polveri-sottili-sds011 SDS011]&lt;br /&gt;
&lt;br /&gt;
==== Sensore temperatura e umidità ====&lt;br /&gt;
* [https://www.sensirion.com/en/environmental-sensors/humidity-sensors/sht85-pin-type-humidity-sensor-enabling-easy-replaceability/ sensirion SHT85] [[File:sht85_overview.jpg]]&lt;br /&gt;
* [https://it.rs-online.com/web/p/sensori-di-temperatura-e-umidita/1826530/ negozio RS]&lt;br /&gt;
&lt;br /&gt;
===== in alternativa =====&lt;br /&gt;
====== temperatura 0.2C accuratezza ======&lt;br /&gt;
* [https://www.analog.com/en/products/adt7420.html ADT7420]&lt;br /&gt;
====== temperatura 0.5C accuratezza e umidità ====== &lt;br /&gt;
* [https://sensing.honeywell.com/honeywell-sensing-humidicon-hih6100-series-product-sheet-009059-6-en.pdf HIH6121]&lt;br /&gt;
&lt;br /&gt;
==== Sensore di CO2 ====&lt;br /&gt;
&lt;br /&gt;
[[File:scd30_overview.jpg]]&lt;br /&gt;
* [https://www.sensirion.com/en/environmental-sensors/carbon-dioxide-sensors-co2/ Sensirion SCD30]&lt;br /&gt;
* [https://it.rs-online.com/web/p/sensori-di-temperatura-e-umidita/1720552/ negozio RS]&lt;br /&gt;
&lt;br /&gt;
=== Configurazioni sul server ===&lt;br /&gt;
&lt;br /&gt;
==== Registrazione ====&lt;br /&gt;
[http://rmap.cc/registrazione/register/ Registrasi] o fare [http://rmap.cc/registrazione/login] login sul server.&lt;br /&gt;
==== Configurazione stazione ====&lt;br /&gt;
Registrare una nuova stazione sul [http://rmap.cc/insertdata/newstation server]; dopo aver selezionato le coordinate utilizzando l'indirizzo o selezionandole dalla mappa inserire il nome stazione ( nome consigliato come predefinito &amp;quot;stimawifi&amp;quot;) &lt;br /&gt;
e il modello stazione che sarà &lt;br /&gt;
* &amp;quot;airquality_sps_sht_scd&amp;quot; se sono collegati i sensori Sensirion delle polveri SPS30, temperatura e umidità SHT85 , sensore di CO2 SCD30 &lt;br /&gt;
* &amp;quot;airquality_sps_sht&amp;quot; se sono collegati i sensori Sensirion delle polveri SPS30, temperatura e umidità SHT85 &lt;br /&gt;
* &amp;quot;airquality_sps&amp;quot; se è collegato solo il sensori Sensirion delle polveri SPS30&lt;br /&gt;
* &amp;quot;airquality_sds&amp;quot; se è collegato solo il sensore delle polveri SDS011.&lt;br /&gt;
* &amp;quot;airquality_hpm&amp;quot; se è collegato solo il sensore delle polveri Honeywell HPM&lt;br /&gt;
* &amp;quot;airquality_pms&amp;quot; se è collegato solo il sensore delle polveri Plantower pms5003&lt;br /&gt;
* &amp;quot;stima_thd&amp;quot; se sono collegati il sensore delle polveri Honeywell HPM e il modulo stima_th&lt;br /&gt;
* &amp;quot;stima_thdm&amp;quot; se sono collegati il sensore delle polveri Honeywell HPM, il modulo stima_th, il modulo stima_gas&lt;br /&gt;
&lt;br /&gt;
=== Attivazione stazione ===&lt;br /&gt;
Accendere la stazione collegandola tramite l'apposito alimentatore a una alimentazione USB.&lt;br /&gt;
&lt;br /&gt;
==== Se si ha il display ====&lt;br /&gt;
Tenendo premuto il pulsante A premere il pulsante Reset.&lt;br /&gt;
Dovranno apparire le seguenti scritte:&lt;br /&gt;
 Clean FS&lt;br /&gt;
 Reset wifi configuration&lt;br /&gt;
&lt;br /&gt;
Con un PC o uno smathphone collegarsi al WIFI con ssed &amp;quot;STIMA-config&amp;quot; e password &amp;quot;bellastima&amp;quot; come indicato sul display.&lt;br /&gt;
&lt;br /&gt;
Una volta attivata la connessione dovrà comparire una pagina di configurazione intitolata &amp;quot;STIMA-config&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Se questo non avviene automaticamente puntare il browser all'indirizzo http://192.168.4.1/&lt;br /&gt;
&lt;br /&gt;
Selezionare la prima voce &amp;quot;Configure WiFi&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Selezionare dall'elenco l'ssed della rete WiFi di accesso alla rete che dovrà essere utilizzata dalla stazione e inserire nell'apposita casella la relativa password di accesso se necessaria.&lt;br /&gt;
Nella casella &amp;quot;rmap user&amp;quot; inserire il nome utente utilizzato nella registrazione sul server e nella casella &amp;quot;rmap password&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lasciare &amp;quot;stimawifi&amp;quot; come nome stazione se non è sttao precedentemente personalizzato.&lt;br /&gt;
&lt;br /&gt;
premere il tasto &amp;quot;save&amp;quot; per salvare.&lt;br /&gt;
&lt;br /&gt;
Se si ottiene la pagina con la scritta &amp;quot;Credentials Saved&amp;quot; la procedura ha avuto successo.&lt;br /&gt;
&lt;br /&gt;
A questo punto sul display dopo la pagina con la scritta &amp;quot;Starting up!&amp;quot; e la versione del firmware dovrà comparire la scritta &amp;quot;WIFI OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Se questo non avviene rieseguire le istruzioni di questa sezione.&lt;br /&gt;
&lt;br /&gt;
==== Se non si ha il display ====&lt;br /&gt;
Con un filo connettere il pin 7 a massa e premere il pulsante Reset e attendere 5 secondi prima di scollegare il filo dal pin 7.&lt;br /&gt;
&lt;br /&gt;
Con un PC o uno smathphone collegarsi al WIFI con ssed &amp;quot;STIMA-config&amp;quot; e password &amp;quot;bellastima&amp;quot; come indicato sul display.&lt;br /&gt;
&lt;br /&gt;
Una volta attivata la connessione dovrà comparire una pagina di configurazione intitolata &amp;quot;STIMA-config&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Se questo non avviene automaticamente puntare il browser all'indirizzo http://192.168.4.1/&lt;br /&gt;
&lt;br /&gt;
Selezionare la prima voce &amp;quot;Configure WiFi&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Selezionare dall'elenco l'ssed della rete WiFi di accesso alla rete che dovrà essere utilizzata dalla stazione e inserire nell'apposita casella la relativa password di accesso se necessaria.&lt;br /&gt;
&lt;br /&gt;
Nella casella &amp;quot;rmap user&amp;quot; inserire il nome utente utilizzato nella registrazione sul server e nella casella &amp;quot;rmap password&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Lasciare &amp;quot;stimawifi&amp;quot; come nome stazione se non è sttao precedentemente personalizzato.&lt;br /&gt;
&lt;br /&gt;
premere il tasto &amp;quot;save&amp;quot; per salvare.&lt;br /&gt;
&lt;br /&gt;
Se entro 60 secondi si accenderà un led blu per una decina di secondi tutto è andato a buon fine.&lt;br /&gt;
&lt;br /&gt;
Se questo non avviene rieseguire le istruzioni di questa sezione.&lt;br /&gt;
&lt;br /&gt;
=== Legenda segnalazioni tramite LED blu onboard ===&lt;br /&gt;
&lt;br /&gt;
* riavvio: 3 impulsi luminosi di 1 secondo &lt;br /&gt;
* tentativo aggiornamento firmware in corso: led lampeggiante a 1Hz&lt;br /&gt;
* risultato aggiornamento firmware:&lt;br /&gt;
** nessun aggiornamento disponibile: 1 impulso luminosi di 1 secondo&lt;br /&gt;
** aggiornamento firmware fallito: 2 impulsi luminosi di 1 secondo&lt;br /&gt;
** firmware aggiornato:  3 impulsi luminosi di 1 secondo&lt;br /&gt;
* in attesa di configurazione: led lampeggiante a 1Hz per tutto il periodo di configurazione&lt;br /&gt;
* configurazione remota fallita:  led lampeggiante a 1Hz per 5 secondi&lt;br /&gt;
* connect MQTT fallita/errore pubblicazione: impulso medio a 1Hz per 5 secondi&lt;br /&gt;
* sensore assente o rotto/errore comunicazione: impulso lungo a 1Hz per 5 secondi&lt;br /&gt;
* dato mancante: un impulso luminoso di 1 secondo a 2Hz&lt;br /&gt;
&lt;br /&gt;
Un corretto funzionamento della stazione viene evidenziato dal led blu che si accende per circa 5 secondi ogni 60 secondi.&lt;br /&gt;
&lt;br /&gt;
=== Visualizzazione dei dati ===&lt;br /&gt;
[http://rmapv.rmap.cc/accounts/profile/ Dati stazione] &amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cancellazione delle configurazioni e reset alle condizioni di &amp;quot;fabbrica&amp;quot; ===&lt;br /&gt;
==== Se si ha il display ====&lt;br /&gt;
Tenendo premuto il pulsante A premere il pulsante Reset.&lt;br /&gt;
Dovranno apparire le seguenti scritte:&lt;br /&gt;
 Clean FS&lt;br /&gt;
 Reset wifi configuration&lt;br /&gt;
&lt;br /&gt;
Potranno essere necessarie alcune decine di secondi prima che queste scritte scompaiano e si possa procedere.&lt;br /&gt;
&lt;br /&gt;
==== Se non si ha il display ====&lt;br /&gt;
Con un filo connettere il pin 7 a massa e premere il pulsante Reset e attendere 5 secondi prima di scollegare il filo dal pin 7 e attendere ulteriori 60 secondi.&lt;br /&gt;
&lt;br /&gt;
=== Assemblaggio ===&lt;br /&gt;
Infilare i connettori con i pin lunghi e saldarli sul modulo Wemos D1 mini.&lt;br /&gt;
Se si dispone di un display Wemos v2 impilarlo sul modulo Wemos D1 mini.&lt;br /&gt;
Aggiungere alla pila Wemos il DC Power Shield.&lt;br /&gt;
&lt;br /&gt;
Saldare alla wemos protoboard i pin necessari a connettere tutti i sensori e aggiungerlo alla pila Wemos come da foto.&lt;br /&gt;
[[File:protoboard-shield-per-wemos-d1-mini.jpg]]&lt;br /&gt;
[[File:wemos_protoboard_connection.png]]&lt;br /&gt;
[[File:protoboard_saldata.jpg]]&lt;br /&gt;
[[File:pila_wemos.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== opzione display oled ====&lt;br /&gt;
Se si possiede la versione v2.0.0 sul circuito stampato dal lato opposto del display interrompere la piazzola sulla destra indicata con D3 (pulsante A, piazzola indicata con la freccia) e della stessa colonna di piazzole saldare quella indicata con D7.&lt;br /&gt;
Se si possiede la versione v1.x (senza pulsanti A e B) è necessario realizzare una saldatura dove previsto (sul retro del circuito stampato rispetto al display) selezionando l'indirizzo I2C corrispondente a 0x3C.&lt;br /&gt;
&lt;br /&gt;
==== Sensore Sensirion SPS30 per le polveri ====&lt;br /&gt;
&lt;br /&gt;
[[File:sps30_connector.png]]&lt;br /&gt;
&lt;br /&gt;
Connettere:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wemos D1 mini &lt;br /&gt;
! &lt;br /&gt;
! SPS30&lt;br /&gt;
|-&lt;br /&gt;
| 5V  || &amp;lt;-&amp;gt; || PIN 1&lt;br /&gt;
|-&lt;br /&gt;
| D2  || &amp;lt;-&amp;gt; || PIN 2&lt;br /&gt;
|-&lt;br /&gt;
| D1  || &amp;lt;-&amp;gt; || PIN 3&lt;br /&gt;
|-&lt;br /&gt;
| GND || &amp;lt;-&amp;gt; || PIN 4&lt;br /&gt;
|-&lt;br /&gt;
| GND || &amp;lt;-&amp;gt; || PIN 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Sensore Sensirion SCD30 per la CO2 ====&lt;br /&gt;
&lt;br /&gt;
[[File:scds30_connector.png]]&lt;br /&gt;
&lt;br /&gt;
Connettere:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wemos D1 mini &lt;br /&gt;
! &lt;br /&gt;
! SCD30&lt;br /&gt;
|-&lt;br /&gt;
| 5V  || &amp;lt;-&amp;gt; || VDD&lt;br /&gt;
|-&lt;br /&gt;
| GND || &amp;lt;-&amp;gt; || GND&lt;br /&gt;
|-&lt;br /&gt;
| D1  || &amp;lt;-&amp;gt; || SCL&lt;br /&gt;
|-&lt;br /&gt;
| D2  || &amp;lt;-&amp;gt; || SDA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assemblaggio del sensore all'uscita del sensore di polveri:&lt;br /&gt;
[[File:scd30_assemblaggio_1.jpg]]&lt;br /&gt;
[[File:scd30_assemblaggio_2.jpg]]&lt;br /&gt;
&lt;br /&gt;
==== opzione sensore Plantower PMS5003 per le polveri ====&lt;br /&gt;
numbering pins from left to right with &amp;quot;plantower&amp;quot; stamps on the floor&lt;br /&gt;
&lt;br /&gt;
Effettuare i seguenti collegamenti tra Wemos e [https://github.com/r-map/rmap/blob/master/arduino/sketchbook/libraries/pms/doc/pms5003-manual_v2-3.pdf PMS5003]:&lt;br /&gt;
Connettere:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wemos D1 mini &lt;br /&gt;
! &lt;br /&gt;
! PMS5003&lt;br /&gt;
|-&lt;br /&gt;
| GND || &amp;lt;-&amp;gt; || PIN 2&lt;br /&gt;
|-&lt;br /&gt;
| 5V  || &amp;lt;-&amp;gt; || PIN 1&lt;br /&gt;
|-&lt;br /&gt;
| D5  || &amp;lt;-&amp;gt; || PIN 5&lt;br /&gt;
|-&lt;br /&gt;
| D6  || &amp;lt;-&amp;gt; || PIN 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
eventualmente connettere anche il PIN 6 (reset) e PIN 3 (SET) (DA FARE)&lt;br /&gt;
&lt;br /&gt;
==== opzione sensore SDS011 per le polveri ====&lt;br /&gt;
Effettuare i seguenti collegamenti tra Wemos e SDS011:&lt;br /&gt;
Connettere:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wemos D1 mini &lt;br /&gt;
! &lt;br /&gt;
! SDS011&lt;br /&gt;
|-&lt;br /&gt;
| GND || &amp;lt;-&amp;gt; || pin 5 GND&lt;br /&gt;
|-&lt;br /&gt;
| 5V  || &amp;lt;-&amp;gt; || pin 3 5V&lt;br /&gt;
|-&lt;br /&gt;
| D5  || &amp;lt;-&amp;gt; || pin 7 TXD&lt;br /&gt;
|-&lt;br /&gt;
| D6  || &amp;lt;-&amp;gt; || pin 6 RXD&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== opzione sensore Honeywell HPM per le polveri ====&lt;br /&gt;
Effettuare i seguenti collegamenti tra Wemos e Honeywell hpm:&lt;br /&gt;
[[File:Honeywell_hpm_pinout.png|300px|thumb|left|Honeywell pinout]] &amp;lt;br clear=all&amp;gt;&lt;br /&gt;
Connettere:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wemos D1 mini &lt;br /&gt;
! &lt;br /&gt;
! Honeywell HPM&lt;br /&gt;
|-&lt;br /&gt;
| GND || &amp;lt;-&amp;gt; || PIN 8 GND&lt;br /&gt;
|-&lt;br /&gt;
| 5V  || &amp;lt;-&amp;gt; || PIN 2 5V&lt;br /&gt;
|-&lt;br /&gt;
| D5  || &amp;lt;-&amp;gt; || PIN 6 TX&lt;br /&gt;
|-&lt;br /&gt;
| D6  || &amp;lt;-&amp;gt; || PIN 7 RX&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[File:assemblaggioinscatolaelettrica.jpg|400px|thumb|left|Assemblaggio moduli in scatola elettrica]] &amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:assemblaggioinscatolaelettricaflusso.jpg|400px|thumb|left|Assemblaggio materiale espanso per flusso aria]] &amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:presearia.jpg|400px|thumb|left|Messa in opera con canaletta angolo a 90 gradi per flusso aria in/out antipioggia]] &amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:filtroinsetti.jpg|400px|thumb|left|Uso di rete zanzariera per filtro contro gli insetti]] &amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== sensore SHT85 per temperatura e umidità ====&lt;br /&gt;
&lt;br /&gt;
[[File:sht85_connections.png]] &lt;br /&gt;
Connettere:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wemos D1 mini &lt;br /&gt;
! &lt;br /&gt;
! modulo Stima-th&lt;br /&gt;
|-&lt;br /&gt;
| GND || &amp;lt;-&amp;gt; || PIN 3&lt;br /&gt;
|-&lt;br /&gt;
| 3V3  || &amp;lt;-&amp;gt; || PIN 2&lt;br /&gt;
|-&lt;br /&gt;
| D1  || &amp;lt;-&amp;gt; || PIN 1&lt;br /&gt;
|-&lt;br /&gt;
| D2  || &amp;lt;-&amp;gt; || PIN 4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Opzione modulo Stima-th con HIH6121 e ADT7420 per temperatura e umidità ====&lt;br /&gt;
&lt;br /&gt;
[[File:sensoretemperaturaeumidita.jpg|400px|thumb|left|Sensore temperatura e umidità all'interno di apposito schermo per le radiazioni]] &amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ponticellare (con un resistore)  A1-centrale con  A1-&lt;br /&gt;
* ponticellare (con un resistore)  A0-centrale con  A0+&lt;br /&gt;
&lt;br /&gt;
Una volta saldati i terminali dei cavi e protetti con nastro autoagglomerante è importante preservare le connessioni dalla corrosione degli agenti atmosferici e consigliamo uno strato di silicone protettivo spray del tipo Electrolube DCR200H; solo una volta asciugato lo strato di vernice protettiva rimuovere la protezione adesiva del sensore HIH&lt;br /&gt;
&lt;br /&gt;
Connettere:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Wemos D1 mini &lt;br /&gt;
! &lt;br /&gt;
! modulo Stima-th&lt;br /&gt;
|-&lt;br /&gt;
| GND || &amp;lt;-&amp;gt; || GND&lt;br /&gt;
|-&lt;br /&gt;
| 3V3  || &amp;lt;-&amp;gt; || VCC&lt;br /&gt;
|-&lt;br /&gt;
| D1  || &amp;lt;-&amp;gt; || SCL&lt;br /&gt;
|-&lt;br /&gt;
| D2  || &amp;lt;-&amp;gt; || SDA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se non si utilizza la wemos_protoboard è necessario fare una modifica al modulo wemos per aggiungere un pin di collegamento a GND.&lt;br /&gt;
Saldare a 45 gradi di inclinazione un pin aggiuntivo per connettore Dupont a GND come da figura:&lt;br /&gt;
[[File:stima_wifi_addpintognd.jpg|300px|thumb|center|Pin aggiunto a GND]] &amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Opzione modulo Stima-i2c-sdsmics ====&lt;br /&gt;
&lt;br /&gt;
vedi:&lt;br /&gt;
http://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/HowTo#Modulo_Stima-i2c-sdsmics&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Opzione per alimentazione con cavo di lunghezza superiore a 2m. ====&lt;br /&gt;
Tagliare il cavo dell'alimentatore e inserire una piattina bipolare con rame di diametro opportuno ovviamente della lunghezza necessaria.&lt;br /&gt;
&lt;br /&gt;
==== Per caricare il firmware ====&lt;br /&gt;
&lt;br /&gt;
===== Installare il driver USB2Serial =====&lt;br /&gt;
&lt;br /&gt;
====== Windows ======&lt;br /&gt;
Per comunicare col Wemos c’è bisogno del driver usb2serial.&lt;br /&gt;
&lt;br /&gt;
====== Linux ======&lt;br /&gt;
Nessuna installazione necessaria.&lt;br /&gt;
&lt;br /&gt;
====== MacOS ======&lt;br /&gt;
Per Sierra vedere queste instruzioni che sono state testate: https://github.com/adrianmihalko/ch340g-ch34g-ch34x-mac-os-driver&lt;br /&gt;
&lt;br /&gt;
===== Upload del firmware =====&lt;br /&gt;
&lt;br /&gt;
Effettuare il download del firmware da http://rmap.cc/media/firmware/rmap_esp8266.ino.d1_mini_yhbp7E2.bin&lt;br /&gt;
e caricarlo sul Wemos dopo averlo connesso tramite cavetto USB.&lt;br /&gt;
Per fare questo seguire le istruzioni a:&lt;br /&gt;
https://github.com/espressif/esptool&lt;br /&gt;
e in particolare:&lt;br /&gt;
https://github.com/espressif/esptool#writing-binaries-to-flash&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/Partecipa/OsservazioniManuali&amp;diff=7207</id>
		<title>Gruppo Meteo/Partecipa/OsservazioniManuali</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/Partecipa/OsservazioniManuali&amp;diff=7207"/>
		<updated>2019-11-06T09:10:42Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Per inserire delle osservazioni manuali è necessario essere registrati sulla piattaforma RMAP (vedi RegistrazioneUtenti)&lt;br /&gt;
&lt;br /&gt;
Una volta fatto login sulla piattaforma RMAP, si potrà inserire le proprie osservazioni manuali spostando il mouse sul menù &amp;quot;Partecipa&amp;quot; e clicakando sulla voce &amp;quot;aggiungi osservazioni manuali&amp;quot;, che porterà l'utente direttamente sulla pagina http://rmap.cc/insertdata/manualdata&lt;br /&gt;
&lt;br /&gt;
La prima operazione da fare è indicare la posizione esatta del sito di osservazione. Questo può essere fatto alternativamente in tre modi:&lt;br /&gt;
* scegliendo una delle proprie stazioni di osservazione e clickando su &amp;quot;Seleziona&amp;quot;;&lt;br /&gt;
* indicando l'indirizzo preciso di osservazione (nome della strada esteso, così che possa essere riconosciuto correttamente) e clickando su &amp;quot;seleziona&amp;quot;;&lt;br /&gt;
* selezionando il segnaposto (a forma di goccia, l'ultimo dal basso del gruppo di 4 pulsanti sulla sinistra della mappa) e posizionandolo con doppio click sul punto preciso della mappa. Se la posizione non è corretta il segnaposto potrà essere spostato. Questa opzione per ora non è disponibile su Android.&lt;br /&gt;
&lt;br /&gt;
Qualsiasi sia il modo in cui sia stato individuato il sito di osservazione, se l'operazione si è conclusa con successo, comparirà sulla mappa il marker a forma di goccia che lo identifica.&lt;br /&gt;
&lt;br /&gt;
Infine potranno essere inserite le osservazioni (tempo presente e/o visibilità e/o altezza del manto nevoso).&lt;br /&gt;
&lt;br /&gt;
L'inserimento delle osservazioni viene completato clickando su &amp;quot;Invia&amp;quot;.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7134</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7134"/>
		<updated>2019-07-31T07:18:15Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Tabella D */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.3 =&lt;br /&gt;
== Storia del documento ==&lt;br /&gt;
2019/06/18 v. 2.3 : aggiunte specifiche JSRPC&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
              &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
              &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
              &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;],&lt;br /&gt;
        &amp;quot;51&amp;quot;:[&amp;quot;B11211&amp;quot;,&amp;quot;B11212&amp;quot;,&amp;quot;B11213&amp;quot;,&amp;quot;B11214&amp;quot;,&amp;quot;B11215&amp;quot;,&amp;quot;B11216&amp;quot;],&lt;br /&gt;
        &amp;quot;52&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
              &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: se true riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server (default false)&lt;br /&gt;
* char datalevel: &amp;quot;sample&amp;quot; o &amp;quot;report&amp;quot;; prima parte del path di pubblicazione su MQTT per i dati (default &amp;quot;report&amp;quot;)&lt;br /&gt;
* char network: &amp;quot;fixed&amp;quot; o &amp;quot;mobile&amp;quot;; prima parte del path di pubblicazione su MQTT per i dati (default &amp;quot;fixed&amp;quot;)&lt;br /&gt;
* int lat: latitudine espressa con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* int lon: longitudine espressa con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* char mqttmaintpath: prima parte del path di pubblicazione su MQTT per i messaggi di funzionamento (default &amp;quot;maint&amp;quot;)&lt;br /&gt;
* int  sampletime: intervallo tra le misure in secondi (default 900)&lt;br /&gt;
* char mqttserver:  server MQTT (default &amp;quot;rmap.cc&amp;quot;)&lt;br /&gt;
* char mqttuser: MQTT user ( no default)&lt;br /&gt;
* char mqttpass: MQTT password ( no default)&lt;br /&gt;
* char ntpserver:  NTP server (no default)&lt;br /&gt;
* array int[6] date: set date and time [esempio: 2014,2,10,18,45,18] (no default)&lt;br /&gt;
* array byte mac[6]: ethernet mac address (esempio: use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.) (no default)&lt;br /&gt;
* bool save: if true save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server (default false)&lt;br /&gt;
* array sens:&lt;br /&gt;
** char tr: timerange (esempio: &amp;quot;1,0,60&amp;quot;) (no default)&lt;br /&gt;
** char lev: level (esempio &amp;quot;1,-,-,-&amp;quot;) (no default)&lt;br /&gt;
** char var: variabile tabella B (esempio &amp;quot;B13011&amp;quot;) (no default)&lt;br /&gt;
** any ext: configurazione relativa a una implementazione specifica di un sensore nella stazione OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;mqttuser&amp;quot;:&amp;quot;myuser&amp;quot;, &amp;quot;mqttpass&amp;quot;:&amp;quot;mypassword&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;datalevel&amp;quot;:&amp;quot;report&amp;quot;, &amp;quot;network&amp;quot;:&amp;quot;fixed&amp;quot;, &amp;quot;lon&amp;quot;:1112345, &amp;quot;lat&amp;quot;:4412345}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;1,0,60&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;1,-,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B130111&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;254,0,0&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;105,2000,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B12101&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server (opzionale)&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta terminerà con la stringa &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere la chiave &amp;quot;t&amp;quot; nel payload.&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?time&lt;br /&gt;
risposta:&lt;br /&gt;
 19/06/18,13:06:59+00 please set topic&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Discussione:Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7081</id>
		<title>Discussione:Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Discussione:Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7081"/>
		<updated>2019-06-19T16:57:50Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: Creata pagina con '= questioni aperte durante il seminario del 19/6/2019 =  * il concetto di stazione non è contemplato nel datamodel; ne deriva quindi poca chiarezza quando il suo uso è richi...'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= questioni aperte durante il seminario del 19/6/2019 =&lt;br /&gt;
&lt;br /&gt;
* il concetto di stazione non è contemplato nel datamodel; ne deriva quindi poca chiarezza quando il suo uso è richiesto:&lt;br /&gt;
** nella definizione dell'uso del protocollo MQTT al punto 1.6.1.6 http://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap#Stato_della_connessione dove il soggetto che sta effettuando la connessione non è definito chiaramente&lt;br /&gt;
** nella definizione delle JSRPC over MQTT 1.6.1.9 http://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap#Remote_procedure_over_MQTT cove il destinatario della richiesta RPC anche in questo caso non è chiaro&lt;br /&gt;
&lt;br /&gt;
Una possibile soluzione sarebbe quella di modellare anche la stazione (ad esempio ident -&amp;gt; stazione -&amp;gt; modulo -&amp;gt; sensore) oppure semplificare il tutto e considerare solo il livello di metadati definiti nei due casi.&lt;br /&gt;
La discussione è aperta.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7080</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7080"/>
		<updated>2019-06-18T15:56:34Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* RFC rmap versione 2.2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.3 =&lt;br /&gt;
== Storia del documento ==&lt;br /&gt;
2019/06/18 v. 2.3 : aggiunte specifiche JSRPC&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: se true riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server (default false)&lt;br /&gt;
* char datalevel: &amp;quot;sample&amp;quot; o &amp;quot;report&amp;quot;; prima parte del path di pubblicazione su MQTT per i dati (default &amp;quot;report&amp;quot;)&lt;br /&gt;
* char network: &amp;quot;fixed&amp;quot; o &amp;quot;mobile&amp;quot;; prima parte del path di pubblicazione su MQTT per i dati (default &amp;quot;fixed&amp;quot;)&lt;br /&gt;
* int lat: latitudine espressa con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* int lon: longitudine espressa con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* char mqttmaintpath: prima parte del path di pubblicazione su MQTT per i messaggi di funzionamento (default &amp;quot;maint&amp;quot;)&lt;br /&gt;
* int  sampletime: intervallo tra le misure in secondi (default 900)&lt;br /&gt;
* char mqttserver:  server MQTT (default &amp;quot;rmap.cc&amp;quot;)&lt;br /&gt;
* char mqttuser: MQTT user ( no default)&lt;br /&gt;
* char mqttpass: MQTT password ( no default)&lt;br /&gt;
* char ntpserver:  NTP server (no default)&lt;br /&gt;
* array int[6] date: set date and time [esempio: 2014,2,10,18,45,18] (no default)&lt;br /&gt;
* array byte mac[6]: ethernet mac address (esempio: use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.) (no default)&lt;br /&gt;
* bool save: if true save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server (default false)&lt;br /&gt;
* array sens:&lt;br /&gt;
** char tr: timerange (esempio: &amp;quot;1,0,60&amp;quot;) (no default)&lt;br /&gt;
** char lev: level (esempio &amp;quot;1,-,-,-&amp;quot;) (no default)&lt;br /&gt;
** char var: variabile tabella B (esempio &amp;quot;B13011&amp;quot;) (no default)&lt;br /&gt;
** any ext: configurazione relativa a una implementazione specifica di un sensore nella stazione OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;mqttuser&amp;quot;:&amp;quot;myuser&amp;quot;, &amp;quot;mqttpass&amp;quot;:&amp;quot;mypassword&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;datalevel&amp;quot;:&amp;quot;report&amp;quot;, &amp;quot;network&amp;quot;:&amp;quot;fixed&amp;quot;, &amp;quot;lon&amp;quot;:1112345, &amp;quot;lat&amp;quot;:4412345}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;1,0,60&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;1,-,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B130111&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;254,0,0&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;105,2000,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B12101&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server (opzionale)&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta terminerà con la stringa &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere la chiave &amp;quot;t&amp;quot; nel payload.&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?time&lt;br /&gt;
risposta:&lt;br /&gt;
 19/06/18,13:06:59+00 please set topic&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7079</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7079"/>
		<updated>2019-06-18T15:35:08Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* config */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: se true riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server (default false)&lt;br /&gt;
* char datalevel: &amp;quot;sample&amp;quot; o &amp;quot;report&amp;quot;; prima parte del path di pubblicazione su MQTT per i dati (default &amp;quot;report&amp;quot;)&lt;br /&gt;
* char network: &amp;quot;fixed&amp;quot; o &amp;quot;mobile&amp;quot;; prima parte del path di pubblicazione su MQTT per i dati (default &amp;quot;fixed&amp;quot;)&lt;br /&gt;
* int lat: latitudine espressa con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* int lon: longitudine espressa con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* char mqttmaintpath: prima parte del path di pubblicazione su MQTT per i messaggi di funzionamento (default &amp;quot;maint&amp;quot;)&lt;br /&gt;
* int  sampletime: intervallo tra le misure in secondi (default 900)&lt;br /&gt;
* char mqttserver:  server MQTT (default &amp;quot;rmap.cc&amp;quot;)&lt;br /&gt;
* char mqttuser: MQTT user ( no default)&lt;br /&gt;
* char mqttpass: MQTT password ( no default)&lt;br /&gt;
* char ntpserver:  NTP server (no default)&lt;br /&gt;
* array int[6] date: set date and time [esempio: 2014,2,10,18,45,18] (no default)&lt;br /&gt;
* array byte mac[6]: ethernet mac address (esempio: use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.) (no default)&lt;br /&gt;
* bool save: if true save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server (default false)&lt;br /&gt;
* array sens:&lt;br /&gt;
** char tr: timerange (esempio: &amp;quot;1,0,60&amp;quot;) (no default)&lt;br /&gt;
** char lev: level (esempio &amp;quot;1,-,-,-&amp;quot;) (no default)&lt;br /&gt;
** char var: variabile tabella B (esempio &amp;quot;B13011&amp;quot;) (no default)&lt;br /&gt;
** any ext: configurazione relativa a una implementazione specifica di un sensore nella stazione OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;mqttuser&amp;quot;:&amp;quot;myuser&amp;quot;, &amp;quot;mqttpass&amp;quot;:&amp;quot;mypassword&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;datalevel&amp;quot;:&amp;quot;report&amp;quot;, &amp;quot;network&amp;quot;:&amp;quot;fixed&amp;quot;, &amp;quot;lon&amp;quot;:1112345, &amp;quot;lat&amp;quot;:4412345}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;1,0,60&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;1,-,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B130111&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;254,0,0&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;105,2000,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B12101&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server (opzionale)&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta terminerà con la stringa &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere la chiave &amp;quot;t&amp;quot; nel payload.&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?time&lt;br /&gt;
risposta:&lt;br /&gt;
 19/06/18,13:06:59+00 please set topic&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7078</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7078"/>
		<updated>2019-06-18T15:29:37Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* config */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: se true riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server (default false)&lt;br /&gt;
* char datalevel: &amp;quot;sample&amp;quot; o &amp;quot;report&amp;quot;; prima parte del path di pubblicazione su MQTT per i dati (default &amp;quot;report&amp;quot;)&lt;br /&gt;
* char network: &amp;quot;fixed&amp;quot; o &amp;quot;mobile&amp;quot;; prima parte del path di pubblicazione su MQTT per i dati (default &amp;quot;fixed&amp;quot;)&lt;br /&gt;
* int lat: latitudine espressa con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* int lon: longitudine espressa con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* char mqttmaintpath: prima parte del path di pubblicazione su MQTT per i messaggi di funzionamento (default &amp;quot;maint&amp;quot;)&lt;br /&gt;
* int  sampletime: intervallo tra le misure in secondi (default 900)&lt;br /&gt;
* char mqttserver:  server MQTT (default &amp;quot;rmap.cc&amp;quot;)&lt;br /&gt;
* char mqttuser: MQTT user ( no default)&lt;br /&gt;
* char mqttpassword: MQTT password ( no default)&lt;br /&gt;
* char ntpserver:  NTP server (no default)&lt;br /&gt;
* array int[6] date: set date and time [esempio: 2014,2,10,18,45,18] (no default)&lt;br /&gt;
* array byte mac[6]: ethernet mac address (esempio: use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.) (no default)&lt;br /&gt;
* bool save: if true save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server (default false)&lt;br /&gt;
* array sens:&lt;br /&gt;
** char tr: timerange (esempio: &amp;quot;1,0,60&amp;quot;) (no default)&lt;br /&gt;
** char lev: level (esempio &amp;quot;1,-,-,-&amp;quot;) (no default)&lt;br /&gt;
** char var: variabile tabella B (esempio &amp;quot;B13011&amp;quot;) (no default)&lt;br /&gt;
** any ext: configurazione relativa a una implementazione specifica di un sensore nella stazione OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;1,0,60&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;1,-,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B130111&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;254,0,0&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;105,2000,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B12101&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server (opzionale)&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta terminerà con la stringa &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere la chiave &amp;quot;t&amp;quot; nel payload.&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?time&lt;br /&gt;
risposta:&lt;br /&gt;
 19/06/18,13:06:59+00 please set topic&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7077</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7077"/>
		<updated>2019-06-18T13:41:39Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* config */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: se true riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server (default false)&lt;br /&gt;
* char datalevel: &amp;quot;sample&amp;quot; o &amp;quot;report&amp;quot;; prima parte del path di pubblicazione su MQTT per i dati (default &amp;quot;report&amp;quot;)&lt;br /&gt;
* char network: &amp;quot;fixed&amp;quot; o &amp;quot;mobile&amp;quot;; prima parte del path di pubblicazione su MQTT per i dati (default &amp;quot;fixed&amp;quot;)&lt;br /&gt;
* char mqttmaintpath: prima parte del path di pubblicazione su MQTT per i messaggi di funzionamento (default &amp;quot;maint&amp;quot;)&lt;br /&gt;
* int  sampletime: intervallo tra le misure in secondi (default 900)&lt;br /&gt;
* char mqttserver:  server MQTT (default &amp;quot;rmap.cc&amp;quot;)&lt;br /&gt;
* char mqttuser: MQTT user ( no default)&lt;br /&gt;
* char mqttpassword: MQTT password ( no default)&lt;br /&gt;
* char ntpserver:  NTP server (no default)&lt;br /&gt;
* array int[6] date: set date and time [esempio: 2014,2,10,18,45,18] (no default)&lt;br /&gt;
* array byte mac[6]: ethernet mac address (esempio: use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.) (no default)&lt;br /&gt;
* bool save: if true save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server (default false)&lt;br /&gt;
* array sens:&lt;br /&gt;
** char tr: timerange (esempio: &amp;quot;1,0,60&amp;quot;) (no default)&lt;br /&gt;
** char lev: level (esempio &amp;quot;1,-,-,-&amp;quot;) (no default)&lt;br /&gt;
** char var: variabile tabella B (esempio &amp;quot;B13011&amp;quot;) (no default)&lt;br /&gt;
** any ext: configurazione relativa a una implementazione specifica di un sensore nella stazione OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;1,0,60&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;1,-,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B130111&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;254,0,0&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;105,2000,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B12101&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server (opzionale)&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta terminerà con la stringa &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere la chiave &amp;quot;t&amp;quot; nel payload.&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?time&lt;br /&gt;
risposta:&lt;br /&gt;
 19/06/18,13:06:59+00 please set topic&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7076</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7076"/>
		<updated>2019-06-18T13:29:33Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Root topic */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: se true riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT per i dati&lt;br /&gt;
* char mqttmaintpath: prima parte del path di pubblicazione su MQTT per i messaggi di funzionamento&lt;br /&gt;
* int  sampletime: intervallo tra le misure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* array int[6] date: set date and time [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* array byte mac[6]: ethernet mac address (esempio: use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.)&lt;br /&gt;
* bool save: if true save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server&lt;br /&gt;
* array sens:&lt;br /&gt;
** char tr: timerange (esempio: &amp;quot;1,0,60&amp;quot;)&lt;br /&gt;
** char lev: level (esempio &amp;quot;1,-,-,-&amp;quot;)&lt;br /&gt;
** char var: variabile tabella B (esempio &amp;quot;B13011&amp;quot;)&lt;br /&gt;
** any ext: configurazione relativa a una implementazione specifica di un sensore nella stazione OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;1,0,60&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;1,-,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B130111&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;254,0,0&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;105,2000,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B12101&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server (opzionale)&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta terminerà con la stringa &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere la chiave &amp;quot;t&amp;quot; nel payload.&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?time&lt;br /&gt;
risposta:&lt;br /&gt;
 19/06/18,13:06:59+00 please set topic&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7075</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7075"/>
		<updated>2019-06-18T13:23:30Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* config */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: se true riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT per i dati&lt;br /&gt;
* char mqttmaintpath: prima parte del path di pubblicazione su MQTT per i messaggi di funzionamento&lt;br /&gt;
* int  sampletime: intervallo tra le misure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* array int[6] date: set date and time [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* array byte mac[6]: ethernet mac address (esempio: use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.)&lt;br /&gt;
* bool save: if true save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server&lt;br /&gt;
* array sens:&lt;br /&gt;
** char tr: timerange (esempio: &amp;quot;1,0,60&amp;quot;)&lt;br /&gt;
** char lev: level (esempio &amp;quot;1,-,-,-&amp;quot;)&lt;br /&gt;
** char var: variabile tabella B (esempio &amp;quot;B13011&amp;quot;)&lt;br /&gt;
** any ext: configurazione relativa a una implementazione specifica di un sensore nella stazione OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;1,0,60&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;1,-,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B130111&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;254,0,0&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;105,2000,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B12101&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server (opzionale)&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta terminerà con la stringa &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere la chiave &amp;quot;t&amp;quot; nel payload.&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?time&lt;br /&gt;
risposta:&lt;br /&gt;
 19/06/18,13:06:59+00 please set topic&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7074</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7074"/>
		<updated>2019-06-18T13:19:21Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* HTTP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT&lt;br /&gt;
* int  sampletime: intervallo tra le minure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* int[6] date: set date and time [2014,2,10,18,45,18]&lt;br /&gt;
* byte mac[6]: ethernet mac address; use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.&lt;br /&gt;
* bool save: save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server&lt;br /&gt;
* array sens:&lt;br /&gt;
** char tr: timerange (esempio: &amp;quot;1,0,60&amp;quot;)&lt;br /&gt;
** char lev: level (esempio &amp;quot;1,-,-,-&amp;quot;)&lt;br /&gt;
** char var: variabile tabella B (esempio &amp;quot;B13011&amp;quot;)&lt;br /&gt;
** any ext: configurazione relativa a una implementazione specifica di un sensore nella stazione OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;1,0,60&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;1,-,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B130111&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;254,0,0&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;105,2000,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B12101&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server (opzionale)&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta terminerà con la stringa &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere la chiave &amp;quot;t&amp;quot; nel payload.&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/&amp;lt;myuser&amp;gt;/945000,4530000/fixed/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?time&lt;br /&gt;
risposta:&lt;br /&gt;
 19/06/18,13:06:59+00 please set topic&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7073</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7073"/>
		<updated>2019-06-18T13:12:58Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* config */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT&lt;br /&gt;
* int  sampletime: intervallo tra le minure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* int[6] date: set date and time [2014,2,10,18,45,18]&lt;br /&gt;
* byte mac[6]: ethernet mac address; use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.&lt;br /&gt;
* bool save: save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server&lt;br /&gt;
* array sens:&lt;br /&gt;
** char tr: timerange (esempio: &amp;quot;1,0,60&amp;quot;)&lt;br /&gt;
** char lev: level (esempio &amp;quot;1,-,-,-&amp;quot;)&lt;br /&gt;
** char var: variabile tabella B (esempio &amp;quot;B13011&amp;quot;)&lt;br /&gt;
** any ext: configurazione relativa a una implementazione specifica di un sensore nella stazione OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;1,0,60&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;1,-,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B130111&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;254,0,0&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;105,2000,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B12101&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server (opzionale)&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta terminerà con la stringa &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere la chiave &amp;quot;t&amp;quot; nel payload.&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?time&lt;br /&gt;
risposta:&lt;br /&gt;
 19/06/18,13:06:59+00 please set topic&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7072</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7072"/>
		<updated>2019-06-18T13:09:41Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* config */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT&lt;br /&gt;
* int  sampletime: intervallo tra le minure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* int[6] date: set date and time [2014,2,10,18,45,18]&lt;br /&gt;
* byte mac[6]: ethernet mac address; use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.&lt;br /&gt;
* bool save: save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server&lt;br /&gt;
* array sens:&lt;br /&gt;
** char tr: &amp;quot;1,0,60&amp;quot;&lt;br /&gt;
** char lev: &amp;quot;1,-,-,-&amp;quot;&lt;br /&gt;
** char var: &amp;quot;B13011&amp;quot;&lt;br /&gt;
** any ext: configurazione relativa a una implementazione specifica di un sensore nella stazione OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;1,0,60&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;1,-,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B130111&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;tr&amp;quot;:&amp;quot;254,0,0&amp;quot;, &amp;quot;lev&amp;quot;:&amp;quot;105,2000,-,-&amp;quot;, &amp;quot;var&amp;quot;:&amp;quot;B12101&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server (opzionale)&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta terminerà con la stringa &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere la chiave &amp;quot;t&amp;quot; nel payload.&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?time&lt;br /&gt;
risposta:&lt;br /&gt;
 19/06/18,13:06:59+00 please set topic&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7071</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7071"/>
		<updated>2019-06-18T13:03:36Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* HTTP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT&lt;br /&gt;
* int  sampletime: intervallo tra le minure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* int[6] date: set date and time [2014,2,10,18,45,18]&lt;br /&gt;
* byte mac[6]: ethernet mac address; use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.&lt;br /&gt;
* bool save: save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server&lt;br /&gt;
* array sens:&lt;br /&gt;
** char mqttpath: seconda parte del path di pubblicazione su MQTT&lt;br /&gt;
** any ext configurazione relativa a una implementazione specifica della stazione (ad esempio configurazione di un sensore) OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server (opzionale)&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta terminerà con la stringa &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere la chiave &amp;quot;t&amp;quot; nel payload.&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
* get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?time&lt;br /&gt;
risposta:&lt;br /&gt;
 19/06/18,13:06:59+00 please set topic&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7070</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7070"/>
		<updated>2019-06-18T12:58:32Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* HTTP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT&lt;br /&gt;
* int  sampletime: intervallo tra le minure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* int[6] date: set date and time [2014,2,10,18,45,18]&lt;br /&gt;
* byte mac[6]: ethernet mac address; use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.&lt;br /&gt;
* bool save: save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server&lt;br /&gt;
* array sens:&lt;br /&gt;
** char mqttpath: seconda parte del path di pubblicazione su MQTT&lt;br /&gt;
** any ext configurazione relativa a una implementazione specifica della stazione (ad esempio configurazione di un sensore) OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta terminerà con la stringa &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
risposta:&lt;br /&gt;
 OK&lt;br /&gt;
&lt;br /&gt;
get:&lt;br /&gt;
 http://rmap.cc/http2mqtt/?time&lt;br /&gt;
risposta:&lt;br /&gt;
 19/06/18,13:06:59+00 please set topic&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot; nel payload.&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7069</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7069"/>
		<updated>2019-06-18T12:53:25Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT&lt;br /&gt;
* int  sampletime: intervallo tra le minure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* int[6] date: set date and time [2014,2,10,18,45,18]&lt;br /&gt;
* byte mac[6]: ethernet mac address; use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.&lt;br /&gt;
* bool save: save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server&lt;br /&gt;
* array sens:&lt;br /&gt;
** char mqttpath: seconda parte del path di pubblicazione su MQTT&lt;br /&gt;
** any ext configurazione relativa a una implementazione specifica della stazione (ad esempio configurazione di un sensore) OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
====== pinout ======&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== recovery ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== resend ======&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
====== reboot ======&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot; nel payload.&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta sarà &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7068</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7068"/>
		<updated>2019-06-18T12:50:30Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* recovery */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT&lt;br /&gt;
* int  sampletime: intervallo tra le minure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* int[6] date: set date and time [2014,2,10,18,45,18]&lt;br /&gt;
* byte mac[6]: ethernet mac address; use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.&lt;br /&gt;
* bool save: save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server&lt;br /&gt;
* array sens:&lt;br /&gt;
** char mqttpath: seconda parte del path di pubblicazione su MQTT&lt;br /&gt;
** any ext configurazione relativa a una implementazione specifica della stazione (ad esempio configurazione di un sensore) OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
==== pinout ====&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== recovery ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== resend ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== reboot ====&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot; nel payload.&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta sarà &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7067</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7067"/>
		<updated>2019-06-18T12:49:54Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* reboot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT&lt;br /&gt;
* int  sampletime: intervallo tra le minure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* int[6] date: set date and time [2014,2,10,18,45,18]&lt;br /&gt;
* byte mac[6]: ethernet mac address; use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.&lt;br /&gt;
* bool save: save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server&lt;br /&gt;
* array sens:&lt;br /&gt;
** char mqttpath: seconda parte del path di pubblicazione su MQTT&lt;br /&gt;
** any ext configurazione relativa a una implementazione specifica della stazione (ad esempio configurazione di un sensore) OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
==== pinout ====&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== recovery ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== resend ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== reboot ====&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot; nel payload.&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta sarà &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7066</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7066"/>
		<updated>2019-06-18T12:49:13Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* resend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT&lt;br /&gt;
* int  sampletime: intervallo tra le minure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* int[6] date: set date and time [2014,2,10,18,45,18]&lt;br /&gt;
* byte mac[6]: ethernet mac address; use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.&lt;br /&gt;
* bool save: save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server&lt;br /&gt;
* array sens:&lt;br /&gt;
** char mqttpath: seconda parte del path di pubblicazione su MQTT&lt;br /&gt;
** any ext configurazione relativa a una implementazione specifica della stazione (ad esempio configurazione di un sensore) OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
==== pinout ====&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== recovery ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== resend ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time; anno, mese, giorno, ora, minuti, secondi [esempio: 2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
esempio:&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== reboot ====&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot; nel payload.&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta sarà &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7065</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7065"/>
		<updated>2019-06-18T12:46:41Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* togglepin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT&lt;br /&gt;
* int  sampletime: intervallo tra le minure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* int[6] date: set date and time [2014,2,10,18,45,18]&lt;br /&gt;
* byte mac[6]: ethernet mac address; use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.&lt;br /&gt;
* bool save: save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server&lt;br /&gt;
* array sens:&lt;br /&gt;
** char mqttpath: seconda parte del path di pubblicazione su MQTT&lt;br /&gt;
** any ext configurazione relativa a una implementazione specifica della stazione (ad esempio configurazione di un sensore) OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
==== pinout ====&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;pinout&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== recovery ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== resend ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time [2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time [2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== reboot ====&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot; nel payload.&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta sarà &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7064</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7064"/>
		<updated>2019-06-18T12:44:44Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* configure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== config ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: riporta le configurazioni ai valori di default e rimuove ogni sensore precedentemente configurato; questa operazione è la prima ad essere effettuata dal server&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT&lt;br /&gt;
* int  sampletime: intervallo tra le minure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* int[6] date: set date and time [2014,2,10,18,45,18]&lt;br /&gt;
* byte mac[6]: ethernet mac address; use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.&lt;br /&gt;
* bool save: save configuration into permanent memory; questa operazione è l'ultima ad essere effettuata dal server&lt;br /&gt;
* array sens:&lt;br /&gt;
** char mqttpath: seconda parte del path di pubblicazione su MQTT&lt;br /&gt;
** any ext configurazione relativa a una implementazione specifica della stazione (ad esempio configurazione di un sensore) OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
esempi:&lt;br /&gt;
* reset, configurazione e salvatataggio in una unica RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;sensors&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
* reset, configurazione, addizione sensori e salvataggio in differenti RPC&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;}, &amp;quot;id&amp;quot;: 1}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 2}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;sens&amp;quot;:[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;TMP&amp;quot;}}]}, &amp;quot;id&amp;quot;: 3}&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;config&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;save&amp;quot;:true}, &amp;quot;id&amp;quot;: 4}&lt;br /&gt;
&lt;br /&gt;
==== togglepin ====&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number (pins 4,5,6,7 are supported)&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;togglepin&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== recovery ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== resend ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time [2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time [2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== reboot ====&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot; nel payload.&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta sarà &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7058</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7058"/>
		<updated>2019-06-18T10:45:48Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* configure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== configure ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: riporta le configurazioni ai valori di default&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT&lt;br /&gt;
* int mqttsampletime: intervallo tra le minure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* int[6] date: set date and time [2014,2,10,18,45,18]&lt;br /&gt;
* byte mac[6]: ethernet mac address; use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.&lt;br /&gt;
* bool save: save configuration into EEPROM&lt;br /&gt;
* array sensor:&lt;br /&gt;
** char mqttpath: seconda parte del path di pubblicazione su MQTT&lt;br /&gt;
** any ext configurazione relativa a una implementazione specifica della stazione (ad esempio configurazione di un sensore) OPZIONALE:&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;configure&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, sensor[{&amp;quot;mqttpath&amp;quot;:&amp;quot;105,2000,,/1,0,900&amp;quot;, ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}]}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== togglepin ====&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number (pins 4,5,6,7 are supported)&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;togglepin&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== recovery ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== resend ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time [2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time [2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== reboot ====&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot; nel payload.&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta sarà &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
	<entry>
		<id>https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7057</id>
		<title>Gruppo Meteo/RFC-rmap obsolete</title>
		<link rel="alternate" type="text/html" href="https://www.raspibo.org/wiki/index.php?title=Gruppo_Meteo/RFC-rmap_obsolete&amp;diff=7057"/>
		<updated>2019-06-18T08:56:09Z</updated>

		<summary type="html">&lt;p&gt;PaoloPatruno: /* Remote procedure over MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= RFC rmap versione 2.2 =&lt;br /&gt;
&lt;br /&gt;
== Definizioni ==&lt;br /&gt;
&lt;br /&gt;
==== Campionamento e processo di misurazione ====&lt;br /&gt;
* Campionamento è il processo per ottenere una discretizzata sequenza di misure di una quantità.&lt;br /&gt;
* Misurazione: processo volto a ottenere sperimentalmente uno o più valori che possono essere ragionevolmente attribuiti a una grandezza (UNI CEI 70099:2008);&lt;br /&gt;
* Valore: elemento di un sistema di misura che è direttamente influenzato dal fenomeno, corpo o sostanza che propongono la grandezza da sottoporre a misurazione (UNI CEI 70099:2008). Una osservazione (valore di una grandezza) è il risultato del processo di campionamento. Nel contesto di analisi di serie, un'osservazione è derivata da un numero di campioni.&lt;br /&gt;
* Risultato di misura: insieme di valori attribuiti a un misurando congiuntamente a ogni altra informazione pertinente disponibile (UNI CEI 70099:2008);&lt;br /&gt;
* Taratura (Calibration): operazione eseguita in condizioni specificate, che in una prima fase stabilisce una relazione tra i valori di una grandezza, con le rispettive incertezze di misura, forniti da campioni di misura, e le corrispondenti indicazioni, comprensive delle incertezze di misura associate, e in una seconda fase usa queste informazioni per stabilire una relazione che consente di ottenere un risultato di misura a partire da un'indicazione (UNI CEI 70099:2008). NOTA: Il termine &amp;quot;calibrazione&amp;quot; non dovrebbe essere usato per designare la taratura.&lt;br /&gt;
* Trasduttore di misura: dispositivo, impiegato in una misurazione, che fornisce una grandezza di uscita avente una relazione specificata con la grandezza di ingresso (UNI CEI 70099:2008). ESEMPI Termocoppia, trasformatore di corrente elettrica, estensimetro, elettrodo per la misurazione del pH, tubo di Bourdon, lama bimetallica.&lt;br /&gt;
* Variabili atmosferiche come la velocità del vento, temperatura, pressione e umidità sono funzioni di quattro dimensioni - due orizzontali, una verticale e una temporale. Esse variano irregolarmente in tutte e quattro, e lo scopo dello studio del campionamento è quello di definire le procedure di misura pratiche per ottenere osservazioni rappresentative con incertezze accettabili nelle stime delle medie e variabilità.&lt;br /&gt;
&lt;br /&gt;
==== Data Level ====&lt;br /&gt;
&lt;br /&gt;
* Dati Level I , sono le letture dirette degli strumenti espresse in appropriate unità fisiche e georeferenziate (campionamenti)&lt;br /&gt;
* Dati Level II, dati riconosciuti come variabili meteorologiche (osservazioni/misurazioni); possono essere ottenuti direttamente da strumenti o derivati dai dati Level I&lt;br /&gt;
* Dati Level III sono quelli contenuti in dataset internamente consistenti, generalmente su grigliato.&lt;br /&gt;
&lt;br /&gt;
I dati scambiati a livello internazionale sono livello II o livello III&lt;br /&gt;
&lt;br /&gt;
==== Report ====&lt;br /&gt;
&lt;br /&gt;
Un report è un insieme (sincrono) di osservazioni a livello II completo di metadati o con la possibilità di ricostruire i metadati.&lt;br /&gt;
&lt;br /&gt;
==== Protocolli per R-map ====&lt;br /&gt;
&lt;br /&gt;
* MQTT (Message Queue Telemetry Transport) è un protocollo publish/subscribe particolarmente leggero, adatto per la comunicazione M2M tra dispositivi con poca memoria o potenza di calcolo e server o message broker.&lt;br /&gt;
* AMQP (Advanced Message Queuing Protocol) è protocollo per comunicazioni attraverso code di messaggi. Sono garantite l'interoperabilità, la sicurezza, l'affidabilità, la persistenza. Nella sua implementazione Rabbitmq exporta un broker MQTT e fornisce delle api web&lt;br /&gt;
&lt;br /&gt;
==== Sistema di misura ====&lt;br /&gt;
&lt;br /&gt;
Un [[sistema di misura]] è costituito da 3 componenti:&lt;br /&gt;
* [[sensore]]: trasforma le variazioni di una grandezza misurata in variazioni di una grandezza di tipo elettrico;&lt;br /&gt;
* sistema di controllo deputato a svolgere le seguenti funzioni:&lt;br /&gt;
# acquisizione ad intervalli prestabiliti dei segnali provenienti dal sensore;&lt;br /&gt;
# eventuale memorizzazione locale dei dati;&lt;br /&gt;
# trasmissione dei dati.&lt;br /&gt;
* sistema di alimentazione.&lt;br /&gt;
&lt;br /&gt;
== Visione generale ==&lt;br /&gt;
&lt;br /&gt;
Seguendo un semplice flusso dei dati di una rete rmap compatibile si possono prevedere le seguenti fasi:&lt;br /&gt;
&lt;br /&gt;
* digitalizzazione dei campionamenti o osservazioni&lt;br /&gt;
* pubblicazione dei campionamenti su broker MQTT con root topic sample/&lt;br /&gt;
* pubblicazione delle osservazioni su broker MQTT con root topic report/&lt;br /&gt;
* eventuale trasformazione dei campionamenti (level I) in osservazioni (level II) e eventuale pubblicazione sul broker MQTT&lt;br /&gt;
* composizione di un report&lt;br /&gt;
* invio del report ad un broker tramite AMQP&lt;br /&gt;
* archiviazione dei dati in modo permanente&lt;br /&gt;
* disponibilità dei dati in archivio tramite web services&lt;br /&gt;
&lt;br /&gt;
Questo è uno schema tra i più semplici; rimane la possibilità di articolarlo replicando i servizi, distribuendoli in rete etc.&lt;br /&gt;
&lt;br /&gt;
== Data Model: Dati e Metadati ==&lt;br /&gt;
&lt;br /&gt;
Ogni dato è un valore associato a 6 metadati univoci.&lt;br /&gt;
* Time: date time della osservazione o di termine del periodo di osservazione&lt;br /&gt;
* Longitudine, latitudine e identificativo: coordinate geografiche e identificativo del generatore del dati&lt;br /&gt;
* Network: definisce stazioni con caratteristiche omogenee (classe degli strumenti, rappresentatività e/o stazioni mobili o fisse)&lt;br /&gt;
* Time range: indica osservazione o tempo della previsione ed eventuale elaborazione “statistica” in forma codificata tramite tabella&lt;br /&gt;
* Level: le coordinate verticali (eventualmente strato) in forma codificata tramite tabella&lt;br /&gt;
* Variabile: parametro fisico definito con una descrizione, unità di misura , campo di misura e cifre significative&lt;br /&gt;
&lt;br /&gt;
Ogni dato può essere dotato inoltre di attributi (a esempio prodotti dal controllo di qualità) definiti dalla stessa tabella variabili.&lt;br /&gt;
E' inoltre possibile associare dei dati statici (di anagrafica, ossia invariabili nel tempo, timerange e level) con i soli metadati longitudine, latitudine, identicativo, report&lt;br /&gt;
&lt;br /&gt;
=== Time ===&lt;br /&gt;
L'istante di riferimento del dato in ora GMT: si riferisce all'istante finale della misurazione. Di conseguenza, una precipitazione cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05. &lt;br /&gt;
&lt;br /&gt;
=== Longitudine, latitudine e identificativo ===&lt;br /&gt;
Le coordinate sono espresse con rappresentazione sessadecimale.&lt;br /&gt;
* longitudine: coordinate geografiche  (ETRF89 - WGS84)&lt;br /&gt;
* latitudine: coordinate geografiche   (ETRF89 - WGS84)&lt;br /&gt;
* identificativo  : identificativo fornitore dati/volo aereo/nave (obbligatorio nel caso di stazioni mobili)&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
Definisce stazioni con caratteristiche omogenee: classe degli strumenti, rappresentatività e/o stazioni mobili o fisse.&lt;br /&gt;
Per le stazioni che non appartengono a reti omogenee con un ente gestore il valore di &amp;quot;network&amp;quot; segue la seguente regola:&lt;br /&gt;
* &amp;quot;fixed&amp;quot; per tutte le stazioni fisse, le cui coordinate non variano nel tempo&lt;br /&gt;
* &amp;quot;mobile&amp;quot; per tutte le stazioni/punti di misura le cui coordinate cambiano nel tempo&lt;br /&gt;
&lt;br /&gt;
=== Time range ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Definition of the main concepts related to the description of time range and statistical processing for observed and forecast data:&lt;br /&gt;
&lt;br /&gt;
Validity time is defined as the time at which the data are measured or at which forecast is valid; for statistically processed data, the validity time is the end of the time interval.&lt;br /&gt;
&lt;br /&gt;
Reference time is defined as the nominal time of an observation for observed values, or as the time at which a model forecast starts for forecast values.&lt;br /&gt;
&lt;br /&gt;
The date and time in rmap are always the validity date and time of a value, regardless of the value being an observation or a forecast.&lt;br /&gt;
&lt;br /&gt;
The Timerange field is composed by:&lt;br /&gt;
* pindicator : integer from table timerange ( unsigned integer)&lt;br /&gt;
* P1 is defined as the difference in seconds between validity time and reference time. For forecasts it is the positive forecast time. For observed values, the reference time is usually the same as the validity time, therefore P1 is zero. However P1 &amp;lt; 0 is a valid case for reports containing data in the past with respect to the nominal report time. (unsigned integer)&lt;br /&gt;
* P2 is defined as the duration of the period over which statistical processing is performed, and is always nonnegative. Note that, for instantaneous values, P2 is always zero. (usigned integer)&lt;br /&gt;
&lt;br /&gt;
The following table lists the possible values for pindicator and the interpretation of the corresponding values of P1 and P2 specifying a time range:&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Pindicator || Description &lt;br /&gt;
|-&lt;br /&gt;
| 0       ||  Average &lt;br /&gt;
|-&lt;br /&gt;
| 1       ||  Accumulation &lt;br /&gt;
|-&lt;br /&gt;
| 2       ||  Maximum &lt;br /&gt;
|-&lt;br /&gt;
| 3       ||  Minimum &lt;br /&gt;
|-&lt;br /&gt;
| 4       ||  Difference (value at the end of the time range minus value at the beginning) &lt;br /&gt;
|-&lt;br /&gt;
| 5       ||  Root Mean Square &lt;br /&gt;
|-&lt;br /&gt;
| 6       ||  Standard Deviation &lt;br /&gt;
|-&lt;br /&gt;
| 7       ||  Covariance (temporal variance) &lt;br /&gt;
|-&lt;br /&gt;
| 8       ||  Difference (value at the beginning of the time range minus value at the end) &lt;br /&gt;
|-&lt;br /&gt;
| 9       ||  Ratio &lt;br /&gt;
|-&lt;br /&gt;
| 51      ||   Climatological Mean Value &lt;br /&gt;
|-&lt;br /&gt;
| 10-191  ||   Reserved &lt;br /&gt;
|-&lt;br /&gt;
| 192-254 ||  Reserved for Local Use &lt;br /&gt;
|-&lt;br /&gt;
| 200     ||  Vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 201     ||  Mode &lt;br /&gt;
|-&lt;br /&gt;
| 202     ||  Standard deviation vectorial mean &lt;br /&gt;
|-&lt;br /&gt;
| 203     ||  Vectorial maximum &lt;br /&gt;
|-&lt;br /&gt;
| 204     ||  Vectorial minimum &lt;br /&gt;
|-&lt;br /&gt;
| 205     ||  Product with a valid time ranging inside the given period &lt;br /&gt;
|-&lt;br /&gt;
| 254     ||  Istantaneous value &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Level ===&lt;br /&gt;
Level/layer&lt;br /&gt;
&lt;br /&gt;
This table lists the possible values for leveltype1 or leveltype2 and the interpretation of the corresponding numerical value l1 or l2. Leveltype values in the range 0-255 can be used for defining either a single level (leveltype1) or a surface delimiting a layer (leveltype1 and leveltype2) with any meaningful combination of leveltypes; values of leveltype &amp;gt;255 have a special use for encoding cloud values in SYNOP reports and they do not strictly define physical surfaces.&lt;br /&gt;
&lt;br /&gt;
The idea is borrowed from the GRIB edition 2 fixed surface concept and the values for leveltype coincide with the GRIB standard where possible.&lt;br /&gt;
&lt;br /&gt;
The level field is composed by:&lt;br /&gt;
* leveltype : from level table (unsigned integer value)&lt;br /&gt;
* l1 : first level defined by leveltype   (unsigned integer value)&lt;br /&gt;
* l2 : second level defined by leveltype ; needed with layer only, missing otherwise (unsigned integer value)&lt;br /&gt;
&lt;br /&gt;
Should be everytime l1 &amp;lt; l2&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| leveltype 	 || 	Meaning 	 	 ||	unit/contents of l1/l2  	 	 		 &lt;br /&gt;
|- 		 	 		 	 		 	 		 &lt;br /&gt;
|0 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|1 	 	 || 	Ground or Water Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|2 	 	 || 	Cloud Base Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|3 	  	 ||	Level of Cloud Tops &lt;br /&gt;
|-	 	 		 	 		 &lt;br /&gt;
|4 	  	 ||	Level of 0C Isotherm 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|5  	 	 ||	Level of Adiabatic Condensation Lifted from the Surface 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|6 	  	 ||	Maximum Wind Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|7 	 	 ||	Tropopause 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|8 	 	 ||	Nominal Top of the Atmosphere 	 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|9 	 	 ||	Sea Bottom 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|10-19 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|20 	 	 ||	Isothermal Level 	 	 	  || K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|21-99 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|100 	 	 ||	Isobaric Surface 	 	 	  || Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|101 	 	 ||	Mean Sea Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|102 	 	 ||	Specific Altitude Above Mean Sea Level 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|103 	 	 ||	Specified Height Level Above Ground 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|104 	 	 ||	Sigma Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|105 	 	 ||	Hybrid Level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|106 	 	 ||	Depth Below Land Surface 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|107 	 	 ||	Isentropic (theta) Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|108 	 	 ||	Level at Specified Pressure Difference from Ground to Level 	 	|| 	Pa 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|109 	 	 ||	Potential Vorticity Surface 	 	 ||	10-9 K m2 kg-1 s-1 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|110 	 	 ||	Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|111 	 	 ||	Eta (NAM) Level (see note below) 	 ||	 	1/10000 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|112 	 	 ||	116 Reserved 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|117 	 	 ||	Mixed Layer Depth 	 	|| 	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|118-159          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|160 	 	 ||	Depth Below Sea Level 	 	 ||	mm 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|161-191          ||     Reserved 	 	 		 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|200 	 	 ||	Entire atmosphere (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|201 	 	 ||	Entire ocean (considered as a single layer) 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|204 	 	 ||	Highest tropospheric freezing level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|206 	 	 ||	Grid scale cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|207 	 	 ||	Grid scale cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|209 	 	 ||	Boundary layer cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|210 	 	 ||	Boundary layer cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|211 	 	 ||	Boundary layer cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|212 	 	 ||	Low cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|213 	 	 ||	Low cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|214 	 	 ||	Low cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|215 	 	 ||	Cloud ceiling 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|220 	 	 ||	Planetary Boundary Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|222 	 	 ||	Middle cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|223 	 	 ||	Middle cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|224 	 	 ||	Middle cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|232 	 	 ||	High cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|233 	 	 ||	High cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|234 	 	 ||	High cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|235 	 	 ||	Ocean Isotherm Level 	 	 ||	K/10 	 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|240 	 	 ||	Ocean Mixed Layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|241 	 	 ||	Ordered Sequence of Data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|242 	 	 ||	Convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|243 	 	 ||	Convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|244 	 	 ||	Convective cloud layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|245 	 	 ||	Lowest level of the wet bulb zero 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|246 	 	 ||	Maximum equivalent potential temperature level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|247 	 	 ||	Equilibrium level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|248 	 	 ||	Shallow convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|249 	 	 ||	Shallow convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|251 	 	 ||	Deep convective cloud bottom level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|252 	 	 ||	Deep convective cloud top level 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|253 	 	 ||	Lowest bottom level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|254 	 	 ||	Highest top level of supercooled liquid water layer 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|256 	 	 ||	Clouds 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|257 	 	 ||	Information about the station that generated the data 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|258 	 	 ||	(use when ltype1=256) Cloud Data group, L1 = 1 low clouds, 2 middle clouds, 3 high clouds, 0 others 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|259 	 	 ||	(use when ltype1=256) Individual cloud groups, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|260 	 	 ||	(use when ltype1=256) Cloud drift, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|261 	 	 ||	(use when ltype1=256) Cloud elevation, L1 = group number; (use when ltype1=264) L2 = swell wave group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|262 	 	 ||	(use when ltype1=256) Direction and elevation of clouds, L1 is ignored 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|263 	 	 ||	(use when ltype1=256) Cloud groups with bases below station level, L1 = group number 	 	 		 	 		 &lt;br /&gt;
|-&lt;br /&gt;
|264 	 	 ||	Waves&lt;br /&gt;
|-&lt;br /&gt;
|265 	 	 ||	Non-physical data level              || engineering ordinal level &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variabile ===&lt;br /&gt;
&lt;br /&gt;
La tabella B (vedi codifica BUFR del WMO) descrive i dati e la loro eventuale codifica.&lt;br /&gt;
&lt;br /&gt;
I dati possono essere inviati come numeri a virgola mobile, interi con segno o stringhe di caratteri.&lt;br /&gt;
Nell'utilizzo del formato JSON i numeri a virgola mobile vendono distinti da quelli interi per la presenza del carattere &amp;quot;.&amp;quot;.&lt;br /&gt;
Il formato consigliato è quello intero con segno per evitare problemi di troncamento nella rappresentazione dei valori.&lt;br /&gt;
E' anche possibile rappresentare i dati convertendo gli interi con segno in una rappresentazione decimale in una stringa&lt;br /&gt;
(es. &amp;quot;27315&amp;quot; per una temperatura di 273.15K)&lt;br /&gt;
Il valore intero con segno si ottiene moltiplicando la variabile rappresentata con la unità di misura descritta da &amp;quot;units&amp;quot; per il fattore di scala &amp;quot;scale&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Le restanti colonne della tabella B vengono utilizzate nella de/codifica in formato Bufr e Crex.&lt;br /&gt;
Fare riferimento a http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
==== Description ====&lt;br /&gt;
The description in table B is a simple description of the data.&lt;br /&gt;
&lt;br /&gt;
==== Units ====&lt;br /&gt;
The units of Table B entries refer to the format of how the data is&lt;br /&gt;
represented. The data may be numeric or character.  When data is in&lt;br /&gt;
character form, the character representation is always according to&lt;br /&gt;
the CCITT International Alphabet No. 5.  The units may also refer to a&lt;br /&gt;
code or flag table, where the code or flag table is described in the&lt;br /&gt;
WMO Manual On Codes or if not provided by WMO defined as local table.&lt;br /&gt;
Other units are in Standard International (SI) units, such as meters&lt;br /&gt;
or degrees Kelvin.&lt;br /&gt;
&lt;br /&gt;
==== Scale ====&lt;br /&gt;
The scale refers to the power of 10 that the&lt;br /&gt;
element has been multiplied by in order to retain the desired&lt;br /&gt;
precision in the transmitted data when the integer format is used.&lt;br /&gt;
For example, the units of&lt;br /&gt;
temperature are whole Kelvin degrees in Table B.  But this is not&lt;br /&gt;
precise enough for most usages, therefore the elements are to be&lt;br /&gt;
multipli ed by 100 (10^2) so that the transmitted precision will be&lt;br /&gt;
centidegrees, a more useful precision. On the other hand, the (SI)&lt;br /&gt;
unit of pressure in Table B is Pascal, a rather small unit that would&lt;br /&gt;
result in unnecessarily precise numbers being transmitted. The BUFR Ta&lt;br /&gt;
ble B calls for pressure to be divided by 10 (10^-1) resulting in a&lt;br /&gt;
transmitted unit of 10ths of hPa, or tenths of millibars, a more&lt;br /&gt;
reasonable precision for meteorological usage.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Other values in the table B used in Bufr de/coding ====&lt;br /&gt;
&lt;br /&gt;
The reference value is a value that is to be subtracted from the data&lt;br /&gt;
after multiplication by the scale factor, if any, before encoding into&lt;br /&gt;
Section 4 in order to produce, in all cases, a positive value.  In the&lt;br /&gt;
case of lati tude and longitude, south latitude and west longitude are&lt;br /&gt;
negative before applying the refe rence value. If, for example, a&lt;br /&gt;
position of 35.50 degrees south latitude were being encoded,&lt;br /&gt;
multiplying -35.50 by 100 (scale of 2) would produce -3550.&lt;br /&gt;
Subtracting the refere nce value -9000 would give 5450 that would be&lt;br /&gt;
encoded.&lt;br /&gt;
&lt;br /&gt;
To obtain the original value in decoding, adding back the -9000&lt;br /&gt;
reference value to 5450 would result in -3550, then dividing by the&lt;br /&gt;
scale (100) would obtain -35.50.&lt;br /&gt;
&lt;br /&gt;
The data width of Table B entries is a count of how many bits the&lt;br /&gt;
largest possible value of an individual data item occupies.&lt;br /&gt;
&lt;br /&gt;
==== Tabella variabile (B table) ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
B table example; SAMPLE VALUES ONLY ! (the full table is big !)&lt;br /&gt;
&lt;br /&gt;
Get the full table from: https://github.com/ARPA-SIMC/dballe/blob/master/tables/dballe.txt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|	Code 	         || 	Description 	 	         || 	Units 	 	 || 	Scale 	 &lt;br /&gt;
|-		 	 		 	 		 	 		 &lt;br /&gt;
| 	001001 	 	 ||	WMO BLOCK NUMBER 	 	 ||	Numeric 	 ||	0	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001002 	 	 ||	WMO STATION NUMBER 	 	 ||	Numeric 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001006 	 	 ||	AIRCRAFT FLIGHT NUMBER 	 	 ||	Character 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001007 	 	 ||	SATELLITE IDENTIFIER 	 	 ||	CODE TABLE 1007  || 	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001008 	 	 ||	AIRCRAFT REGISTRATION NUMBER OR OTHER IDENTIFICATION 	 || 	Character 	         ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001011 	 	 ||	SHIP OR MOBILE LAND STATION IDENTIFIER 	 	         || 	Character 	 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001012 	 	 ||	DIRECTION OF MOTION OF MOVING OBSERVING PLATFORM** 	 ||	 	DEGREE TRUE 	 ||	0 	 &lt;br /&gt;
|-&lt;br /&gt;
| 	001013 	 	 ||	SPEED OF MOTION OF MOVING OBSERVING PLATFORM* 	 	 ||	M/S 	 	         || 	0 	&lt;br /&gt;
|-&lt;br /&gt;
|       012101           ||     TEMPERATURE/DRY-BULB TEMPERATURE                         ||        K                     ||     2  &lt;br /&gt;
|-&lt;br /&gt;
|       012102           ||     WET-BULB TEMPERATURE                                     ||        K                     ||     2&lt;br /&gt;
|-&lt;br /&gt;
|       012103           ||     DEW-POINT TEMPERATURE                                    ||        K                     ||     2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Formati ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete comprende due passaggi:&lt;br /&gt;
&lt;br /&gt;
* composizione di un report composto da una selezione di osservazioni (sincrone) di tipo II&lt;br /&gt;
* invio a un concentratore tramite protocollo AMQP&lt;br /&gt;
&lt;br /&gt;
=== BUFR ===&lt;br /&gt;
Il formato BUFR è definito dal WMO:&lt;br /&gt;
http://www.wmo.int/pages/prog/www/WMOCodes.html&lt;br /&gt;
&lt;br /&gt;
Sono utilizzabili solo alcuni template definiti dal WMO o da ECMWF:&lt;br /&gt;
* acars-ecmwf - ACARS ECMWF (4.145)&lt;br /&gt;
* acars-wmo - ACARS WMO&lt;br /&gt;
* airep-ecmwf - AIREP ECMWF (4.142)&lt;br /&gt;
* amdar-ecmwf - AMDAR ECMWF (4.144)&lt;br /&gt;
* amdar-wmo - AMDAR WMO&lt;br /&gt;
* buoy - Buoy (1.21)&lt;br /&gt;
* metar - Metar (0.140)&lt;br /&gt;
* pilot-ecmwf - Pilot (2.91)&lt;br /&gt;
* pilot-wmo - Pilot (2.1, 2.2, 2.3)&lt;br /&gt;
* pollution - Pollution (8.171)&lt;br /&gt;
* ship - Synop ship (autodetect)&lt;br /&gt;
* ship-abbr - Synop ship (abbreviated) (1.9)&lt;br /&gt;
* ship-auto - Synop ship (auto) (1.13)&lt;br /&gt;
* ship-plain - Synop ship (normal) (1.11)&lt;br /&gt;
* ship-reduced - Synop ship (reduced) (1.19)&lt;br /&gt;
* ship-second - Synop ship (second record) (1.12)&lt;br /&gt;
* ship-wmo - Ship WMO&lt;br /&gt;
* synop-ecmwf - Synop ECMWF (autodetect) (0.1)&lt;br /&gt;
* synop-ecmwf-auto - Synop ECMWF land auto (0.3)&lt;br /&gt;
* synop-ecmwf-land - Synop ECMWF land (0.1)&lt;br /&gt;
* synop-ecmwf-land-high - Synop ECMWF land high level station (0.1)&lt;br /&gt;
* synop-wmo - Synop WMO (0.1)&lt;br /&gt;
* temp-ecmwf - Temp ECMWF (autodetect)&lt;br /&gt;
* temp-ecmwf-land - Temp ECMWF land (2.101)&lt;br /&gt;
* temp-ecmwf-ship - Temp ECMWF ship (2.102)&lt;br /&gt;
* temp-radar - Temp radar doppler wind profile (6.1)&lt;br /&gt;
* temp-ship - Temp ship (autodetect)&lt;br /&gt;
* temp-wmo - Temp WMO (2.101)&lt;br /&gt;
&lt;br /&gt;
E' possibile e consigliato usare un template denominato &amp;quot;generic&amp;quot; specifico per il Data Model descritto sopra con il quale è possibile la codifica di tutti i dati pubblicabili secondo lo standard RMAP.&lt;br /&gt;
&lt;br /&gt;
==== generic template ====&lt;br /&gt;
&lt;br /&gt;
Il template generic non è qui documentato in quanto al momento non esistono specifiche stabili.&lt;br /&gt;
Per la scrittura e lettura di un messaggio BUFR con template &amp;quot;generic&amp;quot; si consiglia vivamente l'utilizzo della libreria software DB-all.e https://github.com/ARPA-SIMC/dballe anche tramite tools disponibili.&lt;br /&gt;
&lt;br /&gt;
=== Json ===&lt;br /&gt;
&lt;br /&gt;
Ogni oggetto json è un report con tutti i dati di una certa stazione per un certo istante di riferimento.&lt;br /&gt;
&lt;br /&gt;
La stazione è identificata univocamente dai seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* `ident`: identificativo opzionale della stazione (necessario solo se la stazione è mobile, generalmente nullo per stazioni fisse).&lt;br /&gt;
* `lon`: longitudine&lt;br /&gt;
* `lat`: latitudine&lt;br /&gt;
* `network`: nome della rete a cui appartiene la stazione (minuscolo).&lt;br /&gt;
&lt;br /&gt;
Le latitudini e longitudini devono essere scritte come coordinate&lt;br /&gt;
geodetiche espresse in sessadecimale, come numero intero dopo aver&lt;br /&gt;
moltiplicato per 10^5 (quindi espresso in 10^-5 gradi sessadecimali).&lt;br /&gt;
&lt;br /&gt;
L'istante di riferimento è il campo `datetime` (ISO 8601) che si riferisce&lt;br /&gt;
all'istante finale della misurazione. Di conseguenza, una precipitazione&lt;br /&gt;
cumulata su 30 minuti con istante di riferimento &amp;quot;2015-08-05T12:00:00Z&amp;quot; è la&lt;br /&gt;
precipitazione cumulata tra le 11:30:00Z e le 12:00:00Z del giorno 2015-08-05.&lt;br /&gt;
&lt;br /&gt;
I dati sono nel campo `data` sotto forma di array. Ogni elemento dell'array è&lt;br /&gt;
un oggetto con i seguenti campi:&lt;br /&gt;
&lt;br /&gt;
* livello: coordinate verticali. Si veda il capitolo dedicato.&lt;br /&gt;
* timerange: definisce il periodo di tempo e l'eventuale processamento (e.g. dato istantaneo, media oraria, etc). Si veda il capitolo dedicato.&lt;br /&gt;
* vars: oggetto i cui campi sono i codici della tabella B locale, i.e. i parametri misurati (vedi tabella relativa). Ognuno di questi è associato ad un oggetto con i campi `v` (il valore) e `a` (oggetto degli attributi del dato, in cui i campi sono altri codici della tabella B a cui è associato un valore).&lt;br /&gt;
&lt;br /&gt;
Tra questi, un solo elemento non ha i campi `level` e `timerange`. Tali dati&lt;br /&gt;
sono relativi a dati invarianti della stazione in se (e.g. il nome, l'altezza, etc.)&lt;br /&gt;
&lt;br /&gt;
==== Esempio ====&lt;br /&gt;
&lt;br /&gt;
Stazione fissa (`ident: null`) delle rete (`network`) `rer` posizionata nel&lt;br /&gt;
punto `(9.15454, 4451485)` (`lon`, `lat`) con i seguenti dati (`data`) statici&lt;br /&gt;
(l'elemento dell'array che non ha `level` e `timerange`):&lt;br /&gt;
&lt;br /&gt;
* Nome della stazione (`B01019`): &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
* Altezza della stazione (`B07030`): 769.0m&lt;br /&gt;
* Altezza barometrica della stazione (`B07031`): 769.0m&lt;br /&gt;
&lt;br /&gt;
E per l'istante di riferimento &amp;quot;2015-07-30T15:30:00Z&amp;quot; ha registrato i seguenti&lt;br /&gt;
dati:&lt;br /&gt;
&lt;br /&gt;
* Al suolo (`level: [1, null, null, null]`) le seguenti cumulate orarie (`timerange: [1, 0, 3600]`):&lt;br /&gt;
** Precipitazione (`B13011`): 0.0&lt;br /&gt;
* A 2m dal suolo (`level: [103, 2000, null, null]`) i seguenti valori istantanei:&lt;br /&gt;
** Temperatura (`B12101`): 297.15K. Il dato è stato invalidato manualmente (attributo `B33196: 1`).&lt;br /&gt;
** Umidità relativa (`B13003`): 50%&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;rer&amp;quot;,&lt;br /&gt;
        &amp;quot;lon&amp;quot;: 915454,&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2015-07-30T15:30:00Z&amp;quot;,&lt;br /&gt;
        &amp;quot;lat&amp;quot;: 4451485,&lt;br /&gt;
        &amp;quot;data&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B01019&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: &amp;quot;Torriglia&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07030&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B07031&amp;quot;: {&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 769.0&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    0,&lt;br /&gt;
                    3600&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B13011&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 0.0&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    1,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;timerange&amp;quot;: [&lt;br /&gt;
                    254,&lt;br /&gt;
                    0,&lt;br /&gt;
                    0&lt;br /&gt;
                ],&lt;br /&gt;
                &amp;quot;vars&amp;quot;: {&lt;br /&gt;
                    &amp;quot;B12101&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                            &amp;quot;B33196&amp;quot;: 1&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 297.15&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;B13003&amp;quot;: {&lt;br /&gt;
                        &amp;quot;a&amp;quot;: {&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;v&amp;quot;: 50&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;level&amp;quot;: [&lt;br /&gt;
                    103,&lt;br /&gt;
                    2000,&lt;br /&gt;
                    null,&lt;br /&gt;
                    null&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== JSON Lines text format ====&lt;br /&gt;
&lt;br /&gt;
In alternativa al formato json è possibile utilizzare questa variante che in molti casi risulta vantaggiosa.&lt;br /&gt;
&lt;br /&gt;
La documentazione del formato JSON Lines text format, chiamato anche newline-delimited JSON è reperibile qui:&lt;br /&gt;
http://jsonlines.org/&lt;br /&gt;
&lt;br /&gt;
== Protocolli ==&lt;br /&gt;
&lt;br /&gt;
L'accentramento dei dati della rete può essere effettuato a differenti livelli determinati dall'hardware disponibile, dal tipo di connettività e dai dati da inviare:&lt;br /&gt;
&lt;br /&gt;
* invio dei dati (campionamenti o osservazioni) a un broker tramite protocollo MQTT&lt;br /&gt;
* invio di un report composto da un insieme di osservazioni (sincrone) di tipo II a un broker tramite protocollo AMQP &lt;br /&gt;
&lt;br /&gt;
=== Dati e Metadati su MQTT ===&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo utilizzabili ====&lt;br /&gt;
MQTT protocol versions 3.1 and 3.1.1&lt;br /&gt;
&lt;br /&gt;
Non utilizzare SSL/TLS&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
MQTT provides username/password authentication as part of the protocol.&lt;br /&gt;
To pubblish mqtt messages on a rmap server follow standard registration procedure on rmap server and get username and password.&lt;br /&gt;
&lt;br /&gt;
==== Quality of Service ====&lt;br /&gt;
&lt;br /&gt;
E possibile utilizzare Quality of Service 0 o 1.&lt;br /&gt;
Ovviamente quando possibile è consigliato utilizzare QoS 1.&lt;br /&gt;
&lt;br /&gt;
==== Client ID ====&lt;br /&gt;
MQTT 3.1.1 allows clients to connect with a zero length client id and have the broker generate a client id for them.&lt;br /&gt;
Use this method as alternative method to the only allowed method that is to use an ID starting with the username used in authentication.&lt;br /&gt;
&lt;br /&gt;
==== Root topic ====&lt;br /&gt;
&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''sample/''' appartengono solo al level type I&lt;br /&gt;
* I dati pubblicati nel root path MQTT '''report/''' appartengono solo al level type II&lt;br /&gt;
&lt;br /&gt;
==== Stato della connessione ====&lt;br /&gt;
&lt;br /&gt;
Alla connessione deve essere inviato dalla stazione una eventuale segnalazione di sconnessione gestita male con will (retained):&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/''' &lt;br /&gt;
&lt;br /&gt;
payload : '''{&amp;quot;v&amp;quot;: &amp;quot;error01&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
poi questo messaggio viene &amp;quot;ricoperto&amp;quot; con:&lt;br /&gt;
&lt;br /&gt;
 '''maint/IDENT/COORDS/NETWORK/254,0,0/265,0,-,-/B01213&amp;quot;/'''&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;conn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
alla disconnessione allo stesso topic dovrà essere inviato:&lt;br /&gt;
&lt;br /&gt;
payload : '''{ &amp;quot;v&amp;quot;: &amp;quot;disconn&amp;quot;}'''&lt;br /&gt;
&lt;br /&gt;
==== Data e Constant Data ====&lt;br /&gt;
&lt;br /&gt;
===== Data =====&lt;br /&gt;
Ogni topic corrisponde ai metadati univoci, mentre il payload è composto dal valore, eventuali attributi e dall'instante temporale.&lt;br /&gt;
Json è il formato per il payload.&lt;br /&gt;
&lt;br /&gt;
Forma simbilica del topic:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/TRANGE/LEVEL/VAR'''&lt;br /&gt;
&lt;br /&gt;
* '''IDENT''': identificativo dell'utente che pubblica i dati o identificativo della stazione per stazioni mobili, “-” per stazioni fisse non associate a un singolo utente&lt;br /&gt;
* '''COORDS''': nella forma lon,lat. Le coordinate sono espresse con rappresentazione sessadecimale nella forma int(valore*10^5) con eventuale segno negativo&lt;br /&gt;
* '''NETWORK''': etichetta massimo 16 caratteri&lt;br /&gt;
* '''TRANGE''': nella forma indicator,p1,p2; Indicator e p2 interi senza segno, p1 intero con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''LEVEL''': nella forma type1,l1,type2,l2; Type1, type2 interi con eventuale segno negativo, l1e l2 interi con eventuale segno negativo. “-” per valori non significativi&lt;br /&gt;
* '''VAR''': nella forma BXXYYY come da tabelle B codice BUFR WMO&lt;br /&gt;
&lt;br /&gt;
Il payload è in formato JSON: '''{ “v”: VALUE, “t”: TIME, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
* '''VALUE''': valore in formato intero o a virgola mobile o stringa (vedi specifiche precedenti)&lt;br /&gt;
* '''TIME''': formato YYYY-mm-ddTHH:MM:SS.MSC (secondi e millisecondi opzionali) un sottoinsime delle specifiche in https://tools.ietf.org/html/rfc3339&lt;br /&gt;
Gli attributi (“a”) solitamente per controllo di qualità sono opzionali; la chiave fa riferimento alla tabella B e VALUE ha la stessa rappresentazione di VALUE descritto sopra.&lt;br /&gt;
&lt;br /&gt;
===== Constant Data =====&lt;br /&gt;
&lt;br /&gt;
I metadati per i dati costanti (anagrafica) sono caratterizzati da questo path:&lt;br /&gt;
&lt;br /&gt;
 '''&amp;lt;rootpath&amp;gt;/IDENT/COORDS/NETWORK/-,-,-/-,-,-,-/''' &lt;br /&gt;
&lt;br /&gt;
con payload simile a quello dei dati, in particolare dovrà essere omessa la chiave “t”: '''{ “v”: VALUE, “a”: { “BXXYYY”: VALUE, … } }'''&lt;br /&gt;
&lt;br /&gt;
==== Estensioni ====&lt;br /&gt;
&lt;br /&gt;
Queste estensioni sono state create per ottimizzare in alcuni casi l'invio dei dati.&lt;br /&gt;
Possono essere utilizzate solo quando il loro utilizzo comporti un risparmio sul numero di byte necessari per la trasmissione.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Prima forma contratta tabella D =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi relativi allo stato della connessione.&lt;br /&gt;
&lt;br /&gt;
Il topic e come quello della forma standard senza l'ultimo parametro &amp;quot;VAR&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed/254,0,0/103,2000,-,-&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;d&amp;quot; che descrive quale elemento della tabella D è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot; descritti nell'elemento in tabella D&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;d&amp;quot;:50,&amp;quot;p&amp;quot;:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Tabella D ======&lt;br /&gt;
&lt;br /&gt;
 dtable={&amp;quot;50&amp;quot;:[&amp;quot;B49198&amp;quot;,&amp;quot;B49199&amp;quot;,&amp;quot;B49200&amp;quot;,&amp;quot;B49201&amp;quot;,&amp;quot;B49202&amp;quot;,&amp;quot;B49203&amp;quot;,&amp;quot;B49204&amp;quot;,&lt;br /&gt;
               &amp;quot;B49205&amp;quot;,&amp;quot;B49206&amp;quot;,&amp;quot;B49207&amp;quot;,&amp;quot;B49208&amp;quot;,&amp;quot;B49209&amp;quot;,&amp;quot;B49210&amp;quot;,&amp;quot;B49211&amp;quot;,&lt;br /&gt;
               &amp;quot;B49212&amp;quot;,&amp;quot;B49213&amp;quot;,&amp;quot;B49214&amp;quot;,&amp;quot;B49215&amp;quot;,&amp;quot;B49216&amp;quot;,&amp;quot;B49217&amp;quot;,&amp;quot;B49218&amp;quot;,&lt;br /&gt;
               &amp;quot;B49219&amp;quot;,&amp;quot;B49220&amp;quot;,&amp;quot;B49221&amp;quot;]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Seconda forma contratta tabella E =====&lt;br /&gt;
&lt;br /&gt;
In questa forma contratta non è previsto l'invio di attributi del dato.&lt;br /&gt;
In questa forma contratta non è necessario inviare messaggi  relativi allo stato della connessione.&lt;br /&gt;
Il topic e come quello della forma standard senza i parametri &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot;.&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 test/myuser/1131908,4449301/fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Il payload prevede due parametri:&lt;br /&gt;
* &amp;quot;e&amp;quot; che descrive quale elemento della tabella E è preso in considerazione&lt;br /&gt;
* &amp;quot;p&amp;quot; con un array di valori corrispondenti ai &amp;quot;VAR&amp;quot;, &amp;quot;LEVEL&amp;quot; e &amp;quot;TRANGE&amp;quot; descritti nell'elemento in tabella E&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;p&amp;quot;:[27315,73],&amp;quot;e&amp;quot;:1}&lt;br /&gt;
&lt;br /&gt;
====== Tabella E ======&lt;br /&gt;
&lt;br /&gt;
 # template 1: temperature and humidity&lt;br /&gt;
 etable={&amp;quot;1&amp;quot;:{&amp;quot;B12101&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}},&lt;br /&gt;
 &lt;br /&gt;
 # template 2: temperature, humidity and PM2.5&lt;br /&gt;
         &amp;quot;2&amp;quot;:{&amp;quot;B12101&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B13003&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;},&lt;br /&gt;
              &amp;quot;B15198&amp;quot;]={&amp;quot;timerange&amp;quot;:&amp;quot;254,0,0&amp;quot;,&amp;quot;level&amp;quot;:&amp;quot;103,2000,-,-&amp;quot;}}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
==== Remote procedure over MQTT ====&lt;br /&gt;
&lt;br /&gt;
Le RPC sono in formato json (json-rpc) e utilizzano due topics MQTT:&lt;br /&gt;
&lt;br /&gt;
        topiccom=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/com&amp;quot;&lt;br /&gt;
        topicres=&amp;quot;rpc/&amp;quot;+user+&amp;quot;/&amp;quot;+mac+&amp;quot;/res&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* topiccom è il topic utilizzato per l'invio delle richieste RPC al server mentre topicres è il topic utilizzato dal server per le risposte.&lt;br /&gt;
* user è l'utente e dovrà essere lo stesso utilizzato per l'autenticazione al broker MQTT.&lt;br /&gt;
* mac è l'identificativo univoco del device (numerico 12 cifre, ossia 6 numeri di 2 cifre)&lt;br /&gt;
&lt;br /&gt;
Il payload seguirà le specifiche [https://www.jsonrpc.org/specification JSON-RPC 2.0 Specification]&lt;br /&gt;
&lt;br /&gt;
Ogni payload comando/risposta Jsonrpc non deve superare i 144 caratteri.&lt;br /&gt;
&lt;br /&gt;
Non sono ammessi accessi concorrenziali e ogni utente è tenuto a gestire di conseguenza gli accessi.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Remote procedure supportate =====&lt;br /&gt;
&lt;br /&gt;
====== configure ======&lt;br /&gt;
Configura la stazione.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* bool reset: riporta le configurazioni ai valori di default&lt;br /&gt;
* char mqttrootpath: prima parte del path di pubblicazione su MQTT&lt;br /&gt;
* int mqttsampletime: intervallo tra le minure in secondi&lt;br /&gt;
* char mqttserver:  server MQTT&lt;br /&gt;
* char mqttuser: MQTT user&lt;br /&gt;
* char mqttpassword: MQTT password&lt;br /&gt;
* char ntpserver:  NTP server&lt;br /&gt;
* int[6] date: set date and time [2014,2,10,18,45,18]&lt;br /&gt;
* byte mac[6]= ethernet mac address; use (0,0,0,0,0,1) for board1, use (0,0,0,0,0,2) for board2 etc.&lt;br /&gt;
* bool save: save configuration into EEPROM&lt;br /&gt;
&lt;br /&gt;
configurazione relativa a una implementazione specifica della stazione (ad esempio configurazione di un sensore) OPZIONALE:&lt;br /&gt;
* any ext&lt;br /&gt;
&lt;br /&gt;
ad esempio nella implementazione Stima ext contiene:&lt;br /&gt;
* char mqttpath: seconda parte del path di pubblicazione su MQTT&lt;br /&gt;
* char driver: driver locale del sensore&lt;br /&gt;
* char type: driver remoto&lt;br /&gt;
* int address: address I2C&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;configure&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;reset&amp;quot;:true,&amp;quot;save&amp;quot;:true,&amp;quot;mqttserver&amp;quot;:&amp;quot;rmap.cc&amp;quot;, &amp;quot;ext&amp;quot;:{&amp;quot;driver&amp;quot;:&amp;quot;HIH&amp;quot;}}, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== togglepin ====&lt;br /&gt;
Attuatore che accende/spegne uno o più pin.&lt;br /&gt;
&lt;br /&gt;
parametri:&lt;br /&gt;
* array di oggetti con la seguente struttura:&lt;br /&gt;
** integer n: pin number (pins 4,5,6,7 are supported)&lt;br /&gt;
** bool s: true=on; false=off&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;togglepin&amp;quot;, &amp;quot;params&amp;quot;: [{&amp;quot;n&amp;quot;:4,&amp;quot;s&amp;quot;:true},{&amp;quot;n&amp;quot;:5,&amp;quot;s&amp;quot;:false}], &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== recovery ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server; senza parametri&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;sdrecovery&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== resend ====&lt;br /&gt;
Richiede il re-invio dei dati non trasmessi al server da una data iniziale a una data finale&lt;br /&gt;
&lt;br /&gt;
* int[6] dts: start date and time [2014,2,10,18,45,18]&lt;br /&gt;
* int[6] dte: end   date and time [2015,3,25,12,0,0]&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;resend&amp;quot;, &amp;quot;params&amp;quot;: {&amp;quot;dts&amp;quot;:[2014,2,10,18,45,18],&amp;quot;dte&amp;quot;:[2015,3,25,12,0,0] }, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
==== reboot ====&lt;br /&gt;
Richiede il riavvio della stazione&lt;br /&gt;
&lt;br /&gt;
 {&amp;quot;jsonrpc&amp;quot;: &amp;quot;2.0&amp;quot;, &amp;quot;method&amp;quot;: &amp;quot;reboot&amp;quot;, &amp;quot;id&amp;quot;: 0}&lt;br /&gt;
&lt;br /&gt;
=== HTTP ===&lt;br /&gt;
E' possibile utilizzare il protocollo http con una get per inviare i dati; la get http sarà immediatamente convertita dal server in una &amp;quot;pub&amp;quot; al broker mqtt.&lt;br /&gt;
Http è molto inefficiente rispetto mqtt e qui è utilizzato solo come &amp;quot;bridge&amp;quot; a mqtt quando dovesse essere necessario.&lt;br /&gt;
&lt;br /&gt;
I parametri della get sono:&lt;br /&gt;
* '''topic''' il topic mqtt&lt;br /&gt;
* '''payload''' il payload mqtt&lt;br /&gt;
* '''username''' username dell'utente&lt;br /&gt;
* '''password''' password dell'utente&lt;br /&gt;
* '''time''' richiede data e ora nella risposta del server&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://rmap.cc/http2mqtt/?user=&amp;lt;myuser&amp;gt;&amp;amp;password=&amp;lt;mypassword&amp;gt;&amp;amp;topic=sample/-/945000,4530000/&amp;lt;myuser&amp;gt;/1,0,60/1,-,-,-/B13011&amp;amp;payload={&amp;quot;v&amp;quot;:0, &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
Per dati non differiti è possibile omettere &amp;quot;t&amp;quot;:&amp;quot;2015-07-30T15:30:00&amp;quot; nel payload.&lt;br /&gt;
&lt;br /&gt;
Se l'invio dei dati ha successo la risposta sarà &amp;quot;OK&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== AMQP ===&lt;br /&gt;
AMQP is a binary messaging protocol and semantic framework for microservices and enterprise messaging.&lt;br /&gt;
&lt;br /&gt;
https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf&lt;br /&gt;
&lt;br /&gt;
==== Versioni del protocollo supportate ====&lt;br /&gt;
* 0-9-1&lt;br /&gt;
* 0-9&lt;br /&gt;
* 0-8&lt;br /&gt;
&lt;br /&gt;
==== Autenticazione ====&lt;br /&gt;
La pubblicazione dei messaggi è ammessa solo dopo autenticazione.&lt;br /&gt;
&lt;br /&gt;
L'autenticazione si effettua tramite una coppia username/password fornite dall'amministratore del server.&lt;br /&gt;
&lt;br /&gt;
==== Tls ====&lt;br /&gt;
L'uso di TLS (amqps) non è richiesto, ma potrà essere implementato in future versioni di queste specifiche.&lt;br /&gt;
&lt;br /&gt;
==== Formati dei messaggi ====&lt;br /&gt;
Il report che costituisce il messaggio dovrà essere scritto nei formati json, jsonline o bufr sopra descritti.&lt;br /&gt;
&lt;br /&gt;
===== BUFR messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_bufr&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON Line messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_jsonline&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== JSON messages over AMQP =====&lt;br /&gt;
&lt;br /&gt;
Il payload dovrà essere inviato con protocollo AMQP al broker tramite autenticazione su exchange &amp;quot;rmap_dbajson&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==  RMAP web services ==&lt;br /&gt;
&lt;br /&gt;
=== Composizione degli URL per un HTTP GET request ===&lt;br /&gt;
&lt;br /&gt;
==== Versioning ====&lt;br /&gt;
&lt;br /&gt;
Le `API` avranno come prefisso la versione in uso.&lt;br /&gt;
&lt;br /&gt;
Ad esempio, serie temporale mensile usando la versione 1:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/dbajson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
==== Format ====&lt;br /&gt;
&lt;br /&gt;
Il secondo prametro delle api è il formato; questa la scelta:&lt;br /&gt;
* dbajson&lt;br /&gt;
* jsonline&lt;br /&gt;
* geojson&lt;br /&gt;
&lt;br /&gt;
ad esempio:&lt;br /&gt;
&lt;br /&gt;
http://api.borinud.arpa.emr.it/v1/geojson/-/1120000,4450000/generic/254,0,0/103,2000,-,-/B12101/timeseries/2013/09&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== metadati ====&lt;br /&gt;
&lt;br /&gt;
La &amp;quot;base&amp;quot; della richiesta è quella descritta per il topic MQTT, i.e.:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 '''/-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101'''&lt;br /&gt;
&lt;br /&gt;
E' l'URL che identifica la misurazione effettuata dalla stazione fissa (`-`) con longitudine 12,07738 e latitudine 44.60016 (`1207738,4460016`) per la rete `locali`; la grandezza misurata è istantanea (`254,0,0`), è stata presa a 2 metri dal suolo (`103,2000,-,-`) ed è una temperatura (`B12101`).&lt;br /&gt;
&lt;br /&gt;
Ogni parametro incluso nelle &amp;quot;/&amp;quot; può essere sostituito con &amp;quot;*&amp;quot; equivalente a dire &amp;quot;tutti&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Anagrafica =====&lt;br /&gt;
&lt;br /&gt;
I dati costanti nel tempo e indipendenti dal timerange e livello sono specificati così:&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/-,-,-/-,-,-,-/*/stationdata'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Serie dei dati o sommario ====&lt;br /&gt;
&lt;br /&gt;
===== Serie temporale =====&lt;br /&gt;
&lt;br /&gt;
Serie temporale annuale,mensile, giornaliera e oraria:&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/timeseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/timeseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13&lt;br /&gt;
 /-/1207738,4460016/locali/254,0,0/103,2000,-,-/B12101/timeseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Serie spaziale =====&lt;br /&gt;
&lt;br /&gt;
Serie spaziale di una rete, con granularità giornaliera o oraria (± 30 minuti):&lt;br /&gt;
&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day'''&lt;br /&gt;
 '''/ident/coords/network/timerange/level/bcode/spatialseries/year/month/day/hour'''&lt;br /&gt;
&lt;br /&gt;
&amp;quot;ident&amp;quot; e &amp;quot;coords&amp;quot; possono assumere il valore &amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
nel dettaglio:&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/spatialseries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;/&amp;lt;day&amp;gt;/&amp;lt;hour&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Ad esempio:&lt;br /&gt;
&lt;br /&gt;
 /-/*/locali/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13&lt;br /&gt;
 /-/*/*/254,0,0/103,2000,-,-/B12101/spatialseries/2011/01/13/06&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Riassuntivo =====&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di tutto il database:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/*/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una stazione (fissa o mobile):&lt;br /&gt;
&lt;br /&gt;
 '''/-/&amp;lt;lon&amp;gt;,&amp;lt;lat&amp;gt;/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
 '''/&amp;lt;ident&amp;gt;/*/&amp;lt;network&amp;gt;/*/*/*/summaries'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Riassuntivo di una misurazione in un dato mese:&lt;br /&gt;
&lt;br /&gt;
 '''/*/*/&amp;lt;network&amp;gt;/&amp;lt;pind&amp;gt;,&amp;lt;p1&amp;gt;,&amp;lt;p2&amp;gt;/&amp;lt;lt1&amp;gt;,&amp;lt;l1&amp;gt;,&amp;lt;lt2&amp;gt;,&amp;lt;l2&amp;gt;/&amp;lt;bcode&amp;gt;/summaries/&amp;lt;year&amp;gt;/&amp;lt;month&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
I dati restituiti sono analoghi a quelli restituiti con una richiesta dati.&lt;br /&gt;
&lt;br /&gt;
=== Formati dati ===&lt;br /&gt;
&lt;br /&gt;
==== Json ====&lt;br /&gt;
Vedi sopra formato `Json`&lt;br /&gt;
&lt;br /&gt;
==== Jsonline ====&lt;br /&gt;
Vedi sopra formato `Jsonline`&lt;br /&gt;
&lt;br /&gt;
==== Geojson ====&lt;br /&gt;
http://geojson.org/&lt;br /&gt;
&lt;br /&gt;
Questo un esempio di `GeoJSON`:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {&lt;br /&gt;
  &amp;quot;type&amp;quot;: &amp;quot;FeatureCollection&amp;quot;,&lt;br /&gt;
  &amp;quot;features&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;geometry&amp;quot;: {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;Point&amp;quot;,&lt;br /&gt;
        &amp;quot;coordinates&amp;quot;: [&lt;br /&gt;
          10.26667,&lt;br /&gt;
          46.81667&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      &amp;quot;type&amp;quot;: &amp;quot;Feature&amp;quot;,&lt;br /&gt;
      &amp;quot;properties&amp;quot;: {&lt;br /&gt;
        &amp;quot;date&amp;quot;: &amp;quot;2011-01-25T00:00:00&amp;quot;,&lt;br /&gt;
        &amp;quot;level&amp;quot;: [103,2000,null,null],&lt;br /&gt;
        &amp;quot;ident&amp;quot;: null,&lt;br /&gt;
        &amp;quot;network&amp;quot;: &amp;quot;locali&amp;quot;,&lt;br /&gt;
        &amp;quot;bcode&amp;quot;: &amp;quot;B12101&amp;quot;,&lt;br /&gt;
        &amp;quot;value&amp;quot;: 263.75,&lt;br /&gt;
        &amp;quot;trange&amp;quot;: [254,0,0]&lt;br /&gt;
      }&lt;br /&gt;
    },&lt;br /&gt;
    ...&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Ritrasmissioni  e correzioni ==&lt;br /&gt;
&lt;br /&gt;
I dati possono essere ritrasmessi e sarà l'ultimo dato ricevuto a vincere sui vecchi.&lt;br /&gt;
&lt;br /&gt;
Attenzione va posta alla gestione degli attributi che possono contenere il risultato del controllo di qualità dei dati. AI dati  che non superano il controllo di qualità viene aggiunta loro una flag corrispondente all'attributo B33007, che fornisce una % di confidenza del dato ( = 0 per valore invalidato). I dati con attributo B33007 dovranno quindi essere offuscati ( mancante, valore = null) alle applicazioni. In questo modo vengono gestite le correzioni, ossia è possibile che un dato sia inviato prima senza attributo B33007; poi in seguito alle procedure di controllo di qualità il dato viene invalidato e ritrasmesso con valore null e attributo B33007=0; in questo caso chi riceve il dato dovrebbe procedere a invalidarlo/rimuoverlo.&lt;br /&gt;
Nella gestione di questo flusso dati i tools forniti insieme alla libreria software DB-all.e possono agevolare molto il lavoro.&lt;/div&gt;</summary>
		<author><name>PaoloPatruno</name></author>
	</entry>
</feed>