iOS开发--MQTT实时处理数据

一. MQTT

一个物联网项目中用到了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"];
相关文章
相关标签/搜索