有没有大神做过W5100与JAVA上位机通信的项目-Arduino中文社区 - Powered by Discuz! Archiver

十年 发表于 2014-1-9 20:51

有没有大神做过W5100与JAVA上位机通信的项目

小弟现在在做空气污染物的检测,通过气体传感器把气体浓度测出来后(已解决),经过W5100通信模块把浓度值上传到JAVA上位机去(不会)。也就是一方是Server,一方是Client,定的是用套接字socket来做。主要是上传数据不会,有没有哪位小哥做过类似的,有程序参考就最好的。感激不尽!!

kevinzhang19701 发表于 2014-1-13 09:22

本帖最后由 kevinzhang19701 于 2014-1-13 17:23 编辑

代码在我家里电脑上,这里我先简单说一下吧。:)



项目的大致结构如上图。Arduino终端通过Ethernet Shield(扮演Web Client)向服务器传递请求,传递参数。这个可以在官网找到sample,稍微改一下就可以了。

#include <Ethernet.h>
#include <SPI.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // 这里随便写
byte ip[] = { 10, 0, 0, 177 }; // 分配给ethernet shield的IP
byte server[] = { 64, 233, 187, 99 }; // 服务器的IP
EthernetClient client;
void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(9600);
delay(1000);
Serial.println("connecting...");
if (client.connect(server, 8080)) // 用Tomcat的默认8080端口
{
    Serial.println("connected");
    client.println("GET /search?q=arduino HTTP/1.0"); // 要传递的数据放在?后面,等号左边是变量名,
                                                                                        // 等号右边是数值(一般都是字符型)
    client.println();
} else {
    Serial.println("connection failed");
}
}
void loop()
{
if (client.available())
{
    char c = client.read();
    Serial.print(c);
}
if (!client.connected())
{
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
}
}

上传的参数由Java写的服务器端的Servlet来控制,数据最后写入数据库一个表内保存,便于以后进行统计。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

public class myServlet extends HttpServlet
{
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
      response.setContentType("text/html;charset=UTF-8");
      PrintWriter out = response.getWriter();
      request.setCharacterEncoding("UTF-8");
      
      String myPara = request.getParameter("q"); //要取的变量名
      
      myImport(myPara); // 写入数据库的函数
      
      try
      {
            /* TODO output your page here. You may use following sample code. */
            out.println("<html>");
            out.println("<head>");
            out.println("<title>myServlet</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>更新完毕...</h1>");
            out.println("</body>");
            out.println("</html>");
      } finally
      {            
            out.close();
      }
    }
   
    public void myImport(String aPara)
    {
      Connection conn = null;
      Statement stmt = null;
      ResultSet rs1 = null;
      int oR = 0;
      String mySQL01 = "INSERT INTO newcon (c1) value ('" + aPara + "');"; // 将参数写入数据的SQL语句
      try
      {
            conn = DriverManager.getConnection("jdbc:mysql://localhost/myproject06?" +
                                 "user=root&password=15J053436"); //连接数据库
            stmt = conn.createStatement();
            oR = stmt.executeUpdate(mySQL01);
      }
      catch (SQLException ex)
      {
            System.out.println("Error in connection: " + ex.toString());
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
      }
      System.out.println("");
      System.out.println(oR);
      System.out.println("原始数据写入newcon表完毕...");
    }   
   
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
   * Handles the HTTP
   * <code>GET</code> method.
   *
   * @param request servlet request
   * @param response servlet response
   * @throws ServletException if a servlet-specific error occurs
   * @throws IOException if an I/O error occurs
   */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
      processRequest(request, response);
    }

    /**
   * Handles the HTTP
   * <code>POST</code> method.
   *
   * @param request servlet request
   * @param response servlet response
   * @throws ServletException if a servlet-specific error occurs
   * @throws IOException if an I/O error occurs
   */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
      processRequest(request, response);
    }

    /**
   * Returns a short description of the servlet.
   *
   * @return a String containing servlet description
   */
    @Override
    public String getServletInfo() {
      return "Short description";
    }// </editor-fold>
}

原始代码,我回家找了再发。


coloz 发表于 2014-1-9 21:37

Arduino IDE里有例程呢

kevinzhang19701 发表于 2014-1-10 10:17

本帖最后由 kevinzhang19701 于 2014-1-10 10:34 编辑

参考Arduino的Ethernet Libraries的EthernetClient(),不过她用的不是socket,她用的是http的GET后接参数模式。

我没找到现成的Libraires里直接操作socket的代码。

或者你反向设计一下,让W5100充当Web Server,用你的Java当客户端去取数据。Java写client还是比较简单的。

我自己的项目,w5100通过HTTP/GET向服务器发request,服务器上有个Servlet用来接住这些数据。

kevinzhang19701 发表于 2014-1-13 10:01

本帖最后由 kevinzhang19701 于 2014-1-13 10:03 编辑

颠倒的思路,是让Ethernet Shield充当Server, Java程序充当Client, 请参考下列链接:

http://www.lauridmeyer.com/2012/ ... -and-a-java-client/

文章标题为《simple Arduino TCP Server using the Ethernetshield and a Java Client》,希望对你有帮助。

十年 发表于 2014-2-16 21:21

kevinzhang19701 发表于 2014-1-13 10:01
颠倒的思路,是让Ethernet Shield充当Server, Java程序充当Client, 请参考下列链接:

http://www.lauridme ...

真心非常感激:lol

kevinzhang19701 发表于 2014-2-17 17:10

本帖最后由 kevinzhang19701 于 2014-2-17 17:14 编辑

十年 发表于 2014-2-16 21:21
真心非常感激
:handshake:) 别把5100看得太高,她只能实现一些简单的功能,Java太强大了。

十年 发表于 2014-2-17 20:48

kevinzhang19701 发表于 2014-2-17 17:10
别把5100看得太高,她只能实现一些简单的功能,Java太强大了。

嗯,亲你的原始代码找到了吗?可以发给我参考一下吗:)

kevinzhang19701 发表于 2014-2-18 09:05

本帖最后由 kevinzhang19701 于 2014-2-18 09:17 编辑

十年 发表于 2014-2-17 20:48
嗯,亲你的原始代码找到了吗?可以发给我参考一下吗
:'(一个不幸滴消息是东东被删掉了。窃以为,还是放弃socket滴比较好, client端改用HttpURLConnection向w5100发出GET的request。

参考如下链接:

《How to use HTTP connection instead of a stream socket》

http://www.java-tips.org/java-me ... -stream-socket.html

《Reading from and Writing to a URLConnection》

http://docs.oracle.com/javase/tutorial/networking/urls/readingWriting.html

无为 发表于 2014-2-18 09:28

给个UDP的通讯方式给你看看,程序不是我写的,别人写的,我给你看UDP这一段,完整的我就不贴了,上位机采用C做的一个小窗口接收和控制
arduino端程序:(注释为串口查看各段运行情况调试时用的)

#include <Ethernet.h>
#include <EthernetUdp.h>

byte mac[] = { };                                    //自己设定MAC地址
IPAddress ip(10, 10, 10, 2);
unsigned int localPort = 8888;                  // local port to listen on
char packetBuffer;      //buffer to hold incoming packet,
char ReplyBuffer[] = " ";                     // a string to send back

EthernetUDP udp;

void setup()
{
//NET CONFIG
Ethernet.begin(mac,ip);
udp.begin(localPort);


//////MSG///////////////////////////////////////////////////////////
   int packetSize = udp.parsePacket();
   if( packetSize )//Data recieved?
   {
   udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
   switch( packetBuffer )
   {
       case 'a':   
         udp.beginPacket(udp.remoteIP(), udp.remotePort()+1);
         for(int i=0;i<8;i++)
         {
         if( errFlag == 0 )
         {
             String myStr;
             myStr = String(current_t);
             myStr.toCharArray(ReplyBuffer,myStr.length()+1);
             if(current_t<10) udp.write("00");
             else if(current_t<100) udp.write("0");
             udp.write(ReplyBuffer);
         }
         else
         {
             udp.write("888");
         }
         }
         udp.endPacket();
         break;
         
         case 's':
//         Serial.print("Roger!");
//         Serial.println(packetSize);
//         for(int i=0;i<packetSize;i++)
//             Serial.print(packetBuffer);
//         Serial.println("END");
         if( (packetSize == 26) && (packetBuffer == 'e') )
         {
             //Serial.println("T CONFIG");
             for(int i=0 ; i<8 ; i++)            //数据编码与解码方式和上位机编码与解码方式一至
             {
               target_t= 100*(packetBuffer-'0')+10*(packetBuffer-'0')+(packetBuffer-'0');                     
               if( target_t< 20 ) target_t = 20;
               else if( target_t > 500) target_t = 500;
             }
         }
         break;
         
         case 'h':
         udp.beginPacket(udp.remoteIP(), 8889);//udp.remotePort()+1);
//         Serial.print(udp.remoteIP());
//         Serial.print(",");
//         Serial.println(udp.remotePort());
         for(int i=0;i<8;i++)
         {
             if( errFlag == 0)
             {
               boolHeat=1;
               udp.write("1");
             }
             else
             {
               boolHeat=0;
               udp.write("0");
             }
         }
         udp.endPacket();
         break;
         
       case 'z':
         for(int i=0;i<8;i++)
         {
               boolHeat=0;
         }
         break;
   }
   }
页: [1] 2 3 4 5 6
查看完整版本: 有没有大神做过W5100与JAVA上位机通信的项目