簡體   English   中英

無法使用Arduino + wifi屏蔽連接到Xively,“ ret = -1無可用插座”

[英]Can't connect to Xively using Arduino + wifi shield, “ret = -1 No sockets available”

非常感謝各位的光臨。 我剛開始使用Arduino無線傳感器項目,但遇到了麻煩。 如果您有任何見解或對我的項目進行故障排除,我將不勝感激。

我正在使用Arduino Mega和Wifi Shield,嘗試將4個通道(所有浮動)上傳到Xively Feed。 我使用的是基本教程腳本的修改形式(底部代碼)。 我驗證並成功上傳。 當我運行電路板時,初始調試信息看起來不錯。 當我嘗試使用Xively客戶端庫進行放置或獲取操作時,出現錯誤(ret = -1,沒有可用的套接字,並且獲取時出現http錯誤)。 我還在底部附加了錯誤的串行日志。

我已經采取了一些故障排除步驟。 我已經重新下載了所有xively庫和Wifi庫。 我認為手動設置DNS服務器(8.8.8.8)可能會有所幫助。 我什至導入了整個arduino庫(盡管我認為這不是必需的)以獲取DNS功能。 它似乎沒有什么區別,所以我把它留在了故障排除過程中。 另外,作為故障排除步驟,我添加了一個Xively client.get,以查看是否可以拉出但不能推入。 那產生了一個HTTP錯誤。 我還向我的項目添加了一個公共開放的api密鑰,並對此進行了嘗試(而不是私有的api密鑰)。 仍然沒有喜悅。

雖然我可以成功連接到wifi,但是卻無法與任何服務建立真正的連接。 我希望能錯過一些非常明顯的步驟。 我真的可以使用一條有用的線索使我再次走上正確的道路。 謝謝!

米卡·懷恩(Micah 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

感謝您為您的問題提供了如此多的背景知識,它使測試和弄清楚您的問題是很容易的。 只要您可以正常連接到wifi,就可以看到您的代碼應該不錯,除了所有導入。 我要做的就是刪除您一開始就有的多余導入。 關於設置自己的DNS服務器,您可以執行此操作,但這可能是導致問題的原因。 如果您擔心DNS,則最好手動設置IP,而不要依賴DNS。

以下是我從您的代碼中復制的內容的改編版本。 希望它可以與您的網絡和供稿一起使用。 我在帶有官方Arduino WiFi防護罩的UNO和Mega ADK(只有我擁有的Mega)上進行了測試,並且在這兩者上均可使用。

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

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM