加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

iOS中简单的 MQTT和 WS组合使用

发布时间:2023-04-01 13:50:45 所属栏目:教程 来源:
导读: 历经三天的寻找和尝试,终于完成了一个任务,任务要求的服务器访问用WebSocket的URL格式的,而访问结束后要进行订阅和消息发送,这更多出现在MQTT协议的框架里,例如这个文章

-(void)loginMQTT{
/*设置i
    历经三天的寻找和尝试,终于完成了一个任务,任务要求的服务器访问用WebSocket的URL格式的,而访问结束后要进行订阅和消息发送,这更多出现在MQTT协议的框架里,例如这个文章

-(void)loginMQTT{
    /*设置ip和端口号*/
    
    self.transport.host=_ip;
    self.transport.port=_port;
    
    /*设置MQTT账号和密码*/
    self.mqttSession.transport=self.transport;//给MQTTSession对象设置基本信息
    self.mqttSession.delegate=self;//设置代理
    [self.mqttSession setUserName:_userName];
    [self.mqttSession setPassword:_password];
    //会话链接并设置超时时间
    [self.mqttSession connectAndWaitTimeout:5];
}
该方式的host格式严格是“xxx.xxx.xx.xx”,如果格式错误,会直接访问报错,域名解析错误。报错信息如下:

2021-05-27 09:49:58.630527+0800 Intelligent_fire_protection[28024:9675835] Error Domain=kcfErrorDomainCFNetwork Code=2 "(null)" UserInfo={_kcfStreamErrorDomainKey=12, _kcfStreamErrorCodeKey=8, kCfgetAddrInfoFailureKey=8}
有时也会返回404,报错信息如下

Error Domain=SRWebSocketErrorDomain Code=2132 "received bad response code from server 404" UserInfo={NSLocalizedDescription=received bad response code from server 404, HTTPResponseStatusCode=404}
如果格式包含了path,例如“ws://xxxx/xxxx.xx.xx/mqtt”,需要将    self.transport.host=_ip;和self.transport.port=_port;删去,改成self.transport.url=“ws://xxxx/xxxx.xx.xx/mqtt”。

实现效果我没具体实践,应该不会有问题,起初我没发现这个url属性,host地址又被框架定死没办法和后台统一,访问又一直失败,于是我换了一个网上的demo,在另一个demo里发现了url属性,并完成了我的需求,后来回头查看这个框架的时候,发现也有url属性。爬坑了。

接下来我简单介绍一下我应用的这个框架:

       配置MQTT。 MQTTClient 配置更多 是可持续更新,可配置 SSL

pod 'MQTTClient'
pod 'MQTTClient/MinL'
pod 'MQTTClient/ManagerL'
pod 'MQTTClient/WebsocketL'
       .h文件中添加文件头和MQTTsession变量

#import <MQTTClient.h>
#import <MQTTWebsocketTransport.h>
#define WEAKSELF   __typeof(&*self) __weak weakSelf = self;
@property (nonatomic, strong) MQTTSession *mySession;
     .m文件中添加协议<MQTTSessionDelegate,MQTTSessionManagerDelegate>,定义相应的变量,本文后续代码都在改.m文件中添加

@property(nonatomic,strong)Nsstring *server_ip;
@property(nonatomic,strong)Nsstring *userName;
@property(nonatomic,strong)Nsstring *passWord;
@property(nonatomic,strong)NSArray *topics;
文章中用到了下面的代码,但我在应用时候链接服务器报错了,我便把这部分代码注释掉了,实际上这部分代码只是避免持续等待连接卡死的情况,当连接时间超过某一个时间长度就强制断开申请连接。后文中我另加了一行代码实现这个功能。

        MQTTCFSocketTransport *transport = [[MQTTCFSocketTransport alloc] init];
        transport.host = @"localhost";
        transport.port = 1883;
        MQTTSession *session = [[MQTTSession alloc] init];
        session.transport = transport;
        session.delegate = self;
        [session connectAndWaitTimeout:30];

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章