1 MQTT介绍
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
2 MQTT开源项目
网上有很多mqtt的开源项目,根据实际情况选择适合的源码进行移植修改。我们主要选择C语言实现的客户端代码。
开源项目列举如下:
经过对比分析paho mqtt和wolfmqtt,考虑到对SSL的支持和接口的简便性,这里选用wolfmqtt。
3 WOLFMQTT移植
3.1 MQTT源码树
这里我们先来看一下wolfmqtt的源码目录结构。源码主要分布在3个目录中,wolfmqtt中是主要的头文件,src目录中是核心c代码,examples下面有各种平台的示例代码。
3.1.1 顶层目录
3.1.2 头文件
3.1.3 核心C代码
3.1.4 测试程序
测试程序参考mqttclient.c编写。
3.2 网络接口移植
实现对应平台的网络接口函数,网络接口实现代码位于:mqtt/examples/mqttnet.c,主要实现以下4个网络函数:
3.3 内存接口移植
Mqtt会用到动态内存申请,需要将内存申请函数替换为平台相关的函数。内存接口定义位于:mqtt_types.h 。
#define WOLFMQTT_CUSTOM_MALLOC
#define WOLFMQTT_MALLOC(s) malloc((s))
#define WOLFMQTT_FREE§ free(§)
3.4 调试打印接口:
Mqtt支持自定义的调试打印函数,用宏定义来申明,接口申明位于:mqtt_types.h。
#define WOLFMQTT_CUSTOM_PRINTF
#define PRINTF(f, …) dbg_print( (f “\n”), ##VA_ARGS)
这里将MQTT的PRINTF函数替换为平台的dbg_print函数。
3.5 测试程序
3.5.1 示例代码版本
Linux编译:在wolfmqtt的源码顶层目录运行 automake/configure/make命令编译,编译出的可执行文件位于example目录下对应子目录。
Windows编译:使用vs2015(其他vs版本未测试过)编译example下面对应的工程。
测试程序使用方法参考mqtt_show_usage()函数中提示。
4 MQTT 接口版本
接口描述
Mqtt初始化
连接mqtt服务器
订阅主题
推送主题消息
Mqtt主循环轮询
Mqtt发送ping包,在掉线后应该发起mqtt ping包
取消订阅
断开连接
Mqtt反初始化
Mqtt 额外命令,比如获取版本等功能
5 工具及其他
5.1 mqtt测试后台
网上有很多测试后台程序及开源代码,有需要可以去网上搜索。这里我们调试使用eclipse的后台来做测试。后台配置如下:
5.2 mqtt测试客户端
测试客户端使用mqttfx。