iOS MQTT 应用 使用MQTTClient

2022-03-27  本文已影响0人  小锤子_

直接上代码,最好写一个单例中去实现

需要特别注意的是 transport.host 后边的地址IP,前面不要加http://因为MQTTClient 这个封装已经为我们加好了。

还有需要考虑的断网,切换网络 ,连接断开情况,自己加一个网络监控。

还有进入后台连接断开,热启动,冷启动 的时候是否需要重新连接需要考虑

设置代理
@interface MqttManager()<MQTTSessionDelegate>



-(void)creatSession
{
        self.mqttSession = [[MQTTSession alloc] init];
        MQTTCFSocketTransport *transport = [[MQTTCFSocketTransport alloc] init];
        transport.host = @"IP地址";
        transport.port = 端口;
        self.mqttSession.transport = transport;
        // 设置代理 回调信息
        self.mqttSession.delegate = self;
 
 
    // 设置签名, 签名唯一性 //MQTT_NAME 为自己配制的字符串
    NSString *deid = [self getDeviceUUID];
    self.mqttSession.clientId = deid;
    // 设置用户名称
    self.mqttSession.userName = @"mqtts";
    // 设置用户密码
    self.mqttSession.password = @"mqtts";
    // 设置会话链接超时时间
    
    dispatch_queue_t quene = dispatch_queue_create("net1", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(quene
                   , ^{
        // 主线程会发生阻塞
        [ self.mqttSession connectAndWaitTimeout:3];

    });
    
}

// 连接状态
- (void)handleEvent:(MQTTSession *)session event:(MQTTSessionEvent)eventCode error:(NSError *)error {

switch (eventCode) {
        case MQTTSessionEventConnected:
            
            NSLog(@"连接成功");
        
            break;
        case MQTTSessionEventConnectionRefused:
            
            NSLog(@"连接被拒绝");
            self.isConnect = NO;
            break;
        case MQTTSessionEventConnectionClosed:
            
            NSLog(@"连接关闭");
         
            
            break;
        case MQTTSessionEventConnectionError:
            
            NSLog(@"连接错误");
         
            break;
        case MQTTSessionEventProtocolError:
            
            NSLog(@"协议不被接受/协议错误");
        
            break;
        case MQTTSessionEventConnectionClosedByBroker:
            
            NSLog(@"其余错误");
        
            break;
            
        default:
            break;
    }
    


}

连接成功之后订阅

- (void)connected:(MQTTSession *)session {
    
    // MQTT连接成功,进行订阅主题 设置主题 服务质量
 
    [session subscribeToTopic:@"订阅"atLevel:MQTTQosLevelAtMostOnce];
    

}

收到消息

- (void)newMessage:(MQTTSession *)session data:(NSData *)data onTopic:(NSString *)topic qos:(MQTTQosLevel)qos retained:(BOOL)retained mid:(unsigned int)mid {
    

    NSString *result =[[ NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
      // 进行下一步操作
    
 
    // 不一定是字符串
     NSLog(@"收到的消息:%@",result);
    

}

发消息

-(void)sendMsg
{
    NSString *str =@"hello---world";
    NSData *data =[str dataUsingEncoding:NSUTF8StringEncoding];
    [self.mqttSession publishData:data onTopic:@"mobtopic" retain:NO qos:MQTTQosLevelAtMostOnce publishHandler:^(NSError *error) {
           
           if (error) {

               // 发送失败则 重新登录 mqtt 进行重发
            //   [self getMQTTServerAnew];
               
           }else {
               //主题发送成功
               NSLog(@"主题 %@ 发送成功", @"所订阅的主题mobtopic");
           }
           
       }];
    
}
上一篇 下一篇

猜你喜欢

热点阅读