java - 如何调用GpioPinListenerDigital(Pi4J/RaspberryPi)中的Web服务?

标签 java web-services raspberry-pi

我想在 PIR 传感器处于 Activity 状态时调用网络服务。 我使用 wsimport 创建了 Web 服务调用: wsimport -keep -s src http://webservicex.net/geoipservice.asmx?WSDL

我使用 pi4j ( http://pi4j.com/ ) 项目库向我的 Raspberry Pi 编写了一个测试应用程序。在此代码中,在启动时调用该服务,并在 PIR 传感器激活时再次调用。 第一次调用是正确的,但是当我尝试调用 GpioPinListenerDigital 对象的 handleGpioPinDigitalStateChangeEvent 方法时,我遇到了 NullPointerException。

package me.losadrian.Pirel;

import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;

import net.webservicex.GeoIP;
import net.webservicex.GeoIPService;
import net.webservicex.GeoIPServiceSoap;

public class App {
    public static void main(String[] args) {

        GeoIPService service = new GeoIPService();
        GeoIPServiceSoap client = service.getGeoIPServiceSoap();
        GeoIP geoIp = client.getGeoIP("74.125.239.142");
        System.out.println(geoIp.getCountryName());

        final GpioController gpioPIR = GpioFactory.getInstance();
        final GpioPinDigitalInput sensorPir = gpioPIR.provisionDigitalInputPin(RaspiPin.GPIO_07, PinPullResistance.PULL_DOWN);

        final GpioController gpioREL1 = GpioFactory.getInstance();           
        final GpioPinDigitalOutput rel1 = gpioREL1.provisionDigitalOutputPin(RaspiPin.GPIO_08, "REL", PinState.HIGH);         
        final GpioController gpioREL2 = GpioFactory.getInstance();           
        final GpioPinDigitalOutput rel2 = gpioREL2.provisionDigitalOutputPin(RaspiPin.GPIO_09, "REL", PinState.HIGH);         

        rel1.high();
        rel2.high();

        sensorPir.addListener(new GpioPinListenerDigital() {

            public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
                if (event.getState().isHigh()) {
                    System.out.println("Motion!!");
                    GeoIPService service = new GeoIPService();
                    GeoIPServiceSoap client = service.getGeoIPServiceSoap();
                    GeoIP geoIp = client.getGeoIP("74.125.239.142");
                    System.out.println(geoIp.getCountryName());
                    rel1.low();
                    rel2.high();
                }
                if (event.getState().isLow()) {
                    System.out.println("Quiet...");
                    rel1.high();
                    rel2.low();
                }
            }
        });

        try {
            for (;;) {
                Thread.sleep(3000);
            }
        } catch (final Exception e) {
            System.out.println(e.getMessage());
        }

    }
}

控制台输出为:

pi@raspberrypi ~ $ sudo java -jar Pirel.jar 
United States
Motion!!
Exception in thread "pi4j-gpio-event-executor-0" java.lang.NullPointerException
    at com.sun.xml.internal.ws.client.ClientContainer$1.getResource(ClientContainer.java:45)
    at com.sun.xml.internal.ws.assembler.MetroConfigLoader.locateResource(MetroConfigLoader.java:220)
    at com.sun.xml.internal.ws.assembler.MetroConfigLoader.locateResource(MetroConfigLoader.java:230)
    at com.sun.xml.internal.ws.assembler.MetroConfigLoader.init(MetroConfigLoader.java:125)
    at com.sun.xml.internal.ws.assembler.MetroConfigLoader.<init>(MetroConfigLoader.java:104)
    at com.sun.xml.internal.ws.assembler.TubelineAssemblyController.getTubeCreators(TubelineAssemblyController.java:78)
    at com.sun.xml.internal.ws.assembler.MetroTubelineAssembler.createClient(MetroTubelineAssembler.java:103)
    at com.sun.xml.internal.ws.client.Stub.createPipeline(Stub.java:328)
    at com.sun.xml.internal.ws.client.Stub.<init>(Stub.java:295)
    at com.sun.xml.internal.ws.client.Stub.<init>(Stub.java:228)
    at com.sun.xml.internal.ws.client.Stub.<init>(Stub.java:243)
    at com.sun.xml.internal.ws.client.sei.SEIStub.<init>(SEIStub.java:84)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.getStubHandler(WSServiceDelegate.java:814)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.createEndpointIFBaseProxy(WSServiceDelegate.java:803)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:436)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:404)
    at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:386)
    at javax.xml.ws.Service.getPort(Service.java:119)
    at net.webservicex.GeoIPService.getGeoIPServiceSoap(GeoIPService.java:72)
    at me.losadrian.Pirel.App$1.handleGpioPinDigitalStateChangeEvent(App.java:42)
    at com.pi4j.io.gpio.tasks.impl.GpioEventDispatchTaskImpl.run(GpioEventDispatchTaskImpl.java:66)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:744)
Quiet...

有人知道如何更改此代码吗? 预先感谢您提供的任何帮助。

最佳答案

也许我找到了解决方案:

  • 如果我创建静态 GeoIPService 和 GeoIPServiceSoap 类变量,服务调用就会起作用。
  • 如果我在主程序中的处理程序之前创建最终的 GeoIPServiceSoap 局部变量,则服务调用将起作用。

.

package me.losadrian.Pirel;

import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalInput;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinPullResistance;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
import com.pi4j.io.gpio.event.GpioPinDigitalStateChangeEvent;
import com.pi4j.io.gpio.event.GpioPinListenerDigital;

import net.webservicex.GeoIP;
import net.webservicex.GeoIPService;
import net.webservicex.GeoIPServiceSoap;

public class App {
// Works here
//  static GeoIPService service = new GeoIPService();
//  static GeoIPServiceSoap client = service.getGeoIPServiceSoap();

    public static void main(String[] args) {
        // Works here too
        GeoIPService service = new GeoIPService();
        final GeoIPServiceSoap client = service.getGeoIPServiceSoap();

        final GpioController gpioPIR = GpioFactory.getInstance();
        final GpioPinDigitalInput sensorPir = gpioPIR.provisionDigitalInputPin(RaspiPin.GPIO_07, PinPullResistance.PULL_DOWN);

        final GpioController gpioREL1 = GpioFactory.getInstance();           
        final GpioPinDigitalOutput rel1 = gpioREL1.provisionDigitalOutputPin(RaspiPin.GPIO_08, "REL", PinState.HIGH);         
        final GpioController gpioREL2 = GpioFactory.getInstance();           
        final GpioPinDigitalOutput rel2 = gpioREL2.provisionDigitalOutputPin(RaspiPin.GPIO_09, "REL", PinState.HIGH);         

        rel1.high();
        rel2.high();

        sensorPir.addListener(new GpioPinListenerDigital() {

            public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event) {
                if (event.getState().isHigh()) {
                    System.out.println("Motion!!");
// Not works here
//                  GeoIPService service = new GeoIPService();
//                  GeoIPServiceSoap client = service.getGeoIPServiceSoap();
                    GeoIP geoIp = client.getGeoIP("212.58.246.92");
                    System.out.println(geoIp.getCountryName());
                    rel1.low();
                    rel2.high();
                }
                if (event.getState().isLow()) {
                    System.out.println("Quiet...");
                    rel1.high();
                    rel2.low();
                }
            }
        });

        try {
            for (;;) {
                Thread.sleep(3000);
            }
        } catch (final Exception e) {
            System.out.println(e.getMessage());
        }

    }
}

关于java - 如何调用GpioPinListenerDigital(Pi4J/RaspberryPi)中的Web服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32713382/

相关文章:

javascript - 是否可以将多个 BLE 设备连接到一个中央设备?

python - TypeError : 'NoneType' object is unsubscriptable in cv2. 归一化

java - OAuth2 : Confirmation Approval is not working, 即使我单击“批准”按钮也拒绝

java - 在 Java 中等待给定时间

java - Sharepoint Web 服务抛出 Microsoft.SharePoint.SoapServer.SoapServerException

java - 是否有 Google App Engine 等效项可以让您将 SOAP 与 Java 结合使用并且是免费的,或者是 GAE 支持的 SOAP 库吗?

java - ksoap2 序列化错误

java - 用于存储java应用程序中使用的少量数据的数据库

java - 您可以从 MuleESB <choice> 调用 bean 中的方法吗?

python - 树莓派 Omxplayer OpenCV