首页 > 解决方案 > Struts2 和 PI4J

问题描述

我尝试使用带有 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

感谢所有看我帖子的人!

请告诉我。斯瓦维克,

标签: javastruts2pi4j

解决方案


推荐阅读