MqttFramework.h
#import <Foundation/Foundation.h>
#import "MQTTClient.h"
#import "BusinessModuleProtocol.h"
#import "BusinessFramework.h"
#import "AppDelegate.h"
@interface MqttFramework : NSObject<MQTTDelegate,BusinessModuleProtocol>
{
BusinessFramework *businessFrameworks_;
}
/**
* @brief 单例模式的设置
*
* @param [in] N/A
* @param [out] N/A
* @return void
* @note
*/
+(MqttFramework *)getMQttFrameInstance;
/**
* @brief 给mqtt服务器发送消息 暂时未做使用 待扩展
*
* @param [in] N/A
* @param [out] N/A
* @return void
* @note
*/
+(void)publishMessage:(NSString *)message withTopicType:(NSString *)topicType;
/**
* @brief 请求的结果处理
*
* @param [in] N/A
* @param [out] N/A
* @return void
* @note
*/
-(void)requestResult:(NSString *)topic withData:(id)resultData;
/**
* @brief 定义mqtt消息主题
*
* @param [in] N/A
* @param [out] N/A
* @return void
* @note
*/
-(void)productTheme:(NSString *)theme;
/**
* @brief 重连mqtt服务器
*
* @param [in] N/A
* @param [out] N/A
* @return void
* @note
*/
-(void)reconnectMqtt;
@end
MqttFramework.m
#import "MqttFramework.h"
#import "MQTTClient.h"
#import "XmlAdept.h"
#import "ASIFormDataRequest.h"
@implementation MqttFramework
/**
* @brief 得到模块控制器的句柄单例
*
* @param [in] N/A
* @param [out] N/A
* @return void
* @note
*/
static MqttFramework *mqttInstance = nil;
+(MqttFramework*)getMQttFrameInstance
{
@synchronized(self)
{
if(mqttInstance==nil)
{
mqttInstance=[[self alloc]init];
}
}
return mqttInstance;
}
#pragma --mark BusinessModuleProtocol delegate
- (int)initBusinessModule:(BusinessModuleInfo*)info
{
info.businessModuleIdEX = @"MqttFrameWork";//
businessFrameworks_ = info.businessFramework;
return 0;
}
- (int)callBusinessProcessEX:(NSString *)capabilityId withMessageType:(NSString *)MessageType WithMessage:(id)messageVector
{
NSLog(@"capabilityId = %@ topic = %@ messageVector = %@",capabilityId,MessageType,messageVector);
AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
MQTTClient *mosq = [app mosquittoClient];
// [mosq setHost:Mqtt_URL];
// [mosq connect];
// [mosq subscribe:@"nanode/red_led"];
// [mosq subscribe:@"nanode/green_led"];
// [mosq subscribe:@"iCombo"];
// [mosq subscribe:@"iPhone"];
//1.组装xml工作
//2.发送请求消息
//在此正式调用mqtt请求
NSString *sendStr = [[NSString alloc] initWithData:[XmlAdept makeMqttXML:MessageType withDictionary:(NSDictionary *)messageVector] encoding:NSUTF8StringEncoding];
// /****************去掉最后换行符********************/
int index = sendStr.length-1;
sendStr = [sendStr substringToIndex:index];
// /*********************end*************************/
// ASIFormDataRequest *formDataRequest = [ASIFormDataRequest requestWithURL:nil];
//NSString *messageEx = [formDataRequest encodeURL:sendStr];
// NSString *messageEx = [formDataRequest encodeURL:@"我家"];
//[mosq publishString:sendStr toTopic:@"iCombo" retain:YES];
// NSLog(@"%@",messageEx);
NSString *string = [NSString stringWithFormat:@"**%@**",sendStr];
NSLog(@"senderMesg = %@",string);
[mosq publishString:sendStr toTopic:@"iCombo" retain:NO];
return 0;
}
-(void)requestResult:(NSString *)topic withData:(id)resultData
{
NSLog(@"发送业务广播 给监听者");
[businessFrameworks_ broadcastBusinessNotifyEX:topic withInParam:resultData];
}
/**
* @brief 定义mqtt消息主题
*
* @param [in] N/A
* @param [out] N/A
* @return void
* @note
*/
-(void)productTheme:(NSString *)theme
{
AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
MQTTClient *mosq = [app mosquittoClient];
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
if ([[ud objectForKey:@"host"] isEqualToString:@"no"])
{
[mosq setHost:Mqtt_URL];
}
else
{
[mosq setHost:[ud stringForKey:@"host"]];
}
//[mosq setHost:Mqtt_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 mosquittoClient];
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
if ([ud stringForKey:@"host"])
{
[mosq setHost:[ud stringForKey:@"host"]];
}
else
{
[mosq setHost:Mqtt_URL];
}
[mosq reconnect];
}
#pragma --mark mosquittoclientDelegate
- (void) didConnect:(NSUInteger)code
{
if (code == 0)
{
NSLog(@"连接本地mosquito代理服务器返回码为:%d 连接mqtt成功",code);
}
else
{
NSLog(@"连接Mqtt服务器失败");
}
}
- (void) didDisconnect
{
NSLog(@"mqtt disconnect!");
}
//处理各个主题对应的message
- (void) didReceiveMessage: (NSString*)message topic:(NSString*)topic
{
NSLog(@"%@ => %@", topic, message);
//deal with diffrent message here:
//if else 分支处理
//1.xml的解析工作
//将收到的消息处理后然后广播出去 接收者会根据主题处理自己的业务
NSArray *resultArr = [[NSArray alloc]initWithObjects:message, nil];
NSArray *list = [XmlAdept mqttParseMessageNode:resultArr];
NSString *type = [[list objectAtIndex:0] objectForKey:@"type"];
[self requestResult:type withData:list];
}
//publish后回调的messageId
- (void) didPublish: (NSUInteger)messageId
{
NSLog(@"send messageId = %d",messageId);
}
//定制一个主题
- (void) didSubscribe: (NSUInteger)messageId grantedQos:(NSArray*)qos
{
NSLog(@"messageId = %d grantedQos = %@",messageId,qos);
}
//取消一个主题
- (void) didUnsubscribe: (NSUInteger)messageId
{
NSLog(@"unsubscibe messageId = %d",messageId);
}
/**
* @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 mosquittoClient];
[mosq publishString:message toTopic:topicType retain:NO]; //消息的retain类型设置为NO让其不在消息缓冲池中保留
}
-(void)dealloc
{
[super dealloc];
}
@end