Api 阿杜伊诺+;WiFly屏蔽无法与xively通信

Api 阿杜伊诺+;WiFly屏蔽无法与xively通信,api,arduino,xively,Api,Arduino,Xively,我在通过Arduino Uno v3和Sparkfun WiFly屏蔽将传感器数据传送到xively API时遇到问题。问题不在硬件上,也不在WiFly shield库中,因为我可以很好地将数据传送到Parappu服务器 最根本的问题是xively库不能与sparkfun WiFly库一起工作。相关声明(由XIVELLY在文件中建议)包括: 这将不起作用,因为WiFlyClient声明需要一个服务器和端口,因此我将其修改为: byte server[] = {173,203,98,29}; //

我在通过Arduino Uno v3和Sparkfun WiFly屏蔽将传感器数据传送到xively API时遇到问题。问题不在硬件上,也不在WiFly shield库中,因为我可以很好地将数据传送到Parappu服务器

最根本的问题是xively库不能与sparkfun WiFly库一起工作。相关声明(由XIVELLY在文件中建议)包括:

这将不起作用,因为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&)”时没有匹配的函数 /Users/paultravers/Documents/Arduino/libraries/xively/XivelyClient.h:11:注意:候选对象是:XivelyClient::XivelyClient(客户机&) /Users/paultravers/Documents/Arduino/libraries/xively/XivelyClient.h:9:注意:XivelyClient::XivelyClient(const XivelyClient&)

在这一点上,我陷入了困境,我试图修改各种库来协调这个问题,但都没有结果——主要是因为这超出了我的技能水平,我真的不知道我在做什么

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

我打开一个连接(到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"}]}
PUT/v2/feeds/.json
主持人:api.xively.com
内容类型:application/json
用户代理:Xively Arduino Lib/1.0
X-ApiKey:
内容长度:197
{“版本”:“1.0.0”,“数据流”:[{“id”:“温度通道”,“当前值”:“29.00”},{“id”:“光传感器通道”,“当前值”:“541.00”},{“id”:“报警通道”,“当前值”:“0.00”}
以空行结束


不用说,我已经用这些名字在xively建立了频道。但是这不起作用-我没有得到预期的回报,频道也没有更新。如果我读取连接上返回的输入,它只是一个长长的数字字符串。有人能看出这个请求的格式有什么错误吗

我可能会看一下
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/etc,我只使用arduino…而且我也遇到了类似这样的麻烦:)

我没有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

如果这不起作用,它将是有益的,如果你可以张贴什么是回报,这将有助于我们帮助你。祝你好运

我在代码中注意到的一点是,在请求中没有发送HTTP版本

您应该尝试发送:

PUT /v2/feeds/<feed ID redacted>.json HTTP/1.1
PUT/v2/feeds/.json HTTP/1.1
我在写Xively时遇到了405个错误,因为我在put请求中错误地使用了HTTP/1.0作为版本


还有一个方法有助于确保您正确使用WiFlyClient实例。

谢谢@zoltan nagy,我将尝试您的建议。我进一步研究了各自的库,问题似乎是在Ethernet.h和xively.h库中,客户机类(EthernetClient或XIVELClient)被定义为客户机,而在WiFly库中,WiFlyClient被定义为流,因此我将尝试您的建议,设置一个新的WiFlyClient类将流包装到客户端,或者设置一个新的XivelyClient类将流包装到客户端,然后看看我是否可以通过这种方式解决问题。我还选择发送自己的请求,而不是尝试将与客户端库一起工作的堆栈拼凑在一起。我很幸运地用curl构造了我的请求,确认它是有效的,然后让我的arduino草图发送与curl相同的标题。
PUT /v2/feeds/<feed ID redacted>.json HTTP/1.1