Data-ora di Raspberry: impostarla da Windows C#

Data-ora di Raspberry: come impostare la data e l’ora di un Raspberry Pi da un PC Windows usando C-Sharp.

In questo articolo precedente abbiamo visto come ottenere la data, l’ora ed il fuso orario di un Raspberry Pi utilizzando un programma implementato in C#: vediamo ora come impostare i primi due dati inviando i comandi necessari attraverso la rete locale da un pc Windows.

Anche questa volta, per prima cosa è necessario procurarsi la libreria SshNet che consente la comunicazione tra PC e Raspberry Pi attraverso il protocollo Secure shell per stabilire una sessione remota cifrata attraverso la rete (ricordiamo che potete scaricare il file Renci.Sshnet.dll con la libreria SSH da Codeplex).

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. Quindi 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: SetDT ) in cui inserirete il codice C#:
private void SetDT()
{
// do something cool!
}

Create un client SSH utilizzando i seguenti parametri connessione:

  • host: di solito il nome del dispositivo (es: raspberry ) oppure l’ip locale (es: 192.168.0.99 )
  • 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();
Preparate la stringa con la data-ora per il dispositivo raspberry:
string datetime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
costruite l’istruzione da inviare via SSH per impostare il datetime:
string command = string.Format("sudo date -s \"{0}\"", datetime);
e se il vostro Raspberry è dotato di un orologio hardware (RTC) aggiungete:
command += "; sudo hwclock -w";
A questo punto lanciate il comando via SSH:
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.

Ricompattiamo tutto il codice C# che serve a impostare data-ora di Raspberry:
private void SetDT(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 datetime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
string command = string.Format("sudo date -s \"{0}\"", datetime);
command += "; sudo hwclock -w";
Renci.SshNet.SshCommand cmd = client.RunCommand(command);
client.Disconnect();
if (cmd.ExitStatus == 0)
{
System.Windows.Forms.MessageBox.Show("OK!");
}
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
Al termine della procedura, in caso di successo potete effettuare un controllo di data-ora di Raspberry prendendo spunto dal codice C-Sharp presente in questo articolo.

Attenzione anche a:

  • Errori di connessione: sostituendo il nome dispositivo con l’indirizzo ip locale si può ovviare al problema, tuttavia l’ip del Raspberry può cambiare nel tempo se non è statico.
  • Errori di autorizzazione: se non utilizzate un utente del gruppo amministratori del Raspberry, assicuratevi che possieda i permessi necessari ad eseguire i comandi richiesti.

Link utili:

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