目录
喷淋实验--嵌入式实训
1.MQTT通信原理
2.MQTT库的移植
3.代码流程
运行视频如下:
喷淋实验--嵌入式实训
1.MQTT通信原理
MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,旨在提供可靠、高效的通信机制,适用于各种网络环境和设备。
MQTT通信原理如下:
客户端连接:MQTT协议使用TCP/IP作为传输层协议,客户端通过建立与MQTT代理服务器(也称为Broker)的TCP连接来进行通信。
订阅主题:客户端可以订阅一个或多个主题(Topic),表示对感兴趣的消息进行关注。主题是消息发布者和订阅者之间的桥梁。
发布消息:客户端可以发布消息到指定的主题。消息由两部分组成:主题和有效负载(Payload)。有效负载可以是任何格式的数据,例如文本、二进制等。
代理服务器路由:当有消息发布到某个主题时,MQTT代理服务器将根据订阅关系,将消息路由给所有订阅了该主题的客户端。
消息传输质量:MQTT支持三种消息传输质量:
- 最多一次(At most once):消息发布者发布后,不会进行确认,且不保证消息能够成功传输到订阅者。
- 至少一次(At least once):消息发布者发布后,会收到确认,如果没有收到确认,则会进行重传,保证消息至少被传输一次到订阅者。
- 正好一次(Exactly once):消息发布者发布后,会进行两阶段确认,确保消息只传输一次到订阅者。
保持连接:MQTT协议支持客户端和代理服务器之间的长连接,避免了频繁建立和断开连接的开销。客户端和代理服务器之间可以通过心跳机制保持连接状态。
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通信。
- MQTT库移植的步骤在群文件中下载MQTT源码文件压缩包paho.mqtt.c-1.3.0.tar.gz
- 将源码文件压缩包放到Linux操作系统中
- 使用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协议进行物联网通信的示例程序。根据代码的逻辑,大致可以分为以下几个步骤:
导入必要的头文件,包括"stdio.h"、"mqtt.h"和"unistd.h"。
在主函数中,首先调用
mqtt_init()
函数来初始化MQTT连接。调用
mqtt_subscribe()
函数订阅指定的主题,该主题用于接收元宇宙平台发布的数据。定义一个
float
类型的变量soilHum
,用于存储解析得到的数据。进入一个无限循环,在循环中通过
get_virtual_env()
函数获取虚拟环境的湿度数据,并将其赋值给soilHum
变量。根据湿度数据的不同情况,使用
mqtt_publish()
函数向指定主题发送控制指令,控制喷淋器的状态和警报器的状态。在每次循环中,使用
printf()
函数打印当前湿度数据。最后,调用
exit_mqtt()
函数关闭MQTT连接,并返回0表示程序正常结束。总的来说,这段代码是一个简单的智能灌溉系统的控制程序,通过接收来自元宇宙平台的湿度数据,根据设定的阈值进行判断,并控制喷淋器和警报器的状态
运行结果:
运行视频如下:
喷淋实验--实训