直接上代码,最好写一个单例中去实现
需要特别注意的是 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");
}
}];
}
网友评论