基于NXP i.MX 6ULL——MQTT通信协议的开发案例
前 言
本指导文档适用开发环境:
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 mqtt_client案例
2.1 案例说明
案例功能:使用libmosquitto(MQTT version 3.1.1 client library)的API与MQTT代理服务器通信。基于MQTT通信协议,实现发布和订阅消息功能。
程序流程图如下图所示。
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主题,可自定义命名。
在评估板文件系统执行如下命令发布消息至MQTT服务器。
Target# ./mqtt_client -h broker.hivemq.com -p 1883 -M publish -t test/data -m 'www.tronlong.com'
消息发布成功后,上位机将从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协议,因此使用的端口号不同。
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
3.4 关键代码
(1) 创建Mosquitto实例。
图 25
(2) 设置回调函数。
(3) 连接MQTT服务器。
(4) 发送数据。
图 28
基于NXP i.MX 6ULL——MQTT通信协议的开发案例的更多相关文章
- 基于面向对象js的弹窗的组件的开发案例
var aInput = document.getElementsByTagName("input"); 2 aInput[0].onclick = function() { 3 ...
- 高性能嵌入式核心板新标杆!米尔推出基于NXP i.MX8M处理器的MYC-JX8MX核心板
随着嵌入式及物联网技术的飞速发展,高性能计算的嵌入式板卡已经成为智能产品的基础硬件平台.为响应行业应用和满足客户需求,米尔电子推出基于NXP公司i.MX8M系列芯片的开发平台MYD-JX8MX系列开发 ...
- Cortext-A7_i.MX 6ULL——多模式DDR控制器(MMDC)
1.概述 i.MX 6ULL系列芯片的MMDC是一个多模式DDR控制器,支持DDR3/DDR3Lx16和LPDDR2x16的存储类型,MMDC是可配置,高性能,优化的内存控制器. 注:DDR3/DDR ...
- 基于Netty的IdleStateHandler实现Mqtt心跳
基于Netty的IdleStateHandler实现Mqtt心跳 IdleStateHandler解析 最近研究jetlinks编写的基于Netty的mqtt-client(https://githu ...
- 基于.net C# Socket WinForm MQTT 客户端开发
1.什么是MQTT? MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的&quo ...
- MQTT是IBM开发的一个即时通讯协议,构建于TCP/IP协议上,是物联网IoT的订阅协议,借助消息推送功能,可以更好地实现远程控制
最近一直做物联网方面的开发,以下内容关于使用MQTT过程中遇到问题的记录以及需要掌握的机制原理,主要讲解理论. 背景 MQTT是IBM开发的一个即时通讯协议.MQTT构建于TCP/IP协议上,面向M2 ...
- [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)
[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date 周六 10 一月 2015 By 钟谢伟 Category website develop ...
- GPS部标平台的架构设计(三) 基于struts+spring+hibernate+ibatis+quartz+mina框架开发GPS平台
注意,此版本是2014年研发的基于Spring2.5和Struts2的版本,此版本的源码仍然销售,但已不再提供源码升级的服务,因为目前我们开发的主流新版本是2015-2016年近一年推出的基于spri ...
- 【Hades】ades是一个开源库,基于JPA和Spring构建,通过减少开发工作量显著的改进了数据访问层的实现
几乎每个应用系统都需要通过访问数据来完成工作.要想使用领域设计方法,你就需要为实体类定义和构建资源库来实现领域对象的持久化.目前开发人员经常使用JPA来实现持久化库.JPA让持久化变得非常容易,但是仍 ...
- HubbleDotNet 最新绿色版,服务端免安装,基于eaglet 最后V1.2.8.9版本开发,bug修正,支持一键生成同步表
HubbleDotNet 是一个基于.net framework 的开源免费的全文搜索数据库组件.开源协议是 Apache 2.0.HubbleDotNet提供了基于SQL的全文检索接口,使用者只需会 ...
随机推荐
- Solution Set - 数论相关
绝了,六道题都差一步想出来或者差一个细节就开始看题解. CF906D Link&Submission. 要求 \(a^b\bmod p\),那就要求 \(b\bmod \varphi(p)\) ...
- CentOS-7卸载了python2.7,yum不可用的解决方法
1.mount挂载iso镜像 [root@localhost software]# mount -t iso9660 -o loop CentOS-7-x86_64-DVD-2003.iso /med ...
- easyExcel多行表头设定不同样式和特定单元格设定样式的实现
前言 有个需求,需要设置Excel导出的样式,样式如下图所示,有三个表头行,第一个表头行需要加粗和灰色背景,另外两个表头行使用另外的样式,并且当测试结果单元格出现x或者未通过的时候,设置其为红色字体. ...
- 效率工具mysoV0.3.0功能介绍
也许大家在日常工作中,有使用过提升效率的工具,比如快速搜索文件的Everything:火柴:Listary等,这些工具都在一定程度上提升您的工作效率.myso作为后来者,跟上述软件一样,也是为提升 ...
- kubernets之了解Qos等级
一 Qos的种类 BestEffort(优先级最低) Burstable(中等优先级) Guaranteed(最高优先级) 二 Qos的作用 众所周知,节点上面的limits允许超卖,当节点上面的 ...
- Java 创建/识别条形码
项目刚好需要用到就记录一下 -- 依赖 <!-- 条形码生成 --><dependency> <groupId>net.sf.barcode4j</group ...
- npm 安装 sass 引用
1.npm install node-sass --save-dev 2.npm install sass-loader --save-dev npm i less-loader --save-de ...
- 使用 TortoiseGit 时,报 Access denied 错误
当输入正确的密码时,总是报如下错误: 解决方法: 然后弹出如下对话框: 然后编辑本地配置文件: 然后将红色框的SSH配置改为绿色框的 HTTP配置,点击保存,确定. 然后再进行拉取源码,先输入用户名, ...
- Vue Vue-Router params 传参 为空 path定义参数 参数 param is not repeatable
我在Vue-Router4.0.3版本上出现这个问题 因为官方 在2022年8月22日时废除了未定义的传参方式,所以必须使用定义的params. 解决办法: 在配置路由时:path路径上带上传值的ke ...
- CSS——组合选择器
1.后代选择器(包括儿子和孙子) .c1 .c2{ color: red; } 2.子代选择器(只选择儿子) .c3 > .c5{ color: red; } 3.与选择器 选择p标签下面的.c ...