2016-04-28 5 views
0

Я использую Java (через обработку) для запуска Pubnub и пытается интегрировать его со встроенным графиком EON javascript. Пока я получаю опубликованные значения на консоли (которые я проверяю с помощью отдельного сценария для подписки), я не получаю никаких данных EON. Я почти уверен, что это связано с формированием, но я на полную потерю.Проблемы с формированием диаграммы EON с помощью PubNub

Вот что я пробовал:

Я попытался с помощью команды transform в моем встроенный JavaScript, чтобы попытаться получить его в нужный формат. Я не совсем понимаю, какой формат transform хочет видеть, но я попробовал строки значений, значения как ints и свою собственную форматированную строку формата 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); 
} 

Я также попытался использовать объекты JSON в Java, но я получаю очень странные ошибки с publish. Перед запуском publish выделяется следующая ошибка: «Функция« Опубликовать() »ожидает таких параметров, как:« publish (String, JSONObject, Callback) ». Это странно, потому что я даю все это. Затем во время выполнения я получаю : «Метод publish (String, JSONObject, Callback) в типе PubnubCoreAsync неприменим для аргументов (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

Ok! Теперь я попытаюсь объяснить, как я это решил. Решение охватывает как проблемы форматирования с проблемами объекта EON и JSON при обработке. Я постараюсь поразить оба.Чтобы заставить его работать, я использовал общий канал датчика pubnub как хороший ресурс: https://www.pubnub.com/developers/realtime-data-streams/sensor-network/ Мой основной подход состоял в том, чтобы попугать этот канал на моем собственном канале, а затем преобразовать его в то, что я действительно хотел отправить.

JSON форматирование: Долгий срок службы, если вы хотите, чтобы графики EON правильно преобразовывали ваши опубликованные значения, они должны быть отправлены как org.json.JSONObject в вашей команде публикации. Я никогда не мог использовать команду публикации, которая взяла строку, и сама JSONing. Даже когда я выпустил тот же формат, что и вход для публикации, который должен был быть преобразован в JSON EON, он отклонил его.

Итак, первый пункт, используйте org.json.JSONObject в качестве входных данных для публикации.

Это приводит нас к тому, как создать такой объект в обработке, что непросто.

org.json.JSONObject Обработка: Поскольку у обработки есть свой собственный тип JSONObject, org.json.JSONObject должен использоваться явно. Оттуда вам необходимо использовать синтаксис, описанный here, для правильного форматирования объекта JSON. Существует твист, новое создание объекта JSON должно быть помещено в оператор try, иначе обработка будет жаловаться на наличие отмеченного необработанного исключения. Это более подробно описывается 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. Этот код посылает 6 значений каждых 5s на графику:

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

Где ваша реализация Callback() для этого publish в этом коде:

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

new Callback() {} пустая реализация 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-коду. Это публикация не должна работать из-за того, что у нее нет реализации для параметра класса обратного вызова. –

+0

Спасибо! Но я не думаю, что это основная проблема. Я думаю, что может произойти то, что как обработка, так и библиотека pubnub имеют тип 'JSONObject'. Вы уже увидите, что у меня есть 'processing.data.JSONObject write;' вместо обычного 'JSONObject write'. Когда у меня есть полный обратный вызов, он говорит, что ищет 'org.json.JSONObject' не' process.data.JSONObject'. Проблема в том, что я понятия не имею, как создать org.json.JSONObject. – Murenrb

Смежные вопросы