使用Arduino WiFi屏蔽和Xively(WPA2)时出现HTTP错误

使用Arduino WiFi屏蔽和Xively(WPA2)时出现HTTP错误,http,arduino,wifi,xively,Http,Arduino,Wifi,Xively,我刚开始学习Xively,并尝试了基础教程() 我刚刚将我的网络访问权限更改为WPA2,这似乎可行,但随后我在串行监视器中得到以下响应: Starting single datastream upload to Xively... Attempting to connect to SSID: Tinker Lab Connected to wifi SSID: Tinker Lab IP Address: 192.168.1.103 signal strength (RSSI):-45 dBm

我刚开始学习Xively,并尝试了基础教程() 我刚刚将我的网络访问权限更改为WPA2,这似乎可行,但随后我在串行监视器中得到以下响应:

Starting single datastream upload to Xively...

Attempting to connect to SSID: Tinker Lab
Connected to wifi
SSID: Tinker Lab
IP Address: 192.168.1.103
signal strength (RSSI):-45 dBm 

HTTP Error
Read sensor value 560.00
Uploading it to Xively
xivelyclient.put returned -1
我的代码如下所示:

/*
##Xively WiFi Sensor Tutorial##
This sketch is designed to take sensors (from photocell) and upload the values to Xively
at consistant intervals. At the same time it gets a setable value from Xively to adjust the brigthness
of an LED. This sketch is reusable and can be adapted for use with many different sensors.
Derived from Xively Ardino Sensor Client by Sam Mulube.

By Calum Barnes 3-4-2013
BSD 3-Clause License - [http://opensource.org/licenses/BSD-3-Clause]
Copyright (c) 2013 Calum Barnes
*/
#include <SPI.h>
#include <WiFi.h>
#include <HttpClient.h>
#include <Xively.h>


char ssid[] = "Tinker Lab";     //  your network SSID (name) 
char pass[] = "passwordXXXX";  // your network password
int keyIndex = 0;            // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;

// Your Xively key to let you upload data
char xivelyKey[] = "OAj0TV6KquAyLhQjR8T0dOxwzdm3ATl4ki9mWDXXXXXXXXX";  // just changed a few chars
//your xively feed ID
#define xivelyFeed 1763000000  // just changed a few numbers
//datastreams
char sensorID[] = "controller";
char ledID[] = "LED";

// Analog pin which we're monitoring (0 and 1 are used by the Ethernet shield)
#define sensorPin A2
//led connected pin
#define ledPin 9

// Define the strings for our datastream IDs
XivelyDatastream datastreams[] = {
  XivelyDatastream(sensorID, strlen(sensorID), DATASTREAM_FLOAT),
  XivelyDatastream(ledID, strlen(ledID), DATASTREAM_FLOAT),
};
// Finally, wrap the datastreams into a feed
XivelyFeed feed(xivelyFeed, datastreams, 2 /* number of datastreams */);

WiFiClient client;
XivelyClient xivelyclient(client);

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm \n");
}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  //pin setup
  pinMode(sensorPin, INPUT);
  pinMode(ledPin, OUTPUT);

  Serial.println("Starting single datastream upload to Xively...");
  Serial.println();

    // check for the presence of the shield:
   if (WiFi.status() == WL_NO_SHIELD) {
     Serial.println("WiFi shield not present"); 
     // don't continue:
     while(true);
   } 

  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) { 
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
     status = WiFi.begin(ssid, pass);
    // wait 10 seconds for connection:
    delay(10000);
  } 
  Serial.println("Connected to wifi");
  printWifiStatus();
}

void loop() {
  //adjust LED level. set from Xively
  int getReturn = xivelyclient.get(feed, xivelyKey);    //get data from xively
  if(getReturn > 0){
    Serial.println("LED Datastream");
    Serial.println(feed[1]);
  }else Serial.println("HTTP Error");

  //write value to LED - change brightness
  int level = feed[1].getFloat();
  if(level < 0){
    level = 0;
  }else if(level > 255){
    level = 255;
  }
  //actually write the value
  digitalWrite(ledPin, level);

///////////////////////////////////////////////////////
  //read sensor values
  int sensorValue = analogRead(sensorPin);
  datastreams[0].setFloat(sensorValue);

  //print the sensor valye
  Serial.print("Read sensor value ");
  Serial.println(datastreams[0].getFloat());

  //send value to xively
  Serial.println("Uploading it to Xively");
  int ret = xivelyclient.put(feed, xivelyKey);
  //return message
  Serial.print("xivelyclient.put returned ");
  Serial.println(ret);
  Serial.println("");


  //delay between calls
  delay(15000);
}
/*
##XIVELLY无线传感器教程##
此草图设计用于获取传感器(来自光电管)并将值上传至Xively
以一致的间隔。同时,它从Xively获得一个可设置的值来调整亮度
一个LED。此草图可重复使用,并可适用于许多不同的传感器。
源自Sam Mulube的XIVELLY Ardino传感器客户端。
由Calum Barnes于2013年3月4日撰写
BSD 3条款许可证-[http://opensource.org/licenses/BSD-3-Clause]
版权所有(c)2013 Calum Barnes
*/
#包括
#包括
#包括
#包括
char ssid[]=“修补匠实验室”;//您的网络SSID(名称)
char pass[]=“passwordXXXX”;//您的网络密码
int-keyIndex=0;//您的网络密钥索引号(仅WEP需要)
int状态=WL\U空闲\U状态;
//您的Xively密钥允许您上载数据
字符xivelyKey[]=“OAJ0Tv6KQUAYLHQJR8T0DOXWZDM3ATL4KI9MWDxxxxxxxx”//只是换了几个角色
//您的订阅源ID
#定义xivelyFeed 1763000000//只更改了几个数字
//数据流
char sensorID[]=“控制器”;
字符ledID[]=“LED”;
//我们正在监控的模拟引脚(以太网屏蔽使用0和1)
#定义传感器引脚A2
//led连接引脚
#定义LED引脚9
//为数据流ID定义字符串
XIVELYDATASEAM数据流[]={
十四数据流(传感器ID、strlen(传感器ID)、数据流_浮点),
XivelyDatastream(ledID、strlen(ledID)、DATASTREAM_FLOAT),
};
//最后,将数据流包装到提要中
XivelyFeed提要(XivelyFeed,数据流,2/*数据流数量*/);
无线客户端;
XivelyClient XivelyClient(客户);
void printWifiStatus(){
//打印您连接到的网络的SSID:
序列号。打印(“SSID:”);
Serial.println(WiFi.SSID());
//打印您的WiFi屏蔽的IP地址:
ip地址ip=WiFi.localIP();
串行打印(“IP地址:”);
序列号println(ip);
//打印接收到的信号强度:
长rssi=WiFi.rssi();
串行打印(“信号强度(RSSI):”;
串行打印(rssi);
Serial.println(“dBm\n”);
}
无效设置(){
//将安装代码放在此处,以便运行一次:
Serial.begin(9600);
//引脚设置
引脚模式(传感器引脚,输入);
引脚模式(LED引脚,输出);
println(“开始将单个数据流上载到Xively…”);
Serial.println();
//检查是否存在屏蔽:
如果(WiFi.status()=无线无屏蔽){
Serial.println(“不存在WiFi屏蔽”);
//不要继续:
虽然(正确);
} 
//尝试连接到Wifi网络:
当(状态!=WL_已连接){
Serial.print(“试图连接到SSID:”);
序列号println(ssid);
状态=WiFi.begin(ssid,通过);
//等待10秒钟以进行连接:
延迟(10 000);
} 
Serial.println(“连接到wifi”);
printWifiStatus();
}
void循环(){
//调整LED电平。从Xively开始设置
int getReturn=xivelyclient.get(feed,xivelyKey);//从xively获取数据
如果(getReturn>0){
Serial.println(“LED数据流”);
Serial.println(提要[1]);
}else Serial.println(“HTTP错误”);
//将值写入LED-更改亮度
int level=feed[1].getFloat();
如果(级别<0){
级别=0;
}否则,如果(级别>255){
级别=255;
}
//实际写入值
数字写入(ledPin,电平);
///////////////////////////////////////////////////////
//读取传感器值
int sensorValue=模拟读数(sensorPin);
数据流[0]。setFloat(传感器值);
//打印传感器值
串行打印(“读取传感器值”);
Serial.println(数据流[0].getFloat());
//将值发送给xively
Serial.println(“上传到Xively”);
int-ret=xivelyclient.put(feed,xivelyKey);
//回信
Serial.print(“xivelyclient.put返回”);
序列号println(ret);
Serial.println(“”);
//通话间隔
延迟(15 000);
}
我很确定这只是一个愚蠢的开始

谢谢你帮助我!
Stefan

当您收到错误时

HTTP错误

这意味着对以下对象的调用存在问题:

xivelyclient.get(feed, xivelyKey);
因此,“feed”或“xivelyKey”是不正确的

首先我要再次检查你的钥匙是否正确。如果没有问题,请检查您设置的提要是否正确

// Define the strings for our datastream IDs
XivelyDatastream datastreams[] = {
  XivelyDatastream(sensorID, strlen(sensorID), DATASTREAM_FLOAT),
  XivelyDatastream(ledID, strlen(ledID), DATASTREAM_FLOAT),
};
// Finally, wrap the datastreams into a feed
XivelyFeed feed(xivelyFeed, datastreams, 2 /* number of datastreams */);
通过查看此代码,您需要确保在Xively站点上正确设置了提要;确保“传感器ID”确实是“控制器”,并且“LED ID”是“LED”

我所做的观察同样适用于您调用时发生的错误:

int ret = xivelyclient.put(feed, xivelyKey);

谢天谢地,我加倍检查,甚至用新钥匙等安装了一台新设备,但仍然存在相同的问题:(是否有任何特殊语法我可能会出错?我将在今晚尝试运行此示例草图,看看是否会遇到相同的问题。明白了!我用最新固件刷新了Arduino WiFi屏蔽,现在它可以工作了!这是个好消息!很抱歉没有回复您,昨天没有机会调查。如果其固件重新启动,这将是一个令人讨厌的问题。)艾德!