我们正在尝试将基于Arduino的wifi蜂(ATmega 328P)连接到Cloudant数据库. wifi蜜蜂使用wiwhield库连接到网络.我们可以使用它连接到cosm(xively)和post / get数据.但是,对于cloudant,我们无法这样做,并且继
我认为问题在于Wishield期望指定一个IP地址,而Cloudant使用DNS ..我使用wishield添加代码片段,该函数适用于来自weather.com的GET数据,但是当我们修改cloudant的变量时.com,它只给了我503请求.
请找到不同的代码:
代码片段:GetDatafromCloudant.ino:我们刚刚更改了cloudant GET请求的IP地址/端口详细信息.
/* * 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); }您是对的,Cloudant根据提供的标头路由您的请求.您可以通过如下指定Host标头来处理此问题:Host:USERNAME.cloudant.com
您从Cloudant获取的503状态代码表示您登陆的负载均衡器不知道如何路由您的请求,因为它没有您的帐户名称.
您可以像这样连接IP(Bash终端):主机USERNAME.cloudant.com
但是,这不是一个好主意.
Cloudant使用DNS的原因是IP可以在服务的奇思妙想中改变.此外,故障转移到不同的负载平衡服务器和/或数据中心由DNS处理(数据中心内的本地故障转移由负载平衡器处理).因此,您不会创建一个稳定的环境 – Cloudant可以并且将会更改您的IP,从而终止您的设置.
抱歉,听起来最好的解决方案是让DNS在您的环境中运行.
[来源:我在Cloudant工作.]