반응형
# Java MQTT Client 만들기_Java 에서 MQTT 연동하기 (Java 와 MQTT 연동 DHT11 센서 데이터 모니터링 및 LED 제어)
- IoT(사물인터넷)과 관련 됨. (사물 인터넷에서 중요한 부분은 통신)
- 별도의 IoT(사물인터넷) 연동하진 않고 Java 와 MQTT 연동하는 소스 작업 진행.
## 준비물
- paho API 다운로드 (https://repo1.maven.org/maven2/org/eclipse/paho/org.eclipse.paho.client.mqttv3/1.2.1/)
## 작업소스
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}\"
반응형
'인프런 강의 학습 > Java TPC 실전' 카테고리의 다른 글
Java Socket(소켓)을 이용한 Multi-Chatting 프로그래밍 (0) | 2022.08.06 |
---|---|
Java Socket(소켓) Multi-Chatting 프로그래밍_소켓이 만들어지는 과정(TCP 3-way Handshake), 자바에서 소켓 만들기 (ECHO) (0) | 2022.08.03 |
Java MQTT Client 만들기_Mosquitto MQTT broker 설치 및 서버구동 (0) | 2022.07.29 |
Java iText API 활용 Excel에서 데이터 읽어서 PDF로 만들기 (0) | 2022.07.28 |
Java iText API 활용 PDF 에 image 삽입 및 크기조절 하기 (0) | 2022.07.27 |