有没有大神做过W5100与JAVA上位机通信的项目
小弟现在在做空气污染物的检测,通过气体传感器把气体浓度测出来后(已解决),经过W5100通信模块把浓度值上传到JAVA上位机去(不会)。也就是一方是Server,一方是Client,定的是用套接字socket来做。主要是上传数据不会,有没有哪位小哥做过类似的,有程序参考就最好的。感激不尽!! 本帖最后由 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>
}
原始代码,我回家找了再发。
Arduino IDE里有例程呢 本帖最后由 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: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》,希望对你有帮助。 kevinzhang19701 发表于 2014-1-13 10:01
颠倒的思路,是让Ethernet Shield充当Server, Java程序充当Client, 请参考下列链接:
http://www.lauridme ...
真心非常感激:lol 本帖最后由 kevinzhang19701 于 2014-2-17 17:14 编辑
十年 发表于 2014-2-16 21:21
真心非常感激
:handshake:) 别把5100看得太高,她只能实现一些简单的功能,Java太强大了。
kevinzhang19701 发表于 2014-2-17 17:10
别把5100看得太高,她只能实现一些简单的功能,Java太强大了。
嗯,亲你的原始代码找到了吗?可以发给我参考一下吗:) 本帖最后由 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
给个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;
}
}