系统物联网的方案及功能设计

这篇具有很好参考价值的文章主要介绍了系统物联网的方案及功能设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.1  通信协议的选择

1.1.1  MQTT的简介

1.1.2  MQTT的通信模型

 1.2  物联网服务平台的选择

1.2.1  注册物联网平台

1.3  Web端或手机端远程控制和监测跟踪装置

1.3.1  Node-RED设计      

1.3.2  移动端设计     

1.3.3  远程监视设计

1.3.4  代码实现

1.4  自适应天气运行控制策略

1.4.1  自适应天气运行的需求

1.4.2  自适应天气运行的设计原理

1.4.3  天气信息平台的选择

1.3.4  自适应天气运行的设计方案

1.4.5  代码实现

        1、使用心知天气数据服务的准备工作

        2、ESP8266获取并解析心知天气数据

        3、自适应天气运行+远程监控代码


物联网是通过ESP8266 nodeMCU来实现WiFi联网的,本系统是采用Arduino IDE来对ESP8266进行开发,因此本章的代码仅适用于Arduino IDE上。

1.1  通信协议的选择

        在物联网协议中,一般分为两大类,一类是传输协议,一类是通信协议。传输协议一般负责子网内设备间的组网及通信;通信协议则主要是运行在传统互联网TCP/IP协议之上的设备通讯协议,负责设备通过互联网进行数据交换及通信。MQTT是一种轻量级消息传输协议,它为物联网设备提供了一种简单的方法来传输数据信息。由于MQTT占用网络资源小,且适用于远程信息传输,MQTT在物联网(IoT)领域起着重要作用。

1.1.1  MQTT的简介

        MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,属于应用层协议,因此只要是支持TCP/IP协议栈的地方,都可以使用MQTT。

        MQTT协议最大的特点就是,两个设备端(Client)之间不及进行直接通讯,而是将数据发送到服务端(Server),由服务器将设备端发送的数据传递给对应的设备端。

1.1.2  MQTT的通信模型

        MQTT协议提供一对多的消息发布,可以降低应用程序的耦合性,用户只需要编写极少量的应用代码就能完成一对多的消息发布与订阅,该协议是基于<客户端-服务器>模型,在协议中主要有三种身份:发布者(Publisher)、服务器(Broker)以及订阅者(Subscriber)。其中,MQTT消息的发布者和订阅者都是客户端,服务器只是作为一个中转的存在,将发布者发布的消息进行转发给所有订阅该主题的订阅者;发布者可以发布在其权限之内的所有主题,并且消息发布者可以同时是订阅者,实现了生产者与消费者的脱耦,发布的消息可以同时被多个订阅者订阅。MQTT通信模型如图1所示。

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机
图1    MQTT通信模型

 1.2  物联网服务平台的选择

        本系统着重对个人开发者相对友好以及对Arduino的支持情况两个方面考虑,最终选择然也物联作为物联网服务平台。然也物联平台可提供社区版MQTT服务,其为面向个人用户的免费MQTT服务。社区版MQTT服务中的用户个人主题和信息传输受到用户名和密码保护。即,A用户的个人主题只有A用户可以发布和订阅,其他人不能对该主题进行订阅和发布,为个人开发者提供了很好的安全保护。

        然也物联平台还提供相应的手机APP的接入方式,使得用户可以更多元化的管理自己的设备和传感器,随时了解设备动态。

1.2.1  注册物联网平台

        进入然也物联的官网:http://www.ranye-iot.net

        在首页点击物联平台后会进行页面跳转,然后往下滑就可以找到 社区版MQTT服务

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

        最近好像没得注册用户了... 进而无法进行平台申请...也无法使用社区版MQTT服务了...

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

         服务端连接基本信息

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

         客户端连接信息(共有8组)

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

         专属个人主题

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

         社区版服务有效期为一年,届时会有工作人员联系。

1.3  Web端或手机端远程控制和监测跟踪装置

        光伏跟踪装置的远程监测控制系统可由感知层、网络层以及应用层组成。

        第一层为感知层,由单片机、传感器模块和ESP8266 WiFi模块所组成,对环境进行数据采集和对执行机构的控制,通过WiFi模块将数据传输到网络层。

        第二层为网络层,主要包括路由器和服务器,网络层主要用于处理不同层之间的数据交互,感知层的数据通过网络层可以传递到应用层,应用层的下行命令可以通过网络层传递到感知层。感知层中监测到的数据经过ESP8266 WiFi模块,通过路由器接入互联网,将数据发送到然也物联平台搭建的MQTT服务器上。

        感知层的数据通过基于TCP的MQTT协议上传到1个PubTopic,并通过订阅SubTopic以接收下行命令,进行执行器的控制。

        第三层为应用层,主要包括Web端和移动端的数据显示、管理和控制,在Web端通过Node-Red进行数据的远程监控和对装置的控制,在移动端也可以通过APP进行实时监测环境数据和向感知层下发下行命令以控制装置的执行机构运动。

1.3.1  Node-RED设计      

        通过mqtt in节点配置连接的服务器 IP 地址,确定 mqtt 连接的 Topic 主题和Qos方式后,便可以连接到传输层,得到感知层的环境数据和执行器的状态,然后通过文本显示节点,便可以将上述数据显示文本窗口。

        要完成以上步骤,首先需要下载node.js才可进入node-red,接下来如何使用node-red可观看以下视频,重点学习如何使用MQTT进行通信。

【太极创客】零基础入门学用物联网 - MQTT应用篇 3-1-5 用电脑搭建物联网控制台(上)https://www.bilibili.com/video/BV1VR4y1n7nj/?spm_id_from=333.999.0.0&vd_source=b4d125df2ebf1ab26fbed06ba725ac39

         Web端监控页面如下图所示。

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

1.3.2  移动端设计     

        本系统在移动端的监测控制是通过然也物联提供的移动应用平台所设计而成。首先,配置所要连接的服务器的客户端ID、 IP 地址、端口号、网络协议、用户名和密码,然后确定 mqtt 连接的 Topic 主题和Qos方式后进入到功能设计页面;可设置文本显示框架,便可以将服务器数据显示到文本窗口,还可设置控制按钮,配置下行命令;这样便可以连接到传输层,得到感知层的环境数据和执行器的状态,或将下行命令通过传输层下达到感知层,控制执行机构运动。

         要完成以上步骤,需先下载然也物联的APP,可观看以下视频进行学习,重点学习如何使用MQTT进行通信,视频里也会教如何下载APP。

【太极创客】零基础入门学用物联网 - MQTT应用篇 3-1-4 手机应用控制ESP8266(下)https://www.bilibili.com/video/BV1QT4y1R7uf/?spm_id_from=333.999.0.0&vd_source=b4d125df2ebf1ab26fbed06ba725ac39

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

        移动端监控页面如下图所示。

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

1.3.3  远程监视设计

        设置ESP32-CAM为STA模式,即可通过路由器接入互联网。在浏览器中输入其生成的IP地址,即可在Web端或移动端看到由ESP32-CAM拍摄所上传的画面,这样便可实现远程监视效果。

        这部分在CSDN搜索都有很多教程。

        视频监视效果如下图所示。

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

1.3.4  代码实现

        代码后的注释能解释清楚每一句代码的作用。

        初始化设置

#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <string.h>

// 设置wifi接入信息(请根据您的WiFi信息进行修改)
const char* ssid     = "SunFlower";               // 请将您需要连接的WiFi名填入引号中                                           
const char* password = "88888888";                // 请将您需要连接的WiFi密码填入引号中
const char* mqttServer = "iot.ranye-iot.net";     //连接MQTT服务器,iot开头代表是社区版服务端的地址

//建立两对象
WiFiClient wifiClient;                            // 连接网络
PubSubClient mqttClient(wifiClient);              // MQTT通信用的
 
// ****************************************************
// 注意!以下需要用户根据然也物联平台信息进行修改!否则无法工作!
// ****************************************************
const char* mqttUserName = "UserName";          // 服务端连接用户名(需要修改)
const char* mqttPassword = "password";           // 服务端连接密码(需要修改)
const char* clientId = "UserName_1_id";           // 客户端id (需要修改)
const char* subTopic1 = "UserName/phone";         // 订阅主题(需要修改)
const char* subTopic2 = "UserName/web";           // 订阅主题(需要修改)
const char* pubTopic1 = "UserName/esp8266_1";     // 发布主题(需要修改)
const char* pubTopic2 = "UserName/esp8266_2";     // 发布主题(需要修改)
const char* pubTopic3 = "UserName/esp8266_3";     // 发布主题(需要修改)
const char* pubTopic4 = "UserName/esp8266_4";     // 发布主题(需要修改)
const char* willTopic = "UserName/led_yz";        // 遗嘱主题名称(需要修改)
// ****************************************************
 
//遗嘱相关信息
const char* willMsg = "esp8266 offline";        // 遗嘱主题信息
const int willQos = 0;                          // 遗嘱QoS
const int willRetain = false;                   // 遗嘱保留
 
const int subQoS = 1;            // 客户端订阅主题时使用的QoS级别(截止2020-10-07,仅支持QoS = 1,不支持QoS = 2)
const bool cleanSession = false; // 清除会话(如QoS>0必须要设为false)                                          

//***************************************************** 
const char* host = "api.seniverse.com";     // 将要连接的服务器地址  
const int httpPort = 80;                    // 将要连接的服务器端口      
 
// 心知天气HTTP请求所需信息
String reqUserKey = "************";   // 私钥
String reqLocation = "你的城市所在地";            // 城市
String reqUnit = "c";                      // 摄氏/华氏
//***************************************************** 

 
void setup(){
  Serial.begin(115200);          

  //设置ESP8266工作模式为无线终端模式
  WiFi.mode(WIFI_STA);

  // 连接WiFi
  connectWiFi();

  // 设置MQTT服务器和端口号
  mqttClient.setServer(mqttServer, 1883);
  mqttClient.setCallback(receiveCallback);
 
  // 连接MQTT服务器
  connectMQTTserver();
}

        由于主函数中涵盖了自适应天气运行部分的代码,因此具体代码放在文末与自适应天气部分一起放上。

1.4  自适应天气运行控制策略

1.4.1  自适应天气运行的需求

        为实现系统避风、避雪,保护支架、组件,减少装置的受损概率,延长支架、组件的使用寿命,延长发电寿命,增加发电收益。本系统针对天气对光伏发电的影响为跟踪装置设计了自适应天气运行,即适应天气的变化使跟踪装置作出相应的调整,以最大化地提高发电效益,力求将天气对光伏发电所带来的影响降到最低。

1.4.2  自适应天气运行的设计原理

        ①本系统采用的是混合跟踪方式,光电跟踪方式在尤其是在阴雨或者多云天气时,很难与太阳光线对正,有些情况下还会出现误跟踪、丢跟踪和往反跟踪等现象,没办法保证跟踪精度;而视日轨迹跟踪方式的主要缺点在于运行时会产生累积误差,该误差不能自行消除,往往需要人为定期调整跟踪累积误差。

        综合分析考虑决定,在晴朗天气下,系统将采用光电跟踪方式;而在阴天或多云天气时,系统将采用视日轨迹跟踪方式。

        ②本系统中配置风速风向监测仪用于监测光伏支架安装环境中风速的大小、风的方向(当接收到与风相关的天气信息方启动风速风向检测仪,以降低系统整体能耗);如果测量的风速大于设定值时,MCU即驱动执行机构,使太阳能电池板的侧面迎风,正面避开风的正面,减少迎风面积,从而减少受风力,降低受损概率;同时可以驱动俯仰角转动,使得俯仰角变小,张力变小,机械受外力不易损坏。

        ③本系统配置雨滴传感器用于检测雨雪量(当接收到与雨雪相关的天气信息方启动雨滴传感器,以降低系统整体能耗);如果雨雪量大于设定值时,容易造成组件或支架受雨雪压力受损,MCU即可驱动执行机构转动,使得太阳能电池板正面和地面垂直或接近垂直,雨雪就不容易积压到太阳能电池板表面上,严寒地区安装的组件表面也不易结冰,减少雨雪对组件的腐蚀和压力;当雨量小于设定值时,系统将采用视日轨迹跟踪方式,此时较小的雨量并不容易对组件造成损害,相反,还可利用雨水冲刷掉光伏组件表面的污垢和灰尘,从而增加光照强度,提高光伏发电系统的输出功率。

1.4.3  天气信息平台的选择

        互联网上有很多天气信息平台,心知天气是信息最准确,服务最稳定的平台。更重要的是,心知天气所提供的基础服务是完全免费的,其免费的天气信息就包含3天的天气预报信息,实时天气以及生活指数。

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

1.3.4  自适应天气运行的设计方案

        ①对WiFi模块进行初始化设置,设置成STA模式,WiFi模块通过路由器/手机热点可连接互联网;建立“心知天气”API当前天气请求资源地址,通过互联网向“心知天气”服务器发送HTTP请求,并获取服务器返回的天气信息,从服务器响应中解析出天气代码(如图2所示)。

        ②设定特殊天气的转换程序,即将所需响应的天气情况所对应的天气代码转换为控制系统可识别的字符。此时WiFi模块同时作为上位机,与单片机进行串行通信,将可识别的天气字符传送给单片机。

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机
图2    部分天气现象代码说明

        ③对单片机进行初始化设置,设计接收到不同的天气字符即运行不同的舵机驱动代码。当单片机接收到实时的天气信息后,配合雨滴传感器、风速风向传感器来确认天气信息属实后,才会驱动跟踪装置执行相应的动作。

        目前仅对四种天气情况进行了设置:

        晴天时,单片机将运行光电跟踪模式;

        阴天或多云时,单片机将运行视日轨迹跟踪模式,确保光伏板始终朝向太阳,以提供最佳的能量收集效果,最大限度地提高能量输出效率;

        雨天时,单片机将中断当前所执行的模式,转而驱动控制俯仰角的舵机将光伏电池板置于倾斜45°的状态,令雨水冲刷板面,以清理尘土、落叶等遮挡物, 从而减弱热斑效应,延长系统寿命。

        雪天时,单片机将中断当前所执行的模式,转而驱动控制俯仰角的舵机将光伏电池板置于垂直地面的状态,系统能够自动调整光伏板角度,使其正面和地面垂直或接近垂直,减少积雪对 组件的腐蚀和压力。

        自适应天气运行控制策略的流程图如图3所示。

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机
图3    自适应天气运行控制策略的程序流程图

         补充:图中在执行雨雪天气时,漏了得先经过雨滴传感器的数据辅助判断当前天气情况是否属实这一步。

1.4.5  代码实现

        1、使用心知天气数据服务的准备工作

        ①注册心知天气账户

        打开心知天气网页:www.seniverse.com

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

         ②申请免费天气数据API服务

        完成注册后进行登录,然后从首页进入控制台页面(如下图所示)

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

         申请天气数据API免费版

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

         申请成功后可以在控制台中看到(如下图所示)

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

         点击该服务链接,进入天气数据API免费服务页面

        ③获取用户私钥、 

物联网系统设计,基于物联网的智慧光伏跟踪系统,物联网,单片机

        点击私钥旁边的 闭合上的眼睛 即可查看自己的私钥信息 

        2、ESP8266获取并解析心知天气数据

        这里可以先使用“太极创客团队”的代码来实现 获取实时天气信息(温度、天气)

        要实现本系统的自适应天气运行功能,照搬太极创客的代码是行不通的。

#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
 
const char* ssid     = "taichimaker";       // 连接WiFi名(此处使用taichi-maker为示例)
                                            // 请将您需要连接的WiFi名填入引号中
const char* password = "12345678";          // 连接WiFi密码(此处使用12345678为示例)
                                            // 请将您需要连接的WiFi密码填入引号中
 
const char* host = "api.seniverse.com";     // 将要连接的服务器地址  
const int httpPort = 80;                    // 将要连接的服务器端口      
 
// 心知天气HTTP请求所需信息
String reqUserKey = "XXXXXXXXXXXXXXXXX";   // 私钥
String reqLocation = "Beijing";            // 城市
String reqUnit = "c";                      // 摄氏/华氏
 
void setup(){
  Serial.begin(9600);          
  Serial.println("");
  
  // 连接WiFi
  connectWiFi();
}
 
void loop(){
  // 建立心知天气API当前天气请求资源地址
  String reqRes = "/v3/weather/now.json?key=" + reqUserKey +
                  + "&location=" + reqLocation + 
                  "&language=en&unit=" +reqUnit;
 
  // 向心知天气服务器服务器请求信息并对信息进行解析
  httpRequest(reqRes);
  delay(3000);
}
 
// 向心知天气服务器服务器请求信息并对信息进行解析
void httpRequest(String reqRes){
  WiFiClient client;
 
  // 建立http请求信息
  String httpRequest = String("GET ") + reqRes + " HTTP/1.1\r\n" + 
                              "Host: " + host + "\r\n" + 
                              "Connection: close\r\n\r\n";
  Serial.println(""); 
  Serial.print("Connecting to "); Serial.print(host);
 
  // 尝试连接服务器
  if (client.connect(host, 80)){
    Serial.println(" Success!");
 
    // 向服务器发送http请求信息
    client.print(httpRequest);
    Serial.println("Sending request: ");
    Serial.println(httpRequest);  
 
    // 获取并显示服务器响应状态行 
    String status_response = client.readStringUntil('\n');
    Serial.print("status_response: ");
    Serial.println(status_response);
 
    // 使用find跳过HTTP响应头
    if (client.find("\r\n\r\n")) {
      Serial.println("Found Header End. Start Parsing.");
    }
    
    // 利用ArduinoJson库解析心知天气响应信息
    parseInfo(client); 
  } else {
    Serial.println(" connection failed!");
  }   
  //断开客户端与服务器连接工作
  client.stop(); 
}
 
// 连接WiFi
void connectWiFi(){
  WiFi.begin(ssid, password);                  // 启动网络连接
  Serial.print("Connecting to ");              // 串口监视器输出网络连接信息
  Serial.print(ssid); Serial.println(" ...");  // 告知用户NodeMCU正在尝试WiFi连接
  
  int i = 0;                                   // 这一段程序语句用于检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED) {      // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 
    delay(1000);                               // 如果WiFi连接成功则返回值为WL_CONNECTED                       
    Serial.print(i++); Serial.print(' ');      // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值
  }                                            // 同时NodeMCU将通过串口监视器输出连接时长读秒。
                                               // 这个读秒是通过变量i每隔一秒自加1来实现的。                                              
  Serial.println("");                          // WiFi连接成功后
  Serial.println("Connection established!");   // NodeMCU将通过串口监视器输出"连接成功"信息。
  Serial.print("IP address:    ");             // 同时还将输出NodeMCU的IP地址。这一功能是通过调用
  Serial.println(WiFi.localIP());              // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。  
}
 
// 利用ArduinoJson库解析心知天气响应信息
void parseInfo(WiFiClient client){
  const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 230;
  DynamicJsonDocument doc(capacity);
  
  deserializeJson(doc, client);
  
  JsonObject results_0 = doc["results"][0];
  
  JsonObject results_0_now = results_0["now"];
  const char* results_0_now_text = results_0_now["text"]; // "Sunny"
  const char* results_0_now_code = results_0_now["code"]; // "0"
  const char* results_0_now_temperature = results_0_now["temperature"]; // "32"
  
  const char* results_0_last_update = results_0["last_update"]; // "2020-06-02T14:40:00+08:00" 
 
  // 通过串口监视器显示以上信息
  String results_0_now_text_str = results_0_now["text"].as<String>(); 
  int results_0_now_code_int = results_0_now["code"].as<int>(); 
  int results_0_now_temperature_int = results_0_now["temperature"].as<int>(); 
  
  String results_0_last_update_str = results_0["last_update"].as<String>();   
 
  Serial.println(F("======Weahter Now======="));
  Serial.print(F("Weather Now: "));
  Serial.print(results_0_now_text_str);
  Serial.print(F(" "));
  Serial.println(results_0_now_code_int);
  Serial.print(F("Temperature: "));
  Serial.println(results_0_now_temperature_int);
  Serial.print(F("Last Update: "));
  Serial.println(results_0_last_update_str);
  Serial.println(F("========================"));
}

        3、自适应天气运行+远程监控代码

         代码后的注释能解释清楚每一句代码的作用。文章来源地址https://www.toymoban.com/news/detail-769050.html

void loop(){
//*****************************************************   
  // 建立心知天气API当前天气请求资源地址
  String reqRes = "/v3/weather/now.json?key=" + reqUserKey +
                  + "&location=" + reqLocation + 
                  "&language=en&unit=" +reqUnit;
 
  // 向心知天气服务器服务器请求信息并对信息进行解析
  httpRequest(reqRes);
//***************************************************** 

//***************************************************** 
  // 如果开发板未能成功连接服务器,则尝试连接服务器
  if (!mqttClient.connected()) {
    connectMQTTserver();
  }
 
  // 处理信息以及心跳
  mqttClient.loop();
//***************************************************** 
  char a[20] = ""; //定义字符数组,接受来自串口的数据
  char b;
  int i = 0;
  while (Serial.available()) //当发现缓存中有数据时,将数据送至字符数组a中
  {
    a[i] = Serial.read();   
    i++;
  }
  
  b = a[0];
  if (b == '1'){
    mqttClient.publish(pubTopic4, "YES"); //向Web端发送雨滴传感器的状态,有雨或无雨
    Serial.print('5');
  }else{
    mqttClient.publish(pubTopic4, "NO");
  }
  
  if(Serial.available() == 0){ 
    mqttClient.publish(pubTopic3, a);   //向Web端和移动端发送跟踪装置的俯仰角度和水平角度
  }

}
 
// 向心知天气服务器服务器请求信息并对信息进行解析
void httpRequest(String reqRes){
  WiFiClient client;
 
  // 建立http请求信息
  String httpRequest = String("GET ") + reqRes + " HTTP/1.1\r\n" + 
                              "Host: " + host + "\r\n" + 
                              "Connection: close\r\n\r\n";

  // 尝试连接服务器
  if (client.connect(host, 80)){
 
    // 向服务器发送http请求信息
    client.print(httpRequest);
 
    // 获取并显示服务器响应状态行 
    String status_response = client.readStringUntil('\n');
 
    // 使用find跳过HTTP响应头
    if (client.find("\r\n\r\n")) {
//      Serial.println("Found Header End. Start Parsing.");
    }
    
    // 利用ArduinoJson库解析心知天气响应信息
    parseInfo(client);
    delay(1000);
    
  } else {
//    Serial.println(" connection failed!");
  }   
  //断开客户端与服务器连接工作
  client.stop(); 
}
 
// 连接WiFi
void connectWiFi(){
  WiFi.begin(ssid, password);                  // 启动网络连接
  
  int i = 0;                                   // 这一段程序语句用于检查WiFi是否连接成功
  while (WiFi.status() != WL_CONNECTED) {      // WiFi.status()函数的返回值是由NodeMCU的WiFi连接状态所决定的。 
  delay(1000);                                                  

  }                                            
  
}
 
// 利用ArduinoJson库解析心知天气响应信息
void parseInfo(WiFiClient client){
  const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 2*JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(6) + 230;
  DynamicJsonDocument doc(capacity);
  
  deserializeJson(doc, client);
  
  JsonObject results_0 = doc["results"][0];
  
  JsonObject results_0_now = results_0["now"];
  const char* results_0_now_text = results_0_now["text"]; // "Sunny"
  const char* results_0_now_code = results_0_now["code"]; // "0"
  const char* results_0_now_temperature = results_0_now["temperature"]; // "32"
  
  const char* results_0_last_update = results_0["last_update"]; // "2020-06-02T14:40:00+08:00" 
 
  String results_0_now_text_str = results_0_now["text"].as<String>(); 
  int results_0_now_code_int = results_0_now["code"].as<int>(); 
  int results_0_now_temperature_int = results_0_now["temperature"].as<int>(); 
  
  String results_0_last_update_str = results_0["last_update"].as<String>();   
 
    mqttClient.publish(pubTopic2, results_0_now_text);//将天气情况发送到Web端,使其可显示当前天气情况
    
//转换成单片机可识别的天气状态字符,然后通过串口传给单片机
  if(results_0_now_code_int == 24 || results_0_now_code_int == 25)//雪天
  {
    Serial.print('3');
  }
  if(results_0_now_code_int == 13 || results_0_now_code_int == 14 || results_0_now_code_int == 15 || results_0_now_code_int == 16 || results_0_now_code_int == 17 || results_0_now_code_int == 18)//雨天
  {
    Serial.print('5');
  }
    if(results_0_now_code_int == 0)//晴天
  {
    Serial.print('0');
  }
  if(results_0_now_code_int == 4 || results_0_now_code_int == 5 || results_0_now_code_int == 6 || results_0_now_code_int == 7 || results_0_now_code_int == 8 || results_0_now_code_int == 9)//阴天
  {
    Serial.print('1');
  }    

//将天气情况发送到移动端,使其可显示当前天气情况
    char* pubMessage;
    pubMessage = "天气:";   
    if(mqttClient.publish(pubTopic1, results_0_now_text)){ 
       mqttClient.publish(pubTopic1, pubMessage);
    }
}

// 连接MQTT服务器并订阅信息
void connectMQTTserver(){
  // 根据ESP8266的MAC地址生成客户端ID(避免与其它ESP8266的客户端ID重名)
  
 
  /* 连接MQTT服务器
  boolean connect(const char* id, const char* user, 
                  const char* pass, const char* willTopic, 
                  uint8_t willQos, boolean willRetain, 
                  const char* willMessage, boolean cleanSession); 
  若让设备在离线时仍然能够让qos1工作,则connect时的cleanSession需要设置为false                
                  */
  if (mqttClient.connect(clientId, mqttUserName, 
                         mqttPassword, willTopic, 
                         willQos, willRetain, willMsg, cleanSession)) {    
    
    subscribeTopic(); // 订阅指定主题
  } else {
    delay(5000);
  }   
}
 
// 收到信息后的回调函数。
void receiveCallback(char* topic, byte* payload, unsigned int length) {

  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);     // 订阅了Web端和移动端发布的主题,当收到这两端发布信息后,便会通过串口传给单片机
  }

}
 
// 订阅指定主题
void subscribeTopic(){

  mqttClient.subscribe(subTopic1, subQoS); 
  mqttClient.subscribe(subTopic2, subQoS);
  
}

到了这里,关于系统物联网的方案及功能设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于物联网及云平台的光伏运维系统

    系统结构    在光伏变电站安装逆变器、以及多功能电力计量仪表,通过网关将采集的数据上传至服务器,并将数据进行集中存储管理。用户可以通过PC访问平台,及时获取分布式光伏电站的运行情况以及各逆变器运行状况。平台整体结构如图所示。     光伏背景及用户痛点

    2024年02月10日
    浏览(28)
  • 基于物联网智慧公厕的多功能城市智慧驿站

    在现代城市发展中,智慧化已经成为了一个不可或缺的趋势。而多功能城市智慧驿站,作为智慧城市建设的一部分,以物联网智慧公厕为基础,集合了诸多功能于一身,成为了城市中不容忽视的存在。多功能城市智慧驿站也称为轻松的驿站智慧公厕、智慧文旅驿站、5G智慧公

    2024年02月21日
    浏览(35)
  • 基于边缘物联网关的智慧零售应用方案

    推动经济健康发展增长,就要持续促进和扩大消费需求,提升消费体验。随着物联网技术的普及,面向日常消费的智慧零售应用迎来爆发式增长,不仅可以提升消费者消费体验,还可以提高商家营销和管理效率。本篇就为大家简单介绍一下基于边缘物联网关的智慧零售应用方

    2024年02月09日
    浏览(30)
  • 4G工业路由器物联网解决方案智慧储能系统

    储能系统是用于电网和用户间起到电力缓冲和削峰填谷作用的电力管理平台。储能系统通常由电池、充电机、控制器、电能质量治理装置及监控系统组成。主要应用于可再生能源发电系统,电力需求侧响应,电动汽车充电等领域。 4G工业路由器是一款专门针对物联网领域设计

    2024年02月04日
    浏览(30)
  • 智慧工业园区建设方案-智慧化工园区物联网管理系统平台---豌豆云

    将化工园区海量信息互联、互通、互融,结合化工园区建设管理经验,通过“动态感知、主动监测、政企联动、综合管理”。 将事件管理从事后处置变为事前防控,保障生产安全,提升环保水平,结合可视化大屏,帮助管理者实时了解园区整体状态,为决策提供依据。助力化

    2024年01月23日
    浏览(44)
  • 15-55V输入自动升降压 光伏MPPT自动跟踪充电方案 大功率300瓦

    1.MPPT原理--简介 MPPT,全称为Maximum Power Point Tracking,即最大功点跟踪,它是一种通过调节电气模块的工作状态,使光伏板能够输出更多电能的电气系统能够将太阳能电池板发出的直流电有效地贮存在蓄电池中,可有效地解决常规电网不能覆盖的偏远地区及旅游地区的生活和工

    2024年02月20日
    浏览(25)
  • 基于EasyCVR视频技术的“互联网+监管”非现场监管视频监控系统设计方案

    一、方案背景 1、行业痛点 1)智能化水平弱,管理效率低:传统监管方式比较落后,智能化水平弱,监管工作完全依赖人工,导致人力成本过高、监管盲点多、效率低、服务质量差; 2)缺乏感知、预警和应急联动等能力:各单位违规行为、违规现象等突发事件应急联动效率

    2024年02月02日
    浏览(37)
  • 基于STM32+OneNet设计的物联网智慧路灯

    近年来,构筑智慧城市、推动城镇发展被国家列入重要工作范畴。发布的《超级智慧城市报告》显示,全球已启动或在建的智慧城市有1000多个,中国在建500个,远超排名第二的欧洲(90个)。从在建智慧城市的分布来看,我国已初步形成环渤海、长三角、珠三角、中西部四大

    2024年02月10日
    浏览(38)
  • 基于物联网、视频监控与AI视觉技术的智慧电厂项目智能化改造方案

    现阶段,电力行业很多企业都在部署摄像头对电力巡检现场状况进行远程监控,但是存在人工查看费时、疲劳、出现问题无法第一时间发现等管理弊端,而且安全事件主要依靠人工经验判断分析、管控,效率十分低下。 为解决上述问题,行业需要建立全新的安全管理模式,通

    2024年02月15日
    浏览(40)
  • 蓝牙物联网商场预警功能设计方案

    近几年来,随着物联网的不断发展,多种新兴科学技术也开始得到了应用。在物联网领域中,由于蓝牙技术的不断成熟,使其得到更多的应用拥有更重要的作用。本部分主要介绍基于单片机的家长端与孩子端蓝牙互联。本文基本用STC89C52RC这种型号的单片机作为主要控制端,在

    2024年02月03日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包