MQTT协议在物联网环境中的应用及代码实现解析(一)

news2024/12/22 19:20:08

 

 

MQTT协议全称是Message Queuing Telemetry Transport,翻译过来就是消息队列遥测传输协议,它是物联网常用的应用层协议,运行在TCP/IP中的应用层中,依赖TCP协议,因此它具有非常高的可靠性,同时它是基于TCP协议的<客户端-服务器>模型发布/订阅主题消息的轻量级协议,也是我们常说的发送与接收数据。

一、使用单片机环境实现MQTT协议数据上传

以下是使用STM32F103单片机链接W5500芯片链接到网络上,通过MQTT协议与mqtt.laobai.net的MQTT服务器的"laobai_topic001"主题发送一串文本为"TEST001"的消息的代码示例和详尽的代码注释和编程说明:

#include "stm32f10x.h"
#include "w5500.h"
#include "mqtt.h"

// 定义W5500的IP、端口等详细信息
#define W5500_IP        "192.168.1.100"   // W5500的IP地址
#define W5500_GW        "192.168.1.1"     // 网关的IP地址
#define W5500_SUBNET    "255.255.255.0"   // 子网掩码
#define W5500_DNS       "8.8.8.8"         // DNS服务器的IP地址
#define W5500_MAC       {0x00, 0x08, 0xDC, 0x01, 0x02, 0x03}   // W5500的MAC地址
#define W5500_PORT      5000              // W5500的端口号

// 定义MQTT服务器的详细信息
#define MQTT_SERVER     "mqtt.laobai.net"  // MQTT服务器地址
#define MQTT_PORT       1883               // MQTT服务器端口号

// 定义要发送的消息
#define MQTT_TOPIC      "laobai_topic001"  // MQTT主题
#define MQTT_MESSAGE    "TEST001"          // 要发送的消息

// 初始化W5500芯片
void W5500_Init(void) {
    uint8_t mac[6] = W5500_MAC;
    uint8_t ip[4] = {0};
    uint8_t gw[4] = W5500_GW;
    uint8_t sn[4] = W5500_SUBNET;
    uint8_t dns[4] = W5500_DNS;

    // 初始化W5500芯片
    W5500_InitSPI();     // 初始化SPI接口
    W5500_InitGPIO();    // 初始化GPIO
    W5500_InitPHY();     // 初始化PHY
    W5500_InitCommonReg(mac, ip, gw, sn, dns);   // 初始化W5500的常规寄存器
}

// 连接到MQTT服务器
void MQTT_Connect(void) {
    uint8_t server_ip[4] = {0};
    uint16_t server_port = MQTT_PORT;

    // 解析MQTT服务器的IP地址
    DNS_GetIP(MQTT_SERVER, server_ip);
    
    // 连接到MQTT服务器
    MQTT_ConnectTCP(server_ip, server_port);
    
    // 设置MQTT连接的用户名和密码(如果需要)
    MQTT_SetConnectUsername("username");
    MQTT_SetConnectPassword("password");
    
    // 设置MQTT连接的客户端ID
    MQTT_SetConnectClientID("client1");
    
    // 订阅主题
    MQTT_SubscribeTopic(MQTT_TOPIC);
    
    // 发布消息
    MQTT_PublishMessage(MQTT_TOPIC, MQTT_MESSAGE);
    
    // 断开MQTT连接
    MQTT_Disconnect();
}

int main(void) {
    // 初始化W5500芯片
    W5500_Init();
    
    // 连接到MQTT服务器
    MQTT_Connect();
    
    while(1) {
        // 处理MQTT消息的接收和发送
        MQTT_Process();
    }
}

上述代码中,使用了名为"W5500"的库来操作W5500芯片,"mqtt"库来实现MQTT协议。

首先,在W5500_Init函数中,根据具体的网络设置,初始化了W5500芯片的IP、MAC地址、网关、子网掩码和DNS服务器等参数。

接下来,在MQTT_Connect函数中,通过调用DNS_GetIP函数,将MQTT服务器的域名解析为IP地址,然后调用MQTT_ConnectTCP函数连接到MQTT服务器,并进行相关配置(如用户名、密码和客户端ID)。

然后,调用MQTT_SubscribeTopic函数订阅主题,并调用MQTT_PublishMessage函数发布消息。

最后,在主函数中,先初始化W5500芯片,然后调用MQTT_Connect函数连接到MQTT服务器,并在循环中调用MQTT_Process函数来处理MQTT消息的接收和发送。

请注意,上述代码仅为示例,具体的实现可能需要根据实际情况进行调整和修改。此外,还需要根据具体的硬件平台和开发环境,包括使用的开发板、编译器等进行适配和配置。

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

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

相关文章

macos使用搭建算法竞赛c/c++的g++/gcc编译环境(homebrew,含万能头,改环境变量,vscode/clion可用)

文章目录 1、homebrew安装2、安装g3、改环境变量 1、homebrew安装 我没改镜像&#xff0c;直接网上脚本一键安装的&#xff0c;具体命令忘了&#xff0c;可能是这个 反正装这个的方法很多&#xff0c;网上一搜都有。 成功装上homebrew就行。 /bin/bash -c "$(curl -fsSL…

一款功能强大的子域收集工具OneForAll

简介 借助官方的宣传简介阐述一下&#xff1a; 在渗透测试中信息收集的重要性不言而喻&#xff0c;子域收集是信息收集中必不可少且非常重要的一环&#xff0c;目前网上也开源了许多子域收集的工具&#xff0c;但是总是存在以下部分问题&#xff1a; 不够强大&#xff0c;子域…

基于Cyclone V SoC利用HLS实现卷积手写体数字识别设计

基于Cyclone V SoC利用HLS实现卷积手写体数字识别设计 本文是基于英特尔 Cyclone V SoC 开发板&#xff0c;利用 HLS 技术实现三层卷积两层池化两层全连接推理运算的手写体数字识别设计 硬件环境&#xff1a; Cyclone V SoC开发板 SD卡 电脑 软件环境&#xff1a; Windows 11 Q…

unity3d:YooAsset shader变体收集代码解析

开始收集 YooAsset.Editor.ShaderVariantCollector.Run 创建临时场景 // 创建临时测试场景CreateTempScene();_steps ESteps.Prepare;EditorApplication.update EditorUpdate;准备阶段 反射调用ShaderUtil.ClearCurrentShaderVariantCollection清空当前项目搜集到的变体&…

第52步 深度学习图像识别:Transformer in Transformer建模(Pytorch)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;Transformer in Transformer Transformer in Transformer&#xff08;TNT&#xff09;模型是一种新的图像分类模型&#xff0c;由研究者在2021年提出。这种模型的特点是在传统的Vision Transformer模型的基础…

FreeRTOS源码分析-1创建任务

目录 1 任务的句柄&#xff08;结构体&#xff09; 2 创建任务主要工作 2.1 创建任务初始化源码分析 2.2 任务添加到就绪列表源码分析 2.3任务堆栈的初始化源码分析 问&#xff1a;R0为什么要入栈保存&#xff1f;因为作为函数的第一个传入参数&#xff0c;必须也要保存。…

spring复习:(37)ProxyFactoryBean之getObject

该工厂bean的getObject代码如下&#xff1a; public Object getObject() throws BeansException {initializeAdvisorChain();if (isSingleton()) {return getSingletonInstance();}else {if (this.targetName null) {logger.info("Using non-singleton proxies with sing…

4.CSS图文样式

考点&#xff1a;line-height为200%时&#xff0c;font-size为40px

第十五章:DenseASPP for Semantic Segmentation in Street Scenes——在街景语义分割中的DenseASPP

0.摘要 语义图像分割是自动驾驶中的基本街景理解任务&#xff0c;在这个任务中&#xff0c;高分辨率图像中的每个像素被归类为一组语义标签。与其他场景不同&#xff0c;自动驾驶场景中的物体呈现出非常大的尺度变化&#xff0c;这给高级特征表示带来了巨大挑战&#xff0c;因为…

IDEA设置显示行号和方法间的分隔符

IDEA设置显示行号和方法间的分隔符 选择File--Settings--Edotor-General-Apperance&#xff0c;勾选上下图中的选项后点击 OK 即可。 每个函数不迷路~~ Show line numbers&#xff1a;显示行数 Show method separators&#xff1a; 显示方法分隔线。

央视赋能,强势出击——方圆出海与《品牌中国》栏目达成战略合作

2023 央视赋能&#xff0c;强势出击 方圆出海 “日前&#xff0c;深圳市方圆出海科技有限公司与《品牌中国》栏目携手&#xff0c;双方正式达成战略合作协议&#xff0c;央视《品牌中国》栏目负责人正式授予方圆出海“《品牌中国》重点推荐品牌”的荣誉称号。 此次签约标志着…

js的this绑定规则以及箭头函数

目录 调用位置默认绑定隐式绑定隐式丢失 显式绑定callapplybind new绑定装箱绑定优先级this规则之外忽略显式绑定间接函数引用 箭头函数 调用位置 从字面意思上来理解&#xff0c;this似乎是指向自己的 然而在JavaScript中&#xff0c;this并不是绑定到自身的 可以看这一个例子…

蓝牙HID模式下输出中文原理简介

目录 前言一、蓝牙和HID简介二、Unicode编码简介三、Windows下alt键code编码输出中文四、蓝牙HID模式下实现在手机上输入中文的原理 前言 最近在使用蓝牙模组&#xff0c;对于蓝牙模组如何输出中文的原理不太清楚&#xff0c;所以找了一些资料简单学习了下&#xff0c;总结如下…

目标检测——FasterRCNN原理与实现

目录 网络工作流程数据加载模型加载模型预测过程RPN获取候选区域FastRCNN进行目标检测 模型结构详解backboneRPN网络anchorsRPN分类RPN回归Proposal层 ROIPooling目标分类与回归 FasterRCNN的训练RPN网络的训练正负样本标记RPN网络的损失函数训练过程实现正负样本设置损失函数 …

Kubernetes 使用 helm 部署 NFS Provisioner

文章目录 1. 介绍2. 预备条件3. 部署 nfs4. 部署 NFS subdir external provisioner4.1 集群配置 containerd 代理4.2 配置代理堡垒机通过 kubeconfig 部署 1. 介绍 NFS subdir external provisioner 使用现有且已配置的NFS 服务器来支持通过持久卷声明动态配置 Kubernetes 持久…

大模型基础知识汇总

本文总结大模型相关基础知识&#xff0c;用于大模型学习入门 &#xff08;持续更新中…&#xff09; 文章目录 NLP 基础知识传统 NLP 知识NLU 与 NLG 各种任务的差异 Transformer 相关知识Pre Norm与Post Norm的区别&#xff1f;Bert 预训练过程手写 transformer 的 attention …

从0到1:跑团小程序开发心得笔记

背景介绍 随着健康意识的兴起&#xff0c;越来越多的人选择加入跑步俱乐部&#xff0c;不仅体验到了运动的乐趣&#xff0c;也感受到了人生的不同色&#xff0c;那么通过小程序&#xff0c;把俱乐部搬到手机上&#xff0c;通过小程序了解俱乐部动态和运动常识&#xff0c;可以…

C++自定义信号和QML的槽函数建立连接

0x00 在C代码在定义一个信号函数&#xff1a;“void sendData2UI(QString msg);”&#xff0c;该函数主要是将接收到的UDP消息发送到QML界面中 #ifndef UDPCLI_H #define UDPCLI_H#include <QObject> #include <QUdpSocket> #include <QString>class UdpCli …

【Netty】NIO基础(三大组件)

文章目录 三大组件Channel & BufferSelector ByteBufferByteBuffer 正确使用姿势ByteBuffer 内部结构ByteBuffer 常见方法分配空间向 buffer 写入数据从 buffer 读取数据mark 和 reset 字符串与 ByteBuffer 互转Scattering ReadsGathering Writes粘包、半包分析 附&#xf…

《啊哈算法》第一章--排序

文章目录 前言一、排序算法二、桶排序三、冒泡排序三、快速排序总结 前言 今年蓝桥杯没有拿到省一&#xff0c;所以就决定沉下心来学习算法&#xff0c;为了使得算法的学习更加稳固&#xff0c;所以就拿起了&#xff0c;最基础的且最经典的一本算法书《啊哈算法》&#xff0c;…