Fuso Orario E Data-Ora Di Un Raspberry: Ecco Come Implementare Un Programma In C-Sharp Che Richiede E Mostra Timezone E Data-Ora Di Un Raspberry Pi Attraverso La LAN.
Per prima cosa è necessario procurarsi la libreria SshNet che consente la comunicazione tra PC e Raspberry Pi attraverso il protocollo Secure shell, stabilendo una sessione remota cifrata attraverso la rete.
Da DLLDS potete scaricare il file Renci.Sshnet.dll con la libreria SSH.
Nota: l’ultima versione (SshNet .NET 4.0 Binary) attualmente (gennaio 2016) disponibile è una beta, che non abbiamo testato. Abbiamo invece utilizzato la versione precedente (SshNet .NET 3.5 Binary) con Visual Studio 2010 utilizzando il Framework 4 client profile.
Aprite Visual Studio e create un nuovo progetto C# (ad esempio un Windows Form Application).
Nel riquadro Esplora Soluzioni, aggiungere il riferimento alla libreria SSH sfogliando le cartelle fino a raggiungere quella in cui avete scaricato il file dll.
Sempre nel riquadro Esplora Soluzioni, cliccate col tasto destro del mouse sull’icona del file form (es: Form1.cs ) e selezionate Visualizza codice per aprire il file sorgente.
Create una funzione (es: ShowDTTZ ) in cui inserirete il codice C-Sharp:
private void ShowDTTZ()
{
// qui andrà il codice illustrato in seguito
}
Per prima cosa create un client SSH utilizzando i seguenti parametri connessione:
- host: in genere può essere il nome del dispositivo (es: raspberry ) oppure l’ip locale (es: 192.168.1.66 )
- username: nome utente valido per accedere al Raspberry (es: pi )
- password: la password del nome utente
Renci.SshNet.ConnectionInfo info = new Renci.SshNet.PasswordConnectionInfo(host, username, password);
Renci.SshNet.SshClient client = new Renci.SshNet.SshClient(info);
e quindi avviate la connessione:
client.Connect();
A questo punto lanciate un comando via SSH per inviare le istruzioni ed ottenere la risposta:
string command = “date +\”%Y-%m-%d %H:%M:%S\”; cat /etc/timezone”;
Renci.SshNet.SshCommand cmd = client.RunCommand(command);
Ricordatevi di chiudere la connessione:
client.Disconnect();
Se tutto è andato bene, il valore della proprietà ExitStatus dell’oggetto cmd sarà zero, altrimenti in cmd.Error troverete un messaggio d’errore.
Prendete la risposta e suddividetela in righe:
string[] lines = cmd.Result.Split(new char[1] {(char)10}, System.StringSplitOptions.RemoveEmptyEntries);
Nella prima linea sono contenute la data e l’ora, nella seconda il fuso orario (timezone):
System.DateTime dt = System.DateTime.ParseExact(lines[0], “yyyy-MM-dd HH:mm:ss”, System.Globalization.CultureInfo.InvariantCulture);
string tz = lines[1];
Ed ora ricompattiamo tutto il codice C# che serve a richiedere e mostrare la timezone e la data-ora di un Raspberry:
private void ShowDTTZ(string host, string username, string password)
{
try
{
Renci.SshNet.ConnectionInfo info = new Renci.SshNet.PasswordConnectionInfo(host, username, password);
Renci.SshNet.SshClient client = new Renci.SshNet.SshClient(info);
client.Connect();
string command = “date +\”%Y-%m-%d %H:%M:%S\”; cat /etc/timezone”;
Renci.SshNet.SshCommand cmd = client.RunCommand(command);
client.Disconnect();
if (cmd.ExitStatus == 0)
{
string[] lines = cmd.Result.Split(new char[1] {(char)10}, System.StringSplitOptions.RemoveEmptyEntries);
System.DateTime dt = System.DateTime.ParseExact(lines[0], “yyyy-MM-dd HH:mm:ss”, System.Globalization.CultureInfo.InvariantCulture);
string tz = lines[1];
string msg = “Data/ora: “ + dt.ToString();
msg += System.Environment.NewLine + “Fuso orario: “ + tz;
System.Windows.Forms.MessageBox.Show(msg);
}
else
{
System.Windows.Forms.MessageBox.Show(cmd.Error, “Oops…”, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);
}
}
catch (System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message, “Doh!”, System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
}
}
Note
Attenzione che le timezone di Raspberry sono conformi alle specifiche IANA mentre i sistemi Windows hanno una suddivisione semplificata. Ad esempio, “Europe/Rome” su Raspberry corrisponde ad “Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna” su Windows.
Attenzione anche a:
- Errori di connessione: sostituendo l’ip al nome dispositivo si può ovviare, tuttavia l’ip del Raspberry può cambiare se non è impostato staticamente.
- Errori di autorizzazione: se non usate un utente amministratore del Raspberry, assicuratevi che possieda i permessi necessari ad eseguire i comandi richiesti.
Link utili:
- SSH.NET Library
- Protocollo SSH
- Database IANA
- Comandi Linux: date e cat