我在通过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"}]}
以空行终止。
毋庸置疑,我已经在xively中设置了这些名称的频道。但这不起作用 - 我没有获得预期的回报,并且频道不会更新。如果我读取连接上的返回输入,它只是一长串数字。任何人都可以看到这个请求的格式有什么问题吗?
答案 0 :(得分: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 / etc,我只是使用arduino ......我也遇到了这样的麻烦:)
答案 1 :(得分: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
如果这不起作用,如果您可以发布返回信息,这将有助于我们帮助您。祝你好运!
答案 2 :(得分:0)
我在您的代码中注意到的一件事是您不在请求中发送HTTP版本。
你应该尝试发送:
PUT /v2/feeds/<feed ID redacted>.json HTTP/1.1
写Xively时我遇到405错误,因为我错误地将HTTP / 1.0作为put请求中的版本。
还有一个example from SparkFun's WiFly library that shows writing to Thingspeak有助于确保您正确使用WiFlyClient实例。