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代碼的作用就是調用數據庫,完成一些可視化數據界面。

 

 

就是這樣,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章