arduino与esp8266结合制作氛围灯(四)
最后监听端口并传到连接数据库的java代码
package com;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class test {
public static void main(String args[]) throws IOException {
Connection conn = null;
Statement stat = null;
PreparedStatement ps=null;
//为了简单起见,所有的异常信息都往外抛
int port = 702;
//定义一个ServerSocket监听在端口上
ServerSocket server = new ServerSocket(port);
System.out.println("start");
//server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
Socket socket = server.accept();
//跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息了。
Reader reader = new InputStreamReader(socket.getInputStream());
//char chars[] = new char[60];
int len;
int k=1;
StringBuilder sb = new StringBuilder();
while (k>0 ) {
char chars[] = new char[60];
len=reader.read(chars);
//sb.append(new String(chars, 0, len));
//reader.read(chars);
//k+=2;
//System.out.println("from client: " + sb);
String s[] = new String[2];
s[0] = new String();
s[1] = new String();
int d=0;
for(int i=0;i<len;i++)
{
if(chars[i]!=' ')
{
s[d]+=chars[i];
}
else {
d++;
}
}
System.out.println("距离:"+s[0]+"mm");
System.out.println("编号:"+s[1]);
System.out.println("-----------------");
String sql = "INSERT INTO esp8266(dis,bh) "
+ "values(?,?)";
try{
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("数据库加载成功");
}catch(Exception a){
System.out.println("error!");
a.printStackTrace();
}
try{
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test_post?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false","root","hao19990519");
ps=conn.prepareStatement(sql);
//String s= null;
//s.append(new String(chars, 0, len));
ps.setString(1,s[0]);
ps.setString(2,s[1]);
ps.executeUpdate();
}catch (SQLException b){
b.printStackTrace();
}finally{
try{
conn.close();
System.out.println("MySQL 关闭成功");
}catch (SQLException c){
System.out.println("MySQL 关闭失败 ");
c.printStackTrace();
}
}
}
reader.close();
socket.close();
server.close();
}
}
我的arduino代码,我用的是超声波测距,然后把数据上传服务器
#include <SoftwareSerial.h>
unsigned int EchoPin = 2;
unsigned int TrigPin = 3;
unsigned int ledPin = 4;
unsigned int ledPin2 = 5;
unsigned long Time_Echo_us = 0;
//Len_mm_X100 = length*100
unsigned long Len_mm_X100 = 0;
unsigned long Len_Integer = 0;
int k=0;
//unsigned int Len_Fraction = 0;
SoftwareSerial mySerial(13, 12); // RX, TX 通过软串口连接esp8266
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
pinMode(EchoPin, INPUT);
pinMode(TrigPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(ledPin2, OUTPUT);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
mySerial.begin(9600);
mySerial.println("AT+RST"); // 初始化重启一次esp8266
delay(1500);
echo();
mySerial.println("AT");
echo();
delay(500);
mySerial.println("AT+CWMODE=1"); // 设置Wi-Fi模式
echo();
mySerial.println("AT+CWJAP=\"test\",\"12345678\""); // 连接Wi-Fi
echo();
delay(10000);
}
void loop() {
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
post();
}
void echo(){
delay(50);
while (mySerial.available()) {
Serial.write(mySerial.read());
}
}
void cj(){
k=k+1;
digitalWrite(TrigPin, HIGH);
delayMicroseconds(50);
digitalWrite(TrigPin, LOW);
Time_Echo_us = pulseIn(EchoPin, HIGH);
if((Time_Echo_us < 60000) && (Time_Echo_us > 1))
{
Len_mm_X100 = (Time_Echo_us*34)/2;
Len_Integer = Len_mm_X100/100;
if(Len_Integer > 100)
{
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin2, LOW);
delay(1000); //延时1 秒
}
if(Len_Integer <= 100)
{
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin, LOW);
delay(1000); //延时1 秒
}
}
}
void post(){
cj();
int temp = Len_Integer;
int i=k;
mySerial.println("AT+CIPMODE=1");
echo();
//mySerial.println("AT+CIPSTART=\"TCP\",\"192.168.91.1\",80"); // 连接服务器的80端口
//mySerial.println("AT+CIPSTART=\"TCP\",\"192.168.43.26\",80"); // 连接服务器的80端口
mySerial.println("AT+CIPSTART=\"TCP\",\"你的服务器ip\",702"); // 连接服务器的80端口
delay(1000);
echo();
mySerial.println("AT+CIPSEND"); // 进入TCP透传模式,接下来发送的所有消息都会发送给服务器
echo();
// mySerial.print("POST /服务器ip"); // 开始发送post请求
// mySerial.print(" HTTP/1.1\r\nHost: 服务器ip\r\nUser-Agent: arduino-ethernet\r\nConnection:close\r\nContent-Length:"); // post请求的报文格式
// mySerial.print(temp.length()); // 需要计算post请求的数据长度
// mySerial.print("\r\n\r\n");
mySerial.print(temp);
mySerial.print(" ");
mySerial.print(i);// 结束post请求
delay(3000);
echo();
mySerial.print("+++"); // 退出tcp透传模式,用println会出错
delay(2000);
}
MySQL数据库我就整了一个表,三个数据,一个id是主键,一个是距离,还有一个是发送的编号bh,你们数据库可以自己搞。
然后Java代码的意思就是,监听端口,然后收到char串,然后我传输一个数据就带一个空格,这样好提取。。
然后我的总体思路就是:
我的arduino uno r3的作用就是一个工具人,它负责收集传感器数据,担任软串口的责任,为esp8266供电,总之就是工具人。。。
esp8266是主角,与服务器通讯和连接WiFi,都是用的它自带的AT命令。
然后我Java代码的作用就是监听端口并存入数据库数据。为了减轻将来jsp的压力,所以我选择了本地Java直接完成这些操作。
jsp代码的作用就是调用数据库,完成一些可视化数据界面。
就是这样,
作者:Cool baby
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.