项目3任务7-物联网APP远程控制LED_第1页
项目3任务7-物联网APP远程控制LED_第2页
项目3任务7-物联网APP远程控制LED_第3页
项目3任务7-物联网APP远程控制LED_第4页
项目3任务7-物联网APP远程控制LED_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2相关知识34任务小结与练习1任务实施任务引入与目标物联网APP远程控制LED一、任务引入与目标任务目标任务7将实现:APP发送MQTT消息:topic="/手机号/my_APP/set",payload="{"LedStatus":1}"或"{"LedStatus":0}"。ESP32网关收到MQTT消息后,根据解析的命令值控制所接LED的亮与灭。APP程序不需要修改,网关程序设计中需要实现MQTT消息的接收、解析及控制。任务引入任务6实现了温湿度的展示,数据流向为硬件到APP。这个数据能不能实现反方向传输呢?比如能否通过APP远程控制硬件设备呢?二、相关知识Arduino开发环境中的JavaScript对象(JSONObject)JSONObject可以包含多个成员,每个成员以name:value对(键值对,键又称为字段)呈现,如{"id":1,"temp":22}。格式要求:JSONObject用花括号表示;成员之间用逗号分隔;键(字段)和值之间用冒号分隔;键用双引号括起来,即键是一个字符串。获取JSON对象成员的值用户可以通过两种方式获取JSON对象成员的值:(1)JSON对象名.id;(2)JSON对象名["id"];其中,id是JSON对象的一个键。二、相关知识课堂讨论JSONObject可以转换为一个字符串,或者通过字符串转换得到。其中的键也是一个字符串,需要用双引号括起来。在进行程序设计时,键的双引号该如何处理,才不会造成误解呢?三、任务实施实施设备ESP32网关和DHT11温湿度传感器各一个,杜邦线若干,安装了Arduino开发环境和AndroidStudio开发环境的计算机,部署了MQTT服务器的云服务器。1.网关和LED硬件连接在任务6的基础上,连接LED灯:DHT11_DAT———ESP32_IO25DHT11_GND———ESP32_GNDDHT11_VCC———ESP32_VCC三色灯_R———ESP32_IO25三色灯_GND———ESP32_GND三色灯的数据引脚接ESP32的IO25。实施过程三、任务实施2.网关程序设计(1)头文件、宏、变量、对象定义。#defineDHT11_PIN26#defineLED_PIN25/*需要上报和订阅的TOPIC*/constchar*subTopic="my_APP/set";//****订阅constchar*pubTopic="my_ESP32/post";//******发布除了第25引脚的宏定义之外,程序中还定义了订阅消息的主题subTopic。需要注意的是,网关MQTT客户端接收的消息主题是APP中MQTT客户端发布的消息主题,两者必须保持一致,否则网关是收不到MQTT消息的。在setup函数中,对LED进行初始化:pinMode(LED_PIN,OUTPUT);三、任务实施(2)订阅MQTT消息。如图3-36所示,在重连接函数中,当MQTT客户端调用connect方法连接MQTT服务器成功后,调用subscribe方法订阅要接收的消息主题。图3-36订阅MQTT消息三、任务实施(3)解析MQTT消息及控制。voidcallback(char*topic,byte*payload,unsignedintlen){Stringmsg="";StringLedStatus="";Serial.print("Recevice[");Serial.print(topic);Serial.print("]");for(inti=0;i<len;i++){msg+=(char)payload[i];//msg即收到的消息内容}Serial.println(msg);if(msg.indexOf("LedStatus")){//判断消息中是否有字符串"LedStatus",即APP是否要设置LED灯//通过字符串截取函数取出LedStatus的值,是字符串类型LedStatus=msg.substring(msg.indexOf("LedStatus\":")+11,msg.indexOf("}"));digitalWrite(LED_PIN,LedStatus.toInt());}}解析时,判断收到的消息里有没有字符串“LedStatus”,即APP是否要设置LED灯。如果有,则用字符串截取函数取出LedStatus的值,再控制灯的亮灭。这里其实并没有用到JSON库的解析函数,而是直接用字符串去提取。使用ArduinoJson库进行解析前面学习过,本任务稍后来实现。三、任务实施3.结果展示如图3-37所示,点击APP的image21,APP发送开灯命令,LED亮。图3-37APP控制LED点亮如图3-38所示,点击APP的image22,APP发送关灯命令,LED灭。图3-38APP控制LED熄灭稍等一会儿,温湿度值会上报并显示。三、任务实施LED状态改变后,能否上传LED状态值到APP并显示在text23中呢?课堂讨论三、任务实施voidcallback(char*topic,byte*payload,unsignedintlen){Stringmsg="";Serial.print("Recevice["+String(topic)+"]");for(inti=0;i<len;i++){msg+=(char)payload[i];//msg即收到的消息内容}Serial.println(msg);StaticJsonBuffer<200>jsonBuffer;JsonObject&root=jsonBuffer.parseObject(msg);if(!root.success()){Serial.println("parseObject()failed");return;}constchar*val=root[Identifier];4.用ArduinoJson库解析JSON数据(1)解析及控制程序。三、任务实施if(val!=NULL){constuint16_tLedStatus=root[Identifier];if(LedStatus==1){digitalWrite(LED_PIN,HIGH);//开灯}else{digitalWrite(LED_PIN,LOW);//关灯}Serial.print("LedStatus:");Serial.println(LedStatus);}}程序中:①在回调函数中,当收到MQTT消息后,该函数将消息转为JSON对象。②如果发来的消息不满足JSON格式,则失败,打印"parseObject()failed"。③如果消息满足JSON格式,则解析字段“LedStatus”的值是否为空:若为空(说明是其他命令),则不处理;若非空(说明是控制LED的命令),则取出控制命令后控制LED即可。这里比较关键的是要二次解析,千万不能根据“LedStatus”的值直接控制LED,可能会出错。比如收到的是控制风扇命令,root["LedStatus"]是NULL,赋值给LedStatus变量的值是0,执行的就是关灯操作,显然是不合适的。三、任务实施(2)结果展示。如图3-39所示,点击image21,发送开灯命令,IO25所接的LED亮,串口也打印了接收的MQTT消息,topic为[my_APP/set],payload为{"LedStatus":1}。图3-39APP发送开灯命令如图3-40所示,点击image22,发送关灯命令,IO25所接的LED灭,串口也打印了接收的MQTT消息,topic为[my_APP/set],payload为{"LedStatus":0}。图3-40APP发送关灯命令四、任务小结与练习任务小结任务7实现了采用两种网关解析MQTT消息的方法,都可以实现APP远程手动控制LED,将LED替换为蜂鸣器、继电器等简单执行器,即

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论