Azure IoT Hub und “The specified SAS token is expired”

Nachdem der Pi über die Feiertage ebenfalls eine Auszeit bekam, standen die Tage wieder ein paar Tests mit dem Azure IoT Hub an. Pi mit dem Lebenselixier Strom versorgt, Visual Studio gestartet, Test-Anwendung von vor Weihnachten geladen, auf den Pi deployed und auf Nachrichten am IoT Hub gewartet. Aber es kam nichts. Was ist da los? Vor Weihnachten ging’s noch.

Mit dem Debugger durch die Anwendung und siehe da, beim Senden der Nachricht an die Cloud kommt die vielsagende Meldung “The specified SAS token is expired.”

Konsolen-Anwendung ausgepackt und IoT-Gerät simuliert. Funktioniert. Nachrichten kommen an. WTF? Simulierte Messwerte auf dem Pi, siehe oben. WTF?

Nach kurzer Suche in den Tiefen des Internet die Lösung: die Uhr auf dem Pi ging grob 4 Stunden vor!!! Damit akzeptierte der IoT Hub die Nachrichten nicht.

Also Uhr auf dem Pi umstellen. Da dies schlauerweise nicht direkt über die Einstellungen auf dem Pi machbar ist, muss man sich hier mit der PowerShell behelfen. Dazu PowerShell als Administrator starten und folgende Kommandos nacheinander abarbeiten.

net start WinRM
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "<IP or HOSTNAME>"
Enter-PSSession -ComputerName <IP or HOSTNAME> -Credential localhost\Administrator
set-date "8/1/2016 12:11:30 PM"

Der letzte Aufruf hat bei mir etwas gedauert, bis die aktuelle Zeit angezeigt wurde. Danach wieder die Test-Anwendung von oben deployed und siehe da, die Nachrichten kamen wieder durch.

Raspberry Pi 2 und FEZ HAT

Mit Windows IoT hat die .NET-Welt auch offiziell den Weg auf den Raspberry Pi 2 gefunden. Allerdings ist die Auswahl an Sensoren mit passenden Windows-IoT-Treibern noch etwas mau. Und hier kommt GHI Electronics mit seinem Erweiterungs-Board FEZ HAT ins Spiel.

Das Board wird einfach auf die GPIO-Leiste des PIs gesteckt und bietet eine gute Basis für den Einstieg in Windows IoT und das Internet der Dinge.
Hier ein kleiner Auszug der Features:

  • Temperatur-Sensor
  • Licht-Sensor
  • Buttons
  • LEDs
  • Analoge und Digitale Eingänge

Das “Hello World” der IoT-Welt ist gefühlt der Temperatur-Sensor. In diesem Beitrag werden wir uns daher mit der Initialisierung des FEZ HAT sowie der Ansteuerung des Temperatur-Sensors widmen.

Zu aller Anfang benötigen wir einen PI2 sowie ein FEZHAT-Board, welches wir auf den GPIO des PI stecken.

Danach starten wir Visual Studio 2015 und legen eine frische (Windows 10) Universal App an.

01 Blank App

Damit wir direkt auf dem Gerät testen und deployen können, müssen wir in den Debug-Einstellungen für die ARM-Plattform das Target-Device auf “Remote-Machine” und die entsprechende IP-Adresse einstellen. Den Haken bei “Use authentication” rausnehmen!

02 Debug Remote Machine

Danach benötigen wir noch zwei Referenzen, einmal auf die IoT-Extensions und einmal die FEZHAT-Treiber.

03 Add IoT-Extension

04 Add GHI FEZHAT Driver

Nachdem nun alle vorbereitenden Maßnahmen erledigt sind, geht es an den Code.

Wir öffnen die MainPage.xaml.cs und fügen folgendes using hinzu:

using GHIElectronics.UWP.Shields;

Daneben werden noch zwei Klassen-Variablen benötigt:

private FEZHAT hat;
private DispatcherTimer timer;

Die Initialisierung erfolgt über eine private Methode. Hier wird das zuvor angelegte FEZHAT-Objekt mit einem Einzeiler initialisiert.

private async void Setup()
{
   this.hat = await FEZHAT.CreateAsync();

   this.timer = new DispatcherTimer();
   this.timer.Interval = TimeSpan.FromSeconds(10);
   this.timer.Tick += OnTick;
   this.timer.Start();
}

Für das Tick-Event legen wir noch einen Eventhandler an. Dieser holt über die GetTemperature()-Methode die aktuelle Temperatur und schreibt sie in die TextBox “tbTemperature”.

private void OnTick(object sender, object e)
        {
   var temperature = hat.GetTemperature().ToString("N2");

   this.tbTemperature.Text = temperature;
}

Abschließend rufen wir in der Main() die Methode Setup() auf und starten den Timer, welcher nun alle zehn Sekunden die Temperatur ausliest.

public MainPage()
{
   this.InitializeComponent();

   this.Setup();
}

Weitere Informationen findet ihr auf den Seiten des Herstellers:
FEZ HAT von GHI Electronis