iOS 使用MQTT接收消息

一: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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个用于创建独立的、基于Spring框架的Java应用程序的框架。它简化了Spring应用程序的开发过程,并提供了一种快速构建可部署的应用程序的方式。 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它适用于物联网设备和应用程序之间的通信。Spring Boot提供了对MQTT的支持,可以方便地使用MQTT发送消息。 要在Spring Boot中使用MQTT发送消息,首先需要添加相关的依赖。在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> </dependency> ``` 接下来,需要配置MQTT连接信息。在`application.properties`文件中添加以下配置: ```properties spring.mqtt.url=tcp://localhost:1883 spring.mqtt.username=username spring.mqtt.password=password ``` 然后,创建一个MQTT消息发送者的Bean。可以使用`MqttPahoMessageHandler`类来发送消息。例如: ```java @Configuration public class MqttConfig { @Value("${spring.mqtt.url}") private String mqttUrl; @Value("${spring.mqtt.username}") private String mqttUsername; @Value("${spring.mqtt.password}") private String mqttPassword; @Bean public MessageHandler mqttOutbound() { MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler("clientId", MqttClientFactory.defaultOptions(mqttUrl, mqttUsername, mqttPassword)); messageHandler.setAsync(true); messageHandler.setDefaultTopic("topic"); return messageHandler; } } ``` 最后,可以在需要发送消息的地方注入`MessageHandler`并使用它发送消息。例如: ```java @Service public class MessageService { @Autowired private MessageHandler mqttOutbound; public void sendMessage(String message) { mqttOutbound.handleMessage(MessageBuilder.withPayload(message).build()); } } ``` 以上就是使用Spring Boot发送MQTT消息的简单介绍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值