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

目录

喷淋实验--嵌入式实训

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.mzph.cn/news/546825.shtml

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

相关文章

Yolov5系列AI常见数据集(1)车辆,行人,自动驾驶,人脸,烟雾

下述所有数据可在下方二维码公众号回复&#xff1a; 数据大礼包 获得&#xff01;&#xff01;&#xff01; Fashion-MNIST图像数据集&#xff08;200.4MB&#xff09; 每个训练和测试样本都按照以下类别进行了标注&#xff1a; 标注编号描述0T-shirt/top&#xff08;T恤&…

Java核心(四)你不知道的数据集合

导读&#xff1a;Map竟然不属于Java集合框架的子集&#xff1f;队列也和List一样属于集合的三大子集之一&#xff1f;更有队列的正确使用姿势&#xff0c;一起来看吧&#xff01; Java中的集合通常指的是Collection下的三个集合框架List、Set、Queue和Map集合&#xff0c;Map并…

【Jetson-Nano】2.Tensorflow object API和Pytorch的安装

文章目录 1、Tensorflow多版本安装 1.1 Protobuf 安装1.2 安装依赖包及tensorflow1.151.3 安装其它常用库1.4 测试python包是否安装成功1.5 TensorRT和Opencv的安装1.6 pycuda和onnx安装1.7 Tensorflow2.3安装2、Pytorch安装 2.1 安装pytroch和torchvision2.2 安装环境验证参考…

Java核心(五)深入理解BIO、NIO、AIO

导读&#xff1a;本文你将获取到&#xff1a;同/异步 阻/非阻塞的性能区别&#xff1b;BIO、NIO、AIO 的区别&#xff1b;理解和实现 NIO 操作 Socket 时的多路复用&#xff1b;同时掌握 IO 最底层最核心的操作技巧。 BIO、NIO、AIO 的区别是什么&#xff1f; 同/异步、阻/非阻…

pyqt5让主窗口居中显示(显示在显示器的中间位置)

原文&#xff1a;https://blog.csdn.net/zzx188891020/article/details/105940024 课程重点&#xff1a; 就是让窗口居中显示 # QDesktopWidget import sys from PyQt5.QtWidgets import QDesktopWidget,QMainWindow,QApplication from PyQt5.QtGui import QIconclass Cente…

Basic4android v3.50 发布

这次发布的主要是debug 的增强。说实话&#xff0c;在这一方面B4a 比delphi做的要好。希望delphi 在新的版本里面 能进一步加强。 Im happy to release Basic4android v3.50. This update brings major improvements to the debugging features of Basic4android. With this up…

荔枝派 Nano 全志 F1C100s 编译运行 Linux ubuntu并升级gcc

首先是荔枝派的官方文档&#xff0c;写的不是很细&#xff0c;应当说我们必须明确几点&#xff1a; 出厂时 SPI Flash 自带了一个 U-BootLinux Kernel&#xff08;出厂的时候可能烧过了&#xff09;&#xff0c;可直接拿来用。如果希望自己烧固件&#xff0c;才需要后续步骤必…

Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

反射和动态代理放有一定的相关性&#xff0c;但单纯的说动态代理是由反射机制实现的&#xff0c;其实是不够全面不准确的&#xff0c;动态代理是一种功能行为&#xff0c;而它的实现方法有很多。要怎么理解以上这句话&#xff0c;请看下文。 一、反射 反射机制是 Java 语言提…

C++ STL 四种智能指针

文章目录 0.前言1.unique_ptr2.auto_ptr3.shared_ptr 3.1 简介3.2 通过辅助类模拟实现 shared_ptr4.weak_ptr 4.1 简介4.2 用法4.3 作用5.如何选择智能指针参考文献0.前言 C 标准模板库 STL&#xff08;Standard Template Library&#xff09; 一共给我们提供了四种智能指针&…

快速傅里叶变换应用之二 hdu 4609 3-idiots

快速傅里叶变化有不同的应用场景&#xff0c;hdu4609就比较有意思。题目要求是给n个线段&#xff0c;随机从中选取三个&#xff0c;组成三角形的概率。 初始实在没发现这个怎么和FFT联系起来&#xff0c;后来看了下别人的题解才突然想起来&#xff1a;组合计数问题可以用多项式…

基于sympy的python实现三层BP神经网络算法

#!/usr/bin/python # -*- coding: utf-8 -*- """ 写一个三层的BP神经网络&#xff08;3&#xff0c;2&#xff0c;1&#xff09;,3是输入数据的维度&#xff0c;隐层设置节点数为2&#xff0c;1是因为每个观测的target都是一个标量即只有一个数&#xff1b; 1.随…

JVM(二)Java虚拟机组成详解

导读&#xff1a;详细而深入的总结&#xff0c;是对知识“豁然开朗”之后的“刻骨铭心”&#xff0c;想忘记都难。 Java虚拟机&#xff08;Java Virtual Machine&#xff09;下文简称jvm&#xff0c;上一篇我们对jvm有了大体的认识&#xff0c;进入本文之后我们将具体而详细的…

PyCharm pyqt5 python串口通信封装类SerialCommunication

""" pyqt5串口通信文件SerialCommunication.py """ import binascii import os import serial import serial.tools.list_ports from PyQt5.QtGui import QPixmap# 全局变量&#xff0c;串口是否创建成功标志 Ret False # 串口列表串口号 port_…

Fiddler利用Xposed框架+JustTrustMe抓取手机APP数据

文章目录 1. Xposed安装2. JustTrustMe安装3. 确保Fiddler在模拟器里配置 此文只是针对Fiddler抓取APP数据失败情况下的方案&#xff0c;主要想解决的是安卓手机APP抓包HTTPS报文通过MITM代理后证书不被信任的问题。网上搜索出这是使用了SSL Pinning技术&#xff0c;网上可以搜…

互动直播的视频录制与合成—支持多人离线重入

实现的效果图&#xff1a; 上图合成了2个人视频&#xff0c;中途有1个人先离开之后又重新加入了房间。 一、业务场景 业务场景是这样的&#xff1a;多个用户&#xff08;2-4人&#xff09;直播的视频&#xff0c;合成为一个视频&#xff0c;这期间要满足2个条件&#xff1a;首…

Python界面 PyQT可视化开发(python3+PyQt5+Qt Designer)

前言 以前制作一个Python窗体界面&#xff0c;我都是用GUI窗口视窗设计的模块Tkinter一点一点敲出来的&#xff0c;今天朋友问我有没有Python窗体的设计工具&#xff0c;“用鼠标拖拖”就能完成窗体设计&#xff0c;我查了查相关资料&#xff0c;果然有一款好用的工具——Qt De…

JVM(三)对象的生死判定和算法详解

好的文章是能把各个知识点&#xff0c;通过逻辑关系串连起来&#xff0c;让人豁然开朗的同时又记忆深刻。 导读&#xff1a;对象除了生死之外&#xff0c;还有其他状态吗&#xff1f;对象真正的死亡&#xff0c;难道只经历一次简单的判定&#xff1f;如何在垂死的边缘“拯救”一…

【STM32】修改芯片型号后报 Error 的解决方案

原文&#xff1a;https://blog.csdn.net/xiuhua_wu/article/details/85237418 背景 前几天有个新需求&#xff0c;使用 STM32 的标准库&#xff08;STD&#xff09;做个产品的例程。之前已经做了个 HAL 的&#xff0c;但人家客户不干&#xff0c;非要 STD 的。拖了一周&#xf…

Python手写神经网络实现3层感知机

一、BP神经网络结构模型 BP算法的基本思想是&#xff0c;学习过程由信号的正向传播和误差的反向传播俩个过程组成&#xff0c;输入从输入层输入&#xff0c;经隐层处理以后&#xff0c;传向输出层。如果输出层的实际输出和期望输出不符合&#xff0c;就进入误差的反向传…

JVM(四)垃圾回收的实现算法和执行细节

全文共 1890 个字&#xff0c;读完大约需要 6 分钟。 上一篇我们讲了垃圾标记的一些实现细节和经典算法&#xff0c;而本文将系统的讲解一下垃圾回收的经典算法&#xff0c;和Hotspot虚拟机执行垃圾回收的一些实现细节&#xff0c;比如安全点和安全区域等。 因为各个平台的虚拟…