Reputation: 11
I tryied to use a Struts2 web framework with PI4J to change relays status on Rapsberry 3B+ device on Tomcat 9 web container.
My Action class.
package com.action;
import org.apache.log4j.Logger;
import com.opensymphony.xwork2.ActionSupport;
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;
public class RelayAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
final static Logger logger = Logger.getLogger(RelayAction.class);
// create gpio controller
final GpioController gpio = GpioFactory.getInstance();
// provision gpio pin as an output pin and turn on
final GpioPinDigitalOutput output = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_23, "My Output", PinState.HIGH);
public String on() {
logger.error("Start execute : ");
output.setState(PinState.HIGH); // or ... output.high();
return SUCCESS;
}
public String off() {
logger.error("Start execute : ");
output.setState(PinState.LOW); // or ... output.high();
return SUCCESS;
}
}
My JSP
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<title>Pokaż temperaturę</title>
<style>
@media only screen and (max-device-width: 400px) {
html {
-webkit-text-size-adjust : none;
text-size-adjust : none;
}
/* adapt the rest of the mobile interface here */
}
</style>
</head>
<body>
<h2>Przekaznik</h2>
<s:form action="relayAction" method="post">
<s:submit value="ON" align="center" method="on" />
<s:submit value="OFF" align="center" method="off"/>
</s:form>
</body>
</html>
When execute I get error type Exception report
message Filter execution threw an exception
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Filter execution threw an exception
root cause
java.lang.UnsatisfiedLinkError: com.pi4j.wiringpi.Gpio.wiringPiSetup()I
com.pi4j.wiringpi.Gpio.wiringPiSetup(Native Method)
com.pi4j.io.gpio.RaspiGpioProvider.<init>(RaspiGpioProvider.java:69)
com.pi4j.io.gpio.RaspiGpioProvider.<init>(RaspiGpioProvider.java:51)
com.pi4j.platform.Platform.getGpioProvider(Platform.java:125)
com.pi4j.platform.Platform.getGpioProvider(Platform.java:118)
com.pi4j.io.gpio.GpioFactory.getDefaultProvider(GpioFactory.java:109)
com.pi4j.io.gpio.impl.GpioControllerImpl.<init>(GpioControllerImpl.java:53)
com.pi4j.io.gpio.GpioFactory.getInstance(GpioFactory.java:91)
com.action.RelayAction.<init>(RelayAction.java:21)
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
java.lang.reflect.Constructor.newInstance(Unknown Source)
java.lang.Class.newInstance(Unknown Source)
com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:131)
com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:162)
com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:151)
com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:121)
com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:293)
com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:393)
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:194)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:534)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
Aditionally I created Java swing application with code and I can change a status of replays with buttons in application.Output when run on Windows.
cze 11, 2020 9:19:28 PM com.pi4j.util.NativeLibraryLoader load
SEVERE: Unable to load [libpi4j.so] using path: [/lib/raspberrypi/dynamic/libpi4j.so]
java.lang.IllegalArgumentException: The path has to be absolute, but found: \lib\raspberrypi\dynamic\libpi4j.so
at com.pi4j.util.NativeLibraryLoader.loadLibraryFromClasspath(NativeLibraryLoader.java:136)
at com.pi4j.util.NativeLibraryLoader.load(NativeLibraryLoader.java:105)
at com.pi4j.wiringpi.Gpio.<clinit>(Gpio.java:189)
at com.pi4j.io.gpio.RaspiGpioProvider.<init>(RaspiGpioProvider.java:69)
at com.pi4j.io.gpio.RaspiGpioProvider.<init>(RaspiGpioProvider.java:51)
at com.pi4j.platform.Platform.getGpioProvider(Platform.java:125)
at com.pi4j.platform.Platform.getGpioProvider(Platform.java:118)
at com.pi4j.io.gpio.GpioFactory.getDefaultProvider(GpioFactory.java:109)
at com.pi4j.io.gpio.impl.GpioControllerImpl.<init>(GpioControllerImpl.java:53)
at com.pi4j.io.gpio.GpioFactory.getInstance(GpioFactory.java:91)
at main.Main$2.actionPerformed(Main.java:62)
Have sombebody use Struts2 with PI4J to change a relays status?
UPDATE: I found this in logs
[2020-06-11 19:08:54] [info] Deploying web application archive [/var/lib/tomcat8/webapps/Relay.war] [2020-06-11 19:09:14] [info] At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were sc$ [2020-06-11 19:09:15] [info] Deployment of web application archive [/var/lib/tomcat8/webapps/Relay.war] has finished in [21,194] ms [2020-06-11 19:09:24] [info] WARNING: An illegal reflective access operation has occurred [2020-06-11 19:09:24] [info] WARNING: Illegal reflective access by ognl.OgnlRuntime (file:/var/lib/tomcat8/webapps/Relay/WEB-INF/lib/ognl-3.0.6.jar) to method java.uti$ [2020-06-11 19:09:24] [info] WARNING: Please consider reporting this to the maintainers of ognl.OgnlRuntime [2020-06-11 19:09:24] [info] WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations [2020-06-11 19:09:24] [info] WARNING: All illegal access operations will be denied in a future release [2020-06-11 19:09:28] [info] wiringPiSetup: Unable to open /dev/mem or /dev/gpiomem: Brak dostępu. [2020-06-11 19:09:28] [info] Aborting your program because if it can not access the GPIO [2020-06-11 19:09:28] [info] hardware then it most certianly won't work [2020-06-11 19:09:28] [info] Try running with sudo?
Most important is Unable to open /dev/mem or /dev/gpiomem: No access. Let me check it abd back to you.
UPDATE: It starst to work by adding user tomcat8 to gpio group
sudo adduser tomcat8 gpio
Thanks for all viewers of my post!
Please let me know. Sławek,
Upvotes: 1
Views: 75