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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 35179|回复: 56

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

[复制链接]
发表于 2014-1-9 20:51 | 显示全部楼层 |阅读模式
小弟现在在做空气污染物的检测,通过气体传感器把气体浓度测出来后(已解决),经过W5100通信模块把浓度值上传到JAVA上位机去(不会)。也就是一方是Server,一方是Client,定的是用套接字socket来做。主要是上传数据不会,有没有哪位小哥做过类似的,有程序参考就最好的。感激不尽!!
发表于 2014-1-13 09:22 | 显示全部楼层
本帖最后由 kevinzhang19701 于 2014-1-13 17:23 编辑

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

sss.jpg

项目的大致结构如上图。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>OST</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>
}


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


评分

参与人数 1贡献 +1 收起 理由
奈何col + 1 很给力!

查看全部评分

发表于 2014-1-9 21:37 | 显示全部楼层
Arduino IDE里有例程呢

点评

嗯,就是在例程的基础上改的,现在遇到了传数据的问题  发表于 2014-1-11 15:03
发表于 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用来接住这些数据。

点评

小哥可以把你写的那段程序发给我学习下吗?  发表于 2014-1-11 15:07
非常感谢W5100做Web Server时,JAVA客户端需要什么函数才能取到数据呢,需要在Server中加函数吗? 另外,我的传感器数据是可以在IE浏览器的指定IP上看  发表于 2014-1-11 15:05
发表于 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 ...

真心非常感激
发表于 2014-2-17 17:10 | 显示全部楼层
本帖最后由 kevinzhang19701 于 2014-2-17 17:14 编辑

别把5100看得太高,她只能实现一些简单的功能,Java太强大了。
 楼主| 发表于 2014-2-17 20:48 | 显示全部楼层
kevinzhang19701 发表于 2014-2-17 17:10
别把5100看得太高,她只能实现一些简单的功能,Java太强大了。

嗯,亲你的原始代码找到了吗?可以发给我参考一下吗
发表于 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/tu ... 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[UDP_TX_PACKET_MAX_SIZE];      //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[0] )
     {
       case 'a':     
         udp.beginPacket(udp.remoteIP(), udp.remotePort()+1);
         for(int i=0;i<8;i++)
         {
           if( errFlag[i] == 0 )
           {
             String myStr;
             myStr = String(current_t[i]);
             myStr.toCharArray(ReplyBuffer,myStr.length()+1);
             if(current_t[i]<10) udp.write("00");
             else if(current_t[i]<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[i]);
//           Serial.println("END");
           if( (packetSize == 26) && (packetBuffer[25] == 'e') )
           {
             //Serial.println("T CONFIG");
             for(int i=0 ; i<8 ; i++)              //数据编码与解码方式和上位机编码与解码方式一至
             {
               target_t[i]= 100*(packetBuffer[i*3+1]-'0')+10*(packetBuffer[i*3+2]-'0')+(packetBuffer[i*3+3]-'0');                     
               if( target_t[i]< 20 ) target_t[i] = 20;
               else if( target_t[i] > 500) target_t[i] = 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[i] == 0)
             {
               boolHeat[i]=1;
               udp.write("1");
             }
             else
             {
               boolHeat[i]=0;
               udp.write("0");
             }
           }
           udp.endPacket();
           break;
           
       case 'z':
           for(int i=0;i<8;i++)
           {
               boolHeat[i]=0;
           }
           break;
     }
   }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 23:58 , Processed in 0.145297 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表