Mosquitto와 Paho 클라이언트라이브러리를 사용

2023. 2. 22. 19:52프로그래밍

728x90

 

오늘은 저번에 생성한 Mosquitto를 사용하는 클라이언트로 Paho 라이브러리를 사용해보도록 하겠다. 여러 언어로 된 클라이언트가 존재하고 있는 데, 이중에 자바로 구현되어 있는 라이브러리를 사용해서 Paho를 사용하도록 한다.

 

“Javaclient and utilities”를 클릭해서 들어가보면 다음과 같이 git을 사용해서다운받을 수 있다.

git clonehttp://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.java.git
cd org.eclipse.paho.mqtt.java.git
mvn package -DskipTests
 

메이븐도 필요하다. 해당 실행파일과 소스 파일은 아래 폴더에 가면 존재한다.

org.eclipse.paho.client.mqttv3/target
 

 

다운을 다 받으면 위와 같은 모습이된다.

Standalone 버전을 만들기 위해서 필요한 패키지는

org.eclipse.paho.client.mqttv3
org.eclipse.paho.client.mqttv3.internal.traceformat
org.eclipse.paho.sample.mqttv3app
 

위의 세 개 정도가 되고 세 개를모아서 만들어 보면 대략 아래와 같다.

그러면 모든 준비는 끝이 난 것 같고, apache ant를 사용해서 컴파일 및 빌드를 하도록 한다.

build.xml 파일은 다음과 같다.

<?xml version="1.0" encoding="UTF-8"?>
<project name="mqtt.paho.cli" default="mqtt.paho.cli" basedir=".">
<description> mqtt client paho service </description>
<!-- set global properties for this build -->
<property name="version" value="0.1"/>
<property name="manifest-version" value="0.1"/>
<property name="src" location="src"/>
<property name="build" location="build"/>
<property name="dist" location="dist"/>
<property name="common.lib.dir" location="C:/DEV/LIBs/JAVA/IOT"/>
<property name="paho.lib.dir" location="libs"/>
<property name="paho.dir" location="exec"/>
<property name="manifest" value="src/META-INF/MANIFEST.MF"/>

<property name="main.class" value="org.eclipse.paho.sample.mqttv3app.Sample"/>
<property name="main.name" value="MQTT Paho client service"/>
<property name="jar.name" value="mqtt-paho-cli"/>

<patternset id="meta.files">
	<include name="**/*" />
</patternset>

<path id="compile.classpath">
	<fileset dir="${common.lib.dir}">
		<include name="**/*.jar"/>
	</fileset>
	
	<fileset dir="${paho.lib.dir}">
		<include name="**/*.jar"/>
	</fileset>
</path>

<target name="init">
	<!-- Create the time stamp -->
	<tstamp/>
	<!-- Create the build directory structure used by compile -->
	<mkdir dir="${build}"/>
</target>

<target name="compile" depends="init" description="compile the source " >
	<javac srcdir="${src}" destdir="${build}" source="1.7" debug="true" encoding="UTF-8">
		<classpath refid="compile.classpath"/>
	</javac>
</target>


<target name="dist" depends="compile" description="generate the distribution" >

	<mkdir dir="${dist}/lib"/>
	<copy todir="${build}/">
		<fileset dir="{src}/../files"/>
	</copy>

	<delete file="${current.lib.dir}/${jar.name}.jar"/>

	<jar destfile="${dist}/lib/${jar.name}.jar"
		basedir="${build}"
		manifest="${manifest}">

		<manifest>
			<attribute name="Manifest-Version" value="1.0"/>
			<attribute name="Main-Class" value="${main.class}"/>
			<attribute name="Build-Jdk" value="1.7.0_51"/>
			<attribute name="Created-By" value="Apache Maven"/>
			<attribute name="Bundle-ManifestVersion" value="2"/>
			<attribute name="Built-By" value="e4Build"/>
		</manifest>
	</jar>

	<copy todir="${paho.dir}">
		<fileset dir="${dist}/lib">
			<include name="${jar.name}.jar"/>
		</fileset>

	</copy>

</target>

<target name="mqtt.paho.cli" depends="dist" description="make own jar file" >
</target>

<target name="clean" description="clean up" >
	<!-- <echo message="Hello, bin/${jar.name}.jar"/> -->
	<delete dir="${build}"/>
	<delete dir="${dist}"/>
	<delete file="${paho.dir}/plugins/${jar.name}.jar"/>
</target>

</project>
 

그리고 Apache launcher를 사용해서 구동 하려 한다.

다음은 launcher.xml 파일이다.

<!--
Copyright 2002-2004 The Apache Software Foundation

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

<project name="MQTT Client Testing" default="mqtt_paho_simple_subscriber" basedir=".">
	<property file="mqtt.paho.properties"/>

	<property name="base.dir" value="."/>
	<property name="etc.dir" value="${base.dir}/etc"/>
	<property name="lib.dir" value="${mqtt.paho.library.dir}"/>
	<property name="log.dir" value="${base.dir}/logs"/>

	<path id="base.class.path">
		<pathelement path="${etc.dir}"/>
		<fileset dir="." includes="mqtt-paho-cli.jar"/>
		<fileset dir="${lib.dir}" includes="**/*.jar"/>
	</path>


	<!--#1. Simple -->
	<target name="mqtt_paho_simple_subscriber">
		<mkdir dir="${log.dir}" />
		<launch classname="org.eclipse.paho.sample.mqttv3app.Sample">
			<classpath refid="base.class.path"/>
			<arg line="-a subscribe -b localhost -p 1883"/>
		</launch>

	</target>

	<target name="mqtt_paho_simple_publisher">
		<mkdir dir="${log.dir}" />
		<launch classname="org.eclipse.paho.sample.mqttv3app.Sample">
			<classpath refid="base.class.path"/>
			<arg line="-a publish -b localhost -p 1883 -m ‘this is a message from me’"/>
		</launch>

	</target>

	<target name="mqtt_paho_simple_subscriber_async_callback">
		<mkdir dir="${log.dir}" />
		<launch classname="org.eclipse.paho.sample.mqttv3app.SampleAsyncCallBack">
			<classpath refid="base.class.path"/>
			<arg line="-a subscribe -b localhost -p 1883"/>
		</launch>
	</target>


	<target name="mqtt_paho_simple_publisher_async_callback">
		<mkdir dir="${log.dir}" />
		<launch classname="org.eclipse.paho.sample.mqttv3app.SampleAsyncCallBack">
			<classpath refid="base.class.path"/>
			<arg line="-a publish -b localhost -p 1883 -m 'this is async message from me'"/>
		</launch>
	</target>


	<target name="mqtt_paho_simple_subscriberr_async_wait">
		<mkdir dir="${log.dir}" />
		<launch classname="org.eclipse.paho.sample.mqttv3app.SampleAsyncWait">
			<classpath refid="base.class.path"/>
			<arg line="-a subscribe -b localhost -p 1883"/>
		</launch>
	</target>


	<target name="mqtt_paho_simple_publisher_async_wait">
		<mkdir dir="${log.dir}" />
		<launch classname="org.eclipse.paho.sample.mqttv3app.SampleAsyncWait">
			<classpath refid="base.class.path"/>
			<arg line="-a publish -b localhost -p 1883 -m 'this is async message from me'"/>
		</launch>
	</target>

</project>
 

 

1. Mosquitto구동

저번문서에서 Cygwin 빌드를 사용해서 설치하였으므로, Cygwin 환경에서작업하도록 한다.

mosquitto -c $MOSQUITTO_HOME/conf/mosquitto.conf -d > $MOSQUITTO_HOME/log/mosquitto.log 2>&1
 

 

2. 동기 클라이언트구동(Simple)

아래문서 내용 대로 subscriber와 publisher를구동하도록 한다. 위의 launcher.xml 파일에 빨간색으로 강조된 부분이 프로그램 인자로 정의 된 것이다.

 

2.1. Subscriber구동

Connected to tcp://localhost:1883 with client ID SampleJavaV3_subscribe
Subscribing to topic "Sample/#" qos 2
Press <Enter> to exit
Time: 2015-11-10 09:47:06.365 Topic: Sample/Java/v3 Message: this is a message from me QoS: 2
 

2.2. Publisher구동

Connecting to tcp://localhost:1883 with client ID SampleJavaV3_publish Connected
Publishing at: 2015-11-10 09:47:06.35 to topic "Sample/Java/v3" qos 2 Disconnected
 

3. 비 동기 클라이언트구현

비동기클라이언트의 구현은 Async-wait 방식이 있고,Async-callback 방식이 있다고 하고 각각 SampleAsyncWait.java,SampleAsyncCallBack.java 이 그것이다. 말만 들어서는 나도 뭔지 모르겠지만…여하튼 설명은 다음과 같다.

 

비동기 샘플은 MQTT 클라이언트를 기다리는 동안 MQTT 애플리케이션이 블록킹 되는 일정한 시간을 어떻게 줄일 수 있는 가에 대한 데모 프로그램이다. 

모바일 환경에서 배터리 수명을 늘리고, 메인 쓰레드에서 응답 시간을 늘이는 블록킹 호출을 제거하는 데 중요하다.

샘플은 MQTT 클라이언트 내에서 비 동기 인터페이스를 호출하는 두 가지 패턴에 대한 데모이다.

 

  1. SampleAsyncWait 은 MQTT가 네트워크 연결 상황을 기다리는 동안 블록 되지 않는다.
  2. SampleAsyncCallBack 는 MQTT 클라이언트가 어떤 행동을 끝내는 것을 기다릴 때 블록 되지 않는다. 

 

후자는 브라우저로부터 MQTT 클라이언트가 호출되는 자바스크립트 페이지가 로딩되는 상황에서 유용한 방법이다. 자바스크립트 페이지는 블록 되지 말아야 한다. 이 행동에 대한 응답은 통지를 시작하라고 작성한 MQTT 이벤트 핸들러를 호출 한 메인 브라우저 쓰레드로 반드시 돌아가야 한다.

 

구동에 관련된 사항은 위의 동기 식방식과 똑같이 적용된다. 이 말인즉슨, 실제 애플리케이션에넣어보아야 효과가 어떤 것인지 알 수 있다는 뜻이기도 하다.

 

4. 마치면서.

이상으로 MQ 서버인 mosquitto를 구동하고 paho MQTT 클라이언트 자바 라이브러리를 통해서 메시징을 구현해 보았다.물론 예제 뿐 이었지만.. 실제로 모바일 기기나 IoT 기기에넣어서 테스트 해보는 방법으로 테스트 해보아야 할 듯 하다.

 

이상.

728x90