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

目录

喷淋实验--嵌入式实训

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表示程序正常结束。

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

运行结果:

运行视频如下:

喷淋实验--实训

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机视觉基础(12)——图像恢复

前言 我们将学习图像恢复相关知识。主要有图像恢复的定义、评价标准和实现图像恢复的方法。图像恢复任务包括图像去噪、去模糊、图像超分辨率、图像修复等&#xff1b;评价标准有峰值信噪比和结构相似性&#xff1b;图像超分辨的方法有传统方法和基于深度学习的方法&#xff1a…

three.js使用精灵模型Sprite渲染森林

效果&#xff1a; 源码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right&quo…

Elasticsearch基本使用

文章目录 概要一、核心概念二、索引操作2.1 创建索引2.2 判断索引是否存在2.3 查看索引2.4 打开、关闭索引2.5 删除索引 三、映射操作3.1 创建映射字段3.2 映射属性详解3.3 查看映射关系 四、文档增删改查4.1 新增文档4.2 查看单个文档4.3 查看所有文档4.4 _source定制返回字段…

Linux进阶系列(二)——lscpu、htop、seq、shuf、sort

1. lscpu lscpu 命令是Linux系统中用来显示关于CPU架构的信息的工具。它详细展示了CPU的相关信息&#xff0c;包括型号、核心数、架构类型、缓存大小等等。 1.1 物理CPU与逻辑CPU 物理CPU指的是实际存在于硬件系统上的中央处理单元。每个物理CPU都是一个独立的处理器芯片或处…

【LeetCode刷题笔记】动态规划(二)

647. 回文子串 解题思路: 1. 暴力穷举 , i 遍历 [0, N) , j 遍历 [i+1, N] ,判断每一个子串 s[i, j) 是否是回文串,判断是否是回文串可以采用 对撞指针 的方法。如果是回文串就计数 +1

C# 类型和成员

C# 教程 - 类型及其成员 - C# | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/types 目录 类和对象 类型参数 基类 结构 接口 枚举 可为 null 的类型 元组 作为面向对象的语言&#xff0c;C# 支持封装、继承和多态性这些概念。 类可…

算法——链表

链表常用技巧 画图分析&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;——直观形象&#xff0c;便于理解、大多数都是模拟引入虚拟头结点&#xff08;哨兵位&#xff09; 典型的就是在第一个节点…

Redis设计与实现之服务器与客户端

目录 一、服务器与客户端 1、初始化服务器 1. 初始化服务器全局状态 2. 载入配置文件 3. 创建 daemon 进程 4. 初始化服务器功能模块 5. 载入数据 6. 开始事件循环 2、 客户端连接到服务器 3、命令的请求、处理和结果返回 4、命令请求实例:SET 的执行过程 5、Redis服…

【浏览器】同源策略和跨域

1. 什么是跨域 在说跨域之前,先说说同源策略,什么是同源策略呢?同源策略是浏览器的一种安全机制,减少跨站点脚本攻击(XSS,Cross Site Scripting)、跨站点请求伪造(CSRF,Cross Site Request Forgery)攻击等,因为非同源的请求会被浏览器拦截掉。 同源就是协议、域名(…

电路设计(7)——窗口比较器的multism仿真

1.功能设计 构建一个窗口比较器的电路&#xff0c;在输入电压大于3.5v&#xff0c;小于0.8v时&#xff0c;蜂鸣器报警&#xff0c;输入电压在0.8v到3.5v之间时&#xff0c;不报警。 整体电路如下&#xff1a; 2.设计思路 在输入端&#xff0c;采取电阻分压的方式&#xff0c;输…

ChatGPT/GPT4+AI绘图+论文写作+编程结合到底有多强大?带你详细了解

ChatGPT在论文写作与编程方面具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&#xff0c;提高编程效率和准确性。此外&#xff0c;ChatGPT是一位出色的合作伙伴&#xff0c;可以为您提供论文写作的支持…

Jenkins自动化部署之后端

准备工作参考本人另外几篇Jenkins相关的文章 新建任务 添加参数配置 字符串参数&#xff1a;分支名称 多选框&#xff1a;项目名称&#xff08;Extended Choice Parameter插件必备&#xff0c;插件安装参考我另外的文章&#xff09; 这个分割规则自定义。只要根据Jenkins…

【Java】MybatisPlus

MybatisPlus MybatisPlus是在mybatis基础上的一个增强型工具。它对mybatis的一些操作进行了简化&#xff0c;能够提高开发的效率。 springboot整合了mybatis之后&#xff0c;其实已经非常方便了&#xff0c;只需要导入mybatis的包后&#xff0c;在配置文件中编写数据源信息&a…

MySQL的替换函数及补全函数的使用

前提&#xff1a; mysql的版本是8.0以下的。不支持树形结构递归查询的。但是&#xff0c;又想实现树形结构的一种思路 提示&#xff1a;如果使用的是MySQL8.0及其以上的&#xff0c;想要实现树形结构&#xff0c;请参考&#xff1a;MySQL数据库中&#xff0c;如何实现递归查询…

渗透测试——1.2被动扫描

一、概念 目标无法觉察的情况下进行的信息收集。公开渠道可获得的信息&#xff0c;与目标系统不产生直接交互&#xff0c;尽量避免留下一切痕迹。 二、CDN&#xff08;content delivery netword内容分发网路&#xff09; 多台边缘服务器提供网络服务&#xff0c; 三、WAF&am…

CRS-4995: The command ‘start resource’ is invalid in crsctl.

ntp时间调整后&#xff0c;节点1&#xff0c;advm 和acfs offline 处理办法&#xff1a; /u01/app/12.2.0.1/grid/bin/crsctl stop crs /u01/app/12.2.0.1/grid/bin/crsctl start crs 曾经尝试如下命令不起作用 /u01/app/12.2.0.1/grid/bin/acfsload start /u01/app/12.2…

Quartz持久化(springboot整合mybatis版本实现调度任务持久化)--提供源码下载

1、Quartz持久化功能概述 1、实现使用quartz提供的默认11张持久化表存储quartz相关信息。 2、实现定时任务的编辑、启动、关闭、删除。 3、实现自定义持久化表存储quartz定时任务信息。 4、本案例使用springboot整合mybatis框架和MySQL数据库实现持久化 5、提供源码下载 …

Tofu5m目标识别跟踪模块 跟踪模块

Tofu5m 是高性价比目标识别跟踪模块&#xff0c;支持可见光视频或红外网络视频的输入&#xff0c;支持视频下的多类型物体检测、识别、跟踪等功能。 产品支持视频编码、设备管理、目标检测、深度学习识别、跟踪等功能&#xff0c;提供多机版与触控版管理软件&#xff0c;为二次…

cuda加速求解龙格库塔四阶五步积分

一般代码使用cuda加速的方法&#xff1a; 使用PyTorch进行加速&#xff1a; 首先&#xff0c;你需要将你的ODE系统定义为PyTorch模型&#xff0c;这样可以利用PyTorch的自动微分功能和GPU加速。然后&#xff0c;你需要将数据和参数转换为PyTorch张量&#xff0c;并将它们移动到…

Java之AQS(AbstractQueuedSynchronizer)

Java之AQS&#xff08;AbstractQueuedSynchronizer&#xff09; AQS 介绍 AQS 的全称为 AbstractQueuedSynchronizer &#xff0c;翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。 ● 是用来实现锁或者其他同步器组件的公共基础部分的抽象实…