2016-04-28 24 views
0

我正在使用Java(通過處理)來運行Pubnub並嘗試將其與嵌入式JavaScript EON圖形進行集成。雖然我將控制檯發佈的值發佈(我使用單獨的訂閱腳本查看),但我沒有收到任何EON數據。我幾乎肯定這與格式有關,但是我完全失敗了。EON圖表通過PubNub格式化問題

這是我曾嘗試:

我在嵌入的JavaScript使用transform命令來嘗試進入它的正確格式嘗試。我不完全明白transform想要看到什麼格式,但我嘗試過使用字符串的值,值作爲整數,以及我自己格式化的JSON格式的字符串。我使用公共流here來測試我的嵌入式代碼是否正常工作。它是!現在我只想獲得一個處理腳本,它將輸入複製到該代碼中。我目前的嘗試是在下面,你可以看到我試圖複製正在發佈的消息。現在,嵌入式代碼只能獲取時間戳。 IE,它會填充x軸並在獲取新發布時進行更新,但不會繪製數據。我確信這是一個格式問題,我不知道還有什麼可以嘗試的。

import com.pubnub.api.*; 
import org.json.*; 
import java.util.*; 
Pubnub pubnub = new Pubnub("pub-c-ca3babb0-c900-4a8e-9524-fc2ae26847da", "sub-c-d0682e0e-04e9-11e6-a8fd-02ee2ddab7fe"); 

void setup() 
{ 

    try { 
    pubnub.subscribe("NSFPhaseII", new Callback() { 
     @Override 
     public void connectCallback(String channel, Object message) { 
     pubnub.publish("NSFPhaseII", "Hello from the PubNub Java SDK", new Callback() {}); 
     } 

     @Override 
     public void disconnectCallback(String channel, Object message) { 
     System.out.println("SUBSCRIBE : DISCONNECT on channel:" + channel 
      + " : " + message.getClass() + " : " 
      + message.toString()); 
     } 

     public void reconnectCallback(String channel, Object message) { 
     System.out.println("SUBSCRIBE : RECONNECT on channel:" + channel 
      + " : " + message.getClass() + " : " 
      + message.toString()); 
     } 

     @Override 
     public void successCallback(String channel, Object message) { 
     System.out.println("SUBSCRIBE : " + channel + " : " 
      + message.getClass() + " : " + message.toString()); 
     } 

     @Override 
     public void errorCallback(String channel, PubnubError error) { 
     System.out.println("SUBSCRIBE : ERROR on channel " + channel 
      + " : " + error.toString()); 
     } 
    } 
    ); 
    } 
    catch (PubnubException e) { 
    System.out.println(e.toString()); 
    } 
} 

void draw() { 

    Date TimeStamp = new Date(); 
    long current = TimeStamp.getTime()/1000; // 

    //String m = "{\"ambient_temperature\":\"10\",\"radiation_level\":\"15\",\"humidity\":\"30\",\"sensor_uuid\":\"probe-dff03902\",\"photosensor\":\"39\",\"timestamp\":"+str(current)+"}"; 
    String m = "{ambient_temperature:'10',radiation_level:'15',humidity:'30',sensor_uuid:'probe-dff03902',photosensor:'39',timestamp:"+str(current)+"}"; 
    println(m); 

    Callback callback = new Callback() { 
    public void successCallback(String channel, Object response) { 
     System.out.println(response.toString()); 
    } 
    public void errorCallback(String channel, PubnubError error) { 
     System.out.println(error.toString()); 
    } 
    }; 
    pubnub.publish("NSFPhaseII", m, callback); 
    delay(5000); 
} 

我也試圖在Java中使用JSON對象,但我得到真正奇怪的錯誤與publish。在運行時publish突出顯示,出現以下錯誤:「函數」Publish()「預期參數,如:」發佈(字符串,JSONObject,回調)「這是奇怪的,因爲我給它所有這些東西。 :「PubnubCoreAsync類型中的publish(String,JSONObject,Callback)方法不適用於參數(String,JSONObject,net Callback(){})。這更加奇怪,因爲運行前錯誤是我需要提供所有這些確切的事情。我相信問題是pubnub需要的庫具有JSONObject類型,處理也是如此,這兩種類型都不能正常工作。

不管怎麼說,這是我的嵌入的JavaScript是從here直接複製:

<html> 
    <head> 

    <script type="text/javascript" src="http://pubnub.github.io/eon/v/eon/0.0.10/eon.js"></script> 
    <link type="text/css" rel="stylesheet" href="http://pubnub.github.io/eon/v/eon/0.0.10/eon.css" /> 

    </head> 
    <body> 
    <div id="chart"></div> 
    <script> 
    // using the example stream from 
    // http://www.pubnub.com/developers/data-streams/sensor-network 
    var pubnub = PUBNUB.init({ 
     subscribe_key: 'sub-c-d0682e0e-04e9-11e6-a8fd-02ee2ddab7fe', //rebound 
     //subscribe_key: 'sub-c-5f1b7c8e-fbee-11e3-aa40-02ee2ddab7fe', 
     ssl: true 
    }); 
    eon.chart({ 
     pubnub: pubnub, 
     history: false, 
     channel: 'NSFPhaseII', 
     //channel: 'pubnub-sensor-network', 
     limit: 100, 
     rate: 10, 
     ssl: true, 
     debug: true, 
     generate: { 
      transition: { 
       duration: 3 
      }, 
      bindto: '#chart', 
      data: { 
       x: 'x' 
      }, 
      axis: { 
       x: { 
        type: 'timeseries', 
        tick: { 
         format: '%H:%m:%S' 
        } 
       } 
      } 
     }, 
     transform: function(m) { 
      return { 
       eon: { 
        'Humidy': m.humidity, 
        'Temperature': m.ambient_temperature, 
        'Light': m.photosensor 
       } 
      } 
     } 
    }); 
    </script> 
    </body> 
</html> 

,這裏是我的處理.pde。在這個版本中,我將它設置爲發佈JSON。

import com.pubnub.api.*; 
import org.json.*; 
processing.data.JSONObject write; 
Pubnub pubnub = new Pubnub("pub-c-ca3babb0-c900-4a8e-9524-fc2ae26847da", "sub-c-d0682e0e-04e9-11e6-a8fd-02ee2ddab7fe"); 



void setup() 
{ 
    write = new processing.data.JSONObject(); 

try { 
    pubnub.subscribe("NSFPhaseII", new Callback() { 
     //@Override 
     //public void connectCallback(String channel, Object message) { 
     // pubnub.publish("NSFPhaseII", "Hello from the PubNub Java SDK", new Callback() {}); 
     //} 

     @Override 
     public void disconnectCallback(String channel, Object message) { 
      System.out.println("SUBSCRIBE : DISCONNECT on channel:" + channel 
        + " : " + message.getClass() + " : " 
        + message.toString()); 
     } 

     public void reconnectCallback(String channel, Object message) { 
      System.out.println("SUBSCRIBE : RECONNECT on channel:" + channel 
        + " : " + message.getClass() + " : " 
        + message.toString()); 
     } 

     @Override 
     public void successCallback(String channel, Object message) { 
      System.out.println("SUBSCRIBE : " + channel + " : " 
        + message.getClass() + " : " + message.toString()); 
     } 

     @Override 
     public void errorCallback(String channel, PubnubError error) { 
      System.out.println("SUBSCRIBE : ERROR on channel " + channel 
        + " : " + error.toString()); 
     } 
    } 
); 
} catch (PubnubException e) { 
    System.out.println(e.toString()); 
} 
} 

void draw(){ 


    write.setFloat("var1", random(10)); 
    write.setFloat("var2", random(10)); 
    write.setFloat("var3", random(10)); 

    //saveJSONObject(write, "data/new.json"); 


    pubnub.publish("NSFPhaseII", write,new Callback() {}); 
    delay(15000); 
} 

歡迎任何想法。

回答

0

好!現在我將嘗試解釋我是如何解決這個問題的。該解決方案跨越處理EON和JSON對象問題的格式問題。我會盡力擊中兩者。爲了使它工作,我使用公共pubnub傳感器頻道作爲一個很好的資源:https://www.pubnub.com/developers/realtime-data-streams/sensor-network/我的基本方法是在我自己的頻道上吟誦此頻道,然後將其轉換爲我實際想要發送的內容。

JSON格式: 缺點是,如果您希望EON圖表正確地轉換髮布的值,則必須在發佈命令中將其作爲org.json.JSONObject發送。我從來沒有能夠使用一個帶字符串的發佈命令,並自行完成JSON。即使我製作了與發佈的輸入完全相同的格式,該格式應該已轉換爲JSON EON也會拒絕它。

所以,第一點,使用org.json.JSONObject作爲發佈的輸入。

這給我們帶來了如何在Processing中創建這樣一個對象,這並不容易。

org.json.JSONObject處理: 由於Processing具有自己的JSONObject類型,因此必須明確使用org.json.JSONObject。從那裏,您需要使用描述here的語法來正確格式化JSON對象。有一個轉折,新的JSON對象創建必須放在一個try語句中,否則Processing將會抱怨檢查到未處理的異常。這是由比我更聰明的人更詳細地覆蓋here!下面是使用庫存org.json.JSONObject庫一些示例代碼:

import org.json.*; 

void setup() { 
    String str = "{ \"name\": \"Alice\", \"age\": 20 }"; 
    org.json.JSONObject json; 
    try { 
    json = new org.json.JSONObject(str); 
    String n = json.getString("name"); 
    int a = json.getInt("age"); 
    println(n + " " + a); 
    } 
    catch (org.json.JSONException e) { 
    System.err.println(e); 
    exit(); 
    } 

} 

void draw() { 
} 

一旦你有了這個對象,你可以使用發佈命令,通告的公佈事情的EON圖!

這裏是從上面更新的代碼,現在創建一個活的EON圖表。此代碼將每5秒6個值圖表:

import com.pubnub.api.*; 
import org.json.*; 
import java.util.*; 
Pubnub pubnub = new Pubnub("pub-c-ca3babb0-c900-4a8e-9524-fc2ae26847da", "sub-c-d0682e0e-04e9-11e6-a8fd-02ee2ddab7fe"); 

org.json.JSONObject m; 
Callback callback = new Callback() { 
    public void successCallback(String channel, Object response) { 
     System.out.println(response.toString()); 
    } 
    public void errorCallback(String channel, PubnubError error) { 
     System.out.println(error.toString()); 
    } 
    }; 

void setup() 
{ 
    try { 
    pubnub.subscribe("NSFPhaseII",callback); 
    } 
    catch (PubnubException e) { 
    System.out.println(e.toString()); 
    } 
} 

void draw() { 

    Date TimeStamp = new Date(); 
    long current = TimeStamp.getTime()/1000; // 
    String m1 = "\"T0\":\""+str(random(10))+"\","; 
    String m2 = "\"T5\":\""+str(random(10))+"\","; 
    String m3 = "\"T6\":\""+str(random(10))+"\","; 
    String m4 = "\"T8\":\""+str(random(10))+"\","; 
    String m5 = "\"T9\":\""+str(random(10))+"\","; 
    String m6 = "\"T13\":\""+str(random(10))+"\","; 
    String m7 = "\"timestamp\":\""+current+"\","; 

    try { 
    m = new org.json.JSONObject("{"+m1+m2+m3+m4+m5+m6+m7+"}"); 
    } 
    catch (org.json.JSONException e) { 
    System.err.println(e); 
    exit(); 
    } 
    pubnub.publish("NSFPhaseII", m, callback); 
    delay(5000); 
} 

希望這有助於利用處理做這樣的事3人...

0

哪裏是你爲這個publish本規範Callback()實現:

pubnub.publish("NSFPhaseII", write,new Callback() {});

new Callback() {}是空的實現回調

您需要通過具有回調類的一個實例全部執行如下:

Callback callback = new Callback() { 
    public void successCallback(String channel, Object response) { 
    System.out.println(response.toString()); 
    } 
    public void errorCallback(String channel, PubnubError error) { 
    System.out.println(error.toString()); 
    } 
}; 
    Callback callback = new Callback() { 
    public void successCallback(String channel, Object response) { 
    System.out.println(response.toString()); 
    } 
    public void errorCallback(String channel, PubnubError error) { 
    System.out.println(error.toString()); 
    } 
}; 
pubnub.publish("NSFPhaseII", write, callback); 

本:

pubnub.publish("NSFPhaseII", write, callback); 

,而不是:

pubnub.publish("NSFPhaseII", write,new Callback() {}); 
+0

那是需要EON圖表?這不能解決格式錯誤。我現在得到錯誤: – Murenrb

+0

我只是解決你的Java代碼。該發佈不應該起作用,因爲它沒有Callback類參數的實現。 –

+0

謝謝!但我不認爲這是核心問題。我認爲可能發生的情況是,處理和pubnub庫都具有類型「JSONObject」。在上面你會看到我有'processing.data.JSONObject write;'而不是普通的'JSONObject write'。當我有一個完整的回調,它說它正在尋找一個'org.json.JSONObject'而不是'processing.data.JSONObject'。問題是我不知道如何生成org.json.JSONObject。 – Murenrb