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