• 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
    


  • 相关阅读:
    C# lock
    read appSettings in configuration file by XElement with xmlns
    get all sites under IIS
    Cross-site scripting(XSS)
    Do not throw System.Exception, System.SystemException, System.NullReferenceException, or System.IndexOutOfRangeException intentionally from your own source code
    C++ 算法
    C++ 数据结构概念
    C++ STL 常用算术和生成算法
    C++ STL 常用拷贝和替换算法
    C++ STL 常用排序算法
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7214395.html
Copyright © 2020-2023  润新知