背景
这是AI稳定性建设项目的一个子项,目的是实现对iOS端设备的生命健康检查,技术方案是使用mqtt协议建立并维持iOS端设备与服务器的心跳,服务端对心跳数据建立监测机制。
我参与的主要是iOS端代码的开发,因此该文档主要为在iOS端使用mqtt协议发送心跳的调研和实践。
技术选型
移动端监测与服务器监测最大的不同,应该在于移动端设备所处的网络环境是复杂多变的,而我们的心跳探活目的是确认端设备本身是否正常。
因此在选择端设备与服务端的通信协议时,要求对网络依赖小且在比如弱网环境下依然稳定工作,这样才能避免网络环境不稳定造成的干扰,避免一些误判。
Mqtt (Message Queue Telemetry Transport)协议是一种应用层协议,适用于资源受限例如低带宽、高延迟网络环境下的端到端通信。这种适用性主要是来自于它在包大小的精简以及对push消息场景的一些优化。
因此最终选用的mqtt协议作为心跳探活的通信协议,mqtt的对比介绍还可参见:Choosing Your Messaging Protocol: AMQP, MQTT, or STOMP
方案设计
在mqtt协议中,一个主要的应用场景就是消息订阅及推送即pub/sub。基于pub/sub机制,我们就可以实现端到端的心跳传输:即一个端负责订阅某个topic的消息,另外一个端定时推送消息。
那么在我们这种移动端-服务端的场景中,应该是谁来订阅,谁来推送呢?我们的目的是在服务端建立对移动端的健康监测,而消息推送(pub)是单向的,如果是移动端进行消息sub,服务端进行pub的话,那么移动端必须在收到消息后,再通过某个途径给服务端回一个ack。
如果是移动端进行pub,服务端进行sub,那么仅需要移动端pub->mqtt-broker->服务端sub,即可完成一次完整的心跳探活。因此,我们最终选择使用移动端pub,服务端sub这种方案。
代码实现
mqtt协议有一个官方的实现库mosquitto,使用C语言实现,可参见:GitHub:eclipse/mosquitto,这个库提供了基于mqtt协议的通信建立和维持、消息订阅及推送等功能。已经够我们的场景使用了。
而在iOS端我们主要使用Objective-C(以下简称OC)实现,因此我基于mosquitto库封装出OC层的调用方法,实现在OC层使用mqtt协议进行消息推送。
mosquitto库的api文档可参见:mosquitto-api
主要的代码如下:
|
|