2013-08-23 37 views
0

我通过Arduino Uno v3和Sparkfun WiFly屏蔽将传感器数据传送到xively API时出现问题。问题不在于硬件或WiFly屏蔽库中,因为我可以将数据传送到Paraimpu服务器。Arduino + WiFly屏蔽层未能与xively进行通信

最根本的问题是xively库不能与sparkfun WiFly库一起使用。有关声明(文档中通过xively建议)是:

WiFlyClient client; 
XivelyClient xivelyclient(client); 

这不会起作用,因为WiFlyClient声明需要一个服务器和端口,所以我修改这:

byte server[] = {173,203,98,29}; //api.xively.com IP address 
WiFlyClient client(server,80); 
XivelyClient xivelyclient(client); 

这给了我

Xively_sketch2_aug20a:上的编译错误60:错误:用于调用 'XivelyClient :: XivelyClient(WiFlyClient &)' /用户/ paultravers /文档/阿尔杜伊诺/库/ xively /僖没有匹配的功能velyClient.h:11:注意:考生:XivelyClient :: XivelyClient(客户&) /Users/paultravers/Documents/Arduino/libraries/xively/XivelyClient.h:9:注意:XivelyClient :: XivelyClient(常量XivelyClient &)

在这一点上,我被卡住了,我试图修改各种图书馆,试图调和这个问题已经无济于事 - 主要是因为它高于我的技能水平,我真的不知道我在做什么。

为了解决这个问题,我编写了代码来构建put请求,并使用成功运行的代码模板将数据发送到API,并将其发送到API。

我打开一个连接(到api.xively.com或173.203.98.29;它使得在此阶段没有区别)和发送以下内容:

PUT /v2/feeds/<feed ID redacted>.json 
Host: api.xively.com 
Content-Type: application/json 
User-Agent : Xively-Arduino-Lib/1.0 
X-ApiKey: < API key redacted > 
Content-Length: 197 
{"version":"1.0.0","datastreams" : [{"id":"TEMPERATURE_CHANNEL" , "current_value" : "29.00"},{"id":"LIGHT_SENSOR_CHANNEL","current_value":"541.00"},{"id":"ALARM_CHANNEL","current_value":"0.00"}]} 

以一个空行终止。

不用说,我已经用这些名字在xively中设置了频道。但是这不起作用 - 我没有得到预期的回报,并且渠道不更新。如果我读到连接上的返回输入,它只是一串很长的数字。任何人都可以在请求的格式中看到任何错误?

+0

我也走了发送我自己的请求的路线,而不是试图将与客户端库一起工作的堆栈绑在一起。我用curl构建我的请求的好运气,确认它的工作,然后让我的arduino草图发送相同的标题作为卷曲。 –

回答

0

我会看看WiFlyClient的文档...也许你需要设置一些其他的方式端口的/ etc ...比延长WiFlyClient

class WiFlyClient2 : public WiFlyClient { 
    WiFlyClient2(int[] ip,int port) : WiFlyClient() { 
    //setup up your parent by calling it's functions here 
    } 
} 

那么它应该工作一样:

byte server[] = {173,203,98,29}; //api.xively.com IP address 
WiFlyClient client(server,80); 
XivelyClient xivelyclient(client); 

注:我从来没有wifly /使用等,我只是将使用Arduino ......我也遇到麻烦这样:)

+0

谢谢@ zoltan-nagy,我会尝试一下你的建议。我已经深入了解了各自的库,看起来问题在于,在Ethernet.h和xively.h库中,客户端类(EthernetClient或XivelyCLient)被定义为Client,而在WiFly库中,WiFlyClient被定义为流,所以我会尝试你的建议,设置一个新的类的WiFlyClient包装流在客户端,或XivelyClient的新类相反,看看我是否可以这样解决它。 – user2710712

0

我没有WiFly屏蔽来测试。但正如你在Zoltan评论中所说的那样,我不认为WiFly客户端的工作方式与Arduino以太网或Wifi相同。这意味着Xively库可能不适用于WiFly客户端。

这意味着您编写自己的HTTP请求的方法可能是要走的路。我查看了你的请求,看起来对我来说完全正确。发送请求时,Xively Workbench请求日志中是否显示任何内容?

你可以尝试的一件事就是改用CSV格式。这可以更好地进行测试,因为您可以避免导致您的整个请求无法工作的次要JSON错误。为此,请将.json更改为.csv,然后将您的主体作为逗号分隔的数据流值列表。你的身体应该是这个样子:

TEMPERATURE_CHANNEL,29.00 
LIGHT_SENSOR_CHANNEL,541.00 
ALARM_CHANNEL,0.00 

如果这也不行那将是有益的,如果你能后的回报是什么,这将有助于我们帮助您。祝你好运!

0

我在代码中注意到的一件事是,您不会在请求中发送HTTP版本。

你应该尝试发送:

PUT /v2/feeds/<feed ID redacted>.json HTTP/1.1 

写Xively的时候,因为我有不正确的HTTP/1.0在我的PUT请求的版本我得到405错误。

还有一个example from SparkFun's WiFly library that shows writing to Thingspeak这有助于确保您正确使用WiFlyClient实例。