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代码的作用就是调用数据库,完成一些可视化数据界面。

就是这样,

发布了12 篇原创文章 · 获赞 19 · 访问量 5498

猜你喜欢

转载自blog.csdn.net/Hao_ge_666/article/details/103706208
今日推荐