Collegamento e INSTERT dati da remoto a DB MySQL (MariaDB) su NAS (Synology)

Ciao a tutti, spero di essere nella sezione del forum giusta per porre il mio quesito e chiedo anticipatamente scusa se nel descriverlo farò qualche strafalcione. Sono relativamente nuovo nel mondo Arduino (e MySQL). Le mie esperienze di programmazione risalgono a svariati anni fa e ora sto faticosamente cercando di tornare al passo (base base) coi tempi.

Sto lavorando a un progetto concettualmente molto semplice (almeno per chi ha solo un minimo di esperienza in più di me) e lo riassumo così:

  1. una scheda Arduino MKR WiFi 1010 acquisisce dei dati da dei sensori;
    2) i dati vengono inviati a un database MySQL (MariaDB 5), con semplici INSERT, che risiede su un NAS Synology DS918+;
  2. i dati sul DB vengono elaborati a piacere e visualizzati in dashboard, inizialmente usando Grafana, ma potenzialmente su pagine web .php dedicate e costruite ad-hoc;
  3. i dati sul DB potrebbero anche essere letti dalla stessa scheda Arduino (o altre) per gestire e generare degli allarmi, attivare cose, ecc...

La scheda Arduino sarà inizialmente collegata via WiFi alla stessa rete del NAS, ma dovrà essere possibile collegarla ad altre reti e/o con modulo SIM dati potendo cmq caricare i dati sul DB che risiederà sempre sul NAS sulla rete originale.

Sui punti 1), 3) e 4) direi che sono coperto:

  • la scheda Arduino per la semplice operazione di lettura sensori la so programmare (già fatto);
  • MariaDB 5 già installato sul NAS e funzionante;
  • phpMyAdmin installato e avviato;
  • BD creato e funzionanate;
  • Grafana installato, collgato al DB e funzionante.

Mi rimane un grosso dubbio (in realtà forse molto banale per i più esperti) sul collegamento al DB sul NAS, punto 2).
Ho provato a cercare, ma forse per carenze mie non ho trovato ancora niente che mi chiarisse quanto segue.

Sto studiando questa libreria per poterlo fare:

(la parte che mi interessa è la WIFININA per il tipo di scheda che userò).

Nello specifico le righe di codice che dicono alla scheda dove sia il DB e avviano la semplice query di inserimento dati (quello sotto è solo un esempio generico per scrivere in una riga "Hello, Arduino!") sono queste:

IPAddress server_addr(192, 168, 2, 112);
uint16_t server_port = 5698;    //3306;

char default_database[] = "test_arduino";           //"test_arduino";
char default_table[]    = "hello_arduino";          //"test_arduino";

String default_value    = "Hello, Arduino!"; 

// Sample query
String INSERT_SQL = String("INSERT INTO ") + default_database + "." + default_table 
                 + " (message) VALUES ('" + default_value + "')";

MySQL_Connection conn((Client *)&client);

Ecco... il mio dubbio riguarda l'indirizzo del server:
IPAddress server_addr(192, 168, 2, 112)

Io che NON ho un IP statico, cosa devo metterci?
Il nome host? Cioè del mio NAS tipo mioNAS.synology.me?
Del server dove gira il DB? In questo ultimo caso quale sarebbe? Nella finestra di info di MariaDB 5 trovo un campo chiamato "Socket dominio" che contiene l'indirizzo /run/mysqld/mysqld.sock, potrebbe essere questo con mioNAS.synology.me davanti?

Grazie a tutti!

Buon pomeriggio e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Ops! Chiedo scusa, sulle frenetiche ali dell'entusiasmo elettronico mi ero presentato su un altro forum ::slight_smile: dimenticando di farlo qui.

Fatto, spero di avere rimediato al volo.

Mah ... la cosa si fa (si chiama NAT), ma ti rendi conto del rischio di permettere l'accesso ad Arduino sulla tua rete "interna", dall'esterno?

Ho prevedi un meccanismo di autenticazione o ... chiunque potrà massacrarti il sistema in vari modi ...e, considera che ci sono BOT apposta per andare a trovare "falle" di sicurezza come questa per portare poi i più svariati attacchi.

Come pensi di risolvere?

Guglielmo

Grazie per questa prima risposta e prezioso avvertimento.
Non sono per nulla esperto nel campo reti e sicurezza, quindi sicuramente sto sottovalutando alla grande questo aspetto.

Diciamo che (ma potrei davvero scrivere della cavolate), il NAS Synology è già dotato di un sistema di autenticazione (e Firewall), così come il DB con phpMyAdmin ha la gestione degli utenti con rispettive autorizzazioni e PW.

Il NAS è già accessibile dall'esterno (riesco a collegarmi in remoto e a lavorare sul DB, chiaramente autenticandomi, e altro), ha attivo un WEB Server con relativi servizi compreso .php. Mi collego usando l'indirizzo mioNAS.synology.me:XXXX., poi devo passare l'autenticazione.

Non so se questo risponde almeno parzialmente alla tua domanda.

Cmq... all'inizio mi accontenterei anche di lavorare solo sulla rete locale, cioè con la scheda connessa in WiFi sulla tessa rete del NAS. Ma avendo l'IP NON statico, cosa devo usare da passare alla variabile della libreria per avere sempre la certezza che la scheda stabilisca la connessione con il DB?

IPAddress server_addr(192, 168, 2, 112);

La soluzione (se c'è), al netto dei problemi da te segnalati, dovrebbe poi funzionare anche da remoto?

Ma l'IP non statico è quello che ti da il tuo provider (quindi come la tua rete si vede verso il mondo esterno), invece, l'IP all'interno della tua rete puoi benissimo fissarlo ...
... vai nel router, selezioni il device Arduino e gli dici di assegnargli sempre lo stesso IP (... anche se, probabilmente, lo fa già da solo riconoscendo il MAC address).

Guglielmo

Non ho capito bene, tu hai un NAS per di più con un DBMS sopra, e non l'hai impostato con IP statico? C'è un perché, oppure lo hai semplicemente lasciato configurato come l'hai trovato di default?

Io il mio NAS l'ho impostato con IP statico, e con un indirizzo esterno al range di IP dinamici (ossia "DHCP pool"). Ad esempio DHCP pool da 192.168.1.100 a 192.168.1.199 e poi tutti gli statici li metti sotto al 100, ad esempio il NAS 192.168.1.5. Il tuo client invece non importa, può stare ovviamente in DHCP.

Sì vero, hai ragione Guglielmo!
Così facendo, da dentro alla stessa rete, di sicuro dovrebbe funzionare.
Devo però fissare l'IP del NAS che ha al suo interno il server MySQL al quale la scheda Arduino punta per l'INSERT dei dati, non l'Arduino, giusto? O meglio, posso fissare anche l'Arduino, ma ciò che conta davvero è che l'Arduino riesca a connettersi con il DB...

Appena provo vi do' riscontro, magari la cosa potrebbe interessare anche ad altri.

Ora... per collegarsi da remoto, il dubbio pratico è se sia possibile usare il nome dell'host che uso già per collegarmi da remoto e/o se debba usare una qualche particolare stringa di connessione nella forma mioNAS.synology.me:XXXX o simile. C'è una funzione/variabile dedicata da usare diversa da:

IPAddress server_addr(192, 168, 2, 112);

?

PS: mi sono sovrapporto a Guglielmo, ma devi specificare meglio di QUALE indirizzo IP parli.

Perché se parli di quello del NAS nella tua rete, vale quanto ti ho scrittp prima, ma se parli di quello del tuo provider che è OVVIAMENTE dinamico, per questi esistono dei servizi esterni di "Dynamic DNS" per cui tu puoi assegnare un nome tipo "casamia.dydns.com" che corrisponderà sempre all'indirizzo IP esterno della tua rete. Quindi devi fare quello che si chiama un "DNS lookup", devi vedere su Arduino come si consulta un DNS (io non l'ho mai fatto, ma si può fare...). Dopo di che dovresti configurare un port mapping sul tuo router che consenta dall'esterno di accedere al tuo MariaDB.

Per questioni di sicurezza, come ha evidenziato anche Guglielmo, ti consiglio non solo di accertarti di avere password abbastanza complesse per accedere al DB, e quantomeno di NON usare la porta standard ma sceglierne una "alta" casuale, che so, 23400, e di mappare questa porta 23400 esterna verso il NAS sulla porta interna di MariaDB.

In effetti ho fatto un po' di confusione doc.

Giustamente se sono all'interno della stessa rete, tutti i dubbi da me esposti sopra hanno poca ragione di esistere.
l'IP del NAS è già fisso, la porta del Maria DB (che cogliendo il tuo consiglio modifico con un numero meno "usuale") è già definita, quindi direi che ho tutto quello che mi serve per applicare i parametri necessari a far girare lo script e la galleria di connessione al DB.

Pensando già a voler accedere anche da remoto, ho fatto un bel mappazzone di concetti mischiando le cose.

Detto questo, rimane la mia curiosità (che poi è esigenza) di capire come fare per accedere anche dall'esterno.

Assodato che accedo già da remoto al NAS usando un DNS del tipo mioNAS.synology.com:XXXX (XXXX è la porta), e avendo già assegnato la pota YYYY al Maria DB gestito da phpMyAdmin (il DBMS, giusto?) al quale accedo sempre da remoto con mioNAS.synology.com:ZZZZ la mia domanda è:

come devo modificare le righe sotto del codice di connessione al DB, prese da un esempio base delle libreria GitHub - khoih-prog/MySQL_MariaDB_Generic: This MySQL_MariaDB_Generic library helps you connect your boards directly to a MySQL / MariaDB server, either local or cloud-based, so that you can store / retrieve data to / from the server. Supported boards are ESP8266/ESP32, WT32_ETH01 (ESP32 + LAN8720A), nRF52, SAMD21/SAMD51, STM32F/L/H/G/WB/MP1, Teensy, SAM DUE, Mega, RP2040-based boards, Portenta_H7, etc. with Teensy 4.1 NativeEthernet/QNEthernet, W5x00 or ENC28J60 Ethernet, WiFiNINA modules/shields or Portenta_H7 WiFi/Ethernet. Ethernet_Generic library is used as default for W5x00 , affinché Arduino possa connettersi al DB?

A occhio mi viene da dire che basterebbe cambiare il server_addr(bla, bla, bla, bla) con qualcos'altro che si riferisca a un DNS. Ho cercato, ma non ho trovato una risposta, ma ripeto che potrebbe essere perchè mi manca l'occhio e l'esperienza per trovarlo. :slight_smile:

IPAddress server_addr(192, 168, 2, 112);
uint16_t server_port = 5698;    //3306;

char default_database[] = "test_arduino";           //"test_arduino";
char default_table[]    = "hello_arduino";          //"test_arduino";

String default_value    = "Hello, Arduino!";

// Sample query
String INSERT_SQL = String("INSERT INTO ") + default_database + "." + default_table
                 + " (message) VALUES ('" + default_value + "')";

MySQL_Connection conn((Client *)&client);

La classe client ha anche una connect tramite url, per la mariadb, vedi l'esempio "connect by host name" della libreria mariadb LINK
Mi pare usa la libreria DNS.h e poi dns.getHostByName(hostname, server_ip); per ottenere l'IP

Cercando poi su internet, usando lib WiFi, qui dice (seconda risposta) che bisogna usare una accortezza: LINK

Grazie mille!
Sto studiando e vedo la luce in fondo al tunnel! :art:

Sapreste solo indicarmi dove trovare la galleria DNS.h?

Nella MySQL_MariaDB_Generic (che ho usato per collegarmi in locale e funziona alla grande!), anche se gli esempi la richiamano, non c'è e non la trovo neanche tra le librerie di Arduino.

La dns.h fa parte della libreria ethernet, dovrebbe averla anche la wifi