【问题标题】:Arduino ethernet shield + Java socket connectionArduino 以太网屏蔽 + Java 套接字连接
【发布时间】:2017-06-01 08:03:36
【问题描述】:

我在我的 arduino 上安装了一个简单的 EthernetServer 示例。我已经设置了IP地址和MAC地址。我可以从我的 PC 上 ping 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());
  }
}

当我运行代码时,我得到:

我可以从命令提示符 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 和端口 8080 上通过 Telnet 连接,情况也是如此。

我做错了什么?

【问题讨论】:

    标签: java sockets arduino


    【解决方案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();
            }
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      将日志添加到 Arduino Sketch 以进行调试

      #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); 之后,我认为您不需要在循环中创建 SocketBufferedReaderPrintWriter。您可以将它们移到顶部。

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

      【讨论】:

      • 谢谢Shazin,我已经复制了你的代码,但问题仍然存在。还尝试仅使用局域网电缆将我的电脑连接到 arduino。我可以 ping 它,但我无法向/从 Arduino 发送或接收任何数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多