MQTT

该图片来自菜鸟教程-MQTT

简述

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的”轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

设计规范

由于物联网的环境是非常特别的,所以MQTT遵循以下设计原则:

  • 精简,不添加可有可无的功能;
  • 发布/订阅(Pub/Sub)模式,方便消息在传感器之间传递;
  • 允许用户动态创建主题,零运维成本;
  • 把传输量降到最低以提高传输效率;
  • 把低带宽、高延迟、不稳定的网络等因素考虑在内;
  • 支持连续的会话控制;
  • 理解客户端计算能力可能很低;
  • 提供服务质量管理;
  • 假设数据不可知,不强求传输数据的类型与格式,保持灵活性。

服务质量(QOS)

服务质量指的是交通优先级和资源预留控制机制,而不是接收的服务质量。 服务质量是为不同应用程序,用户或数据流提供的不同优先级的能力,或者也可以说是为数据流保证一定的性能水平的能力。

以下是每一个服务质量级别的具体描述

  • 0 最多一次传送 (只负责传送,发送过后就不管数据的传送情况)
  • 1 至少一次传送 (确认数据交付)
  • 2 正好一次传送 (保证数据交付成功)

MQTT-Client-Framework

iOS, macOS, tvOS native ObjectiveC MQTT Client Framework

MQTT-Client-Framework是一个用 Objective-C 实现的 iOS 库。它使用 CFNetwork 进行连网,使用CoreData 进行持久化。它是 MQTT 3.1.1 的完整实现且支持 TLS

封装使用

基于MQTT-Client-Framework封装了一套链式语法调用的 API, 方便易用。点击查看源码

  • Config
SGMQTTManage.shared
.host(@"demo.abc.com")
.port(1883)
.auth(YES)
.user(@"user")
.pass(@"123");
  • Connect
SGMQTTManage.shared
.connect(^(NSError *error) {
    [self showMessage:[NSString stringWithFormat:@"MQTT-连接-%@", !error ? @"成功" : error]];
});
  • Disconnect
SGMQTTManage.shared
.disConnect(^(NSError *error) {
    [self showMessage:[NSString stringWithFormat:@"MQTT-断开-%@", !error ? @"成功" : error]];
});
  • Subscribe
SGMQTTManage.shared
.subscribe([self currentTopic], MQTTQosLevelExactlyOnce, ^(NSError *error, NSArray<NSNumber *> *gQoss) {
    [self showMessage:[NSString stringWithFormat:@"MQTT-订阅-%@", !error ? @"成功" : error]];
}, ^(MQTTSessionManager * _Nonnull sessionManager, NSData * _Nonnull data, NSString * _Nonnull topic, BOOL retained) {
    [self showMessage:[NSString stringWithFormat:@"MQTT-Data-%@; topic-%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding], topic]];
});
  • Unsubscribe
SGMQTTManage.shared
.unsubscribe([self currentTopic], ^(NSError *error) {
    [self showMessage:[NSString stringWithFormat:@"MQTT-取消订阅-%@", !error ? @"成功" : error]];
});
  • PublishData
SGMQTTManage.shared
.publishData(data, [self currentTopic], NO, MQTTQosLevelExactlyOnce, ^(NSError *error) {
    [self showMessage:[NSString stringWithFormat:@"MQTT-发送-%@", !error ? @"成功" : error]];
});
  • State
SGMQTTManage.shared
.addChangeState(@"test", ^(MQTTSessionManager * _Nonnull sessionManager, MQTTSessionManagerState newState) {
    [self showMessage:[NSString stringWithFormat:@"MQTT-state=%@", @(newState)]];
});

参考链接

wikipedia-MQTT

菜鸟教程-MQTT

GitHub-MQTT-Client-Framework

Loading Disqus comments...
Table of Contents