基于NXP i.MX 6ULL——MQTT通信协议的开发案例

news2025/1/12 3:54:21

前  言

本指导文档适用开发环境:

Windows开发环境:Windows 7 64bit、Windows 10 64bit

Linux开发环境:Ubuntu 18.04.4 64bit

拟机:VMware15.1.0

U-Boot:U-Boot-2020.04

Kernel:Linux-5.4.70

Linux SDK:5.4.70_2.3.0

本文主要介绍NXP i.MX 6ULL处理器基于MQTT通信协议的开发案例,主要包括mqtt_client案例和mqtt_sinewave_pub案例,位于产品资料“4-软件资料\Demo\mqtt-demos\”目录下。

该案例中采用的NXPi.MX 6ULL工业评估板为Tronlong创龙科技TLIMX6U-EVM,它是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板,由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。

评估板接口资源丰富,引出双路网口、双路RS485、双路CAN、三路USB、多路DI/DO、LCD等接口,板载WIFI、Bluetooth模块,支持LoRa、NB-IoT、Zigbee、4G模块,可选配外壳直接应用于工业现场,方便用户快速进行产品方案评估与技术预研。

正面外观图:

表 1

案例目录

说明

mqtt_client

bin

可执行程序

libmosquitto

libmosquitto压缩包

src

程序源码

mqtt_sinewave_pub

bin

可执行程序

libmosquitto

libmosquitto压缩包

src

程序源码

tools

前端Web

1 MQTT通信协议简介

1.1    概述

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。

MQTT是轻量、简单、开放和易于实现的,同时作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

图 1

MQTT具有如下特点:

(1)        轻量可靠:MQTT的报文格式精简、紧凑,可在严重受限的硬件设备和低带宽、高延迟的网络上实现稳定传输。

(2)        发布/订阅模式(Publish/Subscribe):发布/订阅模式的优点在于发布者与订阅者的解耦,实现异步协议。即订阅者与发布者无需建立直接连接,亦无需同时在线。

(3)        为物联网而生:提供心跳机制、遗嘱消息、QoS质量等级 + 离线消息、主题和安全管理等全面的物联网应用特性。

(4)        生态更完善:覆盖范围广,已成为众多云厂商物联网平台的标准通信协议。

1.2    应用场景

MQTT作为一种低开销,低带宽占用的即时通讯协议,可以极少的代码和带宽为联网设备提供实时可靠的消息服务,适用于硬件资源有限的设备及带宽有限的网络环境。常见的应用场景如下:

(1)        物联网M2M通信,物联网大数据采集。

(2)        移动即时消息及消息推送。

(3)        智能硬件、智能家居、智能电器。

(4)        车联网通信,电动车站桩采集。

(5)        智慧城市、远程医疗、远程教育。

(6)        电力能源、石油能源。

1.3    Mosquitto工具安装

Mosquitto是一款开源的MQTT消息代理(服务器)软件,提供轻量级的、支持可发布/可订阅的的消息推送模式。我司提供的评估板文件系统已支持Mosquitto工具,本文mqtt_client案例采用Mosquitto工具演示MQTT通信协议的通信功能。由于上位机Ubuntu系统作为通信对象,因此需在Ubuntu终端执行如下命令安装Mosquitto工具。

Host#    sudo apt-get install mosquitto-clients

图 2

2 mqtt_client案例

2.1      案例说明

案例功能:使用libmosquitto(MQTT version 3.1.1 client library)的API与MQTT代理服务器通信。基于MQTT通信协议,实现发布和订阅消息功能。

程序流程图如下图所示。

图 3

2.2    案例测试

本案例使用公网MQTT HiveMQ服务器与上位机Ubuntu Mosquitto工具通信。请通过网线将评估板网口ETH1 RMII和上位机连接至公网,确保可正常访问互联网。

下表提供了可用的在线公共MQTT服务器,可根据需要自行切换。

表 2

服务器名称

Broker地址

TCP端口

WebSocket

HiveMQ

broker.hivemq.com

1883

8000

Mosquitto

test.mosquitto.org

1883

80

Eclipse

mqtt.eclipseprojects.io

1883

80/443

EMQ X(国内)

broker-cn.emqx.io

1883

8083/8084

评估板启动,将案例bin目录下mqtt_client可执行文件拷贝至评估板文件系统的任意目录下,执行如下命令查看程序参数说明。

Target#        ./mqtt_client --help

图 4

2.2.1            评估板发布/上位机订阅

在上位机执行如下命令,使用mosquitto_sub工具订阅MQTT主题。

Host#    mosquitto_sub -h broker.hivemq.com -p 1883 -t test/data

参数解析:

-h:指定MQTT服务器;

-p:指定MQTT服务器TCP端口;

-t:定义MQTT主题,可自定义命名。

图 5

在评估板文件系统执行如下命令发布消息至MQTT服务器。

Target#        ./mqtt_client -h broker.hivemq.com -p 1883 -M publish -t test/data -m 'www.tronlong.com'

图 6 评估板发布

消息发布成功后,上位机将从MQTT服务器接收到对应的消息。

 

图 7 上位机订阅

2.2.2            评估板订阅/上位机发布

在评估板文件系统执行如下命令订阅MQTT主题。

Target#        ./mqtt_client -h broker.hivemq.com -p 1883 -M subscribe -t test/data

图 8

在上位机执行如下命令发布消息至MQTT服务器。

Host#    mosquitto_pub -h broker.hivemq.com -p 1883 -t test/data -m www.tronlong.com

 

图 9 上位机发布

消息发布成功后,评估板将从MQTT服务器接收到对应消息。

 

图 10 评估板订阅

2.3    案例编译

将案例src文件夹、libmosquitto文件夹下的libmosquitto.tar.gz压缩包拷贝至Ubuntu工作目录下。执行如下命令,将libmosquitto.tar.gz压缩包解压至与src文件夹同一目录下。

Host#    tar -zxf libmosquitto.tar.gz -C .

图 11

执行如下命令,进入src目录使能Linux SDK环境变量并编译。编译完成后,将在当前目录下生成可执行文件。

Host#    cd src/

Host#    source /home/tronlong/SDK/environment-setup-cortexa7t2hf-neon-poky-linux-gnueabi

Host#    make

 

图 12

2.4    关键代码

(1)        创建Mosquitto实例。

图 13

(2)        设置回调函数。

图 14

(3)        连接MQTT服务器。

图 15

(4)        发布消息。

图 16

(5)        订阅主题。

图 17

3 mqtt_sinewave_pub案例

3.1      案例说明

案例功能:使用libmosquitto(MQTT version 3.1.1 client library)的API与MQTT代理服务器通信。评估板生成正弦波数据,每秒发送512个采样点的数据至MQTT服务器;上位机通过Web页面从MQTT服务器接收到数据后,将会绘制波形。

程序流程图如下图所示。

图 18

3.2    案例测试

本案例使用公网MQTT HiveMQ服务器与上位机Ubuntu Web程序通信。请通过网线将评估板网口ETH1 RMII和上位机连接至公网,确保可正常访问互联网。

评估板启动,将案例bin目录下mqtt_sinewave_pub可执行文件拷贝至评估板文件系统的任意目录下,执行如下命令查看程序参数说明。

Target#        ./mqtt_sinewave_pub --help

图 19

执行如下命令运行程序,连接MQTT服务器,并发送正弦波数据至MQTT服务器。

Target#        ./mqtt_sinewave_pub -h broker.hivemq.com -p 1883

图 20

评估板程序运行后,将案例"tools\web_mqtt_sub\"目录下index.html文件,使用上位机浏览器打开。在弹出的Web页面(如下图),依次输入MQTT服务器:broker.hivemq.com,端口号:8000,最后点击连接,Web页面将会从MQTT服务器获取正弦波数据并进行波形绘制。

备注:ARM端MQTT通信协议基于TCP协议,Web端MQTT通信协议基于WebSocket协议,因此使用的端口号不同。

图 21

图 22

3.3    案例编译

将案例src文件夹、libmosquitto文件夹下的libmosquitto.tar.gz压缩包拷贝至Ubuntu工作目录下。执行如下命令,将libmosquitto.tar.gz压缩包解压至与src文件夹同一目录下。

Host#    tar -zxf libmosquitto.tar.gz -C .

图 23

执行如下命令,进入src目录使能Linux SDK环境变量并编译。编译完成后,将在当前目录下生成可执行文件。

Host#    cd src/

Host#    source /home/tronlong/SDK/environment-setup-cortexa7t2hf-neon-poky-linux-gnueabi

Host#    make

图 24

3.4    关键代码

(1)        创建Mosquitto实例。

图 25

(2)        设置回调函数。

图 26

(3)        连接MQTT服务器。

图 27

(4)        发送数据。

图 28

 如果你还想了解更多嵌入式应用的相关知识,欢迎关注Tronlong创龙科技~

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

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

相关文章

深入理解ThreadPoolExecutor线程池工作原理源码解析

文章目录 0. 前言1. 生命周期管理1.1 创建1.2 执行1.2.1 任务执行入口1.2.2 addWorker解析1.2.3 Worker类解析 1.3 关闭1.4 终止阶段 2. 总结 0. 前言 背景:最近技术交流群里有个新同学,面试的时候被问到线程池相关的问题,答的不是很好&#…

LinkedIn领英如何创建公司主页?附领英产品专区创建方法

领英常见问题-如何创建公司主页? 领英不仅可以创建个人主页,还可以以企业的身份创建公司主页。 公司主页就相当于自己的官网,可以发布动态,展示公司信息,做官网外链,对公司来讲也是一种品牌形象宣传&…

PDF转换软件有哪些?分享免费好用的PDF转换工具!

PDF是在办公和学习中常用的文件格式,它包含文字、图片、数据等各种信息,可以说是功能丰富。然而,有时我们需要将PDF转换为PPT格式以便于演示,或者将其转换为Word格式以节省内存空间。这时候就需要使用PDF转换软件。下面我将介绍一…

20230618_ISP-pipeline-hdrplus_contrast

原理: global映射曲线,通过这个曲线控制黑的更黑,白的更白 b:黑电平 s:强度,值越大越接近yx;越小对比度越强 代码: 简单的映射表,没什么好讲的 效果: before&…

【Spring】设计思想

一、Spring 是什么? Spring是一个开源的Java框架,有着活跃而庞大的社区(例如:Apache),Spring 提供了一系列的工具和库,可以帮助开发者构建高效、可靠、易于维护的企业级应用程序。Spring的核心…

jupyter插件nbextensions及Anaconda安装nbextensions

安装nbextensions 以管理员身份运行Anaconda Prompt,依次敲以下命令 用清华源安装 pip install jupyter_contrib_nbextensions -i https://pypi.tuna.tsinghua.edu.cn/simple pip install jupyter_nbextensions_configurator -i https://pypi.tuna.tsinghua.edu.cn…

如何连接 ONLYOFFICE 文档与Confluence Cloud

在本文中,我们来解释如何将ONLYOFFICE文档编辑器连接至Confluence Cloud。 Confluence Cloud 是什么? Confluence Cloud 是一款 Web 端生产力工具,可帮助用户在共享工作区中创建文档与其他内容,同时还可对其进行共享并开展协作。…

vue多次跳转同一页面不触发created刷新数据

摘要: 今天遇到一个问题,就是vue中跳转同一个详情页面的时候,路由没有变化,但是后面的参数有变,需要重新触发created钩子函数来触发方法来刷新数据! 分析: 其实是因为没有触发vue的created或者m…

机器视觉初步9:目标检测专题

文章目录 1.Two-Stage方法1.1 Faster R-CNN1.2 R-FCN 2.One-Stage方法2.1 YOLOv3(你只看一次)2.2 SSD(单次多框检测器) 3.传统滑动窗口方法 机器视觉领域中常见的目标检测方法主要分为以下两类: Two-Stage方法1:在这类方法中&…

ThreadPoolExecutor的addWorker方法

该方法内部有两个for循环。外for循环用于校验线程池的线程个数。内for循环用于添加for循环并启动工作线程。 retry:打上标记位,方便后期内层for循环跳出到外层for循环。int c ctl.get();获取ctl的值。int rs runStateOf©; 获取ctl高三位的值。if (rs > SH…

【2022吴恩达机器学习课程视频翻译笔记】2.2监督学习-part-1

B站上面那个翻译我有点看不懂,打算自己啃英文翻译了(有自己意译的部分),然后懒得做字幕,就丢在博客上面了,2.2之前的章节结合那个机翻字幕能看懂 监督学习 part 1(Supervised learning part 1) Supervise…

MySQL数据库的优化技术三

如何选择mysql的存储引擎 在开发中,我们经常使用的存储引擎 myisam / innodb/ memory存储引擎针对的是表和数据库 事务:MySQL事务主要用于处理操作量大,复杂度高的数据,比如说,在人员管理系统中,你删除一…

ProTable查询表单必填项不生效解决方法

配置完发现不生效,需要在protable组件里再配置一项属性form才能生效 如此才能真正生效

Kafka消息队列核心概念以及部署

文章目录 1.消息队列核心概念1.1.为什么要引入消息队列1.2.消息队列的流派 2.Kafka消息队列基本概念2.1.Kafka消息队列基本概念2.2.Kafka与Zookeeper的关系2.3.Kafka消息队列各组件概念2.4.Kafka消息队列应用场景 3.部署Kafka消息队列3.1.搭建Zookeeper分布式协调服务3.2.部署K…

loss.backward

如何计算:autograd包根据tensor进行过的数学运算来自动计算梯度 注意:1:autograd实现的。2:对tensor进行计算梯度。 之前损失计算:分割损失和边界损失计算正常。 踩坑1:模型有两个损失,分别为分…

FTL没有映射管理,跟上班没有钱有什么区别

大家好,我是五月。 前言 FTL(Flash Translation Layer),即闪存转换层,是各种存储设备的核心算法,作用是将Host传下来的逻辑地址转换成物理地址,也就是映射。 可以说,地址映射是FT…

【五、软件包管理】

1 rpm rpm -qa 查询命令 [rootredis100 ~]# rpm -qa[rootredis100 ~]# rpm -qa |grep firefox firefox-68.10.0-1.el7.centos.x86_64rpm -e 卸载命令 [rootredis100 ~]# rpm -e fixerpm -ivh 安装命令 2 yum [rootredis100 ~]# yum -y install firefox修改网络源 切换目录…

机器学习——概率与统计

参考资料: 《机器学习》周志华https://zhuanlan.zhihu.com/p/27056207 1 马尔可夫链 1.1 定义 直观含义:在已知现在的条件下,过去与未来相互独立。 1.2 马尔可夫模型 根据定义,A 必为方阵 其中, p i j ( n ) P {…

JMeter在高分辨率电脑上,页面显示字体特别小

最近使用JMeter的过程中,发现一个问题,在高分辨率的电脑上,JMeter启动后,页面显示的字体特别小,上图 我电脑的分辨率是2880*1800,缩放200% 上图里显示的字体真心看不清楚 我以为是JMeter的bug&#xff0c…

[React]面向组件编程

1. 定义组件 - 函数式定义&#xff08;简单组件&#xff09;&#xff0c;使用function定义 import React from react; import ReactDOM from react-dom/client;function App() {return (<button onClick{handleClick}>click</button> // 直接把方法handleClick赋…