mqttcclient实现消息推送入门指引
MQTT C Client 实现消息推送(入门指南) MQTT (Message Queuing Telemetry Transport, 消息队列 遥测传输)是 IBM 开发的一个即时通讯协议,通过 MQTT 协议,目前已经扩展出了数十个 MQTT 服务器端程序,可以 通过 PHP,JAVA,Python,C,C#等系统语言来向 MQTT 发 送相关消息。随着移动互联网的发展,MQTT 由于开放源代 码,耗电量小等特点,将会在移动消息推送领域会有更多的 贡献,在物联网领域,传感器与服务器的通信,信息的收集, MQTT 都可以作为考虑的方案之一。 在未来 MQTT 会进入到 我们生活的各各方面。The Paho MQTT C Client is a fully fledged MQTT client written in ANSI standard C. It avoids C++ in order to be as portable as possible. A C++ layer over this library is also available in Paho. 目录: 何为 MQTT 生成 dll 库混合编程 MQTT C Client 实战 Synchronous publication example Asynchronous publication example Asynchronous subscription example 何为 MQTT? MQTT 主要用于服务端对客户端进行消息推送,根据这个具 体要求,很容易知道它包括两个部分:客户端、服务端。 MQTT 消息推送是基于主题 topic 模式的,可以分开来说: 客户端发布一条消息时,必须指定消息主题。 (如,topic=” 天气”,payload=”北京今天雾霾好大啊~~呜呜” ) ,其中 topic 就是主题,payload 是发送的具体内容。 服务端推送消息,也是基于主题的。当服务器发现有主题 (如,topic=“天气” )时,就会给所有订阅该主题的客户端 推送 payload 内容。 这里需要个前提,就是有客户端订阅 topic=”天气”这个主 题; 一旦客户端订阅该主题,服务端就会每收到该主题的消息, 都会推送给订阅该主题的客户端。如果客户端不需要关注该 主题了,也就是说不想接受到这样的推送消息了,只要取消 otpic=”天气”的主题订阅即可。 MQTT 协议是为大量计算能力有限,且工作在低带宽、不可 靠的网络的远程传感器和控制设备通讯而设计的协议,它具 有以下主要的几项特性: 使用发布/订阅消息模式,提供一对多的消息发布,解除应用 程序耦合; 对负载内容屏蔽的消息传输; 使用 TCP/IP 提供网络连接; 有三种消息发布服务质量: “至多一次” ,消息发布完全依赖底层 TCP/IP 网络。会发 生消息丢失或重复。这一级别可用于如下情况,环境传感器 数据,丢失一次读记录无所谓,因为不久后还会有第二次发 送。 “至少一次” ,确保消息到达,但消息重复可能会发生。 “只有一次” ,确保消息到达一次。这一级别可用于如下情 况,在计费系统中,消息重复或丢失会导致不正确的结果。 (在实际编程中, 只需要设置 QoS 值即可实现以上几种不同 消息发布服务质量模式) 小型传输,开销很小(固定长度的头部是 2 字节) ,协议交 换最小化,以降低网络流量; 使用 Last Will 和 Testament 特性通知有关各方客户端异常 中断的机制; 生成 dll 库?混合编程? 在开始开发之前需要做一些准备工作,MQTT 已经把所有的 APIs 封装好了,我们可以使用它的 dll 库,也可以直接导入 源码进行混合编程,一般要求不高的话(因为不太懂得话, 最好不要修改源码) 可以直接将源码生成 dll, 然后使用即可, 下文就是使用该方式: git clone 从这里获得 C Client 源码之后,可以直接使用 VS 打开(我 是 VS2013) : 对于上图的说明,下载源码后,打开将是以上界面,包括十 来个工程,这里讲解几个: paho-mqtt3a : 一般实际开发中就是使用这个,a 表示的是 异步消息推送(asynchronous) 。 paho-mqtt3as : as 表示的是 异步+加密 (asynchronous+OpenSSL) 。 paho-mqtt3c : c 表示的应该是同步(Synchronize) ,一般 性能较差,是发送+等待模式。 paho-mqtt3cs : 同上,增加了一个 OpenSSL 而已。 这里根据自身的需要选择不同的项目生成 DLL 即可, 右击单 个项目-生成。由于你电脑中可能没有 OPenSSL 环境,如果 点击 VS 工具栏中的生成解决方案,十有八九会失败,因为 它会生成所有项目的解决方案,其实你根本用不着这么多。 另外,上图中无法打开包括文件 VersionInfo.h,你只需要在 src 文件夹中找到 VersionInfo.h.in文件,去掉.in 后缀-重新 生成即可。 MQTT C Client 实战 了解更多可以阅读《MQTT C Client for Posix and Windows》 一文,下面根据官网资料,摘录了几个 C 语言实现 MQTT 的小 DEMO。 MQTT 使用起来也十分容易,基本上就那四五个函数: MQTTClient_create(创建客户端) 、MQTTClient_connect(连 接服务端) 、MQTTClient_publishMessage(客户端-服务端 发送消息) 、MQTTClient_subscribe(客户端订阅某个主题) 等等。其中,很多异步回调函数,需要自己去实现,如, MQTTAsync_setCallbacks(mqtt-_client, mqtt-_client, connlost, msgarrvd, NULL);1 MQTTAsync_setCallbacks 中, connlost 函数指针,是当 MQTT 意外断开链接时会回调的函 数,由自己实现; msgarrvd 函数指针,是当服务器有消息推送回来时,客户端 在此处接受服务端消息内容。 另外,就是一些函数执行是否成功的回调函数,C 语言封装 回调之后,就是这么写法,看起来有些变扭。有兴趣的可以 看《浅谈 C/C++回调函数(Callback) mqtt-_conn_opts.onFailure = onConnectFailure;12 最后,不得不说的就是,MQTT 有些发送或者是订阅的内容 时(某些函数中) ,在编程最好将参数中传进来的值在内存 中拷贝一份再操作, 笔者当时开发时, 就是因为这样的问题, 折腾了较长时间, 后来在 wireshark 中发现数据包中根本没有 内容,才知道是由于函数参数是指针形式,直接在异步中使 用可能会发生一些未知的错误。 Synchronous publication example #include “stdio.h“ #include “stdlib.h“ #include “string.h“ #