Steuern von GPIO-Pins mithilfe einer .NET Core 2-WebAPI auf einem Raspberry Pi unter Verwendung von Windows 10 oder Ubuntu

 C Programming >> C-Programmierung >  >> Tags >> API
Steuern von GPIO-Pins mithilfe einer .NET Core 2-WebAPI auf einem Raspberry Pi unter Verwendung von Windows 10 oder Ubuntu

Zuvor habe ich über das Erstellen einer .NET Core 2-Web-API und deren Hosting auf einem Raspberry Pi 3 geschrieben, und dieses Mal werde ich diese Arbeit erweitern, um mit GPIO-Pin-Logikebenen zu interagieren.

Dies ist der neueste einer Reihe von Beiträgen, die Entwicklern dabei helfen, .NET Core 2-Code zu schreiben, um mit IoT-Hardware zu interagieren, und zwar auf eine Weise, die gegenüber dem Betriebssystem des Geräts agnostisch ist. Ich habe zuvor ein paar Kleinigkeiten darüber geschrieben, wie man den GPIO-Pin-Status mit einer Konsolenanwendung ändert – aber mit einer WebAPI können wir jetzt den GPIO-Status mit HTTP-Post-Anfragen steuern. Mit dieser Funktion können Sie sich also vorstellen, wie wir ein physisches Gerät von etwas wie einer Browseranwendung oder sogar einer HoloLens- oder Xbox-App aus steuern könnten.

Erstellen Sie das Web-API-Projekt für den Raspberry Pi

Dieser Teil ist einfach – sobald Sie .NET Core 2 auf Ihrem Computer haben, installieren Sie einfach die Vorlage von Nuget mit dem folgenden Befehl:

dotnet new -i RaspberryPi.WebApi::*

Wählen Sie dann einen Ordner in Ihrer Entwicklungsumgebung aus, um mit dem folgenden Befehl ein neues Projekt namens GpioSwitcherWebApio zu erstellen:

dotnet new piwebapi -n GpioSwitcherWebApi

An diesem Punkt verfügen Sie über den gesamten Code, den Sie zum Ausführen eines .NET Core 2-Web-API-Projekts auf Ihrem Raspberry Pi benötigen.

Erstellen Sie einen Controller, um den Pin-Status zu ändern

Öffnen wir unser Projekt und fügen eine Abhängigkeit vom Bifröst-Projekt hinzu – das hilft uns in mehrfacher Hinsicht. Wir können denselben Code schreiben, um sowohl Ubuntu- als auch Windows 10-IoT-Core-Geräte anzusprechen, und es gibt auch eine Bifröst-UWP-App, die uns beim Zugriff auf GPIO-Hardware auf Windows 10-IoT-Geräten hilft. Öffnen Sie eine Paket-Manager-Eingabeaufforderung in Visual Studio 2017 und geben Sie Folgendes ein:

Install-Package Bifrost.Devices.Gpio.Core -Version 0.0.1
Install-Package Bifrost.Devices.Gpio.Abstractions -Version 0.0.1
Install-Package Bifrost.Devices.Gpio -Version 0.0.2

Wenn Sie Visual Studio 2017 nicht verwenden, können Sie einfach die Datei „GpioSwitcherWebApi.csproj“ ändern und die unten gezeigten Paketverweise hinzufügen:

  <ItemGroup>
    <PackageReference Include="Bifrost.Devices.Gpio" Version="0.0.2" />
    <PackageReference Include="Bifrost.Devices.Gpio.Abstractions" Version="0.0.1" />
    <PackageReference Include="Bifrost.Devices.Gpio.Core" Version="0.0.1" />
    <PackageReference Include="Microsoft.AspNetCore" Version="2.0.0-preview1-*" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.0-preview1-*" />
    <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.0.0-preview1-*" />
  ItemGroup>

Als Nächstes können wir den standardmäßigen ValuesController bearbeiten, der mit dem Projekt geliefert wird – ich habe meinen in PinsController.cs umbenannt , ein Titel, der besser zu der Aktion passt, die wir ausführen werden.

Ich möchte, dass mein Controller drei Aktionen für Ubuntu- oder Windows IoT-Geräte hat:

  • Get() – eine HttpGet-Aktion, die eine Liste der derzeit exportierten Gpio-Pins und ihren aktuellen Status (hoch/niedrig) zurückgibt.
  • Get(int pinId) – eine HttpGet-Aktion, die den Status des Gpio-Pins mit der Nummer pinId. zurückgibt
  • SwitchPin(int pinId, int status) – eine HttpPost-Aktion, mit der ich eine GpioPin mit der Nummer pinId auswählen kann und setzen Sie ihn auf den Wert status (entweder 1 oder 0, entsprechend hoch oder niedrig).

Die Bifröst-Bibliotheken machen das Einrichten unseres Controllers zum Ändern des GPIO-Pin-Status sehr einfach.

Zuerst müssen wir eine statische Instanz des GpioContoller-Objekts instanziieren – damit wir, wie unten gezeigt, eine private Mitgliedsvariable und einen Klassenkonstruktor hinzufügen können.

private IGpioController gpioController;
 
public PinsController()
{
    Console.WriteLine("In controller - instantiating GpioController instance");
    gpioController = GpioController.Instance;
}

Als nächstes müssen wir die HttpGet-Aktion schreiben, die eine Liste der derzeit exportierten Gpio-Pins und ihren aktuellen Status zurückgibt. Der folgende Code zeigt die Controller-Aktion, die dies erreicht, und gibt einen 200 OK Http-Code zurück.

[HttpGet]
public IActionResult Get()
{
    Console.WriteLine("About to list pin statuses.");
    return Ok(gpioController.Pins);
}

Wir möchten auch in der Lage sein, den aktuellen Status eines Gpio-Pins zu finden, indem wir die PIN-Nummer an die HttpGet-Methode übergeben, und wir können dies mit dem folgenden Code tun.

[HttpGet("{pinId}")]
public IActionResult Get(int pinId)
{
    GpioPinValue pinStatus;
 
    Console.WriteLine("About to get pin status.");
    var pin = gpioController.OpenPin(pinId);
 
    pinStatus = pin.Read();
 
    Console.WriteLine("Returning pin status.");
    return Ok(pinStatus.ToString());
}

Das Interessante zum Schluss – anstatt nur Pin-Logikpegel zu lesen, würde ich sie gerne ändern können – ich denke, das logischste Http-Verb, das hier verwendet werden kann, ist das HttpPost-Verb, damit ich Werte für die Pin-Nummer I posten kann ändern möchte, und die Ebene, auf die ich es ändern möchte, indem ich den folgenden Code verwende:

[HttpPost]
public void SwitchPin(int pinId, int status)
{
    Console.WriteLine("About to change pin status.");
    var pin = gpioController.OpenPin(pinId);
 
    pin.SetDriveMode(GpioPinDriveMode.Output);
 
    if (status == 1)
    {
        Console.WriteLine("Going on");
        pin.Write(GpioPinValue.High);
    }
    else
    {
        Console.WriteLine("Going off");
        pin.Write(GpioPinValue.Low);
    }
}

Um die vollständige, bereits codierte Controller-Datei zu sehen, schau sie dir hier an.

Wenn Sie die obigen Schritte korrekt ausgeführt haben, sollten Sie in der Lage sein, die WebAPI-Anwendung auf Ihre übliche Weise zu erstellen (z. B. verwenden Sie in Visual Studio 2017 Strg+Umschalt+B , oder führen Sie von einem Terminal in VSCode den dotnet-Build aus Befehl.

Bereitstellung auf Ihrem Raspberry Pi-Gerät

Ich habe zuvor eine Schritt-für-Schritt-Anleitung geschrieben, wie Code auf einem Raspberry Pi 3 mit Ubuntu 16.04 oder Windows 10 IoT Core bereitgestellt wird, daher werde ich das hier nicht wiederholen – der einfachste Weg, dies zu tun, besteht darin, einfach den auszuführen in PowerShell-Skripte, die ich auf Github hochgeladen habe, und ich gehe im Folgenden kurz darauf ein, zusammen mit den Parametern, die diese Skripte zum Ausführen benötigen.

Bereitstellung auf Ubuntu 16.04

  • Stellen Sie sicher, dass PuTTY auf Ihrem Entwicklungscomputer installiert ist.
  • Besorgen Sie sich die IP-Adresse Ihres Raspberry Pi 3 (meine ist 192.168.1.110 )
  • Erhalten Sie den Benutzernamen, mit dem Sie sich angemeldet haben (Standard ist ubuntu ).
  • Ermitteln Sie den Pfad, in dem Sie Ihre WebAPI bereitstellen möchten (meiner ist /home/ubuntu/GpioWebAPI )

Führen Sie mit dem hier gehosteten Skript den Befehl in PowerShell aus:

.\deploy-ubuntu.ps1 -ip 192.168.1.110 -username ubuntu -destination /home/ubuntu/GpioWebAPI

Die WebAPI-Binärdateien werden für ein Ubuntu-Betriebssystem erstellt und veröffentlicht und dann auf Ihren Raspberry Pi kopiert.

Bereitstellung auf Windows 10 IoT Core

Dies ist etwas komplexer – Sie müssen Ihre WebAPI und auch die Bifröst UWP-App bereitstellen (Sie benötigen die Bifröst UWP-App unter Windows, damit Ihre .NET Core 2-App die Logikpegel Ihrer GPIO-Pins lesen und ändern kann). .

Stellen Sie zuerst die Web-API-Anwendung bereit

  • Besorgen Sie sich die IP-Adresse Ihres Raspberry Pi 3 (meine ist 192.168.1.125 )
  • Der Name der Web-API-Anwendung, bei mir GpioSwitcherWebApi .

Führen Sie mit dem folgenden Skript (Sie können eine Kopie von hier erhalten) den Befehl aus, um das Zielverzeichnis zu erstellen und eine Firewall-Regel hinzuzufügen:

.\setup-windows.ps1 -ip 192.168.1.125 -applicationName GpioSwitcherWebApi

Führen Sie nun das folgende Skript aus (Sie können eine Kopie von hier erhalten), wodurch die Binärdateien auf Ihren Raspberry Pi 3 kopiert werden.

.\deploy-windows.ps1 -ip 192.168.1.125 -applicationName GpioSwitcherWebApi

Stellen Sie als Nächstes die Bifröst Windows Device Bridge bereit

Wie diese UWP-App bereitgestellt wird, wird hier ausführlich beschrieben, aber es ist nur eine standardmäßige UWP-App-Bereitstellung. Sie können den Code hier herunterladen, in Visual Studio Community 2017 laden und auf Ihrem Raspberry Pi 3 bereitstellen, auf dem Windows 10 IoT Core gehostet wird.

Starten Sie den Kestrel-Webserver, um die Web-API zu starten

Dies ist einfach – für einen Raspberry Pi, auf dem Ubuntu 16.04 gehostet wird, ssh ich mit PuTTY ein und führe Folgendes aus:

sudo /home/ubuntu/GpioWebApi/GpioSwitcherWebApi

Und für einen Raspberry Pi, der Windows 10 IoT Core hostet, rufe ich mit PowerShell eine SSH-Verbindung auf, navigiere zu dem Ort, an dem die App bereitgestellt wird, und führe Folgendes aus:

.\GpioSwitcherWebApi.exe

Der Webserver startet nach einigen Sekunden und ist bereit zum Testen.

Testen unserer Web-API durch Ändern der GPIO-Pin-Logikebenen

Wir können dies ganz einfach testen, indem wir HttpGet- oder HttpPost-Anfragen an unseren Webserver senden. Lassen Sie uns dies für Pin 26 auf unserem Raspberry Pi testen – ich habe eine LED zwischen Pin 26 und Masse angeschlossen.

Bei meinem Windows 10 Raspberry Pi kann ich einfach zur Adresse navigieren:

http://192.168.1.125:5000/api/pins

Dies gibt eine JSON-Liste mit Pins und Logikebenen zurück (es ist wahrscheinlich eine leere Liste, wenn Sie dies noch nie zuvor ausgeführt haben).

Um einen Pin einzuschalten, verwenden wir ein Firefox-Plugin wie HttpRequester.

  • Geben Sie als URL die obige URL ein (http://192.168.1.125:5000/api/pins).
  • Wählen Sie die Registerkarte „Parameter“ (wie unten gezeigt) und fügen Sie Name-Wert-Paare hinzu:
    • pinId =26
    • Status =1
  • Klicken Sie nun auf den „POST“-Button

Die Website antwortet mit einem HTTP-Status von 200 OK und dem Logikpegel von GPIO-Pin 26.

Der Logikpegel ist 1, was bedeutet, dass die an Pin 26 angeschlossene weiße LED aufleuchtet.

Wenn wir jetzt den Status von Pin 26 finden wollen, können wir ihn mit einem HTTP-Get-Request von:

auslesen

http://192.168.1.125:5000/api/pins/26

Wie unten gezeigt, gibt es eine GET-Anforderung, die einen Status von 200 OK und einen Textwert von High zurückgibt – was wir erwarten, da wir gerade den Pin aktiviert haben.

Lassen Sie uns zum Schluss einfach eine HTTP-Get-Anforderung ohne Angabe der PIN-ID ausgeben, um alle Status abzurufen – wieder erhalten wir einen 200-OK-Code und ein JSON-Objekt, das die offene GPIO-Pin und ihren Status auflistet.

Zum Testen von Ubuntu ist der Prozess identisch, außer dass ich die IP-Adresse meines Ubuntu Raspberry Pi (die 192.168.1.110 ist) ersetzen musste. Durch Wiederholen des obigen Vorgangs wird die am Ubuntu Raspberry Pi angebrachte orangefarbene LED eingeschaltet (siehe unten)

Abschluss

Das ist alles für dieses Mal – wir haben gesehen, wie man von einer .NET Core 2-Web-API auf GPIO-Pins zugreift und diese Anwendung auf einem Raspberry Pi 3 bereitstellt, auf dem entweder Windows 10 IoT Core oder Ubuntu 16.04 ausgeführt wird. Diese Technik ermöglicht es uns, die Funktionen des Raspberry Pi von einer größeren Vielfalt von Schnittstellen als nur einer Konsole aus zu nutzen – wir könnten also einen Browser oder sogar eine HoloLens- oder Xbox-App verwenden.

Über mich: Ich poste regelmäßig über .NET – wenn Sie interessiert sind, folgen Sie mir bitte auf Twitter oder sehen Sie sich hier meine früheren Beiträge an. Danke!