我正在使用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);
}
欢迎任何想法。
答案 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个人使用处理来做这样的事情......