4 votes

Comment se connecter à Cloudant avec une abeille Wifi Arduino

Nous essayons de connecter notre abeille wifi basée sur Arduino (un ATmega 328P) à la base de données Cloudant. L'abeille wifi utilise la bibliothèque wiwhield pour se connecter au web. Nous pouvons l'utiliser pour nous connecter à cosm (xively) et afficher/obtenir des données. Cependant, avec Cloudant, nous n'y parvenons pas et nous recevons toujours une demande 503 Service indisponible.

Je pense que le problème est que Wishield s'attend à ce qu'une adresse IP soit spécifiée, alors que Cloudant utilise un DNS . J'ajoute le bout de code utilisant Wishield qui fonctionne très bien pour les données GET de weather.com, mais lorsque nous modifions les variables pour cloudant.com, cela me donne juste une requête 503.

Veuillez trouver les différents codes : Extrait de code : GetDatafromCloudant.ino : Nous venons de modifier les détails de l'adresse IP/du port pour une requête GET de Cloudant.

    /*
 * A simple sketch that uses WiServer to get the hourly weather data from LAX and prints
 * it via the Serial API
 */

#include <WiServer.h>

#define WIRELESS_MODE_INFRA 1
#define WIRELESS_MODE_ADHOC 2

// Wireless configuration parameters ----------------------------------------
unsigned char local_ip[] = {192,168,1,2};   // IP address of WiShield
unsigned char gateway_ip[] = {192,168,1,1}; // router or gateway IP address
unsigned char subnet_mask[] = {255,255,255,0};  // subnet mask for the local network
const prog_char ssid[] PROGMEM = {"BSNL_AP"};       // max 32 bytes

unsigned char security_type = 2;    // 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2

// WPA/WPA2 passphrase
const prog_char security_passphrase[] PROGMEM = {"bhutoriafamily"}; // max 64 characters

// WEP 128-bit keys
// sample HEX keys
prog_uchar wep_keys[] PROGMEM = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, // Key 0
                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Key 1
                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Key 2
                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  // Key 3
                };

// setup the wireless mode
// infrastructure - connect to AP
// adhoc - connect to another WiFi device
unsigned char wireless_mode = WIRELESS_MODE_INFRA;

unsigned char ssid_len;
unsigned char security_passphrase_len;
// End of wireless configuration parameters ----------------------------------------

// Function that prints data from the server
void printData(char* data, int len) {

  // Print the data returned by the server
  // Note that the data is not null-terminated, may be broken up into smaller packets, and 
  // includes the HTTP header. 
  while (len-- > 0) {
    Serial.print(*(data++));
  } 
}

// IP Address for www.weather.gov  
//uint8 ip[] = {140,90,113,200};
uint8 ip[] = {50,23,104,75};
// A request that gets the latest METAR weather data for LAX
GETrequest getWeather(ip, 5984, "http://alfatek.cloudant.com", "/wifi/_all_docs");

void setup() {
    // Initialize WiServer (we'll pass NULL for the page serving function since we don't need to serve web pages) 
  WiServer.init(NULL);

  // Enable Serial output and ask WiServer to generate log messages (optional)
  Serial.begin(57600);
  WiServer.enableVerboseMode(true);

  // Have the processData function called when data is returned by the server
  getWeather.setReturnFunc(printData);
}

// Time (in millis) when the data should be retrieved 
long updateTime = 0;

void loop(){

  // Check if it's time to get an update
  if (millis() >= updateTime) {
    getWeather.submit();    
    // Get another update one hour from now
    updateTime += 1000 * 20 ;
  }

  // Run WiServer
  WiServer.server_task();

  delay(10);
}

Extrait de code : GetDatafromWeather.ino : Cela fonctionne très bien, et nous pouvons tirer des données de weather.com pour les données météo de LA..

/*
 * A simple sketch that uses WiServer to get the hourly weather data from LAX and prints
 * it via the Serial API
 */

#include <WiServer.h>

#define WIRELESS_MODE_INFRA 1
#define WIRELESS_MODE_ADHOC 2

// Wireless configuration parameters ----------------------------------------
unsigned char local_ip[] = {192,168,1,2};   // IP address of WiShield
unsigned char gateway_ip[] = {192,168,1,1}; // router or gateway IP address
unsigned char subnet_mask[] = {255,255,255,0};  // subnet mask for the local network
const prog_char ssid[] PROGMEM = {"BSNL_AP"};       // max 32 bytes

unsigned char security_type = 2;    // 0 - open; 1 - WEP; 2 - WPA; 3 - WPA2

// WPA/WPA2 passphrase
const prog_char security_passphrase[] PROGMEM = {"bhutoriafamily"}; // max 64 characters

// WEP 128-bit keys
// sample HEX keys
prog_uchar wep_keys[] PROGMEM = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, // Key 0
                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Key 1
                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Key 2
                  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  // Key 3
                };

// setup the wireless mode
// infrastructure - connect to AP
// adhoc - connect to another WiFi device
unsigned char wireless_mode = WIRELESS_MODE_INFRA;

unsigned char ssid_len;
unsigned char security_passphrase_len;
// End of wireless configuration parameters ----------------------------------------

// Function that prints data from the server
void printData(char* data, int len) {

  // Print the data returned by the server
  // Note that the data is not null-terminated, may be broken up into smaller packets, and 
  // includes the HTTP header. 
  while (len-- > 0) {
    Serial.print(*(data++));
  } 
}

// IP Address for www.weather.gov  
uint8 ip[] = {140,90,113,200};

// A request that gets the latest METAR weather data for LAX
GETrequest getWeather(ip, 80, "www.weather.gov", "/data/METAR/KLAX.1.txt");

void setup() {
    // Initialize WiServer (we'll pass NULL for the page serving function since we don't need to serve web pages) 
  WiServer.init(NULL);

  // Enable Serial output and ask WiServer to generate log messages (optional)
  Serial.begin(57600);
  WiServer.enableVerboseMode(true);

  // Have the processData function called when data is returned by the server
  getWeather.setReturnFunc(printData);
}

// Time (in millis) when the data should be retrieved 
long updateTime = 0;

void loop(){

  // Check if it's time to get an update
  if (millis() >= updateTime) {
    getWeather.submit();    
    // Get another update one hour from now
    updateTime += 1000 * 20 ;
  }

  // Run WiServer
  WiServer.server_task();

  delay(10);
}

3voto

Sam Bisbee Points 3085

Vous avez raison, Cloudant achemine votre demande en fonction des en-têtes qui sont fournis. Vous pouvez prendre soin de cela en spécifiant l'en-tête Host comme suit : Host: USERNAME.cloudant.com

Le code d'état 503 que vous obtenez de Cloudant signifie que l'équilibreur de charge sur lequel vous avez atterri ne sait pas comment acheminer votre demande car il ne dispose pas de votre nom de compte.

Vous pouvez obtenir l'IP à laquelle vous connecter comme ceci (terminal Bash) : host USERNAME.cloudant.com

Cependant, ce n'est pas une bonne idée.

La raison pour laquelle Cloudant utilise le DNS est que les IP peuvent changer à la guise du service. De plus, le basculement vers différents serveurs d'équilibrage de charge et/ou centres de données est géré par le DNS (le basculement local au sein du centre de données est géré par les équilibreurs de charge). Par conséquent, vous ne créerez pas un environnement stable - Cloudant pourrait, et se changent d'IP et détruisent votre installation.

Désolé, mais il semble que la meilleure solution soit de faire fonctionner le DNS dans votre environnement.

[Source : Je travaille chez Cloudant.]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X