EN图表通过PubNub格式化问题

时间:2016-04-28 20:53:55

标签: processing real-time dashboard pubnub

我正在使用Java(通过Processing)运行Pubnub并尝试将其与嵌入式javascript EON图表集成。当我将已发布的值发送到控制台(我使用单独的仅订阅脚本检查)时,我没有获得任何EON数据。我几乎肯定这与格式化有关,但我完全失去了。

以下是我的尝试:

我尝试在嵌入式javascript中使用transform命令尝试将其设置为正确的格式。我不完全理解transform希望看到的格式,但我已尝试过值的字符串,值为int,以及我自己的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突出显示以下错误:"函数"发布()" expectes参数如:" publish(String,JSONObject,Callback)"。这很奇怪,因为我正在给它所有这些东西。然后在运行时我得到:"类型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);
}

欢迎任何想法。

2 个答案:

答案 0 :(得分:0)

此代码中此Callback()的{​​{1}}实施位置:

publish

pubnub.publish("NSFPhaseII", write,new Callback() {});是Callback的空实现

您需要传递一个具有完整实现的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);

答案 1 :(得分:0)

确定!现在我将尝试解释我是如何解决这个问题的。该解决方案涵盖了处理EON和JSON对象问题的格式问题。我会尽力打两个。为了使它工作,我使用公共pubnub传感器通道作为一个很好的资源:https://www.pubnub.com/developers/realtime-data-streams/sensor-network/我的基本方法是在我自己的频道上鹦鹉这个频道,然后将其转换为我实际想要发送的内容。

JSON格式: 缺点是,如果您希望EON图正确转换已发布的值,则必须在发布命令中将其作为org.json.JSONObject发送。我从来没有能够使用带有字符串的发布命令并自行完成JSONing。即使我生成的格式与发布的输入完全相同,但应该已转换为JSON EON拒绝它。

因此,首先,使用org.json.JSONObject作为Publish的输入。

这让我们了解如何在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个人使用处理来做这样的事情......