Go Down

Topic: Arduino ethernet shield, send data to Xively (Read 969 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: ");

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

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy