W5100S_EVB_PICO快速入门之MQTT篇(十二)

2023-10-09 08:20

本文主要是介绍W5100S_EVB_PICO快速入门之MQTT篇(十二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1. 前言       

2. MQTT介绍

2.1 什么是mqtt?

2.2 特点

2.3 应用场景

2.4 MQTT协议实现方式

2.5 遗嘱消息

3. 硬件介绍及接线方式

3.1 硬件准备

3.2 硬件介绍

3.3 接线图

4. 测试

4.1 MQTT测试流程图

4.2 相关代码

4.3 测试现象

5. 相关链接: 


1. 前言       

        随着物联网技术的快速发展,MQTT(Message Queuing Telemetry Transport)协议已成为一种广泛使用的通讯协议,它适用于设备间低带宽、高延迟、不可靠的网络通信。W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。在以太网应用中使用 W5500 + MQTT应用协议让用户可以更加方便地在设备之间实现远程连接和通信。本教程将介绍W5500以太网MQTT应用的基本原理、使用步骤、应用实例以及注意事项,帮助读者更好地掌握这一技术。

2. MQTT介绍

2.1 什么是mqtt?

        MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上。MQTT最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

2.2 特点

  1. 轻量级:MQTT协议非常轻量,它的开销很小,适用于低带宽、低功耗设备和网络。
  2. 发布/订阅模式:MQTT采用发布/订阅模式,客户端可以订阅一个或多个主题(Topic),并且可以在不知道其他客户端的情况下发布消息到主题。
  3. QoS支持:MQTT支持三种服务质量(QoS)等级,可以在发布和订阅时指定。 这些等级为0、1、2,提供不同的消息传递保证。
  4. 遗嘱机制:MQTT支持遗嘱(Will)机制,当客户端异常断开连接时,可以通过遗嘱机制通知其他客户端。
  5. 保留消息:MQTT支持保留消息(Retained Message),允许客户端发布一个保留的消息到主题,而后连接到该主题的新订阅者可以立即接收到该消息。
  6. 连接控制:MQTT支持连接控制机制,允许客户端在连接时指定自己的客户端ID、用户名和密码。
  7. 安全性:MQTT支持TLS/SSL加密通信协议,以确保数据的安全传输。
  8. 基于 TCP/IP 网络连接

2.3 应用场景

  1. 科学研究:在科学研究中,需要对实验数据进行采集和传输,使用MQTT协议可以有效地解决数据传输过程中的丢包问题,保证数据传输的稳定性和完整性。
  2. 金融行业:在金融行业中,需要对交易信息进行实时监控和传输,使用MQTT协议可以实现实时监控和传输,并保证数据的稳定性和安全性。
  3. 医疗行业:在医疗行业中,需要对患者的生命体征进行采集和传输,使用MQTT协议可以有效地解决数据传输过程中的丢包问题,保证数据传输的稳定性和完整性。
  4. 能源行业:在能源行业中,需要对能源设备进行监控和控制,MQTT协议正是满足这一需求而设计的,它具有简单、可靠、灵活等特点,在能源领域中得到了广泛应用。

2.4 MQTT协议实现方式

        实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、服务器、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:

(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);

(2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

2.5 遗嘱消息

        客户端的遗嘱只在意外断线时才会发布,如果客户端正常的断开了与服务端的连接,这个遗嘱机制是不会启动的,服务端也不会将客户端的遗嘱公布。

        遗嘱消息可以看作是一个简化版的 PUBLISH 消息,他也包含 Topic, Payload, QoS 等字段。遗嘱消息会在设备与服务端连接时,通过 CONNECT 报文指定,然后在设备意外断线时由服务端将该遗嘱消息发布到连接时指定的遗嘱主题(Will Topic)上。

        一般建议设置遗嘱消息内容为client offline!在我们的客户端连接上服务器时,也向遗嘱主题发布一条client online消息。

3. 硬件介绍及接线方式

3.1 硬件准备

  1. W5100S-EVB-Pico开发板
  2. USB数据线、网线
  3. 路由器
  4. pc

3.2 硬件介绍

        W5100S-EVB-Pico是基于树莓派RP2040和全硬件TCP/IP协议栈控制器W5100S的微控制器开发板-基本上与树莓派Pico板相同,但通过W5100S芯片增加了以太网功能。

        W5100S采用WIZnet技术的硬件TCP / IP设计的一款嵌入式以太网控制器。在使用 W5100S时MCU 可以方便的处理 IPv4,TCP,UDP,ICMP,IGMP,ARP,PPPoE等TCP/IP 协议。W5100S 分别有 8KB 的发送缓存和接收缓存,可以减少MCU 的开销。 主机可以同时使用 W5100S 的 4 个独立的硬件SOCKETs,并基于每个硬件SOCKET 开发独立的互联网应用。

3.3 接线图

4. 测试

4.1 MQTT测试流程图

4.2 相关代码

        我们打开例程中库文件的mqttx_client.c文件用到几个函数和定义:

        1.首先我们是对收发缓存大小和收发缓存数组进行定义

        2.然后创建一个 MQTTCONNECTION结构体,里面的参数有mqttHostUrl服务器网址,port端口号,clientid客户端id,username用户名,password密码,server_ip服务器ip,pubtopic发布主题,subtopic1订阅主题,QOS发布服务质量等级。

        3.接下就是定义了一个mqtt_params结构体,将结构体的参数填写进去,其中mqttHostUrl服务器网址和server_ip服务器ip填写其中一个就可以,端口固定为1883,clientid客户端id,clientid客户端id不能与同一个服务器下的clientid客户端id重名,username用户名,password密码可以任意填,也可以选择不填,订阅和发布根据自己来定,保证与另一端客户端进行通信并且不受到别人干扰。服务质量等级也是根据自己的需求来定,这里定义的是0,消息最多传送一次。如果当前客户端不可用,它将丢失这条消息

#define SOCKET_ID 0
#define ETHERNET_BUF_MAX_SIZE (1024 * 2)#define MQTT_SEND_BUFF_SIZE 2048
#define MQTT_RECV_BUFF_SIZE 2048
uint8_t mqtt_send_buff[MQTT_SEND_BUFF_SIZE] = {0};
uint8_t mqtt_recv_buff[MQTT_RECV_BUFF_SIZE] = {0};
typedef struct MQTTCONNECTION
{char mqttHostUrl[1024];int port;char clientid[1024];char username[1024];char passwd[1024];uint8_t server_ip[4];char pubtopic[255];char subtopic1[255];int QOS;
} mqttconn;
mqttconn mqtt_params = {.server_ip = {54,244,173,190},.port = 1883,.clientid = "9a1d7719a8ac40d29311f26c5c5469dc",.username = "mqtt_username",.passwd = "123456",.pubtopic = "1234",.subtopic1 = "2345",.QOS = 0,
};

        1.定义一个net_info的结构体对静态网络参数进行配置,mac地址不能与已经存在的mac地址有重复,首位不能为偶数,ip地址的设置如果连接路由器这必须与路由器在同一网段,并且不能与路由器已经存在的ip有冲突,下来是sn子网掩码(常用的是255.255.255.0)和gw网关(路由器ip)dns域名解析服务器,然后dhcp设为静态获取网络

void network_init(void);
wiz_NetInfo net_info = {.mac = {0x00, 0x08, 0xdc, 0x16, 0xed, 0x2e},.ip = {192, 168, 124, 10},.sn = {255, 255, 255, 0},.gw = {192, 168, 124, 1},.dns = {8, 8, 8, 8},.dhcp = NETINFO_STATIC};
MQTTClient c = {0};  

        1.NewNetwork是网络设置函数,需传入的参数是网络配置的结构体指针和socket号

        2.ConnectNetwork是连接网络函数,需传入的参数是socket号、服务器ip、端口号

        3.MQTTClientInit是客户端初始化函数,需传入mqtt连接配置的结构体指针和网络配置的结构体指针、命令超时时间/ms、发送缓存和发送缓存大小、接收缓存和接收缓存大小。

        4.将得到的数据存入到结构体 MQTTPacket_connectData中   

void mqtt_init(void)
{NewNetwork(&n, 1);                                                /*Obtain network configuration information*/ConnectNetwork(&n, mqtt_params.server_ip, 1883);                  /*Connect to the MQTT server*/MQTTClientInit(&c, &n, 1000, mqtt_send_buff, MQTT_SEND_BUFF_SIZE, mqtt_recv_buff, MQTT_RECV_BUFF_SIZE);data.willFlag = 0;data.MQTTVersion = 4;data.clientID.cstring = mqtt_params.clientid;data.username.cstring = mqtt_params.username;data.password.cstring = mqtt_params.passwd;data.keepAliveInterval = 30;data.cleansession = 1;sleep_ms(300);}

          烧录完程序后打开MQTTX工具信息配置好mqtt的信息。

        订阅主题和发布主题,以及遗嘱主题。

4.3 测试现象

        我们可以看到串口打印信息中打印了网络连接上且配置好网络信息,最后连接上了mqttx上的mqtt公共服务器。

         用mqttx切换到发布消息,将信息发送给W5100S_EVB_PICO。

        最后可以看到串口打印了mqttx下发的消息,表示发布成功。

5. 相关链接: 

       

  


本章例程链接icon-default.png?t=N7T8http://examples/mqtt_client%20%C2%B7%20WIZnet%20HK/W5100S-EVB-PICO%E4%BE%8B%E7%A8%8B%20-%20%E7%A0%81%E4%BA%91%20-%20%E5%BC%80%E6%BA%90%E4%B8%AD%E5%9B%BD%20(gitee.com)

MQTT V3.1.1官方文档链接icon-default.png?t=N7T8http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.pdf
开发板资料链接icon-default.png?t=N7T8http://docs.wiznet.io/Product/iEthernet/W5100S/w5100s-evb-pico

WIZNET官方库连接icon-default.png?t=N7T8https://github.com/Wiznet/ioLibrary_Driver/tree/ce4a7b6d07541bf0ba9f91e369276b38faa619bd

这篇关于W5100S_EVB_PICO快速入门之MQTT篇(十二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/171547

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显