2016-04-28 22 views
0

Ich benutze Java (über die Verarbeitung), um Pubnub und versuchen, das mit einem eingebetteten Javascript EON-Graph zu integrieren. Während ich veröffentlichte Werte auf die Konsole bekomme (die ich mit einem separaten Subskriptions-Skript überprüfe), bekomme ich keine EON-Daten. Ich bin mir fast sicher, dass dies mit der Formatierung zu tun hat, aber ich bin total verloren. HierEON-Diagramm formatieren Probleme über PubNub

ist, was ich habe versucht:

Ich habe versucht, mit dem transform Befehl in meinem eingebetteten Javascript zu versuchen, es in das richtige Format zu bekommen. Ich verstehe nicht ganz, welches Format transform sehen will, aber ich habe versucht, Strings der Werte, die Werte als Ints und meine eigene formatierte Zeichenfolge des JSON-Formats. Ich habe die öffentlichen Streams here verwendet, um zu testen, dass mein eingebetteter Code funktioniert. Und es ist!!! Jetzt versuche ich nur ein Verarbeitungs-Skript zu erhalten, das die Eingabe in diesen Code dupliziert. Mein aktueller Versuch ist unten und wie Sie sehen können, habe ich versucht, die Nachrichten, die gerade veröffentlicht werden, zu kopieren. Im Moment bekommt der eingebettete Code nur den Zeitstempel. IE, es bevölkert die x-Achse und aktualisiert, wie es neue veröffentlicht, aber keine Daten geplottet werden. Ich bin mir sicher, dass dies ein Formatierungsproblem ist, ich habe einfach keine Ahnung, was ich sonst noch versuchen sollte.

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); 
} 

Ich habe auch versucht, JSON-Objekte in Java zu verwenden, aber ich wirklich seltsame Fehler mit publish. Vor der Laufzeit wird publish mit folgendem Fehler hervorgehoben: "Die Funktion" Publish() "erwartet Parameter wie:" publish (String, JSONObject, Callback) ". Das ist merkwürdig, weil ich all diese Dinge gebe. Dann zur Laufzeit bekomme ich : "Die Methode publish (String, JSONObject, Callback) im Typ PubnubCoreAsync gilt nicht für die Argumente (String, JSONObject, net Callback() {}). Was noch merkwürdiger ist als der Fehler vor der Laufzeit war, dass ich genau diese Dinge liefern musste. Ich glaube, das Problem ist, dass die Bibliotheken, die für pubnub benötigt werden, einen JSONObject-Typ haben, und auch die Verarbeitung, und die beiden Typen funktionieren nicht gut.

Wie auch immer, hier ist mein eingebetteter Javascript, die eine direkte Kopie von here ist:

<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> 

und hier ist meine Verarbeitung .pde. In dieser Version habe ich es eingerichtet, den JSON zu veröffentlichen.

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); 
} 

Alle Gedanken sind willkommen.

Antwort

0

Ok! Jetzt werde ich versuchen zu erklären, wie ich das gelöst habe. Die Lösung umfasst sowohl Formatierungsprobleme mit EON- als auch JSON-Objektproblemen bei der Verarbeitung. Ich werde versuchen, beides zu treffen.Um es zum Laufen zu bringen, benutzte ich den öffentlichen Pubnub-Sensor-Kanal als eine gute Ressource: https://www.pubnub.com/developers/realtime-data-streams/sensor-network/ Mein grundlegender Ansatz war, diesen Kanal auf meinem eigenen Kanal zu parapieren und ihn dann zu dem zu konvertieren, was ich eigentlich senden wollte.

JSON-Formatierung: Kurz gesagt, wenn EON-Graphen Ihre publizierten Werte korrekt transformieren sollen, müssen sie als org.json.JSONObject in Ihrem Veröffentlichungsbefehl gesendet werden. Ich war nie in der Lage, einen Veröffentlichungsbefehl zu verwenden, der einen String nahm und das JSONing alleine machte. Selbst wenn ich das exakt gleiche Format wie die zu veröffentlichende Eingabe produzierte, die in eine JSON konvertiert werden sollte, lehnte EON es ab.

Also, ersten Punkt, verwenden Sie ein org.json.JSONObject als Eingabe für die Veröffentlichung.

Das bringt uns zur Erstellung eines solchen Objekts in der Verarbeitung, die nicht einfach ist.

org.json.JSONObject Verarbeitung: Da die Verarbeitung ihren eigenen JSONObject-Typ hat, muss das org.json.JSONObject explizit verwendet werden. Von dort müssen Sie die Syntax here verwenden, um das JSON-Objekt korrekt zu formatieren. Es gibt eine Wendung, die neue JSON-Objekt-Erstellung muss in eine try-Anweisung geschrieben werden, sonst wird die Verarbeitung eine nicht behandelte Ausnahme beanstanden. Dies wird genauer durch here von Menschen, die schlauer als ich! Hier einige Beispiel-Code zur Verwendung der Bibliothek org.json.JSONObject Bibliothek:

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() { 
} 

Sobald Sie dieses Objekt haben, können Sie den Befehl Veröffentlichen verwenden, wie advertized Dinge auf eine EON-Chart zu veröffentlichen!

Hier ist der aktualisierte Code von oben, der jetzt ein Live-EON-Diagramm erstellt. Dieser Code sendet 6 Werte alle 5 Sekunden auf das Diagramm:

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); 
} 

Hope this Sie die 3 Menschen hilft Verarbeitung, so etwas zu tun mit ...

0

Wo ist Ihre Implementierung von Callback() für dieses publish in diesem Code:

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

new Callback() {} ist eine leere Implementierung von Callback

Sie müssen eine Instanz der Callback-Klasse zu übergeben, die eine hat vollständige Implementierung wie folgt:

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); 

Dieses:

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

im Gegensatz zu:

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

dass für EON-Charts ist erforderlich? Dies behebt die Formatierungsfehler nicht. Ich bekomme jetzt den Fehler: – Murenrb

+0

Ich adressiere nur Ihren Java-Code. Diese Veröffentlichung sollte nicht funktionieren, da sie keine Implementierung für den Parameter Callback-Klasse enthält. –

+0

Danke! Aber ich glaube nicht, dass dies das Kernproblem ist. Ich denke, was passiert, ist, dass sowohl die Verarbeitung als auch die pubnub-Bibliothek den Typ "JSONObject" haben. Oben sehen Sie, dass ich 'processing.data.JSONObject write;' anstelle des normalen 'JSONObject write' habe. Wenn ich einen vollständigen Rückruf habe, heißt es, es sucht nach einem 'org.json.JSONObject' und nicht nach einem' processing.data.JSONObject'. Das Problem ist, dass ich keine Ahnung habe, wie man ein org.json.JSONObject erzeugt. – Murenrb