반응형

# Java MQTT Client 만들기_Java 에서 MQTT 연동하기 (Java 와 MQTT 연동 DHT11 센서 데이터 모니터링 및 LED 제어)

  • IoT(사물인터넷)과 관련 됨. (사물 인터넷에서 중요한 부분은 통신)
  • 별도의 IoT(사물인터넷) 연동하진 않고 Java 와 MQTT 연동하는 소스 작업 진행.

## 준비물

## 작업소스

Project05_F.java (메인)

import kr.javatpc.MqttClass;

public class Project05_F {
	public static void main(String[] args) {
		new MqttClass();
	}
}

MqttClass.java

package kr.javatpc;

import java.util.UUID;

import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;

public class MqttClass implements MqttCallback {
	
	private MqttClient client = null;
	public MqttClass() {
		new Thread(task1).start();
	}
	
	private ReceiveEventListener listener = null;
	
	Runnable task1 = new Runnable() {
		@Override
		public void run() {
			try {
				String clientId = UUID.randomUUID().toString();
				client = new MqttClient("tcp://본인IP주소:1883", clientId);
				MqttConnectOptions connopt = new MqttConnectOptions();
				connopt.setCleanSession(true);
				client.connect(connopt);
				client.setCallback(MqttClass.this);
				client.subscribe("dht11");
				new IoTFrame(MqttClass.this);
			} catch(MqttException e) {
				System.out.println("ERRO"+e.getStackTrace());
			}
		}
	};
	
	public void sendMessage(String payload) {
		MqttMessage message = new MqttMessage();
		message.setPayload(payload.getBytes());
		try {
			if (client.isConnected()) {
				client.publish("led", message);
			}
		} catch(MqttException e) {
			System.out.println("error1 : " + e.getStackTrace());
		}
	}
	
	@Override
	public void connectionLost(Throwable arg0) {
		try {
			System.out.println("disconect");
			client.close();
		} catch(MqttException e) {
			System.out.println("error" + e.getMessage());			
		}
	}
	
	@Override
	public void deliveryComplete(IMqttDeliveryToken arg0) {
		
	}
	
	public void setMyEventListner(ReceiveEventListener listener) {
		this.listener = listener;
	}
	
	public void messageArrived(String topic, MqttMessage msg) throws Exception {
		listener.recvMsg(topic, msg);
	}
}

IoTFrame.java

package kr.javatpc;

import java.awt.BorderLayout;
import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.json.JSONObject;

public class IoTFrame extends JFrame implements 
					ActionListener, ReceiveEventListener {
	private static final long serialVersionUID = 1L;
	private JTextField tmp = new JTextField(10);
	private JTextField hum = new JTextField(10);
	private JButton ledOn = new JButton("LED ON");
	private JButton ledOff = new JButton("LED OFF");
	private JLabel msg = new JLabel("온도/습도 모니터링");
	private JTextArea out = new JTextArea(20, 40);
	private JPanel panel = new JPanel();
	private JPanel panel1 = new JPanel();
	private JPanel panel2 = new JPanel();
	private ScrollPane sp = new ScrollPane();
	private MqttClass mqtt = null;
	
	public IoTFrame(MqttClass mqtt) {
		this();
		this.mqtt = mqtt;
		this.mqtt.setMyEventListner(this);
	}
	
	public IoTFrame() {
		super("MQTT 사물인터넷 통신 프로젝트");
		setSize(400, 400);
		panel.add(msg);
		panel.add(ledOn);
		panel.add(ledOff);
		panel1.add(tmp);
		panel1.add(hum);
		sp.add(out);
		add(BorderLayout.NORTH, panel);
		add(BorderLayout.CENTER, sp);
		add(BorderLayout.SOUTH, panel1);
		
		ledOn.addActionListener(this);
		ledOff.addActionListener(this);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	@Override
	public void recvMsg(String topic, MqttMessage msg) {
		System.out.println(topic+","+msg);
		String append = out.getText();
		out.setText(topic+","+msg+"\n"+append);
		JSONObject obj = new JSONObject(new String(msg.getPayload()));
		tmp.setText("온도 : " + obj.get("tmp").toString());
		tmp.setText("습도 : " + obj.get("hum").toString());
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		JButton b = (JButton) e.getSource();
		if (b.getText().equals("LED_NO")) {
			mqtt.sendMessage("1");
		} else if (b.getText().equals("LED_OFF")) {
			mqtt.sendMessage("2");
		}
	}
}

ReceiveEventListener.java (인터페이스)

package kr.javatpc;

import org.eclipse.paho.client.mqttv3.MqttMessage;

public interface ReceiveEventListener {
	public void recvMsg(String topic, MqttMessage msg);
}

## 실습

1. MQTT 서버 구동

  • 관리자 권한으로 cmd 실행.
  • 아래와 같이 입력하여 mosquitto 서버 구동.
cd..

cd..

MQTTProject\mosquitto 

mosquitto -v

2. 수신자 서버 구동 (온도, 습도 수신자)

  • 관리자 권한으로 cmd 실행.
  • 아래와 같이 입력하여 mosquitto 서버 구동.
cd..

cd..

cd MQTTProject\mosquitto

mosquitto_sub -t dht11 -p 1883

3. 수신자 서버 구동(LED 조작 수신자)

  • 관리자 권한으로 cmd 실행.
  • 아래와 같이 입력하여 mosquitto 서버 구동.
cd..

cd..

MQTTProject\mosquitto

mosquitto_sub -t led -p 1883

4. 발행자

  • 원래는 아두이노로 연동하여 테스트 해야 하나, 임의의 발행자 구동하여 테스트 진행.
  • 아래와 같이 데이터 입력하여 테스트.
cd..

cd..

cd MQTTProject\mosquitto

mosquitto_pub -t dht11 -p 1883 -m "{\"tmp\":24,\"hum\":67}\"

반응형

+ Recent posts