我尝试使用带有 PI4J 的 Struts2 Web 框架来更改 Tomcat 9 Web 容器上 Rapsberry 3B+ 设备上的继电器状态。
我的行动课。
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;
}
}
我的 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>
执行时我得到错误类型异常报告
消息过滤器执行抛出异常
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)
此外,我使用代码创建了 Java swing 应用程序,并且可以在 Windows 上运行时使用 application.Output 中的按钮更改重播状态。
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)
有人使用 Struts2 和 PI4J 来更改继电器状态吗?
更新:我在日志中发现了这个
[2020-06-11 19:08:54] [info] 部署 Web 应用程序存档 [/var/lib/tomcat8/webapps/Relay.war] [2020-06-11 19:09:14] [info] 至少扫描了一个 JAR 以查找 TLD,但未包含 TLD。启用此记录器的调试日志记录以获取完整的 JAR 列表,这些 JAR 为 sc$ [2020-06-11 19:09:15] [info] Web 应用程序存档的部署 [/var/lib/tomcat8/webapps/Relay.war]已在 [21,194] 毫秒内完成 [2020-06-11 19:09:24] [信息] 警告:发生了非法反射访问操作 [2020-06-11 19:09:24] [信息] 警告:非法反射通过ognl.OgnlRuntime(文件:/var/lib/tomcat8/webapps/Relay/WEB-INF/lib/ognl-3.0.6.jar)访问方法java.uti$ [2020-06-11 19:09:24 ] [info] 警告:请考虑将此报告给 ognl.OgnlRuntime [2020-06-11 19:09:24] [info] 警告的维护者:使用 --illegal-access=warn 启用对进一步非法反射访问操作的警告 [2020-06-11 19:09:24] [info] 警告:所有非法访问操作将在未来版本中被拒绝 [2020-06- 11 19:09:28] [信息] 连线PiSetup:无法打开 /dev/mem 或 /dev/gpiomem:Brak dostępu。[2020-06-11 19:09:28] [info] 中止您的程序,因为如果它无法访问 GPIO [2020-06-11 19:09:28] [info] 硬件那么它肯定不会工作[2020-06-11 19:09:28] [info] 尝试使用 sudo 运行?
最重要的是 无法打开 /dev/mem 或 /dev/gpiomem:无法访问。让我检查一下,然后给你。
更新:通过将用户 tomcat8 添加到 gpio 组开始工作
sudo adduser tomcat8 gpio
感谢所有看我帖子的人!
请告诉我。斯瓦维克,