最後監聽端口並傳到連接數據庫的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代碼的作用就是調用數據庫,完成一些可視化數據界面。
就是這樣,