2016-12-23 70 views
-1

我編寫了python腳本來從傳感器讀取「溫度/溼度」數據,它工作正常並返回結果「23.0/38.0」。從Java調用Python代碼並返回JSON對象

我需要把23.0放在對象成員變量「temperature」中,38.0放在「Humidity」成員變量中,然後返回傳感器對象。

我的問題是,創建的web服務返回溫度和溼度變量爲空。

package raspberryws; 
import java.io.IOException; 
import java.io.InputStream; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 

@Path("DHTService") 
public class DHTService { 
    public DHTService() { 
     super(); 
    } 


@GET 
@Produces(value = { "application/json" }) 
@Path("/readDHT") 
public DHTSensor readDHT11() throws IOException { 
    DHTSensor sensor = new DHTSensor(); 
    int ch; 
    char y; 
    String temp="" ; 
    String humidity="" ; 

    try { 
     Process p = 
      Runtime.getRuntime().exec("sudo python /projects/Adafruit_Python_DHT/examples/AdafruitDHT.py 11 4 "); 
     // get an InputStream for the python stdout 
     InputStream inStream = p.getInputStream(); 
     // read all stdout data one char at a time. 
     while ((ch = inStream.read()) != -1) { 
      System.out.println(ch + " ch"); 
      if ((int) ch == 47) { 
       sensor.setTempreture(temp); 
       humidity=""; 

      } else { 
       if ((int) ch == 10) { 
        continue; 
       } 
       y = (char) ch; 


       temp=temp+y; 
       humidity=humidity+y; 
       sensor.setHumidity(humidity); 
      } 

     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    // System.out.println(x); 
    return sensor; 
} 

}

+0

還真是不多的錯誤檢查在這裏告訴你什麼錯誤 - 是Python的一部分運行:最後,你可以將這些字符串轉換,如果需要鍵入float?你的'解析'工作?爲什麼不只是在整個輸出中讀取並解析它呢? – pvg

+0

是的Python代碼正在運行,它運行在樹莓卡上。 –

+0

如果我打印從python代碼返回的字符串它返回「23.0/38.0」,但是當我將值賦予sensor.temperatur和溼度它返回空 –

回答

0

您可以蒐集在Python腳本中使用BufferedReader讀取輸出的全線一次性輸出(假設一條線生產)。

然後,您可以使用String.split()將字符串拆分爲使用/作爲分隔符的溫度和溼度組件。有

import java.io.*; 

public class Test { 
    public static void main(String[] args) { 
     try { 
      Process p = Runtime.getRuntime().exec("python test.py"); 
      BufferedReader fromChild = new BufferedReader(
             new InputStreamReader(p.getInputStream())); 
      String data = fromChild.readLine(); 
      String[] measurement = data.split("/"); 
      System.out.println("Temperature: " + measurement[0]); 
      System.out.println("Humidity: " + measurement[1]); 

      float temperature = Float.parseFloat(measurement[0]); 
      float humidity = Float.parseFloat(measurement[1]); 
      System.out.println("Temperature (float): " + temperature); 
      System.out.println("Humidity (float): " + humidity); 
     } 
     catch(Exception e) { 
      System.out.println(e.getMessage()); 
     } 
    } 
} 
+0

當我在測試代碼上運行覆盆子,它工作正常,並返回:溫度:38.0 溼度:16.0 溫度(浮點):38.0 溼度(浮點):16.0 但當我調用相同的代碼的Web服務,它在「String [] measurement = data.split(」/「);」「行處引發java.lang.NullPointerException。 –

+0

您需要嘗試調試您的代碼。基於例外,'data'字符串看起來是空的。從子進程讀取行後,嘗試打印出「data」的值。你甚至確定孩子的過程開始了嗎?你怎麼知道的? – mhawke

+0

是的,我通過調用打印python腳本的結果的主方法來調試它,並且它返回正確的值,但是當我將這些值分配給對象屬性並將該類暴露爲webservice時,它返回帶有空值的對象 –