首页 > 代码库 > Mqtt协议IOS端移植3

Mqtt协议IOS端移植3

ServerMqFramework.h

#import "MqttFramework.h"

@interface ServerMqFramework : MqttFramework


/**
 * @brief  得到模块控制器的句柄单例
 *
 * @param [in] N/A
 * @param [out] N/A
 * @return void
 * @note
 */

+(ServerMqFramework*)getMQttServerFrameInstance;

- (int)callBusinessProcessEX:(NSString *)capabilityId withMessageType:(NSString *)MessageType WithMessage:(id)messageVector withTopic:(NSString *)topic;

@end


ServerMqFramework.m


#import "ServerMqFramework.h"
#import "getMacAddress.h"

@implementation ServerMqFramework



/**
 * @brief  得到模块控制器的句柄单例
 *
 * @param [in] N/A
 * @param [out] N/A
 * @return void
 * @note
 */

static ServerMqFramework *mqttInstance = nil;
+(ServerMqFramework*)getMQttServerFrameInstance
{
    @synchronized(self)
	{
		if(mqttInstance==nil)
		{
			mqttInstance=[[self alloc]init];
        }
	}
	return mqttInstance;
}


#pragma  --mark  BusinessModuleProtocol  delegate
- (int)initBusinessModule:(BusinessModuleInfo*)info
{
    
    info.businessModuleIdEX = @"MqttServerFrameWork";//
    businessFrameworks_ = info.businessFramework;
    return 0;
}


//指定发送到远程的响应接收者的主题   (实现宏观上的点对点传输)  //2012/11/30   modify

- (int)callBusinessProcessEX:(NSString *)capabilityId withMessageType:(NSString *)MessageType WithMessage:(id)messageVector withTopic:(NSString *)topic
{
    NSLog(@"server capabilityId = %@  topic = %@  messageVector = %@",capabilityId,MessageType,messageVector);
    
    AppDelegate  *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
	MQTTClient   *serverMQTTClient = [app serverMqClient];
    
    
   
    
    NSString  *sendStr = [[NSString alloc] initWithData:[XmlAdept makeMqttXML:MessageType withDictionary:(NSDictionary *)messageVector] encoding:NSUTF8StringEncoding];
    
    //    /****************去掉最后换行符********************/
    int index = sendStr.length-1;
    sendStr = [sendStr substringToIndex:index];
    
    NSString *string = [NSString stringWithFormat:@"**%@**",sendStr];
    NSLog(@"server senderMesg = %@",string);
    [serverMQTTClient publishString:sendStr toTopic:topic retain:NO];
    
    return 0;
}

-(void)requestResult:(NSString *)topic  withData:(id)resultData
{
    NSLog(@"远程mq服务器发送业务广播 给监听者");
    [businessFrameworks_ broadcastBusinessNotifyEX:topic withInParam:resultData];
}



/**
 * @brief 定义mqtt消息主题
 *
 * @param [in] N/A
 * @param [out] N/A
 * @return void
 * @note
 */

-(void)productTheme:(NSString *)theme
{
    
    NSLog(@"server theme = %@",theme);
    AppDelegate  *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    MQTTClient *mosq = [app serverMqClient];

    [mosq setHost:Mqtt_Server_URL];
      
    [mosq connect];
    [mosq subscribe:theme];
}

/**
 * @brief 重连mqtt服务器
 *
 * @param [in] N/A
 * @param [out] N/A
 * @return void
 * @note
 */
-(void)reconnectMqtt
{
    AppDelegate  *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    MQTTClient *mosq = [app serverMqClient];
   
    [mosq setHost:Mqtt_Server_URL];
    
    [mosq reconnect];
    
}

#pragma --mark  mosquittoclientDelegate

- (void) didConnect:(NSUInteger)code
{
    if (code == 0)
    {
        NSLog(@"连接远程Mqtt服务器返回码为:%d 连接mqtt成功",code);
    }
    else
    {
        NSLog(@"连接远程Mqtt服务器失败");
    }
    
	
}

- (void) didDisconnect
{
	NSLog(@"Server mqtt disconnect!");
    AppDelegate  *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    MQTTClient *mosq = [app serverMqClient];
    //断开后自动重连
    //3g或wifi任一可达就重连
    if ([Common IsEnable3G] || [Common IsEnableWIFI])
    {
        [mosq reconnect];   //远程MQTT服务器端重连
        NSString  *serverTheme = getMacAddress();
        [mosq subscribe:serverTheme]; //重新订阅主题
    }
    
}

//处理各个主题对应的message

- (void) didReceiveMessage: (NSString*)message topic:(NSString*)topic
{
	NSLog(@" serverMqtt %@ => %@", topic, message);
  
    NSArray   *resultArr = [[NSArray alloc]initWithObjects:message, nil];
    NSArray   *list = [XmlAdept mqttParseMessageNode:resultArr];
    NSString  *type = [[list objectAtIndex:0] objectForKey:@"type"];
    
    [self requestResult:type withData:list];
    
    
	
}

/**
 * @brief 给远程mqtt服务器发送消息   对外接口
 *
 * @param [in] N/A
 * @param [out] N/A
 * @return void
 * @note
 */

+(void)publishMessage:(NSString *)message   withTopicType:(NSString *)topicType
{
    AppDelegate  *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
	MQTTClient *mosq = [app serverMqClient];
    [mosq publishString:message toTopic:topicType retain:NO];  //消息的retain类型设置为NO让其不在消息缓冲池中保留
}

-(void)dealloc
{
    [super dealloc];
}


@end