单片机采集温湿度数据通过wifi模块传给java写的后台并存入数据库

一直想把单片机和java结合起来,但是发现网上这方面的资源很少,所以我自己也是摸索了很久,下面是自己的一些体会

首先最基础的就是wifi模块的使用,如果不会的可以去看我的另一篇博客esp8266上传温湿度数据到乐联网

void esp8266Init(){
    
    

	//检测wifi模块是否能回复指令
 printf("1.AT\r\n");
	while(atk_8266_send_cmd("AT","OK",20)){
    
    
	   
		
	}	
   delay_ms(500);	
	//关闭wifi自动连接
	printf("2. CWAUTOCONN\r\n");
		while(atk_8266_send_cmd("AT+CWAUTOCONN=0","OK",20)){
    
    
	   
		
	}
		delay_ms(500);
	//配置wifi模式 AT+CWMODE=1为sta模式
  printf("3. CWMODE\r\n");
	while(atk_8266_send_cmd("AT+CWMODE=1","OK",20)){
    
    
	   
		
	}
    delay_ms(500);	
	printf("4. CWJAP\r\n");
	//连接网络
	while(atk_8266_send_cmd(ESP8266_WIFI_INFO,"OK",1000)){
    
    
	   
		
	}
	 delay_ms(1000);
	//开启单连接模式,因为透传必须开启单连接模式
	printf("5. CIPMUX\r\n");
	while(atk_8266_send_cmd("AT+CIPMUX=0","OK",20)){
    
    
	   
		
	}
	delay_ms(500);
	//开启透传模式
	printf("6. CIPMODE\r\n");
	
	while(atk_8266_send_cmd("AT+CIPMODE=1","OK",20)){
    
    
	   
		
	}
	delay_ms(500);
	//建立TCP连接
	printf("7. CIPSTART\r\n");
	
	while(atk_8266_send_cmd(ESP8266_servlet_INFO,"OK",50)){
    
    
	      
		
	}
	
	delay_ms(500);
	//进入透传模式
	printf("7. CIPSEND\r\n");
	while(atk_8266_send_cmd("AT+CIPSEND","OK",20)){
    
    
	      
		
	}
	delay_ms(500);
	printf("ESP8266Init ok");


}

其中ESP8266_WIFI_INFO这个宏定义是你连接的wifi名字和密码
#define ESP8266_WIFI_INFO	"AT+CWJAP=\"IOT205\",\"IOT205iot205.\""

ESP8266_servlet_INFO 这个宏定义,首先这个ip地址可以打开命令行窗口,输入ipconfig查看,后面那个端口是tomcat的默认端口号,因为我java用的servlet,所以用的8080
#define ESP8266_servlet_INFO"AT+CIPSTART=\"TCP\",\"192.168.1.111\",8080"

注意如果wifi想要成功连接,建立tcp连接一定要把服务器先跑起来也就是java程序要先跑起来

java的servlet代码

package com.blb;

import com.blb.utils.DBUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.sql.SQLException;

@WebServlet("/dyk")
public class ser01 extends HttpServlet {
    
    


    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        BufferedReader reader = new BufferedReader(req.getReader());
        String data = reader.readLine();
        String[] datas = data.split("&");
        try {
    
    
            DBUtils.execute("insert into test1(temp,wet) values(?,?)",datas[0],datas[1]);

        } catch (SQLException throwables) {
    
    
            throwables.printStackTrace();
        }


    }
}

起初我也一直不清楚wifi模块发的http报文,java这边该如何接收,找了各种资料和函数都没找到,结果最后没有想到就一个这种简单的io流就可以

关于servlet和jdbc的一些基础知识我在这里就不描述过多了大家可以学一下,注意注解的前面的/别掉了,后面发http报文的url访问路径时还会用到的

接下来看一下单片机的发送http报文的函数
在这里插入图片描述

void temp_send2(u8 value1,u8 value2)
{
    
    
 char p[20]="";
	
	sprintf((char*)p,"%d&%d",value1,value2);
	u3_printf("POST /dachuang_war_exploded/dyk HTTP/1.1\r\n");
	u3_printf("Host: 192.168.1.111:8080\r\n");
	u3_printf("Content-Length: %d\r\n",strlen(p));
	 u3_printf("Connection: close\r\n");
	 u3_printf("\r\n");
	atk_8266_send_data(p,"",20);
}
这里我是通过发送一个&符号来区分开温度和湿度的,java那边取数据的时候可以调用split函数分隔出温度和湿度

请求的url路径一定要写完整,我用的idea前面的那个是他自带的/dachuang_war_exploded/dyk,后面那个dyk是我自己在servlet配的注解

有些地方是有空格的不要忘掉,内容前面的换行也千万不能掉了
如果一直不成功可以用USB转ttl模拟一下报文发送,看有没有存到数据库中
然后再改到这个函数里面

当然我这是最简单的发送字符串,有的是可以用json格式来发送java那边也用json来解析,这个我目前还不会,到时候学会了在补上

原码下载地址

当然如果你会服务器可以将javaweb项目打成war包导入到服务器上的tomcat运行,注意jdk的版本问题我在这里也卡了几天一直报500的错误

猜你喜欢

转载自blog.csdn.net/qq_44866153/article/details/111772563