【问题标题】:Arduino+WiFly shield failing to communicate to xivelyArduino+WiFly shield 无法与 xively 通信
【发布时间】:2013-08-23 18:26:57
【问题描述】:

我在通过 Arduino Uno v3 和 Sparkfun WiFly 扩展板向 xively API 提供传感器数据时遇到问题。问题不在于硬件,也不在于 WiFly 屏蔽库,因为我可以很好地将数据传送到 Paraimpu 服务器。

最根本的问题是 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&)” /Users/paultravers/Documents/Arduino/libraries/xively/XivelyClient.h:11:注意:候选人是:XivelyClient::XivelyClient(Client&) /Users/paultravers/Documents/Arduino/libraries/xively/XivelyClient.h:9:注意:XivelyClient::XivelyClient(const XivelyClient&)

此时我被卡住了,我尝试修改各种库以试图协调这个问题没有成功 - 主要是因为它超出了我的技能水平,我真的不知道我在做什么。

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

我打开一个连接(到 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"}]}

以空行结束。

不用说我已经用这些名字设置了频道。但这不起作用——我没有得到预期的回报,而且频道也没有更新。如果我读取连接上的返回输入,它只是一长串数字。任何人都可以看到这个请求的格式有什么问题吗?

【问题讨论】:

  • 我也选择了发送自己的请求,而不是尝试将与客户端库一起工作的堆栈拼凑在一起。我很幸运用 curl 构建了我的请求,确认它有效,然后让我的 arduino 草图发送与 curl 相同的标题。

标签: api arduino xively


【解决方案1】:

我可能会看一下WiFlyClient 的文档...也许您需要以其他方式设置端口/等...而不是扩展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...我也遇到过这样的麻烦 :)

【讨论】:

  • 谢谢@zoltan-nagy,我会试试你的建议。我进一步研究了各自的库,似乎问题在于在 Ethernet.h 和 xively.h 库中,客户端类(EthernetClient 或 XivelyCLient)被定义为客户端,而在 WiFly 库中,WiFlyClient 被定义为Stream,所以我会尝试你的建议,要么设置一个新的 WiFlyClient 类,将 Stream 包装在客户端中,要么设置一个新的 XivelyClient 类,它做相反的事情,看看我是否可以解决它。
【解决方案2】:

我没有要测试的 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

如果这不起作用,如果您可以发布退货内容会很有帮助,这将有助于我们为您提供帮助。祝你好运!

【讨论】:

    【解决方案3】:

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

    您应该尝试发送:

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

    我在写信给 Xively 时遇到 405 错误,因为我在 put 请求中错误地将 HTTP/1.0 作为版本。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多