基于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的全文检索接口,使用者只需会 ...
随机推荐
- Unity 热更--AssetBundle学习笔记 1.0【AB包资源加载工具类的实现】
工具类封装 通过上文中对AB包加载API的了解和简单使用,对AB包资源加载的几种方法进行封装,将其写入单例类中,如代码展示. 确保每个AB资源包只加载一次: 在LoadAssetBundleManag ...
- 01.Markdown 语法
标题 # 一级标题 ## 二级标题 ### 三级标题 ...(最多六级标题) 字体 **hello**:粗体 *hello*:斜体 三个*:粗体+斜体 ~~hello~~:删除线 引用 > 引用 ...
- docker-compose搭建的Mysql主从复制
设置前注意下面几点: 1)要保证同步服务期间之间的网络联通.即能相互ping通,能使用对方授权信息连接到对方数据库(防火墙开放3306端口). 2)关闭selinux. 3)同步前,双方数据库中需要同 ...
- 04 elasticsearch学习笔记-Rest风格说明
目录 Rest风格说明 关于文档的基本操作 添加数据PUT 查询 修改文档 删除索引或者文档 Rest风格说明 Rest风格说明 method url地址 描述 PUT localhost:9200/ ...
- leaflet 加载geojson叠加显示
geojson需要先制作shp,然后导入下面网站生成geojson. https://mapshaper.org/ geojson,最好放后台,前台通过异步请求去加载json,然后显示. getGeo ...
- 厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中
一.写在开头 我们在上一篇文章中提到了通过EasyExcel处理Mysql百万数据的导入功能(一键看原文),当时我们经过测试数据的反复测验,100万条放在excel中的数据,4个字段的情况下,导入数据 ...
- Vue cli之使用Vue-CLI初始化创建前端项目
1.生成项目目录 使用vue自动化工具可以快速搭建单页应用项目目录. 该工具为现代化的前端开发工作流提供了开箱即用的构建配置.只需几分钟即可创建并启动一个带热重载.保存时静态检查以及可用于生产环境的构 ...
- CSS——动画
@keyframes 规则 要创建 CSS 动画,您首先需要了解 @keyframes 规则,@keyframes 规则用来定义动画各个阶段的属性值,类似于 flash 动画中的关键帧,语法格式如下: ...
- jQuery——链式操作
链式操作,即连续操作. 例如: <!DOCTYPE html> <html> <head> <script src="https://cdn.boo ...
- 003. git标签
git标签 标签用于记录详细修改内容,为后续使用提供帮助. 也方便快速的回滚. 每一次提交[commit]都可以打一个tag标签. 测试阶段标签规则: 以 0.01 0.02版本为主 正式上线标签规则 ...