找回密码
 立即注册

QQ登录

Arduino DUE 和Arduino WiFi Shield做为服务器,连接后...

来源: 已解决 这个冬天有点酷 2015-1-5 15:03 显示全部楼层 |阅读模式
前几天在贵公司的店铺买了Arduino Due的板子和Arduino WiFi Shield板子,这两个板子配合着使用现在可以跑IDE中的例子,当我运行开发环境中WiFiChatServer这个例子时,发现利用telnet命令可以连接到服务器,但是过一段时间连接就断开了,客户端终端显示:Connection closed by foreign host,想问一下,这是因为WIFI库中服务器部分代码的问题吗?是不是服务器不稳定呢?这个问题该怎么解决?下面是WiFiChatServer例子的代码
  1. #include <SPI.h>
  2. #include <WiFi.h>

  3. char ssid[] = "zzzzzzzzzz"; //  your network SSID (name)
  4. char pass[] = "1qaz2wsx3edc";
  5. //char ssid[] = "Xiaomi_B1CC"; //  your network SSID (name)
  6. //char pass[] = "12345678";    // your network password (use for WPA, or use as key for WEP)

  7. //int keyIndex = 0;            // your network key Index number (needed only for WEP)

  8. int status = WL_IDLE_STATUS;

  9. WiFiServer server(23);

  10. boolean alreadyConnected = false; // whether or not the client was connected previously

  11. void setup() {
  12.   //Initialize serial and wait for port to open:
  13.   Serial.begin(9600);
  14.   while (!Serial) {
  15.     ; // wait for serial port to connect. Needed for Leonardo only
  16.   }

  17.   // check for the presence of the shield:
  18.   if (WiFi.status() == WL_NO_SHIELD) {
  19.     Serial.println("WiFi shield not present");
  20.     // don't continue:
  21.     while (true);
  22.   }

  23.   String fv = WiFi.firmwareVersion();
  24.   if ( fv != "1.1.0" )
  25.     Serial.println("Please upgrade the firmware");

  26.   // attempt to connect to Wifi network:
  27.   while ( status != WL_CONNECTED) {
  28.     Serial.print("Attempting to connect to SSID: ");
  29.     Serial.println(ssid);
  30.     // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
  31.     status = WiFi.begin(ssid, pass);

  32.     // wait 10 seconds for connection:
  33.     delay(10000);
  34.   }

  35.   // start the server:
  36.   server.begin();
  37.   // you're connected now, so print out the status:
  38.   printWifiStatus();
  39. }


  40. void loop() {
  41.   // wait for a new client:
  42.   WiFiClient client = server.available();


  43.   // when the client sends the first byte, say hello:
  44.   if (client) {
  45.     if (!alreadyConnected) {
  46.       // clead out the input buffer:
  47.       client.flush();
  48.       Serial.println("We have a new client");
  49.       client.println("Hello, client!");
  50.       alreadyConnected = true;
  51.     }

  52.     if (client.available() > 0) {
  53.       // read the bytes incoming from the client:
  54.       char thisChar = client.read();
  55.       // echo the bytes back to the client:
  56.       server.write(thisChar);
  57.       // echo the bytes to the server as well:
  58.       Serial.write(thisChar);
  59.     }
  60.   }
  61. }


  62. void printWifiStatus() {
  63.   // print the SSID of the network you're attached to:
  64.   Serial.print("SSID: ");
  65.   Serial.println(WiFi.SSID());

  66.   // print your WiFi shield's IP address:
  67.   IPAddress ip = WiFi.localIP();
  68.   Serial.print("IP Address: ");
  69.   Serial.println(ip);

  70.   // print the received signal strength:
  71.   long rssi = WiFi.RSSI();
  72.   Serial.print("signal strength (RSSI):");
  73.   Serial.print(rssi);
  74.   Serial.println(" dBm");
  75. }
复制代码

回复

使用道具 举报

大神点评6

这个问题我觉得你可以,更换一个服务器或者路由器试试,随便拿一个小无线上网卡试试,如果没问题说明你服务器或者路由器有问题,如果不行,说明板子有问题。
回复 支持 1 反对 0

使用道具 举报

龙行天下 发表于 2015-1-5 20:29
这个问题我觉得你可以,更换一个服务器或者路由器试试,随便拿一个小无线上网卡试试,如果没问题说明你服务 ...

更换了路由器了,效果是一样的
回复 支持 反对

使用道具 举报

这个冬天有点酷 发表于 2015-1-6 09:34
更换了路由器了,效果是一样的

首先,需要确定下是否重新连接下就好用.
如果是这样,可能是你的客户端突然断开,服务器端的TCP连接处于一个半打开状态。当下一次同一客户机再次建立 TCP连接时,服务器检测到这个半打开的TCP连接,并向客户机回传一个置位RST的TCP报文,客户机就会显示connection closed by foreign host。这是TCP协议本身的一个保护措施,并不是什么错误,你只要再重新连接服务器就能连上。
回复 支持 反对

使用道具 举报

奥松-Tony 发表于 2015-1-9 09:08
首先,需要确定下是否重新连接下就好用.
如果是这样,可能是你的客户端突然断开,服务器端的TCP连接处于 ...

一旦断开连接后重新连接就连接不上了,您了解WIFI库的代码吗?我怀疑是这个函数server.available();调用太频繁导致SPI通信太频繁,芯片没有反应过来,然后返回了垃圾值,然后WIFISERVER库中有一个计数,如果这个垃圾值收到的次数超过了50服务器就重启了,然后就不知道了
回复 支持 反对

使用道具 举报

奥松-Tony 发表于 2015-1-9 09:08
首先,需要确定下是否重新连接下就好用.
如果是这样,可能是你的客户端突然断开,服务器端的TCP连接处于 ...

你好,我试过了,服务器端如果不重启的话,重新连接是无法连接到web服务器的,根本就没有反应,但是这是在DOS下可以ping的通WIFI板子的IP地址,一旦断了以后,就无法连接到服务器,这是什么原因呢?
回复 支持 反对

使用道具 举报

奥松-Sam 2015-1-15 09:38 显示全部楼层
这个冬天有点酷 发表于 2015-1-14 14:24
你好,我试过了,服务器端如果不重启的话,重新连接是无法连接到web服务器的,根本就没有反应,但是这是 ...

这个问题没有遇到,因为测试环境的也没有办法帮您测试下,有没有其他小伙伴遇到过相似的问题。帮解答下。小弟不胜感激。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册