由于项目是汽车租赁,需要监控地图上车辆的数量变化。一直数据请求也不能满足。于是便有了这次MQTT使用介绍,实时获取后台推送的更新数据。很简单
1、集成
pod 'MQTTClient'
pod 'MQTTClient/Websocket'
pod 'SocketRocket'
2、简洁代码(测试时因为给服务器地址加了tcp://前缀,造成了NSStreamEventErrorOccurred错误,去掉前缀成功)
MQTTCFSocketTransport *transport = [[MQTTCFSocketTransport alloc] init]; // 初始化对象
transport.host = @"192.168.1.42"; // 设置MQTT服务器的地址
transport.port = 1883; // 设置MQTT服务器的端口(默认是1883,问后台)
self.mySession = [[MQTTSession alloc] init]; // 初始化MQTTSession对象
self.mySession.transport = transport; // 给mySession对象设置基本信息
self.mySession.delegate = self; // 设置代理,
[self.mySession setUserName:@"testuser"];//账号(问后台)
[self.mySession setPassword:@"testpassword"];//密码 (问后台)
// 注意:订阅主题不能放到子线程进行,否则block不会回调
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 会话链接并设置超时时间
[self.mySession connectAndWaitTimeout:0]; // 设定超时时长,如果超时则认为是连接失败,如果设为0则是一直连接。
dispatch_async(dispatch_get_main_queue(), ^{
// 订阅主题, qosLevel是一个枚举值,指的是消息的发布质量(我们后台随便创建了一个名叫abc的主题)
[self.mySession subscribeToTopic:@"abc" atLevel:MQTTQosLevelAtMostOnce subscribeHandler:^(NSError *error, NSArray*gQoss) {
if (error) {
NSLog(@"连接失败 = %@", error.localizedDescription);
}else{
NSLog(@"链接成功 = %@", gQoss);
}
}];
});
});
3、实现代理方法(数据接收的回调)
- (void)newMessage:(MQTTSession *)session data:(NSData*)data onTopic:(NSString*)topic qos:(MQTTQosLevel)qos retained:(BOOL)retained mid:(unsigned int)mid {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"%@",dic);
// 这个是代理回调方法,接收到的数据可以在这里进行处理。
}
网友评论