MQTT实现服务端推送功能

公司要求做推送功能和即时通讯,又不让使用第三方,查找网上资料,最终采用mqtt
推送实体类
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

public class PushMessage{
	//推送类型
	private String type;
	//标题
	private String title;
	//内容
	private String content;
	//数量
	private Integer badge=1;
	//铃声
	private String sound = "default";
	
	public PushMessage(){
		
	}

	public PushMessage(String type,String title,String content,Integer badge){
		this.type = type;
		this.title = title;
		this.content = content;
		this.badge = badge;
	}
	
	public String getSound() {
		return sound;
	}

	public void setSound(String sound) {
		this.sound = sound;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public Integer getBadge() {
		return badge;
	}

	public void setBadge(Integer badge) {
		this.badge = badge;
	}

	@Override
    public String toString() {
		return JSON.toJSONString(this, SerializerFeature.DisableCircularReferenceDetect);
    }
}
配置文件
mqtt_host=tcp://127.0.0.1
mqtt_port=1883
mqtt_uname=mosquitto
mqtt_pwd=Kdmqtt2016@
mqtt_timeout=10
mqtt_KeepAliveInterval=30

服务端推送工具类
import java.util.ResourceBundle;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttPersistenceException;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public class MqttPushClient {  
  
	protected static final Log logger = LogFactory.getLog(MqttPushClient.class);
	
    private MqttClient client; 
    
    private String clientMac = "admin-12345678abc";

	private static MqttPushClient mqttClientUtil = null;
    
    public static MqttPushClient getInstance(){
    	if(mqttClientUtil == null){
    		mqttClientUtil = new MqttPushClient();
    	}
    	return mqttClientUtil;
    }
    
    private MqttPushClient() {  
    	connect();
    }  
    
    private void connect(){
    	try { 
        	ResourceBundle bundle = ResourceBundle.getBundle("mqtt"); 
        	String host = bundle.getString("mqtt_host") + ":" + bundle.getString("mqtt_port");
        	String userName = bundle.getString("mqtt_uname");
        	String passWord = bundle.getString("mqtt_pwd");
        	Integer timeout = Integer.valueOf(bundle.getString("mqtt_timeout"));
        	Integer keepAliveInterval = Integer.valueOf(bundle.getString("mqtt_KeepAliveInterval"));
            client = new MqttClient(host, clientMac, new MemoryPersistence());  
            MqttConnectOptions options = new MqttConnectOptions();  
            options.setCleanSession(false);  
            options.setUserName(userName);  
            options.setPassword(passWord.toCharArray());  
            options.setConnectionTimeout(timeout);    
            options.setKeepAliveInterval(keepAliveInterval);  
            try {  
                client.setCallback(new PushCallback());  
                client.connect(options); 
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        } catch (Exception e) { 
            e.printStackTrace(); 
        }
    }
    
    /**
     * 发布,默认qos为0,非持久化
     * @param topic
     * @param pushMessage
     */
    public void publish(String topic,PushMessage pushMessage){
    	publish(0, false, topic, pushMessage);
    }
    
    /**
     * 发布
     * @param qos
     * @param retained
     * @param topic
     * @param pushMessage
     */
    public void publish(int qos,boolean retained,String topic,PushMessage pushMessage){
    	//connect();
    	MqttMessage message = new MqttMessage();
	    message.setQos(qos);  
	    message.setRetained(retained);  
	    message.setPayload(pushMessage.toString().getBytes());  
	    MqttTopic mtopic = client.getTopic(topic);
	    if(mtopic == null){
	    	logger.error("主题不存在");
	    }
    	MqttDeliveryToken token;
		try {
			token = mtopic.publish(message);
			token.waitForCompletion();  
		} catch (MqttPersistenceException e) {
			e.printStackTrace();
		} catch (MqttException e) {
			e.printStackTrace();
		}  	
    }
    
    /**
     * 订阅某个主题,qos默认为0
     * @param topic
     */
    public void subscribe(String topic){
    	subscribe(topic,0);
    }
    
    /**
     * 订阅某个主题
     * @param topic
     * @param qos
     */
    public void subscribe(String topic,int qos){
    	try {
			client.subscribe(topic, qos);
		} catch (MqttException e) {
			e.printStackTrace();
		}
    }
    
    public String getClientMac() {
		return clientMac;
	}

	public void setClientMac(String clientMac) {
		this.clientMac = clientMac;
	}
	
	public static void main(String[] args) throws Exception {
    	String kdTopic = "test/topic";
    	PushMessage pushMessage = new PushMessage("test", "111", "2222", 1);
    	MqttPushClient.getInstance().publish(0, false, kdTopic, pushMessage);
    	MqttPushClient.getInstance().subscribe(kdTopic);
    	
		/*String[] devs= new String[2];  
        devs[0] = "6a0f20ea25b4fa8beb5086ea159c3c7311f748d56250a6db8a737514a5fea533";
        devs[1] = "d17fcd83b171bd91ac946d14d58b7780a9ac47555e34b7ce2cac77b623b51a5a";
        List<Device> devices=Devices.asDevices(devs);  
        System.out.println(devices.size());  
        IosPushUtil.pushCombinedNotification(pushMessage.toString(), 2, "default", devices);*/
    } 
}  








已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页