2013-06-27 51 views
2

非常感謝您找人。我剛剛開始使用Arduino無線傳感器項目,並且遇到了線索牆。我會很感激任何見解或幫助解決我的項目。無法連接到Xively使用Arduino + WiFi盾牌,「ret = -1沒有套接字可用」

我正在使用Arduino Mega,Wifi Shield試圖將4個通道(全部浮動)上傳到我的Xively feed。我正在使用基本教程腳本的修改形式(底部的代碼)。我驗證併成功上傳。當我運行電路板時,最初的調試信息看起來不錯。當我嘗試使用Xively客戶端庫執行put或get操作時,出現錯誤(ret = -1,沒有可用的套接字,並且獲取http錯誤)。我在底部附上了一個錯誤的連續日誌。

我已經採取了一些故障排除步驟。我重新下載了所有的xively庫和Wifi庫以確保。我以爲手動設置DNS服務器(8.8.8.8)可能會有所幫助。我甚至導入了整個arduino庫(儘管我認爲它不應該被需要)來獲得DNS功能。它似乎沒有什麼區別,所以我把它作爲一個排除故障的麪包屑。同樣作爲故障排除步驟,我添加了一個Xively client.get,以查看我是否可以取消但不推送。這產生了一個HTTP錯誤。我還爲我的項目添加了一個公開的開放API密鑰,並嘗試(而不是私有密鑰)。仍然沒有快樂。

雖然我成功地連接到我的wifi,但它不能與任何服務建立真正的連接,這種感覺就像是一種感覺。我希望有一些超級明顯的步驟,我錯過了。我真的可以用一條有用的線索讓我再次走上正軌。謝謝!

彌Wyenn

#include <Dhcp.h> 
#include <Dns.h> 
#include <Ethernet.h> 
#include <EthernetClient.h> 
#include <EthernetServer.h> 
#include <EthernetUdp.h> 
#include <util.h> 

/* 
    Hot Tub Monitor 
     --- If you are only calibrating your sensor, use the calibrate sensor script. This is for submerged operation. 
    This script will allow you to test to ensure the temp, Ph, and ORD sensors are operating and are calibrated correctly.---- 

    This script was written for the MEGA 2560 with the wireless shield, connecting in to Xively's cloud graph service 

    The Mega 2560 with the Wireless shield and Probes uses the following pins: 
    * SPI bus interface 
    * Onboard MicroSD card reader (uses SD Lib) on digital pin 4 
    * Digital Pins 7, 50, 51, 52, and 53 are reserved and shouldn't be used 
    * Digital Pin 18 is set to OUTPUT to power the temp probe on/off 
    * Atlas Scientific Temp Sensor input on Analog Uno pin A4 
    * Phidgets Ph Sensor input on Analog Uno pin A2 
    * Phidgets ORD Sensor input on Analog Uno pin A0 
*/ 
// Libraries in use 
#include <SPI.h> 
#include <WiFi.h> 
#include <b64.h> 
#include <HttpClient.h> 
#include <CountingStream.h> 
#include <Xively.h> 
#include <XivelyClient.h> 
#include <XivelyDatastream.h> 
#include <XivelyFeed.h> 
#include <WiFiClient.h> 
#include <WiFiServer.h> 
#include <WiFiUdp.h> 

// setting up some of the globals 
const int TEMPPIN = 4; 
const int PHPIN = 1; 
const int ORPPIN = 0; 
boolean isDebugEnabled = true; //setting up the debug state 
int status = WL_IDLE_STATUS; 
char ssid[] = "<security snip>"; // your network SSID (name) 
char pass[] = "<security snip>"; // your network password (use for WPA, or use as key for WEP) 

// My Xively key to let you upload data 
char xivelyKey[] = "<security snip>"; 
// My xively feed ID 
#define xivelyFeed <security snip> 
// My datastreams 
char myWirelessStrStream[] = "MonitorWirelessStrength"; 
char myORPStream[] = "ORP"; 
char myPhStream[] = "Ph"; 
char myTempStream[] = "Temp"; 

// Creating the datastreams 
XivelyDatastream datastreams[] = { 
    XivelyDatastream(myWirelessStrStream, strlen(myWirelessStrStream), DATASTREAM_FLOAT), 
    XivelyDatastream(myORPStream, strlen(myORPStream), DATASTREAM_FLOAT), 
    XivelyDatastream(myPhStream, strlen(myPhStream), DATASTREAM_FLOAT), 
    XivelyDatastream(myTempStream, strlen(myTempStream), DATASTREAM_FLOAT) 
    }; 
XivelyFeed feed(xivelyFeed, datastreams, 4); 

//starting the Xively client 
WiFiClient client; 
XivelyClient xivelyclient(client); 


void setup() { 
    if (isDebugEnabled) { //setting up the debug stream 
    Serial.begin(9600); 
    Serial.println("Hot Tub Monitor Debug Stream Starting"); 
    Serial.println("-----------------------------------"); 
    } 
    pinMode(12,OUTPUT); //this pin turns on the temp sensor - battery saver to have this on/off switchable 

    // connect to the wifi 
    // check for presence of the shield 
    if (WiFi.status() == WL_NO_SHIELD) { 
    Serial.println("WiFi shield not present"); 
    // don't continue: 
    while(true); 
    } 

    //Connect to the wifi network 
    while (status != WL_CONNECTED) { 
     Serial.print("Attempting to connect to WPA SSID: "); 
     Serial.println(ssid); 
     // Connect to WPA/WPA2 network:  
     status = WiFi.begin(ssid, pass); 

     // wait 10 seconds for connection: 
     delay(10000); 
    } 
    Serial.println("You're connected to the network"); 
    Serial.println(status); 
    //printCurrentNet(); 
    printWifiData(); 

    // print the received signal strength: 
    long rssi = WiFi.RSSI(); 
    Serial.print("signal strength (RSSI):"); 
    Serial.println(rssi); 

} 

void loop() { 
// report on the WiFi Signal strength 
    long rssi = WiFi.RSSI(); 
    if (isDebugEnabled) { //send the signal str to Xively 
    Serial.print("Sending RSSI to Xively: "); 
    Serial.println(rssi); 
    } 
    // print the received signal strength: 
    datastreams[0].setFloat(rssi); 

// get the temp from our Atlas Sci probe 
    float tempC=get_temp(); 
    float tempF = (tempC*1.8)+32; 
    datastreams[1].setFloat(tempF); 

// debugging info for temp 
    if (isDebugEnabled) { //send the temp to Xively 
    Serial.print("Sending Temp to Xively: "); 
    Serial.println(tempF); 
    } 

// get the Ph from our phidget's monitor 
    float Ph=get_Ph(tempC); 
    datastreams[2].setFloat(Ph); 

// debugging info for Ph 
    if (isDebugEnabled) { //send the Ph to Xively 
    Serial.print("Sending Ph to Xively: "); 
    Serial.println(Ph); 
    } 

// get the Ph from our phidget's monitor 
    float ORP=get_ORP(); 
    datastreams[3].setFloat(ORP); 

// debugging info for Ph 
    if (isDebugEnabled) { //send the Ph to Xively 
    Serial.print("Sending ORP to Xively: "); 
    Serial.println(ORP); 
    } 


    Serial.println("Uploading it to Xively"); 
    int ret = xivelyclient.put(feed, xivelyKey); 
    Serial.print("xivelyclient.put returned "); 
    Serial.println(ret); 


    delay(10000); 
} 
float get_Ph(float tempC) { 
    float Ph = analogRead(PHPIN); 
    Ph = 7 -((2.5 - (Ph/200))/((0.257179 + 0.0000941468)*tempC)); // convert to the ph 
    return Ph; 
    } 

float get_ORP() { 
    float ORP = analogRead(ORPPIN); 
    ORP = (2.5 - (ORP/200))/1.037; // convert to proper ORP 
    return ORP; 
    } 

float get_temp(){  
    float v_out; 
    float Temp; 
    digitalWrite(A4, LOW); //wtf is this for? 
    digitalWrite(12, HIGH); 
    delay(2); 
    v_out = analogRead(4); 
    digitalWrite(12, LOW); 
    v_out*=.0048; 
    v_out*=1000; 
    Temp=0.0512 * v_out -20.5128; 
    return Temp; 
} 

void printWifiData() { 
    // print your WiFi shield's IP address: 
    IPAddress ip = WiFi.localIP(); 
    Serial.print("IP Address: "); 
    Serial.println(ip); 
    Serial.println(ip); 
} 

 
    -----------------------------Error Log Output------------------------------------------ 
    Hot Tub Monitor Debug Stream Starting 
    ----------------------------------- 
    Attempting to connect to WPA SSID: LionsGate 
    You're connected to the network 
    3 
    IP Address: 192.168.1.137 
    192.168.1.137 
    signal strength (RSSI):-27 
    Sending RSSI to Xively: -27 
    Sending Temp to Xively: 227.32 
    Sending Ph to Xively: 6.98 
    Sending ORP to Xively: 0.49 
    Uploading it to Xively 
    xivelyclient.put returned -1 
    HTTP Error 
    Sending RSSI to Xively: -27 
    Sending Temp to Xively: 154.33 
    Sending Ph to Xively: 6.94 
    Sending ORP to Xively: 0.87 
    Uploading it to Xively 
    xivelyclient.put returned -1 
    HTTP Error 
    Sending RSSI to Xively: -27 
    Sending Temp to Xively: 147.25 
    Sending Ph to Xively: 6.94 
    Sending ORP to Xively: 0.83 
    Uploading it to Xively 
    No Socket available 
    xivelyclient.put returned -1 
    No Socket available 
    HTTP Error 
    Sending RSSI to Xively: -27 
    Sending Temp to Xively: 149.91 
    Sending Ph to Xively: 6.94 
    Sending ORP to Xively: 0.87 
    Uploading it to Xively 
    No Socket available 
    xivelyclient.put returned -1 
    No Socket available 
    HTTP Error 

回答

1

謝謝你的問題提供了這麼多的背景下,它使人們容易測試,找出您的問題是什麼。只要你連接到你的無線網卡,看起來你的代碼應該是好的,除了所有的進口。我所做的只是在開始時刪除多餘的進口產品。關於設置你自己的DNS服務器,你可以這樣做,但這可能是導致你的問題。如果您擔心DNS,您最好手動設置IP,而不是依靠DNS。

以下是我從代碼中複製的內容的返工版本。希望它能適用於您的網絡和Feed。我在UNO和Mega ADK(僅限於Mega)上使用官方Arduino WiFi屏蔽對它進行了測試,它對兩者都起作用。

// Libraries in use 
#include <SPI.h> 
#include <WiFi.h> 
#include <HttpClient.h> 
#include <Xively.h> 
/* 
    Hot Tub Monitor 
     --- If you are only calibrating your sensor, use the calibrate sensor script. This is for submerged operation. 
    This script will allow you to test to ensure the temp, Ph, and ORD sensors are operating and are calibrated correctly.---- 

    This script was written for the MEGA 2560 with the wireless shield, connecting in to Xively's cloud graph service 

    The Mega 2560 with the Wireless shield and Probes uses the following pins: 
    * SPI bus interface 
    * Onboard MicroSD card reader (uses SD Lib) on digital pin 4 
    * Digital Pins 7, 50, 51, 52, and 53 are reserved and shouldn't be used 
    * Digital Pin 18 is set to OUTPUT to power the temp probe on/off 
    * Atlas Scientific Temp Sensor input on Analog Uno pin A4 
    * Phidgets Ph Sensor input on Analog Uno pin A2 
    * Phidgets ORD Sensor input on Analog Uno pin A0 
*/ 


// setting up some of the globals 
const int TEMPPIN = 4; 
const int PHPIN = 1; 
const int ORPPIN = 0; 
boolean isDebugEnabled = true; //setting up the debug state 
int status = WL_IDLE_STATUS; 
char ssid[] = "LMI-GUEST"; // your network SSID (name) 
char pass[] = "2009LMIGuest!"; // your network password (use for WPA, or use as key for WEP) 

// My Xively key to let you upload data 
char xivelyKey[] = "<snip for security>"; 
// My xively feed ID 
#define xivelyFeed 121601 
// My datastreams 
char myWirelessStrStream[] = "MonitorWirelessStrength"; 
char myORPStream[] = "ORP"; 
char myPhStream[] = "Ph"; 
char myTempStream[] = "Temp"; 

// Creating the datastreams 
XivelyDatastream datastreams[] = { 
    XivelyDatastream(myWirelessStrStream, strlen(myWirelessStrStream), DATASTREAM_FLOAT), 
    XivelyDatastream(myORPStream, strlen(myORPStream), DATASTREAM_FLOAT), 
    XivelyDatastream(myPhStream, strlen(myPhStream), DATASTREAM_FLOAT), 
    XivelyDatastream(myTempStream, strlen(myTempStream), DATASTREAM_FLOAT) 
    }; 
XivelyFeed feed(xivelyFeed, datastreams, 4); 

//starting the Xively client 
WiFiClient client; 
XivelyClient xivelyclient(client); 


void setup() { 
    if (isDebugEnabled) { //setting up the debug stream 
    Serial.begin(9600); 
    Serial.println("Hot Tub Monitor Debug Stream Starting"); 
    Serial.println("-----------------------------------"); 
    } 
    pinMode(12,OUTPUT); //this pin turns on the temp sensor - battery saver to have this on/off switchable 

    // connect to the wifi 
    // check for presence of the shield 
    if (WiFi.status() == WL_NO_SHIELD) { 
    Serial.println("WiFi shield not present"); 
    // don't continue: 
    while(true); 
    } 

    //Connect to the wifi network 
    while (status != WL_CONNECTED) { 
     Serial.print("Attempting to connect to WPA SSID: "); 
     Serial.println(ssid); 
     // Connect to WPA/WPA2 network:  
     status = WiFi.begin(ssid, pass); 

     // wait 10 seconds for connection: 
     delay(10000); 
    } 
    Serial.println("You're connected to the network"); 
    Serial.println(status); 
    //printCurrentNet(); 
    printWifiData(); 

    // print the received signal strength: 
    long rssi = WiFi.RSSI(); 
    Serial.print("signal strength (RSSI):"); 
    Serial.println(rssi); 

} 

void loop() { 
// report on the WiFi Signal strength 
    long rssi = WiFi.RSSI(); 
    if (isDebugEnabled) { //send the signal str to Xively 
    Serial.print("Sending RSSI to Xively: "); 
    Serial.println(rssi); 
    } 
    // print the received signal strength: 
    datastreams[0].setFloat(rssi); 

// get the temp from our Atlas Sci probe 
    float tempC=get_temp(); 
    float tempF = (tempC*1.8)+32; 
    datastreams[1].setFloat(tempF); 

// debugging info for temp 
    if (isDebugEnabled) { //send the temp to Xively 
    Serial.print("Sending Temp to Xively: "); 
    Serial.println(tempF); 
    } 

// get the Ph from our phidget's monitor 
    float Ph=get_Ph(tempC); 
    datastreams[2].setFloat(Ph); 

// debugging info for Ph 
    if (isDebugEnabled) { //send the Ph to Xively 
    Serial.print("Sending Ph to Xively: "); 
    Serial.println(Ph); 
    } 

// get the Ph from our phidget's monitor 
    float ORP=get_ORP(); 
    datastreams[3].setFloat(ORP); 

// debugging info for Ph 
    if (isDebugEnabled) { //send the Ph to Xively 
    Serial.print("Sending ORP to Xively: "); 
    Serial.println(ORP); 
    } 


    Serial.println("Uploading it to Xively"); 
    int ret = xivelyclient.put(feed, xivelyKey); 
    Serial.print("xivelyclient.put returned "); 
    Serial.println(ret); 


    delay(10000); 
} 
float get_Ph(float tempC) { 
    float Ph = analogRead(PHPIN); 
    Ph = 7 -((2.5 - (Ph/200))/((0.257179 + 0.0000941468)*tempC)); // convert to the ph 
    return Ph; 
    } 

float get_ORP() { 
    float ORP = analogRead(ORPPIN); 
    ORP = (2.5 - (ORP/200))/1.037; // convert to proper ORP 
    return ORP; 
    } 

float get_temp(){  
    float v_out; 
    float Temp; 
    digitalWrite(A4, LOW); //wtf is this for? 
    digitalWrite(12, HIGH); 
    delay(2); 
    v_out = analogRead(4); 
    digitalWrite(12, LOW); 
    v_out*=.0048; 
    v_out*=1000; 
    Temp=0.0512 * v_out -20.5128; 
    return Temp; 
} 

void printWifiData() { 
    // print your WiFi shield's IP address: 
    IPAddress ip = WiFi.localIP(); 
    Serial.print("IP Address: "); 
    Serial.println(ip); 
    Serial.println(ip); 
} 

希望這有助於。