반응형

# 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}\"

반응형
반응형

# Java MQTT Client 만들기_Mosquitto MQTT broker 설치 및 서버구동

  • MQTT : 메세지를 중계해주는 프로토콜.
  • 아두이노 등을 이용하여 포트 번호 등의 정보를 이용, 통신하여 온도, 습도 등 원하는 정보 표시가능.

## Mosquitto MQTT broker

Mosquitto MQTT broker 설치

  • 운영체제에 맞는 프로그램 다운로드 진행.

  • 다운로드 받은 설치 파일 실행, 경로를 C드라이브에 MQTTProject 폴더 생성하여 지정 후 설치진행.

Mosquitto MQTT broker 서버 구동

  • 관리자 권한으로 cmd 실행.
  • 아래 명령어 입력하여 MQTT 서버 구동 
mosquitto -v

구독자(subscriber) 실행

  • 서버 구동한건 내려놓고, 별도로 관리자 권한으로 cmd 실행
  • 아래 명령어 입력하여 실행 - 수신 대기 창.

  • 외부에서 연결 시에는 아래와 같이 입력하여 진행
mosquitto_sub -h MQTT서버ip주소 -t iot -p 1883

발행자(publisher) 실행

  • 아래 명령어 입력하여 실행 - 메시지(토픽) 발행 창.

  • 이렇게 하면 아래와 같이 구독자에게 입력한 내용이 전달된다. (JSON 등의 형식으로도 전달 가능)

반응형
반응형

# Java iText API 활용 Excel에서 데이터 읽어서 PDF로 만들기

  • Excel 에 저장된 데이터를 읽어서 PDF로 생성. (Excel > PDF)
  • 기존에 키값에 해당하는 데이터를 입력하여 조회된 정보를 Excel 파일로 만드는 작업을 했었는데, 반대로 Excel 에 저장된 데이터를 가져와 PDF로 생성하는 작업 진행. (이전 작업 내역 종합하여 진행)

## 생성 결과

## 작업 소스

isbn.xls
0.25MB
bookList.pdf
0.31MB
malgun.ttf
12.83MB

import java.io.*;
import java.util.*;
import java.util.List;

import org.apache.poi.hssf.usermodel.*;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

import kr.inflearn.ExcelVO;

public class Project04_F {
	public static void main(String[] args) {
		// 엑셀 데이터 읽어와서 PDF 생성하기.
		// 1. 엑셀 불러오기
		String filename = "isbn.xls";	
		
		List<ExcelVO> data = new ArrayList<ExcelVO>();
		try (FileInputStream fis = new FileInputStream(filename)) {
			HSSFWorkbook workbook = new HSSFWorkbook(fis);
			HSSFSheet sheet = workbook.getSheetAt(0);
			Iterator rows = sheet.rowIterator();
			String[] imsi = new String[5];
			
			rows.next();	// 첫번째 줄은 헤더 이므로 다음줄로 이동.
			while (rows.hasNext()) { // 로우
				HSSFRow row = (HSSFRow) rows.next();
				Iterator cells = row.cellIterator();
				
				int i = 0;
				while (cells.hasNext()) {	// 셀 정보
					HSSFCell cell = (HSSFCell) cells.next();
					imsi[i] = cell.toString();
					i++;
					
					if (i == 5) {	// 5의 경우 이미지 정보로 필요없으므로 5일때 break.
						break;
					}
				}
				
				ExcelVO vo = new ExcelVO(imsi[0], imsi[1], imsi[2], imsi[3], imsi[4]);
				data.add(vo);
			}
			
			// 2. Excel 데이터 바탕으로 PDF 생성
			pdf_maker(data);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private static void pdf_maker(List<ExcelVO> data) {
		// 헤더에 들어갈 값.
		String[] headers = new String[]{"제목", "저자", "출판사", "이미지"};
		
		Document doc = new Document(PageSize.A4);
		try {
			PdfWriter.getInstance(doc, new FileOutputStream(new File("bookList.pdf")));
			doc.open();
			
			// 폰트 설정.
			BaseFont bFont = BaseFont.createFont(
					"MALGUN.TTF", 
					BaseFont.IDENTITY_H	
					, BaseFont.NOT_EMBEDDED);
			Font headerFont = new Font(bFont, 12);	// 헤더 폰트
			Font rowFont = new Font(bFont, 10);	// row 폰트
			
			// 테이블 생성
			PdfPTable table = new PdfPTable(headers.length);
			
			for (String header : headers) {
				// 테이블_셀 생성
				PdfPCell cell = new PdfPCell();
				cell.setGrayFill(0.9f);
				cell.setPhrase(new Phrase(header.toUpperCase(), headerFont));
				table.addCell(cell);
			}	
			table.completeRow();	
			
			// Excel데이터 바탕, PDF에 들어갈 테이블에 정보 입력.
			for (ExcelVO vo : data) {
				Phrase phrase = new Phrase(vo.getTitle(), rowFont);
				table.addCell(new PdfPCell(phrase));
				
				phrase = new Phrase(vo.getAuthor(), rowFont);
				table.addCell(new PdfPCell(phrase));
				
				phrase = new Phrase(vo.getCompany(), rowFont);
				table.addCell(new PdfPCell(phrase));
				
				// 이미지
				Image image = Image.getInstance(vo.getImageUrl());
				table.addCell(image);
				
				table.completeRow();
			}
			doc.addTitle("PDF Table Demo");
			doc.add(table);	// document 에 생성한 테이블 추가.
			System.out.println("bookList 생성 완료.");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			doc.close();
		}		
	}
}
반응형
반응형

# Java iText API 활용 PDF 에 image 삽입 및 크기조절 하기

  • Java iText API 활용하여 PDF에 image 를 삽입 및 이미지의 크기를 조절할 수 있다.

## 활용 방법

파일에서 이미지 생성

import java.io.*;

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;

public class Project04_C {
	public static void main(String[] args) {
		Document doc = new Document();

		try {
			PdfWriter.getInstance(doc, new FileOutputStream("ImageDemo.pdf"));
			doc.open();
			
			// 파일에서 이미지 생성
			String filename = "test_image.jpg";
			Image image = Image.getInstance(filename);
			doc.add(image);
            
			System.out.println("PDF 생성 완료.");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			doc.close();
		}
	}
}

URL에서 이미지 생성

import java.io.*;

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;

public class Project04_C {
	public static void main(String[] args) {
		Document doc = new Document();

		try {
			PdfWriter.getInstance(doc, new FileOutputStream("ImageDemo.pdf"));
			doc.open();
	
			// URL로 부터 이미지 생성
			String url = "https://cdn.inflearn.com/public/main_sliders/90eee9de-869d-4906-aa7a-88998858dc6d/%5B%E1%84%8B%E1%85%B5%E1%84%87%E1%85%A6%E1%86%AB%E1%84%90%E1%85%B3%5D%E1%84%8B%E1%85%B5%E1%86%AB%E1%84%91%E1%85%B3%E1%84%8F%E1%85%A9%E1%86%AB_main_521.png";
			Image urlImage = Image.getInstance(url);
			doc.add(urlImage);

			System.out.println("PDF 생성 완료.");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			doc.close();
		}
	}
}

## 생성 결과

  • 아래와 같이 파일, URL 을 이용 이미지를 추가하여 PDF 생성. (이미지 크기 때문에 2페이지에 걸쳐서 출력)

## 작업 소스

import java.io.*;

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;

public class Project04_C {
	public static void main(String[] args) {
		Document doc = new Document();

		try {
			PdfWriter.getInstance(doc, new FileOutputStream("ImageDemo.pdf"));
			doc.open();
			
			// 파일에서 이미지 생성
			String filename = "test_image.jpg";
			Image image = Image.getInstance(filename);
			doc.add(image);
			
			// URL로 부터 이미지 생성
			String url = "https://cdn.inflearn.com/public/main_sliders/90eee9de-869d-4906-aa7a-88998858dc6d/%5B%E1%84%8B%E1%85%B5%E1%84%87%E1%85%A6%E1%86%AB%E1%84%90%E1%85%B3%5D%E1%84%8B%E1%85%B5%E1%86%AB%E1%84%91%E1%85%B3%E1%84%8F%E1%85%A9%E1%86%AB_main_521.png";
			Image urlImage = Image.getInstance(url);
			doc.add(urlImage);

			System.out.println("PDF 생성 완료.");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			doc.close();
		}
	}
}

 

# Java iText API 활용 PDF 에  삽입한 image 크기조절 하기

  • 위에서 이미지를 추가하여 PDF 생성 시 크기 조절 문제 발생. 이를 해결하기 위해 추가 작업 진행.
  • scaleAbsolute, scalePercent, scaleToFit

## 활용방법

이미지 크기조절 방법 1_scaleAbsolute

Document doc = new Document();

try {
    PdfWriter.getInstance(doc, new FileOutputStream("ImageDemo.pdf"));
    doc.open();

    // 파일에서 이미지 생성
    String filename = "test_image.jpg";
    Image image = Image.getInstance(filename);
    image.scaleAbsolute(200f, 200f);	// 이미지 크기 조절
    doc.add(image);

    System.out.println("PDF 생성 완료.");
} catch (Exception e) {
    e.printStackTrace();
} finally {
    doc.close();
}

이미지 크기조절 방법 2_scalePercent

Document doc = new Document();

try {
    PdfWriter.getInstance(doc, new FileOutputStream("ImageDemo.pdf"));
    doc.open();

    // URL로 부터 이미지 생성
    String url = "https://cdn.inflearn.com/public/main_sliders/90eee9de-869d-4906-aa7a-88998858dc6d/%5B%E1%84%8B%E1%85%B5%E1%84%87%E1%85%A6%E1%86%AB%E1%84%90%E1%85%B3%5D%E1%84%8B%E1%85%B5%E1%86%AB%E1%84%91%E1%85%B3%E1%84%8F%E1%85%A9%E1%86%AB_main_521.png";
    Image urlImage = Image.getInstance(url);
    urlImage.scalePercent(200f);	// 이미지 크기 조절 (%)
    doc.add(urlImage);

    System.out.println("PDF 생성 완료.");
} catch (Exception e) {
    e.printStackTrace();
} finally {
    doc.close();
}

이미지 크기조절 방법 3_scaleToFit

Document doc = new Document();

try {
    PdfWriter.getInstance(doc, new FileOutputStream("ImageDemo.pdf"));
    doc.open();

    // 파일에서 이미지 생성
    String filename = "test_image.jpg";
    Image image = Image.getInstance(filename);
    image.scaleToFit(100f, 200f);	// 이미지 크기 조절 (정한 사이즈에 맞게)
    doc.add(image);

    System.out.println("PDF 생성 완료.");
} catch (Exception e) {
    e.printStackTrace();
} finally {
    doc.close();
}

## 실행 결과

## 작업 소스

import java.io.*;

import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;

public class Project04_D {
	public static void main(String[] args) {
		Document doc = new Document();

		try {
			PdfWriter.getInstance(doc, new FileOutputStream("ImageScalingDemo.pdf"));
			doc.open();
			
			// 1. scaleAbsolute 사용 이미지 크기 조절
			String filename1 = "test_image.jpg";
			Image image1 = Image.getInstance(filename1);
			image1.scaleAbsolute(200f, 200f);
			doc.add(image1);
			
			// 2. scalePercent 사용 이미지 크기 조절
			String filename2 = "test_image.jpg";
			Image image2 = Image.getInstance(filename2);
			image2.scalePercent(100f);
			doc.add(image2);
			
			// 3. scaleAbsolute 사용 이미지 크기 조절
			String filename3 = "test_image.jpg";
			Image image3 = Image.getInstance(filename3);
			image3.scaleToFit(100f, 200f);
			doc.add(image3);

			System.out.println("PDF 생성 완료. (이미지 크기 조절)");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			doc.close();
		}
	}
}
반응형

+ Recent posts