Go Down

Topic: Arduino ethernet shield, send data to Xively (Read 627 times) previous topic - next topic

arusr

Mar 30, 2014, 12:15 am Last Edit: Mar 30, 2014, 12:18 am by arusr Reason: 1
There are two ways to send data to Xively.  

1)  Use the Xively library,
2)  forms a string that is sent to the Xively server.

I've gotten the Xively library method to work, so I know that the ethernet shield connects to my home network OK, but I'd like to use the other method.  I'm trying to use an nRF24L01+ on the same SPI bus as the ethernet shield, and there's something goofy going on that I need to turn off the Ethernet shield in order to use the nRF24L01.

So I think I have to use the second method.  My attempts at using the sample code hasn't lead me anywhere, however.  I'm using this tutorial:

And really didn't modify the code much, just entered in my feed ID and stuff.  This is the output I get from the serial monitor:

Quote


You do not have permission to access this resource
disconnecting.
connecting...
HTTP/1.1 401 Unauthorized
Date: Sat, 29 Mar 2014 23:28:16 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 50
Connection: close
WWW-Authenticate: Basic realm="Web Password"
X-Request-Id: xxxxxxx
Set-Cookie: _pachcore_app_session=xxxxxxx; domain=.xively.com; path=/; expires=Sat, 12-Apr-2014 23:28:16 GMT; HttpOnly

You do not have permission to access this resource
disconnecting.



Here's my code, with the private stuff taking out.  If you wouldn't mind taking a look and giving me some advice?  I got this code from here:

http://arduino.cc/en/Tutorial/XivelyClient

Code: [Select]

/*

http://arduino.cc/en/Tutorial/XivelyClient

 Xively sensor client

This sketch connects an analog sensor to Xively (http://www.xively.com)
using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or
the Adafruit Ethernet shield, either one will work, as long as it's got
a Wiznet Ethernet module on board.

This example has been updated to use version 2.0 of the Xively.com API.
To make it work, create a feed with a datastream, and give it the ID
sensor1. Or change the code below to match your feed.


Circuit:
* Analog sensor attached to analog in 0
* Ethernet shield attached to pins 10, 11, 12, 13

created 15 March 2010
modified 9 Apr 2012
by Tom Igoe with input from Usman Haque and Joe Saavedra

http://arduino.cc/en/Tutorial/XivelyClient
This code is in the public domain.

*/

#include <SPI.h>
#include <Ethernet.h>

#define APIKEY         "xxxxxxxx" // replace your xively api key here
#define FEEDID         xxxxxxxx // replace your feed ID
#define USERAGENT      "Arduinnoooo" // user agent is the project name

// assign a MAC address for the ethernet controller.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
// fill in your address here:
byte mac[] = {0xDE, 0xAD, 0xEE, 0xEE, 0xEE, 0x11};

// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192,168,2,230);
// initialize the library instance:
EthernetClient client;

// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
IPAddress server(173,203,98,29);      // numeric IP for api.xively.com 173.203.98.29
//char server[] = "api.xively.com";   // name address for xively API

unsigned long lastConnectionTime = 0;          // last time you connected to the server, in milliseconds
boolean lastConnected = false;                 // state of the connection last time through the main loop
const unsigned long postingInterval = 10*1000; //delay between updates to Xively.com

void setup() {
// Open serial communications and wait for port to open:
 Serial.begin(9600);
  while (!Serial) {
   ; // wait for serial port to connect. Needed for Leonardo only
 }

 Serial.println("Hola");

// start the Ethernet connection:
 if (Ethernet.begin(mac) == 0) {
   Serial.println("Failed to configure Ethernet using DHCP");
   // DHCP failed, so use a fixed IP address:
   Ethernet.begin(mac, ip);
 }
}

void loop() {
 // read the analog sensor:
 int sensorReading = 5;  

 // if there's incoming data from the net connection.
 // send it out the serial port.  This is for debugging
 // purposes only:
 if (client.available()) {
   char c = client.read();
   Serial.print(c);
 }

 // if there's no net connection, but there was one last time
 // through the loop, then stop the client:
 if (!client.connected() && lastConnected) {
   Serial.println();
   Serial.println("disconnecting.");
   client.stop();
 }

 Serial.println("waiting to send data!");
 
 
 // if you're not connected, and ten seconds have passed since
 // your last connection, then connect again and send data:
 if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
   sendData(sensorReading);
 }
 // store the state of the connection for next time through
 // the loop:
 lastConnected = client.connected();
}

// this method makes a HTTP connection to the server:
void sendData(int thisData) {
 // if there's a successful connection:
 if (client.connect(server, 80)) {
   Serial.println("connecting...");
   // send the HTTP PUT request:
   client.print("PUT /v2/feeds/");
   client.print(FEEDID);
   client.println(".csv HTTP/1.1");
   client.println("Host: api.xively.com");
   client.print("X-XivelyApiKey: ");
   client.println(APIKEY);
   client.print("User-Agent: ");
   client.println(USERAGENT);
   client.print("Content-Length: ");

   // calculate the length of the sensor reading in bytes:
   // 8 bytes for "sensor1," + number of digits of the data:
   int thisLength = 8 + getLength(thisData);
   client.println(thisLength);

   // last pieces of the HTTP PUT request:
   client.println("Content-Type: text/csv");
   client.println("Connection: close");
   client.println();

   // here's the actual content of the PUT request:
   client.print("Temp_LivingRoom,");
   client.println(thisData);

 }
 else {
   // if you couldn't make a connection:
   Serial.println("connection failed");
   Serial.println();
   Serial.println("disconnecting.");
   client.stop();
 }
  // note the time that the connection was made or attempted:
 lastConnectionTime = millis();
}


// This method calculates the number of digits in the
// sensor reading.  Since each digit of the ASCII decimal
// representation is a byte, the number of digits equals
// the number of bytes:

int getLength(int someValue) {
 // there's at least one byte:
 int digits = 1;
 // continually divide the value by ten,
 // adding one to the digit count for each
 // time you divide, until you're at 0:
 int dividend = someValue /10;
 while (dividend > 0) {
   dividend = dividend /10;
   digits++;
 }
 // return the number of digits:
 return digits;
}





ZheFear

The problem with tutorial code is that it is not following API specification.
instead of client.print("X-XivelyApiKey: "); it should be
   client.print("X-ApiKey: ");

theverant

Big thanks!  This small fix worked for me!  Odd the example would have such an obvious error.   :smiley-eek:

Go Up