一个物联网项目中用到了MQTT协议, 能够用来作设备与软件之间的互通.json
MQTT: 即时通信协议, 传输层协议服务器
1.MQTTKit(已经不维护了)session
2.MQTTClientide
a.设置地址端口, 帐号密码等基本信息spa
b.订阅主题(能够订阅多个主题)代理
c.实现代理回调方法(处理数据)code
a.至多一次 (会发生消息丢失或重复)server
b.至少一次 (确保消息到达, 会发生消息重复)blog
c.只有一次 (确保消息到达一次)ip
#import <MQTTClient/MQTTClient.h> #import <MQTTClient/MQTTSessionManager.h>
配置基本信息
- (void)setParameterWithManager { /** host: 服务器地址 port: 服务器端口 tls: 是否使用tls协议,mosca是支持tls的,若是使用了要设置成true keepalive: 心跳时间,单位秒,每隔固定时间发送心跳包, 心跳间隔不得大于120s clean: session是否清除,这个须要注意,若是是false,表明保持登陆,若是客户端离线了再次登陆就能够接收到离线消息 auth: 是否使用登陆验证 user: 用户名 pass: 密码 willTopic: 订阅主题 willMsg: 自定义的离线消息 willQos: 接收离线消息的级别 clientId: 客户端id,须要特别指出的是这个id须要全局惟一,由于服务端是根据这个来区分不一样的客户端的,默认状况下一个id登陆后,假若有另外的链接以这个id登陆,上一个链接会被踢下线, 我使用的设备UUID */ NSString *clientId = [UIDevice currentDevice].identifierForVendor.UUIDString; self.sessionManager = [[MQTTSessionManager alloc] init]; [self.sessionManager connectTo:MQTTHOST port:MQTTPORT tls:false keepalive:60 //心跳间隔不得大于120s clean:true auth:true user:MQTTUSERNAME pass:MQTTPASSWORD will:false willTopic:nil willMsg:nil willQos:0 willRetainFlag:false withClientId:clientId]; self.sessionManager.delegate = self; // 添加监听状态观察者 [self.sessionManager addObserver:self forKeyPath:@"state" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:nil]; // 订阅主题 NSDictionary类型,Object 为 QoS,key 为 Topic self.sessionManager.subscriptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:MQTTQosLevelExactlyOnce] forKey:@"你要订阅的主题(和后台商量好)"]; }
监听链接状态
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { switch (self.sessionManager.state) { case MQTTSessionManagerStateClosed: NSLog(@"链接已经关闭"); break; case MQTTSessionManagerStateClosing: NSLog(@"链接正在关闭"); break; case MQTTSessionManagerStateConnected: NSLog(@"已经链接"); break; case MQTTSessionManagerStateConnecting: NSLog(@"正在链接中"); break; case MQTTSessionManagerStateError: { NSString *errorCode = self.sessionManager.lastErrorCode.localizedDescription; NSLog(@"链接异常 ----- %@",errorCode); } break; case MQTTSessionManagerStateStarting: NSLog(@"开始链接"); break; default: break; } }
处理数据
// 实现MQTTSessionManagerDelegate代理方法,处理数据。 - (void)handleMessage:(NSData *)data onTopic:(NSString *)topic retained:(BOOL)retained { NSLog(@"主题:%@",topic); NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSData * newData = [dataString dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:newData options:NSJSONReadingMutableLeaves error:nil]; NSLog(@"数据:%@",jsonDict); }
最后不要忘记移除观察者, 不然程序会崩溃
[self.sessionManager removeObserver:self forKeyPath:@"state"];