一:pod添加
pod 'MQTTClient'
二:引用
#import <MQTTClient/MQTTClient.h>
#import <MQTTClient/MQTTSessionManager.h>
三:编译报错如下
iOS Use of ‘@import’ when C++ modules are disabled
四:使用
//
// CSMQTTManagement.m
// CStar
//
// Created by imac on 2021/10/11.
//
#import "CSMQTTManagement.h"
#import <CommonCrypto/CommonHMAC.h>
#import <MQTTClient/MQTTClient.h>
#import <MQTTClient/MQTTSessionManager.h>
///实例 ID,购买后从控制台获取
#define AccessKey @"LTAI5t5YMdkqCb7a4n1g3ECc"
#define SecretKey @"QV7xuXZq9TLfLCZ4oqi7ffZUO5B50j"
#define GroupId @"GID_SYSTEM_MSG"
#define Host @"post-cn-tl32bvnd02i.mqtt.aliyuncs.com"
#define Port 1883
#define Qos 1 //1可以读离线消息 0不可以读离线消息
#define Tls 0
#define InstanceId @"post-cn-tl32bvnd02i"
#define RootTopic @"DEV_TOPIC/systemMsg"
@interface CSMQTTManagement ()<MQTTSessionManagerDelegate>
/// MQTT管理类
@property (strong, nonatomic) MQTTSessionManager *manager;
/// 客户端ID
@property (strong, nonatomic) NSString *clientId;
/// 订阅主题
@property (strong, nonatomic) NSString *topic;
@end
@implementation CSMQTTManagement
+ (instancetype)sharedInstance{
static id _imManagement = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_imManagement = [[CSMQTTManagement alloc] init];
});
return _imManagement;
}
- (void)initMQTTConfit{
if([NSString isBlankString:[CSUserDefault cs_getUserInfo].userId]){
PPLog(@"请先登录用户");
return;
}
self.topic = [CSDomainConfigurationModel cs_getMQTTTopic];
//clientId 不能超过64个字符长度
self.clientId = [NSString stringWithFormat:@"%@@@@%@%@",GroupId,[CSUserDefault cs_getUserInfo].userId,[[CSDevice cs_getDeviceID] substringToIndex:10]];
if (!self.manager) {
self.manager = [[MQTTSessionManager alloc] init];
self.manager.delegate = self;
self.manager.subscriptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:Qos]
forKey:[NSString stringWithFormat:@"%@", self.topic]];
//password的计算方式是,使用secretkey对clientId做hmac签名算法,具体实现参考macSignWithText方法
NSString *passWord = [self macSignWithText:self.clientId secretKey:SecretKey];
NSString *userName = [NSString stringWithFormat:@"Signature|%@|%@",AccessKey,InstanceId];;
//此处从配置文件导入的Host即为MQTT的接入点,该接入点获取方式请参考资源申请章节文档,在控制台上申请MQTT实例,每个实例会分配一个接入点域名
[self.manager connectTo:Host
port:Port
tls:Tls
keepalive:60 //心跳间隔不得大于120s
clean:false
auth:true
user:userName
pass:passWord
will:false
willTopic:nil
willMsg:nil
willQos:0
willRetainFlag:FALSE
withClientId:self.clientId
securityPolicy:nil
certificates:nil
protocolLevel:MQTTProtocolVersion311
connectHandler:^(NSError *error) {
PPLog(@"MQTT第一次链接错误:%@",error);
}];
} else {
[self.manager connectToLast:^(NSError *error) {
PPLog(@"MQTT链接错误:%@",error);
}];
}
}
- (void)disConnect{
[self.manager disconnectWithDisconnectHandler:^(NSError *error) {
PPLog(@"MQTT断开链接错误:%@",error);
}];
}
#pragma mark - MQTTSessionManagerDelegate
- (void)handleMessage:(NSData *)data onTopic:(NSString *)topic retained:(BOOL)retained {
NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
PPLog(@"%@", [NSString stringWithFormat:@"RecvMsg from Topic: %@\nBody: %@", topic, dataString]);
}
- (void)sessionManager:(MQTTSessionManager *)sessionManager didChangeState:(MQTTSessionManagerState)newState{
switch (newState) {
case MQTTSessionManagerStateClosed:
PPLog(@"MQTTSessionManagerStateClosed");
break;
case MQTTSessionManagerStateClosing:
PPLog(@"MQTTSessionManagerStateClosing");
break;
case MQTTSessionManagerStateConnected:
PPLog(@"MQTTSessionManagerStateConnected");
break;
case MQTTSessionManagerStateConnecting:
PPLog(@"MQTTSessionManagerStateConnecting");
break;
case MQTTSessionManagerStateError:
PPLog(@"MQTTSessionManagerStateError");
break;
case MQTTSessionManagerStateStarting:
default:
PPLog(@"not connected");
break;
}
}
#pragma mark - 私有方法
- (NSString *)macSignWithText:(NSString *)text secretKey:(NSString *)secretKey{
NSData *saltData = [secretKey dataUsingEncoding:NSUTF8StringEncoding];
NSData *paramData = [text dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData* hash = [NSMutableData dataWithLength:CC_SHA1_DIGEST_LENGTH ];
CCHmac(kCCHmacAlgSHA1, saltData.bytes, saltData.length, paramData.bytes, paramData.length, hash.mutableBytes);
NSString *base64Hash = [hash base64EncodedStringWithOptions:0];
return base64Hash;
}
@end