Timezone e data-ora di un Raspberry con Windows C#

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 Codeplex 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()
{
// do something nice!
}

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:

Post Tagged with , , , , ,
Caricando...