通过 PubNub 的 EON 图表格式化问题

EON chart formating issues via PubNub

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

这是我尝试过的:

我已经尝试在我的嵌入式 java 脚本中使用 transform 命令来尝试将其转换为正确的格式。我不完全明白 transform 想要看到什么格式,但我已经尝试过值的字符串,值作为整数,以及我自己的 JSON 格式的格式化字符串。我使用 public 流 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 突出显示并出现以下错误之前:"The function "Publish()" 期望参数如下:"publish(String, JSONObject,Callback)"。这很奇怪,因为我给了它所有这些东西。然后在 运行 时间我得到:“PubnubCoreAsync 类型的方法 publish(String,JSONObject,Callback) 不适用于参数(String,JSONObject,net Callback( ){}).更奇怪的是,运行 之前的错误是我需要提供所有这些确切的东西。我认为问题在于 pubnub 所需的库具有 JSONObject 类型,处理也是如此,并且这两种类型无法正常工作。

无论如何,这是我的嵌入式 java 脚本,它是 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);
}

欢迎任何想法。

在这段代码中,您为此 publish 实现的 Callback() 在哪里:

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

new Callback() {} 是 Callback

的空实现

您需要传递具有如下完整实现的回调实例 class:

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

好的!现在我将尝试解释我是如何解决这个问题的。该解决方案涵盖 EON 的格式问题和 JSON 对象处理问题。我会尝试同时击中两者。为了让它工作,我使用 public 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 to format the JSON object correctly. There is a twist, the new JSON object creation must be put in a try statement or else Processing will complain that there is an checked unhandled exception. This is covered in more detail 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 个人做这样的事情...