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