2017-06-01 96 views
0

我在我的arduino上安装了一个简单的以太网服务器示例。我设置了IP地址和MAC地址。我可以从PC上ping Arduino,但我无法从简单的Java程序发送任何数据。Arduino以太网盾+ Java套接字连接

下面是Arduino的源:

#include <SPI.h> 
#include <Ethernet.h> 

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
byte ip[] = { 172, 16, 201, 218 };  


EthernetServer server = EthernetServer(8080); 

void setup() 
{ 
    Serial.begin(9600); 
    Ethernet.begin(mac, ip); 

    server.begin(); 
    Serial.print("My IP address: "); 
    Serial.println(Ethernet.localIP()); 
} 

void loop() 
{ 
    // if an incoming client connects, there will be bytes available to read: 
    EthernetClient client = server.available(); 
    if (client == true) { 
    // read bytes from the incoming client and write them back 
    // to any clients connected to the server: 
    server.write(client.read()); 
    } 
} 

当我运行的代码我得到: enter image description here

我可以从命令提示符下执行ping的Arduino:

C:\WINDOWS\system32>ping 172.16.201.218 

Pinging 172.16.201.218 with 32 bytes of data: 
Reply from 172.16.201.218: bytes=32 time<1ms TTL=128 
Reply from 172.16.201.218: bytes=32 time<1ms TTL=128 
Reply from 172.16.201.218: bytes=32 time<1ms TTL=128 
Reply from 172.16.201.218: bytes=32 time<1ms TTL=128 

Ping statistics for 172.16.201.218: 
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 0ms, Maximum = 0ms, Average = 0ms 

C:\WINDOWS\system32> 

的客户端Java是:

package ardsocket; 

import java.io.*; 
import java.net.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class ArdSocket { 

    public static void main(String args[]) throws IOException { 
     final String host = "172.16.201.218"; 
     final int portNumber = 8080; 
     System.out.println("Creating socket to '" + host + "' on port " + portNumber); 

     while (true) { 
      Socket socket = new Socket(host, portNumber); 
      BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

      System.out.println("server says:" + br.readLine()); 

      BufferedReader userInputBR = new BufferedReader(new InputStreamReader(System.in)); 
      String userInput = userInputBR.readLine(); 

      out.println(userInput); 

      System.out.println("server says:" + br.readLine()); 

      if ("exit".equalsIgnoreCase(userInput)) { 
       socket.close(); 
       break; 
      } 
     } 
    } 

} 

当我运行Java源时什么也没有发生.. 另外如果我尝试通过IP连接到Telnet并且端口8080是相同的故事。

我做错了什么?

回答

1

希望我的代码Java有帮助!

import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.InputStreamReader; 
    import java.io.PrintWriter; 
    import java.net.InetAddress; 
    import java.net.Socket; 

public class GateControl { 
    public static void main(String []args) { 
     try { 
      // "192.168.1.177" is a IP of Server 
      Socket s = new Socket("192.168.1.177", 80); 
      InetAddress add = s.getInetAddress(); 
      System.out.println("Connected to " + add); 

      PrintWriter pw = new PrintWriter(s.getOutputStream()); 
      // "?butonon" is a content which you send to server 
      pw.println("GET /?buttonon HTTP/1.1"); 
      pw.println(""); 
      pw.println(""); 
      pw.flush(); 
      System.out.println("Request sent"); 

      BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 
      System.out.println(br.readLine()); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 
0

添加日志Arduino的草图进行调试

#include <SPI.h> 
#include <Ethernet.h> 

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
byte ip[] = { 172, 16, 201, 218 };  


EthernetServer server = EthernetServer(8080); 

void setup() 
{ 
    Serial.begin(9600); 
    Ethernet.begin(mac, ip); 

    server.begin(); 
    Serial.print("My IP address: "); 
    Serial.println(Ethernet.localIP()); 
} 

void loop() 
{ 
    // if an incoming client connects, there will be bytes available to read: 
    EthernetClient client = server.available(); 
    if (client == true) { 
    // Client Connected 
    Serial.println("Client Connected."); 
    server.write(client.read()); 
    } 
} 

而且在Java客户端尝试把out.flush();out.println(userInput);后,我想你并不需要创建Socket,内环路BufferedReaderPrintWriter。您可以将这些移动到顶部。

package ardsocket; 

import java.io.*; 
import java.net.*; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class ArdSocket { 

    public static void main(String args[]) throws IOException { 
     final String host = "172.16.201.218"; 
     final int portNumber = 8080; 
     System.out.println("Creating socket to '" + host + "' on port " + portNumber); 

     Socket socket = new Socket(host, portNumber); 
     BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 

     BufferedReader userInputBR = new BufferedReader(new InputStreamReader(System.in)); 

     while (true) { 
      System.out.println("server says:" + br.readLine()); 

      String userInput = userInputBR.readLine(); 

      out.println(userInput); 
      out.flush(); 

      System.out.println("server says:" + br.readLine()); 

      if ("exit".equalsIgnoreCase(userInput)) { 
       socket.close(); 
       break; 
      } 
     } 
    } 

} 
+0

谢谢Shazin,我已经复制了你的代码,但问题仍然存在。也尝试只连接我的电脑与lan电缆到arduino。我可以ping通它,但是我无法发送或接收来自Arduino的任何数据。 – Ferguson