Java-servlets en Raspberry Pi IO

Ik probeer te leren hoe ik eenvoudige servlets moet schrijven voor gebruik met een Raspberry Pi. Ik wil de I/O van het bord via web beheren. Ik gebruik de Pi4J-bibliotheek die een wrapper is voor de WiringPi C-bibliotheek. Het werkt wanneer ik het gebruik om een ​​led lokaal te laten knipperen, dus ik neem aan dat ik iets verkeerd doe mijn servlet coderen.

Dit is de code die ik schreef:

package com.luca.servlet;

import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.PinState;

public class MyServlet extends javax.servlet.http.HttpServlet {

  private GpioController gpio=GpioFactory.getInstance();
  private GpioPinDigitalOutput redLed=gpio.provisionDigitalOutputPin(RaspiPin.GPIO_23,PinState.LOW);
  private GpioPinDigitalOutput greenLed=gpio.provisionDigitalOutputPin(RaspiPin.GPIO_22,PinState.LOW);
  private GpioPinDigitalOutput blueLed=gpio.provisionDigitalOutputPin(RaspiPin.GPIO_21,PinState.LOW);
  private GpioPinDigitalOutput[] pins=new GpioPinDigitalOutput[]{redLed,greenLed,blueLed};

  @Override
  public void doGet(javax.servlet.http.HttpServletRequest request,javax.servlet.http.HttpServletResponse response) throws java.io.IOException {
    java.io.PrintWriter print=response.getWriter();
    print.write("<body>"+ 
                   "

Choose a color!

"+ "<form action=\"first\" method=\"POST\">"+ "<input type=\"submit\" name=\"button\" value=\"red\"/>"+ "</form>"+ "<form action=\"first\" method=\"POST\">"+ "<input type=\"submit\" name=\"button\" value=\"green\"/>"+ "</form>"+ "<form action=\"first\" method=\"POST\">"+ "<input type=\"submit\" name=\"button\" value=\"blue\"/>"+ "</form>"+ "</body>"); } public void doPost(javax.servlet.http.HttpServletRequest request,javax.servlet.http.HttpServletResponse response) throws java.io.IOException { java.io.PrintWriter pw=response.getWriter(); String act=request.getParameter("button"); switch(act) { case "red": togglePin(); redLed.high(); pw.write("

the led is red!

"); break; case "green": togglePin(); greenLed.high(); pw.write("

the led is green

"); break; case "blue": togglePin(); blueLed.high(); pw.write("

the led is blue!

"); break; } } private void togglePin() { for (GpioPinDigitalOutput pin : pins) if (pin.isHigh()) pin.toggle(); }

het compileert prima en ik gebruik het handmatig in tomcat, met de inzetdescriptor en alles. Maar wanneer ik verbinding maak, zegt het me dat de bron niet beschikbaar is. Als ik de GPIO-gerelateerde code verwijder, werkt het prima.

1
Het is een toestemmingsprobleem zoals aangegeven door @joan. De applet wordt uitgevoerd in de context van de webserver en heeft (dus) geen rootprivileges.
toegevoegd de auteur Florian Bösch, de bron
@Luca Ik ging ervan uit dat je raspbian-tomcat-pakketten gebruikte. Merk op dat het ongelooflijk gevaarlijk is om een ​​webserver als root uit te voeren. Eén beveiligingsprobleem in beide kater of uw code en de indringer heeft rootprivileges op uw systeem.
toegevoegd de auteur Florian Bösch, de bron
Is het een toestemmingsprobleem? bedrading Pi heeft rootprivileges nodig om toegang te krijgen tot de GPIO. Heeft uw applet rootprivileges?
toegevoegd de auteur joan, de bron
Ik heb een softwarepakket waarvan ik denk dat het doet wat u probeert te bereiken. Als een voormalige technicus kan dit voldoen aan uw behoeften. Zie grapl.16mb.com
toegevoegd de auteur Vinu M Shankar, de bron
@DiederikdeHaas Ik start tomcat als sudo ./startup.sh
toegevoegd de auteur user658182, de bron

1 antwoord

Ik ben er eindelijk achter gekomen wat het probleem was! Ik vergat de Pi4J-bibliotheken (de potten) toe te voegen aan de lib-submap van mijn webapplicatie. Dat was stom: D. Toch bedankt!

2
toegevoegd
Markeer dit als beantwoord. Bedankt.
toegevoegd de auteur ppumkin, de bron