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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

楼主: 十年

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

[复制链接]
 楼主| 发表于 2014-2-18 11:57 | 显示全部楼层
kevinzhang19701 发表于 2014-2-18 09:05
一个不幸滴消息是东东被删掉了。窃以为,还是放弃socket滴比较好, client端改用HttpURLConnection向w51 ...

没关系,反正太谢谢了,我好好看看你给的资料先
 楼主| 发表于 2014-2-18 11:58 | 显示全部楼层
无为 发表于 2014-2-18 09:28
给个UDP的通讯方式给你看看,程序不是我写的,别人写的,我给你看UDP这一段,完整的我就不贴了,上位机采用 ...

嗯,我瞧瞧,这几天一直琢磨着写程序的事情,不会的还得请教你们呐,真心感激
 楼主| 发表于 2014-2-18 11:59 | 显示全部楼层
kevinzhang19701 发表于 2014-1-13 09:22
代码在我家里电脑上,这里我先简单说一下吧。

小哥在吗?我想请教下,上面这段程序,arduino如果要发传感器采集的数据要在哪段语句发送?
发表于 2014-2-18 17:59 | 显示全部楼层
本帖最后由 kevinzhang19701 于 2014-2-18 18:07 编辑
十年 发表于 2014-2-18 11:59
小哥在吗?我想请教下,上面这段程序,arduino如果要发传感器采集的数据要在哪段语句发送? ...

Ethernet Lib里,W5100充当Web Client的时候,似乎只能用GET向服务器端提交request。这个可以参考官网(http://arduino.cc/en/Tutorial/WebClient#.UwMtOM6viwE)。

因此,我们就用GET方式。GET后面跟的是服务器端写的Servlet入口(/search)。?后面跟的变量名,变量名后面跟的是数据。见下图红色部分。
Uk02.jpg

您要传递传感器数据,就用“变量名=数据”对来实现。如果有多个“变量-数据”对,中间用&连接,不能有空格。
 楼主| 发表于 2014-2-18 20:27 | 显示全部楼层
kevinzhang19701 发表于 2014-2-18 17:59
Ethernet Lib里,W5100充当Web Client的时候,似乎只能用GET向服务器端提交request。这个可以参考官网(htt ...

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

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };//ethernet shield的mac地址
byte ip[] = {           };//分配给ethernet shield的IP
IPAddress server(59,68,191,216); //服务器的IP
EthernetClient client;

float exchange(float val)
{
  float ppm;
  if(val>=325)
      {
        ppm=400;
        delay(100);
      }
      else if((val<325)&&(val>=315))
      {
        ppm=pow(10,(455.78-val)/50.26);
        delay(100);
      }
      else if((val<315)&&(val>=265))
      {
        ppm=pow(10,(425.00-val)/40.00);
        delay(100);
      }
      else if(val<265)
      {
        ppm=10000;
        delay(100);
      }
      return(ppm);
      delay(100);
}//CO2传感器的输出电压值到浓度值的转换函数

void setup()
{
  
  int val,i,sum=0,mean=0;
  float VAL,ppm,q;
  int analogChannel = 0;
  for(i=0;i<10;i++)
  {
    sum+= analogRead(analogChannel);
    delay(100);
  }
  mean=sum/10;
  VAL = ((5.0*mean)/1023-0.03)/3;
  ppm = exchange(1000*VAL);             //CO2传感器的相关参数的采集和计算
  
  
  Ethernet.begin(mac,ip);
  Serial.begin(9600);
  delay(1000);
  Serial.println("connecting...");
  if (client.connect(server, 3333))
  {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /search?q=ppm HTTP/1.0");
    client.println();
  }
  else
  {
    Serial.println("connection failed");
  }
}

void loop()
{

  
  // if there are incoming bytes available
  // from the server, read them and print them:
  if (client.available()) {
    client.print(ppm);
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    for(;;)
      ;
  }
}
小哥,麻烦你看下我这样改的程序可以用不?
 楼主| 发表于 2014-2-18 20:29 | 显示全部楼层
kevinzhang19701 发表于 2014-2-18 17:59
Ethernet Lib里,W5100充当Web Client的时候,似乎只能用GET向服务器端提交request。这个可以参考官网(htt ...

小哥,之前发给我JAVA上位机程序可以直接用吗?没有做过JAVA的东西呢
发表于 2014-2-18 20:42 | 显示全部楼层
本帖最后由 kevinzhang19701 于 2014-2-18 20:58 编辑
十年 发表于 2014-2-18 20:29
小哥,之前发给我JAVA上位机程序可以直接用吗?没有做过JAVA的东西呢

没有做过Java的东西,那做这个会有点难度。

程序代码我稍微改了一下。

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

byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(192,168,11,101);  // server ip address
IPAddress ip(192,168,11,99);          // w5100 ip address

EthernetClient client;

float exchange(float val)
{
  float ppm;
  if(val>=325)
      {
        ppm=400;
        delay(100);
      }
      else if((val<325)&&(val>=315))
      {
        ppm=pow(10,(455.78-val)/50.26);
        delay(100);
      }
      else if((val<315)&&(val>=265))
      {
        ppm=pow(10,(425.00-val)/40.00);
        delay(100);
      }
      else if(val<265)
      {
        ppm=10000;
        delay(100);
      }
      return(ppm);
      delay(100);
} //CO2传感器的输出电压值到浓度值的转换函数

void setup()
{
  int val,i,sum=0,mean=0;
  float VAL,ppm,q;
  int analogChannel = 0;
  for(i=0;i<10;i++)
  {
    sum+= analogRead(analogChannel);
    delay(100);
  }
  mean=sum/10;
  VAL = ((5.0*mean)/1023-0.03)/3;
  ppm = exchange(1000*VAL);             //CO2传感器的相关参数的采集和计算
  
  Ethernet.begin(mac,ip);
  Serial.begin(9600);
  delay(1000);
  Serial.println("connecting...");
  if (client.connect(server, 3333))
  {
    Serial.println("connected");
    client.println("GET http://192.168.11.101/servlet/unotest?q=" + ppm + " HTTP/1.0");
    client.println("Host: 192.168.11.101");
    client.println();
  }
  else
  {
    Serial.println("connection failed");
  }
}

void loop()
{
  // if there are incoming bytes available
  // from the server, read them and print them:
  if (client.available())
  {
    client.print(ppm);
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected())
  {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    for(;;)
      ;
  }
}


 楼主| 发表于 2014-2-18 20:43 | 显示全部楼层
kevinzhang19701 发表于 2014-2-18 20:42
没有做过Java的东西,那做这个会有点难度。

JAVA是我的师姐在做,我只负责在arduino下位机上的东西。看看我的程序可以那样写吗?发到楼上了
发表于 2014-2-18 20:44 | 显示全部楼层
本帖最后由 kevinzhang19701 于 2014-2-18 21:01 编辑

有几个地方要和你确认一下:

1. 服务器端口,你似乎开放了3333,是这个吗?

2. 代码里是假设,服务器与客户机在一个地址段里,即:192.168.11.XXX。服务器在192.168.11.101,w5100客户机在192.168.11.99。

3. 服务器上,是一个叫unotest的Servlet在接管。参考下面我以前的代码(与MySQL数据库部分可以忽略)。

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;

// MySQL connection package
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

public class unotest extends HttpServlet
{
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/plain;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        String myp1 = request.getParameter("q");  // 从客户机读取变量名为q的数据
        
        try
        {
            Connection conn = null;
            Statement stmt = null;
            ResultSet rs1 = null;
            String mySQL01 = "SELECT r, l FROM newcon WHERE E = '承保件'";
            try
            {
                conn = DriverManager.getConnection("jdbc:mysql://localhost/myproject06?" +
                                   "user=root&password=15186okia");
                stmt = conn.createStatement();
                rs1 = stmt.executeQuery(mySQL01);
                while(rs1.next())
                {
                    out.println(rs1.getString(1) + " | " + rs1.getString(2));
                }
            }
            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());
            }
        }
        finally
        {
            out.close();
        }
    }

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

 楼主| 发表于 2014-2-18 20:45 | 显示全部楼层
kevinzhang19701 发表于 2014-2-18 20:44
有几个地方要和你确认一下:

1. 服务器端口,你似乎开放了3333,是这个吗? ...

嗯,先这样写着,跟上位机上面的一样
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 00:31 , Processed in 0.138306 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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