十年
发表于 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如果要发传感器采集的数据要在哪段语句发送?
kevinzhang19701
发表于 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)。?后面跟的变量名,变量名后面跟的是数据。见下图红色部分。
您要传递传感器数据,就用“变量名=数据”对来实现。如果有多个“变量-数据”对,中间用&连接,不能有空格。
十年
发表于 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的东西呢
kevinzhang19701
发表于 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下位机上的东西。看看我的程序可以那样写吗?发到楼上了
kevinzhang19701
发表于 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,是这个吗? ...
嗯,先这样写着,跟上位机上面的一样