简单的喷淋实验--嵌入式实训

目录

喷淋实验--嵌入式实训

1.MQTT通信原理

2.MQTT库的移植

3.代码流程

运行视频如下:


喷淋实验--嵌入式实训

1.MQTT通信原理

MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,旨在提供可靠、高效的通信机制,适用于各种网络环境和设备。

MQTT通信原理如下:

  1. 客户端连接:MQTT协议使用TCP/IP作为传输层协议,客户端通过建立与MQTT代理服务器(也称为Broker)的TCP连接来进行通信。

  2. 订阅主题:客户端可以订阅一个或多个主题(Topic),表示对感兴趣的消息进行关注。主题是消息发布者和订阅者之间的桥梁。

  3. 发布消息:客户端可以发布消息到指定的主题。消息由两部分组成:主题和有效负载(Payload)。有效负载可以是任何格式的数据,例如文本、二进制等。

  4. 代理服务器路由:当有消息发布到某个主题时,MQTT代理服务器将根据订阅关系,将消息路由给所有订阅了该主题的客户端。

  5. 消息传输质量:MQTT支持三种消息传输质量:

    • 最多一次(At most once):消息发布者发布后,不会进行确认,且不保证消息能够成功传输到订阅者。
    • 至少一次(At least once):消息发布者发布后,会收到确认,如果没有收到确认,则会进行重传,保证消息至少被传输一次到订阅者。
    • 正好一次(Exactly once):消息发布者发布后,会进行两阶段确认,确保消息只传输一次到订阅者。
  6. 保持连接:MQTT协议支持客户端和代理服务器之间的长连接,避免了频繁建立和断开连接的开销。客户端和代理服务器之间可以通过心跳机制保持连接状态。

  7. QoS级别:MQTT协议定义了三个QoS级别(Quality of Service):

    • QoS 0:最多一次,消息会尽力传输,但不保证可靠性。
    • QoS 1:至少一次,确保消息至少传输一次,可能会重复传输。
    • QoS 2:正好一次,确保消息仅传输一次,使用了两阶段确认机制。

        总体来说,MQTT采用发布/订阅模型,通过代理服务器实现消息的路由和传输,支持灵活的订阅主题和发布消息的方式,以及可配置的消息传输质量和QoS级别,使得它成为物联网和其他低带宽、高延迟网络环境下的理想选择。



采集信息:

小程序/Linux           订阅者         1703161172612/AIOTSIM2APP

元宇宙                     发布者         1703161172612/AIOTSIM2APP

Linux订阅的主题是元宇宙发布的主题


控制设备:

小程序/Linux         发布者                 1703161172612/APP2AIOTSIM

元宇宙                   订阅者                 1703161172612/APP2AIOTSIM

Linux发布的主题是元宇宙订阅的主题


2.MQTT库的移植

目的:让Linux操作系统支持MQTT通信。

  1. MQTT库移植的步骤在群文件中下载MQTT源码文件压缩包paho.mqtt.c-1.3.0.tar.gz
  2. 将源码文件压缩包放到Linux操作系统中
  3. 使用tar -xvf paho.mqtt.c-1.3.0.tar.gz命令解压MQTT库文件压缩包

4.执行下述命令:  

       cd paho.mqtt.c-1.3.0/install/

            sudo cp include/* /usr/include/

            sudo cp -d lib/*so* /usr/lib/

3.代码流程

打开MQTT
订阅主题(元宇宙的发布主题)while(1)
{
获取数据
if(数据   >   最大值)
{发送消息(给元宇宙的订阅主题发消息,喷淋关);
}
else if(数据   <   最小值)
{
发送消息(给元宇宙的订阅主题发消息,喷淋开);
}
打印数据;
sleep(1);
}
关闭MQTT;

函数接口:

打开MQTT
mqtt_init();订阅函数和发布函数
int mqtt_subscribe(const char *topic)
功能:订阅主题
参数:元宇宙发布主题int mqtt_publish(const char *topic, char *msg)
功能:发布消息
参数:元宇宙的订阅主题	消息获取数据
float get_virtual_env()
功能:获取土壤湿度数据
参数:空关闭MQTT;
exit_mqtt();

#include<stdio.h>
#include"mqtt.h"
#include<unistd.h>int main(int argc, char *argv[]){//1-连接服务器mqtt_init();//2-订阅元宇宙平台主题,获得数据串//通过目标节点的发布主题,才能的得到发布的内容mqtt_subscribe("1703406852492/AIOTSIM2APP");//3.定义变量接收到存储解析的数据float soilHum=0;//4.循环获取数据,下发控制指令while (1){sleep(1);soilHum= get_virtual_env();if (soilHum>80){mqtt_publish("1703406852492/APP2AIOTSIM", "{\"irrigated\":false}");mqtt_publish("1703406852492/APP2AIOTSIM", "{\"alarm\":true}");printf("关闭喷淋,警报响起。。。。\n");}else if (soilHum<10){mqtt_publish("1703406852492/APP2AIOTSIM", "{\"irrigated\":true}");mqtt_publish("1703406852492/APP2AIOTSIM", "{\"alarm\":false}");printf("打开喷淋,警报关闭。。。。\n");}sleep(1);printf("当前湿度:%.2f\n", soilHum);}exit_mqtt();return 0;
}

        上述程序使用MQTT协议进行物联网通信的示例程序。根据代码的逻辑,大致可以分为以下几个步骤:

  1. 导入必要的头文件,包括"stdio.h"、"mqtt.h"和"unistd.h"。

  2. 在主函数中,首先调用mqtt_init()函数来初始化MQTT连接。

  3. 调用mqtt_subscribe()函数订阅指定的主题,该主题用于接收元宇宙平台发布的数据。

  4. 定义一个float类型的变量soilHum,用于存储解析得到的数据。

  5. 进入一个无限循环,在循环中通过get_virtual_env()函数获取虚拟环境的湿度数据,并将其赋值给soilHum变量。

  6. 根据湿度数据的不同情况,使用mqtt_publish()函数向指定主题发送控制指令,控制喷淋器的状态和警报器的状态。

  7. 在每次循环中,使用printf()函数打印当前湿度数据。

  8. 最后,调用exit_mqtt()函数关闭MQTT连接,并返回0表示程序正常结束。

        总的来说,这段代码是一个简单的智能灌溉系统的控制程序,通过接收来自元宇宙平台的湿度数据,根据设定的阈值进行判断,并控制喷淋器和警报器的状态

运行结果:

运行视频如下:

喷淋实验--实训

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/298572.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十七:演示功能模块相关功能实现

一、本章内容 本章实现常见业务功能,包括文章管理、商品管理、订单管理、会员管理等功能。 1. 详细课程地址: https://edu.csdn.net/course/detail/38183 2. 源码下载地址: 点击下载 二、界面预览 三、开发视频 3.1 B站视频地址:

Python的基本数据类型和数据类型的转换

TOC 数据类型 类型查看 type 可以使用type内置函数查看变量所指的对象类型 a1 b1.0 c"1" d1, e[1] f{1:1} g{1}print(type(a)) print(type(b)) print(type(c)) print(type(d)) print(type(e)) print(type(f)) print(type(g))isinstance **如字面意思,isinstance()…

C# 使用MSTest进行单元测试

目录 写在前面 代码实现 执行结果 写在前面 MSTest是微软官方提供的.NET平台下的单元测试框架&#xff1b;可使用DataRow属性来指定数据&#xff0c;驱动测试用例所用到的值&#xff0c;连续对每个数据化进行运行测试&#xff0c;也可以使用DynamicData 属性来指定数据&…

单例模式(C++实现)

RAII运用 只能在栈上创建对象 只能在堆上创建的对象 单例模式 设计模式 懒汉模式 解决线程安全 优化 饿汉模式 饿汉和懒汉的区别 线程安全与STL与其他锁

IDEA基本设置

本博客适用于纯新手小白&#xff0c;或者刚下载IDEA想要优化开发添加配置的读者。 基础设置 滚轮调整字体大小 打开 IntelliJ IDEA。 转到菜单栏中的 “File” -> “Settings”&#xff08;Windows/Linux&#xff09;或 “IntelliJ IDEA” -> “Preferences”&#xff…

计算机网络基础知识分享

计算机网络基础知识分享 发送一个http请求&#xff0c;从客户端到服务器端&#xff0c;都经历了什么? **Ⅰ&#xff0c;浏览器生成消息 ** &#xff08;1&#xff09;浏览器输入网址 我们的探索之旅从在浏览器中输入网址开始&#xff0c;网址&#xff0c;准确来说应该叫 UR…

MATLAB学习笔记(一)求解三阶微分方程

一、求解三阶微分方程 对于多变量三阶微分方程求解问题&#xff0c;这里介绍一种求解方法。 例题如下&#xff1a; 对于以上方程&#xff0c;给定边界条件&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;。求解和的表达式。 二、解题步骤 &#xff08;1&…

Python遥感影像深度学习指南(2)-在 PyTorch 中创建自定义数据集和加载器

在上一篇 文章中,我们Fast.ai 在卫星图像中检测云轮廓,检测物体轮廓被称为语义分割。虽然我们用几行代码就能达到 96% 的准确率,但该模型无法考虑数据集中提供的所有输入通道(红、绿、蓝和近红外)。问题在于,深度学习框架(如 Keras、Fast.ai 甚至 PyTorch)中的大多数语…

复分析——第1章——复分析准备知识(E.M. Stein R. Shakarchi)

第一章 复分析准备知识 (Preliminaries to Complex Analysis) The sweeping development of mathematics during the last two centuries is due in large part to the introduction of complex numbers; paradoxically, this is based on the seemingly absurd no…

【DataGrip使用小技巧】2

【技巧1】要将活动编辑器与剪贴板内容进行比较&#xff0c;请右键单击编辑器中的任意位置&#xff0c;然后从上下文菜单中选择compare with Clipboard. 如图所示 剪贴板和编辑器的比较一目了然 【技巧2】若要创建表的备份副本&#xff0c;请将表拖到数据库树视图中同一数据源的…

2023.12.24 关于 Redis 中 String 类型内部编码 及 应用场景

目录 String 类型内部编码 3 种内部编码方式 String 类型应用场景 Cache 缓存 键名命名规则 计数&#xff08;Counter&#xff09; 共享会话&#xff08;Session &#xff09; 手机验证码 总结 String 类型内部编码 3 种内部编码方式 int&#xff1a;用来表示 64 位 —…

VUE项目中使用jessibuca实现直播流播放

静态文件引入&#xff1a; 将静态文件存放到public文件夹下 在index.html中引入 具体实现&#xff1a; <template><div class"container" ref"container" style"width:100%;height:200px;"> </div> </template><s…