基于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的全文检索接口,使用者只需会 ...
随机推荐
- USB3.0与Type-C接口的关系
USB全称为Universal Serial Bus,翻译过来就是通用串行总线,是连接计算机与外部设备的一种串口总线标准.USB的发展经历了一下阶段: USB1.0:1.5Mbps(192KB/s)低 ...
- Wordpress小技巧(一)
★★★ Wordpress发表Post文章时,页面会出现评论框,如何禁止出现评论框.步骤如下: 一.使用wordpress的后台功能关闭文章评论依次进入"后台"-"设置 ...
- Arrays类的常用方法
Arrays类的常用方法 Array数组的工具类java.util.Arrays Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而不用使用对象来调用 Ar ...
- Oracle用户创建、赋权、查询及删除操作
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...
- 80x86汇编—分支循环程序设计
文章目录 查表法: 实现16进制数转ASCII码显示 计算AX的绝对值 判断有无实根 地址表形成多分支 从100,99,...,2,1倒序累加 输入一个字符,然后输出它的二进制数 大小写转换 大写转小 ...
- 【.NET项目分享】免费开源的静态博客生成工具EasyBlog,5分钟拥有自己的博客
EasyBlog 说明 本博客系统通过构建工具生成纯静态的博客网站,借助GitHub Pages,你可以在5分钟内免费拥有个人博客. 它具有以下特点 生成纯静态网站,访问速度极快 使用markdown ...
- 通过 Wireshark 解密 Kerberos 票据
前言 在使用 Wireshark 分析 Active Directory 的 Kerberos 的流量时,会遇到加密票据的情况,这对进一步探究 AD 下的漏洞篡改事件的详细过程造成了影响.在查询资料时 ...
- CSS——圆角
例子1: <!DOCTYPE html> <html lang="en"> <head> <style> div { width: ...
- Android 13 - Media框架(6)- NuPlayer
关注公众号免费阅读全文,进入音视频开发技术分享群! 上一节我们通过 NuPlayerDriver 了解了 NuPlayer 的使用方式,这一节我们一起来学习 NuPlayer 的部分实现细节. ps: ...
- uniapp 判断当前是保存还是修改操作
步骤分析: 首先得确定你进入表单后传入了id或者整个对象[这里使用id来进行讲解]其次就是两个请求:POST(保存的) 和 PUT(修改的)最后就是通过传入的id是否存在进行判断即可 POST 请求 ...