系列文章目录

第一章ESP8266的java软件仿真测试
第二章ESP8266硬件与软件测试
第三章ESP8266客户端与Java后台服务器联调
第四章ESP8266客户端与JavaWeb服务器联调
第五章ESP8266客户端与JavaWeb服务器网页联调
第六章ESP8266客户端与JavaWeb服务器网页实现数据的自动上传和下传联调
第七章ESP8266与JavaWeb服务器组成初级物联网自动监控系统
第八章ESP8266、STM32、Android和JavaWeb服务器组成中级物联网自动监控系统


文章目录

  • 系列文章目录
  • 前言
  • 一、中级物联网自动监控系统是什么?
  • 二、系统软硬件设计
    • 1.升级设计说明
    • 2.手机App客户端设计
    • 3.系统逻辑设计
    • 4.仿真与调试
  • 总结

前言

daodanjishui物联网核心原创技术之物联网系统的设计与实现


一、中级物联网自动监控系统是什么?

    在上一期项目:《ESP8266自动上传DHT11数据给javaweb服务器的温湿度监控系统的设计与实现》的功能基础上,这次设计升级了功能,加入了移动互联网技术中的安卓编程设计,实现了手机app自动和手动查询单片机局域网无线采集的数据,并且可以在手机显示数据超标的报警弹窗。
     在这一期项目的特色是:(1)保持第七章项目功能的基础上添加了手机app远程查询stm32单片机采集、使用ESP8266无线上传的dht11温湿度参数。(2)在上一期的项目的基础上更改了服务器源码,让服务器支持手机app的查询请求,起到承上启下作用。(3)手机app编程使用eclipse开发环境使用传统的java语言开发的app,代码精简,功能强大,界面清爽,最适合新手学习和提高。(4)赠送详细的入门教程4个,解析了代码的设计机制和编程思路,还有项目提升的提示。

项目全部运行的截图如下(看出服务器主页和手机app同时报警):

    从上图可以看出汇集了:客户端STM32和ESP8266单片机和DHT11传感器、手机客户端、浏览器客户端和JavaWeb服务器组成了中级物联网自动监控系统。该系统运行流畅,具有稳定性和扩展性。延续了前几章内容,但是又在前几章内容和功能的基础上逐步深入构成了升级版的物联网监控系统。

先看看daodanjishui亲自拍摄的优酷视频,视频地址:
https://v.youku.com/v_show/id_XNDgyMjA2MTA4MA==.html

直接看视频

ESP8266、stm32、DHT11、Android、Javaweb和Html温湿度监控系统的设计

二、系统软硬件设计

1.升级设计说明

    整个系统相对于第七章的系统,变化和升级的地方就是加入了手机客户端App的开发,同时也修改的原来服务器的代码,因为服务器要同时响应手机客户端、浏览器客户端和单片机客户端。
    
服务器修改的代码适配手机(示例):

if(name.equals("app")){response.setContentType("text/html;charset=UTF-8");//设置响应内容和编码方式System.out.println("进入有参数的getMessages方法,user="+name);                                            String msg="";             PrintWriter out;try {out = response.getWriter();//获取输出流对象if(application.getAttribute("message")==null){//msg="no data";msg="0298800112966000129760001297600002976000"+"gateway_offline";//模拟不是开关而是传感器数据变化}else{msg=(String) application.getAttribute("message");//已经存有值了,再存进去if(msg.indexOf("Humidity")>=0){//成功抓取到温湿度数据的话就解析数据Humidity=msg.substring(msg.indexOf("Humidity")+9,msg.indexOf("RH"));Temperature=msg.substring(msg.indexOf("Temperature")+12,msg.indexOf("'C"));int humidity=Math.round(Float.parseFloat(Humidity));int temperature= Math.round(Float.parseFloat(Temperature));if(humidity<10)Humidity="0"+humidity;else Humidity=""+humidity;if(temperature<10)Temperature="0"+temperature;   else Temperature=""+temperature;msg="1"+Temperature+Humidity+"000"+"12976000129760001297600012976000"+"gateway_online";}else msg="0298800112966000129760001297600002976000"+"gateway_offline";//清除记录}System.out.println("msg="+msg); out.println(msg);//返回信息msg="0298800112966000129760001297600002976000"+"gateway_online";//清除记录application.setAttribute("message","");//清除application//out.print(name+" "+msg+"----"+new SimpleDateFormat("yyy.MM.dd HH:mm:ss").format(new Date())+"\n");//输出最新的信息给单片机out.close();//关闭输出流} catch (IOException e) {e.printStackTrace();}       }

在上面的代码可以看到收到的get请求的参数中存在“app”字符串的时候就进入手机客户端处理的逻辑。服务器会给手机客户端返回数据显示在手机app的界面上。

2.手机App客户端设计

(1)先写两个按钮点击事件

一个是手动查询数据,一个是自动查询数据,

// [1]点击按钮 进行post方式提交数据public void click2(View v) {if(flag==false)flag=true;else flag=false;if(flag){textView2.setText("触发了自动查询");              handler.postDelayed(runnable, 0);//运行一次 runnable}else{textView2.setText("关闭了自动查询");handler.removeCallbacks(runnable);}}

自动查询的代码使用了handler.postDelayed(runnable, 0)来定时发送post请求服务器获取温湿度数据。那么这个runnable是怎么写的呢?

Runnable runnable = new Runnable() {     public void run() {//开了第一个线程showToast("运行一次 自动查询");//下面放入发送get请求的逻辑new Thread(){@SuppressLint("SimpleDateFormat")public void run() {try {String ip = et_username.getText().toString().trim();String port = et_password.getText().toString().trim();//[2.1]定义get方式要提交的路径    小细节 如果提交中文要对name 和 pwd 进行一个urlencode 编码String path = "http://"+URLEncoder.encode(ip, "utf-8")+":"+URLEncoder.encode(port, "utf-8")+"/test_TCP/ChatServlet?action=getMessages"+"&signname=app"+"&nocache="+new Date().getTime()+"&speak=getdata";这个地址用户点击触发查询//[3]获取httpclient实例DefaultHttpClient client = new DefaultHttpClient();//[3.1]准备get请求 定义 一个httpget实现HttpGet get = new HttpGet(path);//[3.2]执行一个get请求HttpResponse response = client.execute(get);//[4]获取服务器返回的状态码int code = response.getStatusLine().getStatusCode();if (code == 200) {//[5]获取服务器返回的数据   以流的形式返回InputStream inputStream = response.getEntity().getContent();//[6]把流转换成字符串String content = StreamTools.readStream(inputStream);   //[7]展示结果showToast(content);if (content.length()<8){//返回的信息长度不合适,直接去掉return;}else{String dt = content.substring( 0, 8);//截取8位有效信息长度出来//1366910113769010138691001396910003167101String status=dt.substring( 0, 1 );//获取终端状态String Temperature=dt.substring( 1, 3 );//获取 温度String Humidity=dt.substring( 3, 5 );//获取湿度if(status.equals("1")){//只有在线的时候才判断是否报警status="在线";int humidity=Math.round(Float.parseFloat(Humidity));int temperature= Math.round(Float.parseFloat(Temperature));if(humidity>80||temperature>35){//这里我写死了报警阈值了//给对话框添加内容builder.setMessage("环境参数现在超标了:"+"Temperature="+temperature+" Humidity="+humidity+" "+new SimpleDateFormat("yyy.MM.dd HH:mm:ss").format(new Date()));  runOnUiThread(new Runnable() {                                 @Overridepublic void run() {                                                    //该方法一定是执行主线程builder.show();//弹出报警对话框}});}}elsestatus="离线";textView1.setText("设备状态:"+status+" 温度:"+Temperature+" 湿度:"+Humidity+" "+new SimpleDateFormat("yyy.MM.dd HH:mm:ss").format(new Date()));// textView2.setText("触发了手动查询");}                                                //textView1.setText(content);}} catch (Exception e) {e.printStackTrace();}};}.start();//get请求逻辑结束handler.postDelayed(this, 8000);//8秒又重新执行Runnable对象}};

这个代码看起来执行一次,其实是错觉,因为有一句话:handler.postDelayed(this, 8000);//8秒又重新执行Runnable对象
所以只要你触发了自动查询,那么手机app就会定时给服务器发送get请求获取环境参数。
(2)app如何显示数据呢?使用到toast组件。

//封装toast方法  该toast方法执行在主线程public void showToast(final String content){runOnUiThread(new Runnable() {@Overridepublic void run() {//该方法一定是执行主线程Toast.makeText(getApplicationContext(), content, 1).show();   //builder.show();}});}

如果不这样写,肯定不能将后台的数据显示在主界面上的。

3.系统逻辑设计

(1)单片机客户端发送数据给服务器。
(2)服务器存入数据。
(3)手机客户端发送查询请求给服务器。
(4)服务器返回数据给手机App
(5)手机App接收到数据,判断是否报警

注意:手机接收数据和报警弹窗的逻辑设计还是很精妙的,感兴趣的读者可以下载源码看看。系统经过长时间测试和验证,人品担保能正常运行。

4.仿真与调试

(1)先运行Eclipse编写的javaee服务器,并设置报警值

(2)打开app,输入服务器的IP地址和端口号

(3)在app里面点击“手动查询数据” ,这个时候发现温度变化了

(4)点击app“自动查询数据”,看到toast组件输出调试信息

(5)安卓源码截图


总结

    在前几个远程无线环境参数采集的小项目中,这次项目最大的尝试是加入了手机app查询,那么这次手机app的编写绝对是手工一步一步编写和调试的,绝对是正统java开发的app,不是用什么易语言,html5语言等等简易语言开发的app。可拓展的空间极高,但是代码编写一点都不拖泥带水,安卓编程利用定时器实现自动查询功能,在自动查询功能里面又加入了自动检测报警功能,只有两个源码文件移植到Android studio也非常方便。最终实现了在网页和手机端同时监控数据的效果,在物联网系统设计中脱颖而出,对于小型物联网设计到这里算是告一段落了。在下一个章中,将加入WebSocket技术让服务器控制单片机点灯和手机端控制单片机点灯,敬请期待。

最后附上代码传送链接:https://www.cirmall.com/circuit/19087/
直接跳转到下载处

基于stm32、Android和Html的温湿度监控系统的设计相关推荐

  1. 2个相同的 stm32 can通讯不成功_一文读懂,基于 STM32 和 CAN 总线的温度监控系统的设计方法...

    1 系统总体方案概述 系统总体框图如图 1 所示,本系统采用主站+从站的结构,CAN 主站主要实现温度数据的存储以及 CAN 总线协议和串口协议之间的桥接,CAN 从站主要实现温度的采集.CAN 从站 ...

  2. ESP8266自动上传DHT11数据给javaweb服务器的温湿度监控系统的设计与实现

    系列文章目录 第一章ESP8266的java软件仿真测试 第二章ESP8266硬件与软件测试 第三章ESP8266客户端与Java后台服务器联调 第四章ESP8266客户端与JavaWeb服务器联调 ...

  3. 基于matlab的温度信号采集,基于matlab与单片机的动态温度监控系统的设计

    基于matlab与单片机的动态温度监控系统的设计 基于Matlab/Simulink 与单片机的动态温度监控系统的设计Matlab 有着强大的数值处理能力,已应用于工程计算.控制系统设计.数字信号处理 ...

  4. java人体识别_基于安卓Android的人体动作行为识别系统APP设计(Android studio)

    基于安卓Android的人体动作行为识别系统APP设计(Android studio)(论文12000字,程序代码) 摘要:Android手机已经成为我们大部分人日常生活中不可或缺的一部分,而且其功能 ...

  5. android餐厅菜单功能,基于安卓Android平台餐馆点餐订餐系统的设计与实现(SQLite)...

    基于安卓Android平台餐馆点餐订餐系统的设计与实现(SQLite)(毕业论文18000字,程序代码,SQLite数据库) 本课题是基于android(安卓)平台开发的,作为餐饮业点餐使用的一个工具 ...

  6. 基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计

    目录 1 项目概述 1.1 项目介绍 1.2 项目开发环境 1.3 小组人员及分工 2 需求分析 2.1 系统需求分析 2.2 可行性分析 2.3 项目实施安排 3 系统硬件设计 3.1 系统整体硬件 ...

  7. 毕业设计 基于stm32的智能快递仓库环境监控系统 - 物联网 嵌入式

    本次设计的快递仓库的火灾报警系统通过主控单元将各个传感器的参数值采集回来,包括与消防安全相关的温度.湿度.烟雾等,主控制器. 数据采集回来之后通过无线的方式将数据上传到远端的上位机上,由于这些参数都是 ...

  8. 物联网毕业设计-基于stm32的温湿度监控系统

    一.引言 近年来,随着科技的进步,计算机和电子技术在各个领域的应用越来越广泛,人们对温湿度的要求也越来越高.现在用于食品.药品和环境监测的仪器.仪表和计算机等设备越来越多,它们与人们生产.生活的关系越 ...

  9. 基于单片机的粮仓远程监控系统的设计

    1绪论 1.1 课题研究背景及意义 中国自古以来就是一个大国,地大物博,特别是新中国成立以来,粮食的产量屡创新高,但是中国也是一个人口大国,人口达14亿位居世界第一[1].我国以占世界不到10%的耕地 ...

最新文章

  1. java抽象类与抽象方法详解+练习题
  2. IDC最新报告:阿里语音AI登顶中国No.1
  3. Spring Boot:自定义starter
  4. DIV+CSS基础教程
  5. CSU 1111 三家人
  6. 虚拟机Oracle错误,解决xp虚拟机下oracle的几个错误
  7. thinkphp 前台html调用函数 格式化输出
  8. MySQL重要但容易被忽略_MySQL自定义函数存储过程
  9. 华为收入超过阿里腾讯总和!等等,先把鸿蒙说清楚!
  10. c语言数组模拟骰子6000次,单选:模拟骰子的6000次投掷,编程统计并输出骰子的6个面各自出现的概率。按要求在空白处填写适当的表达式或语句,使程序完整并符合题目要求。...
  11. 苹果xr十大隐藏功能_别再说苹果“悬浮球”功能不好用,隐藏的实用小技巧,每天用得上...
  12. 阿姆达尔定律 是什么 Amdahl 并行效率计算经验法则
  13. 【图像加密】图像处理之Logistic混沌序列加密
  14. xAd:南京大学大二学生开发的视频内广告动态植入技术
  15. 深富策略短线消化市场情绪
  16. google home键_如何使用您的Google Home拨打电话
  17. 为什么学微电子的都怕掉进材料的坑?
  18. 【MFC基础入门】基于Adaboost算法的车牌检测在OpenCV上的研究与实现
  19. tomcat_修改网页标签图标
  20. python 爬虫爬取统计局北京统计数据

热门文章

  1. Win11开始菜单应用程序消失
  2. HTML个人相册(3d旋转)
  3. Elasticsearch6.4.3——安装es浏览器可视化界面elasticsearch-head
  4. oracle 游标的使用
  5. python学习-温度转换
  6. 黑马程序员_7K面试题之交通灯管理系统
  7. 【SDK】VS SLN 转CMAKE
  8. 打印图形(循环嵌套专项练习)
  9. 攻击流量超过300G,遭遇DDoS时我们能做些什么?
  10. 关于runat = “server”