package fr.zng.xxzx.mqtt;

import javax.swing.JTextArea;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;  
import org.eclipse.paho.client.mqttv3.MqttMessage;

import com.alibaba.fastjson.JSONObject;

import fr.zng.xxzx.common.cacheData.ZngCacheData;
import fr.zng.xxzx.common.dao.UpdataDao;
import fr.zng.xxzx.common.dao.impl.UpdataDaoImpl;
import fr.zng.xxzx.common.entity.UpDataEntity;
import fr.zng.xxzx.common.util.CommUtil;
import fr.zng.xxzx.common.util.StringUtil;
import fr.zng.xxzx.main.XmtApplication;  

/**  
 * 发布消息的回调类  
 *   
 * 必须实现MqttCallback的接口并实现对应的相关接口方法CallBack 类将实现 MqttCallBack。  
 * 每个客户机标识都需要一个回调实例。在此示例中，构造函数传递客户机标识以另存为实例数据。
 * 在回调中，将它用来标识已经启动了该回调的哪个实例。  
 * 必须在回调类中实现三个方法：  
 *   
 *  public void messageArrived(MqttTopic topic, MqttMessage message)接收已经预订的发布。  
 *   
 *  public void connectionLost(Throwable cause)在断开连接时调用。  
 *   
 *  public void deliveryComplete(MqttDeliveryToken token))  
 *  接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。  
 *  由 MqttClient.connect 激活此回调。  
 *   
 */    
public class PushCallback implements MqttCallback {  
	private JTextArea jta;
	public PushCallback(JTextArea jta) {
		this.jta = jta;
	}
	
    public void connectionLost(Throwable cause) {  
        // 连接丢失后，一般在这里面进行重连  
        System.out.println("连接断开，可以做重连");  
        CommUtil.doPrint(jta, "MQTT:", "连接断开,开始尝试重新连接");
        ZngCacheData.isConnect = 0;
        XmtApplication.changeConnectState(0);
        
    }  

    public void deliveryComplete(IMqttDeliveryToken token) {
        System.out.println("deliveryComplete---------" + token.isComplete());
        CommUtil.doPrint(jta, "MQTT:", "deliveryComplete---------" + token.isComplete());
    }

    public void messageArrived(String topic, MqttMessage message) throws Exception {
        // subscribe后得到的消息会执行到这里面  
        System.out.println("接收消息主题 : " + topic);  
        System.out.println("接收消息Qos : " + message.getQos());  
        System.out.println("接收消息内容 : " + new String(message.getPayload()));
        CommUtil.doPrint(jta, "MQTT:", "接收消息主题 : " + topic);
        CommUtil.doPrint(jta, "MQTT:", "接收消息Qos : " + message.getQos());
        CommUtil.doPrint(jta, "MQTT:", "接收消息内容 : " + new String(message.getPayload()));
        
        String data = new String(message.getPayload());
        if("".equals(data)) 
        	return;
        
        try {
			UpDataEntity updata = JSONObject.parseObject(data, UpDataEntity.class);
			if(updata!=null) {
				UpdataDao dao = new UpdataDaoImpl();
				int ret= dao.insert(updata);
				if(ret>0) {
					CommUtil.doPrint(jta, "MQTT:", "设备上传实时信息插入成功");
				} else {
					CommUtil.doPrint(jta, "MQTT:", "设备上传实时信息插入失败");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("订阅消息解析失败");
			CommUtil.doPrint(jta, "MQTT:", "订阅消息解析失败");
		}
        
    }  
}