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)]];
});