I decide to use the Jetty Servlet engine. This is a light weight web server and would take less resources than using an instance of Apache Tomcat. This was downloaded from http://www.eclipse.org/jetty/ and installed onto the Pi .Once installed jetty can be started going to the installation directory and issuing the command:
sudo java -jar start.jar
Jetty on it's own does not require sudo access but to access the GPIO port on the pi requires root. This is  not a good idea for any production environments or internet facing services.
I then created my servlet code and configuration in Eclipse on my desktop pc. The code was exported from eclipse as a war file and then copied into the webapps directory of jetty on the pi. If jetty is running it will scan this directory and automatically install the servlet. I found if updating the war file it was a good idea to restart jetty or strange errors seem to creep in.
I added a basic html form to allow the number of the LED to be activated to be entered by the user and posted to the servlet.
This is accessible at:8080/BerryPi_Servlet/ 
I added a basic html form to allow the number of the LED to be activated to be entered by the user and posted to the servlet.
![]()  | 
| The form allowing users to select an LED | 
This is accessible at
The code is once again built using the Pi4J library from the Pi4J Project (http://pi4j.com/).
The Eclipse project including the exported WAR file can be found on bitbucket:
https://bitbucket.org/chughes42/berryclipws/src
The bulk of the java code is shown below
BerryPiWS.java
package com.qubecad.pi.berrypiws;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
/**
 * Servlet class BerryPiWS to Control the Berry Clip for the raspberry Pi
 * available from http://www.raspberrypi-spy.co.uk/ 
 */
public class BerryPiWS extends HttpServlet {
 private static final long serialVersionUID = 1L;
 GpioController gpio;
 GpioPinDigitalOutput pina;
 GpioPinDigitalOutput pinb;
 GpioPinDigitalOutput pinc;
 GpioPinDigitalOutput pind;
 GpioPinDigitalOutput pine;
 GpioPinDigitalOutput pinf;
 /**
  * Default constructor.
  */
 public BerryPiWS() {
  GpioController gpio = GpioFactory.getInstance();
  // Set up the pins and set low to start
  System.out.println("Setting up GPIO Pins for output");
  pina = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_07, "Pin A",
    PinState.LOW);
  pinb = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00, "Pin B",
    PinState.LOW);
  pinc = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_03, "Pin C",
    PinState.LOW);
  pind = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_12, "Pin D",
    PinState.LOW);
  pine = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_13, "Pin E",
    PinState.LOW);
  pinf = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_14, "Pin F",
    PinState.LOW);
 }
 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
  *      response)
  */
 protected void doPost(HttpServletRequest request,
   HttpServletResponse response) throws ServletException, IOException {
  // get the number of the LED to turn on and print to console
  String action = request.getParameter("action");
  System.out.println("action=" + request.getParameter("action"));
  try {
   // activate the request light, pause and reset.
   if (action.equals("1")) {
    System.out.println("A high");
    pina.high();
    Thread.sleep(1000);
    pina.low();
   } else if (action.equals("2")) {
    System.out.println("B high");
    pinb.high();
    Thread.sleep(1000);
    pinb.low();
   } else if (action.equals("3")) {
    System.out.println("C high");
    pinc.high();
    Thread.sleep(1000);
    pinc.low();
   } else if (action.equals("4")) {
    System.out.println("D high");
    pind.high();
    Thread.sleep(1000);
    pind.low();
   } else if (action.equals("5")) {
    System.out.println("E high");
    pine.high();
    Thread.sleep(1000);
    pine.low();
   } else if (action.equals("6")) {
    System.out.println("F high");
    pinf.high();
    Thread.sleep(1000);
    pinf.low();
   }
  } catch (InterruptedException e) {
   System.out.print("Exception ");
  }
  // display the LED select form on the return page
  PrintWriter out = response.getWriter();
  String pagehtml = "";
  // if there was a valid LED number display a message
  if ("123456".contains(action)) {
   pagehtml = pagehtml + "
LED number " + action + " selected
";
  }
  String pagehtmlform = "
";
  out.println(pagehtml + pagehtmlform);
 }
}
Links:The Pi4J Project http://pi4j.com/
Raspberry Pi Spy http://www.raspberrypi-spy.co.uk/berryclip-6-led-add-on-board/
Jetty Web Server http://www.eclipse.org/jetty/


1 comment:
In Debian systems, you usually need to be a member of group "dialout" to use serial ports. Have you tried this yet?
Post a Comment