单片机学习小组
直播中

丁冬芹

7年用户 1295经验值
私信 关注

怎样去设计一种基于DHT11+javaweb的初级物联网自动监控系统呢

初级物联网自动监控系统是什么?

怎样去设计一种基于DHT11+javaweb的初级物联网自动监控系统呢?

回帖(1)

陈敏

2022-2-22 14:09:49
一、初级物联网自动监控系统是什么?
在上一期的项目:ESP8266上传DHT11温湿度给前台+后台的javaweb服务器实现网页自动和手动更新数据 项目中实现了私人javaweb服务器无线采集dht11温湿度数据并动态显示在主页上,但是没有温湿度超过某个阈值的时候报警,没有实现温湿度监控的功能。
在这一期的项目中,在保持上一期项目功能之上,新加入两个功能:第一个是设置监控报警的参数,开启之后开始监控,温度或者湿度超过额定数值的时候就会触发主页弹窗报警(局域网);第二个是会触发邮件报警(广域网)。
在这一期的项目中,特色有如下几点:全部是真刀战枪的开源组合代码,不玩虚的!为了让买家有更好的学习体验,不用javaweb框架、数据库和websocket技术来构建开源私人服务器,所以买家也不用担心要配置大型热门框架、安装数据库和配置websocket等繁琐的事情就能快速上手这个监控系统,包括发送邮件或者是弹窗报警用了大量的js大法和java字符串处理技术和jQuery技术,代码写得也是相当精妙,把大量的代码和功能集中在index.jsp和ChatServlet.java两个文件当中,让买家能集中火力学习和提高技术,最后增加了一个教程3和教程4帮助买家了解并提高系统的方法和帮助买家配置邮箱报警等信息,用单片机客户端和私人服务器联合调试,相信买家能短时间学到技术和掌握相关核心技术。
ESP8266自动上传DHT11数据给javaweb服务器的温湿度监控系统的设计与实现

运行效果如下:


二、系统软硬件设计
1.服务器主页设计
(1)按键设计思想:设计1个按钮实现开启自动监控和关闭自动监控的切换,再设计一个切换状态的显示栏。这样可以让用户决定是否要进行自动监控,代码上用一个flag变量来决定该状态的切换。


(2)设置监控阈值输入框:设计两个输入框来让用户输入最低的监控湿度和最低的监控温度,这样一旦服务器发现温湿度的范围超过了最低值的话会触发发邮件的逻辑


部分代码如下(示例):

   //下面是增加报警设置
     $(document).ready(function(){
                $("#set").click(function(){//点击了开始监控按钮就触发
                        if($("#maxHumidity").val()==""||$("#maxTemperature").val()==""){//一个数值为空就不行
                               alert("请同时输入最大温湿度数字值");
                              $("maxHumidity").focus();//让说话内容文本框获得焦点
                        }else {
                                maxHumidity=$("#maxHumidity").val();
                                maxTemperature=$("#maxTemperature").val();
                                if(flag==0){
                             flag=1;
                             var result = document.getElementById("result3");                  
                       result.innerHTML = ""+"开启监控"+"";                                
                                }else{
                                 flag=0;
                              var result = document.getElementById("result3");                  
                        result.innerHTML = ""+"关闭监控"+"";
                                }  
                        }                                    
               
                });
        });

(3)自动监控报警设计:需要用到定时触发函数定时查询温湿度

$(document).ready(function(){//网页框架加载完毕之后就调用这个函数
          getContent();//调用上面定义的函数
          window.setInterval("getContent()",2000);//每间隔2秒再调用上面的函数
     });
至于 getContent()函数怎么定义的,看下面get请求如何发出去的

    //下面是抓取温湿度数据的逻辑
                 if(flag==1){//是否开启监控                                                                           
                    if(data.indexOf("Humidity")>=0){//成功抓取到温湿度数据的话就解析数据
                          Humidity=data.substring(data.indexOf("Humidity")+9,data.indexOf("RH"));
                          Temperature=data.substring(data.indexOf("Temperature")+12,data.indexOf("'C"));
                         if(parseFloat(Humidity)>maxHumidity&&parseFloat(Temperature)
                         var d = new Date();
                         $.get("SendMail?mailname=su&mailcontent="+"Warning!!!"+d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+"Humidity="+Humidity+" Temperature="+Temperature+"&nocathe="+new Date().getTime(), function(data){//邮件报警
                                         var result = document.getElementById("result1");                  
                                  result.innerHTML = ""+data+"";
                                });
                             alert("湿度报警!!!"+new Date().toLocaleString()+"Humidity="+Humidity+" Temperature="+Temperature);
                          
                             window.navigator.vibrate(2000); //vibrate for 2000ms  发送成功的震动2000毫秒,部分浏览器支持
                             Humidity="0";
                      }

2.服务器后台设计
(1)ChatServlet.java这个文件实现了单片机客户端和浏览器客户端与服务器的Servlet交互,部分代码如下

private void sendMessages(HttpServletRequest request,
                        HttpServletResponse response) {//单片机发送温湿度给服务器
                ServletContext application=getServletContext();//获取application      
                System.out.println("进入sendMessages方法");
                response.setContentType("text/html;charset=UTF-8");//设置响应内容和编码方式
                String user=request.getParameter("user");//昵称
                String speak=request.getParameter("speak");//说话内容               
                mymessage="["+user+"]say:"+speak;//给单片机的
                System.out.println(mymessage);               
                String message="["+user+"]say:"+speak;//组合说话内容               
                application.setAttribute("message", mymessage);//将聊天内容保存到application
                try {
                        response.getWriter().println(mymessage);
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }

(2)SendMail.java这个后台代码主要是拿来发送邮件的,触发报警就会执行这个代码自动发送邮件了。

/**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                // TODO Auto-generated method stub
                //String action = request.getParameter("action");      
                //System.out.println("asdasdasdads"+action);
            //SendmailUtil();
            //doSendHtmlEmail("邮件头文件名su", "邮件内容是test", "12345678@qq.com");//三个参数,第一个是邮件主题,第二个是邮件内容,第三个是收件人邮件地址  
               
                response.setContentType("text/html;charset=UTF-8");//设置响应内容和编码方式
               
                // 解决返回中文乱码问题
                response.setCharacterEncoding("utf-8");
                String mailname = request.getParameter("mailname"); //邮件名
                String mailcontent = request.getParameter("mailcontent"); //邮件内容
                System.out.println("mailname="+mailname);
                // 解决接收中文乱码问题
                mailname = new String(mailname.getBytes("iso-8859-1"), "UTF-8");
                mailcontent = new String(mailcontent.getBytes("iso-8859-1"), "UTF-8");
                SendmailUtil();
            //doSendHtmlEmail("邮件头文件名su", "邮件内容是test", "12345678@qq.com");//三个参数,第一个是邮件主题,第二个是邮件内容,第三个是收件人邮件地址
                String feelback=doSendHtmlEmail(mailname, mailcontent, "12345678@qq.com");//三个参数,第一个是邮件主题,第二个是邮件内容,第三个是收件人邮件地址
               
                String SendTime =new SimpLEDateFormat("yyy.MM.dd HH:mm:ss").format(new Date());                       
                String msg=SendTime+"---"+feelback;
                response.getWriter().println(msg);
               
               
               
               
        }


3.单片机客户端设计
单片机代码的逻辑设计跟上一章没有变化,这里就不过多陈述了,总的来说单片机通过定时器定时采集温湿度数据定时上传给服务器,然后服务器如果开启的自动监控,那么当指标超标之后就会触发邮件发送,注意了发送邮件是可以发到自己的QQ邮箱的,本人亲自测试过的。

3.仿真与调试
单片机程序相比上一版有了一个提高,上一版wifi与热点连接断开才会重新连接,但是断开服务器链接不会重连,这一版修复了这个bug。单片机代码截图如下:


下面是私人服务器部署之后的运行效果,注意了大部分物联网远程控制都是用别人的服务器!!!使用者不能掌握其核心技术。而我这个虽然是局域网的私人开源服务器,但是要是把私人服务器部署到公有云,照样可以做到远程控制,并且自己可以更改服务器的源码真正做到私人定制,图片随便换,主题随便改,功能随便改,绝对给力(PS:我这次又换了主题照片,看到服务器打印效果是不是很亲切呢?)。

邮件报警如下

服务器工程源码截图如下

下面是单片机运行的串口打印情况,证明我的单片机是可以流畅跑起来的,连上服务器不断开,心跳程序确保断线就重连。


总结
物联网系统设计并不是意味着每个人都要设计一个“鸿蒙系统”出来,而是根据自己的需求和能力设计出一个适合自己的物联网系统出来就可以了。这次的物联网系统设计是一个初级的设计,但是具备了广域网自动邮件报警功能,所以部署我系统的读者可以知道环境参数什么时候超标了。
举报

更多回帖

×
20
完善资料,
赚取积分