2013-06-16 5 views
4

Мы пытаемся подключить нашу основанную на Arduino Wi-Fi (ATmega 328P) к базе данных Cloudant. Пчела wifi использует библиотеку wiwhield для подключения к Интернету. Мы можем использовать это для подключения к объектам (xively) и post/get. Тем не менее, с облачным, мы не можем этого сделать и продолжаем получать 503-й Сервисный недоступный запрос.Как подключиться к Cloudant с Arduino Wifi Bee

Я думаю, проблема заключается в том, что Wishield ожидает, что IP-адрес будет указан, тогда как Cloudant использует DNS. Я добавляю фрагмент кода, используя wishield, который отлично работает для данных GET с weather.com, но когда мы меняем переменные для cloudant.com, это просто дает мне запрос 503.

Коды: Фрагмент кода: GetDatafromCloudant.ino: Мы только что изменили данные о IP-адресе/порте для запроса GET-облака.

/* 
* 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); 
} 

Фрагмент кода: GetDatafromWeather.ino: Это работает просто отлично, и мы можем извлекать данные из weather.com для данных о погоде 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); 
} 
+0

Вы должны размещать код, который генерирует запрос, который дает вам 503. Из того, что вы описали, я могу только предположить, что заголовок хоста неправильно или не указано. –

ответ

3

Вы правильны, Cloudant маршруты Ваш запрос в зависимости на предоставляемых заголовках. Вы можете позаботиться об этом, указав заголовок узла следующим образом: Host: USERNAME.cloudant.com

Код статуса 503, который вы получаете от Cloudant, означает, что балансировщик нагрузки, на который вы приземлились, не знает, как перенаправить ваш запрос, поскольку он не укажите свое имя учетной записи.

Вы можете получить IP-адрес для подключения к так (Bash терминал): host USERNAME.cloudant.com

Однако это не очень хорошая идея.

Причина, по которой Cloudant использует DNS, заключается в том, что IP-адреса могут меняться по прихоти службы. Кроме того, переключение на разные серверы балансировки нагрузки и/или центры обработки данных обрабатывается DNS (локальный сбой в центре обработки данных осуществляется балансировщиками нагрузки). Поэтому вы не будете создавать стабильную среду - Cloudant мог бы, и будет, измените IP-адреса на вас, тем самым убив вашу настройку.

Извините, но похоже, что лучшим решением является заставить DNS работать в вашей среде.

[Источник:. Я работаю в Cloudant]

Смежные вопросы