node.js로 mqtt client 만들기

IOT를 구현하기 위해 MQTT broker에 연결해 Publish/Subscrib 할 MQTT Client를 만들어보자.

MQTT client library

npm에서 MQTT client 모듈이 있다. 이 모듈을 설치한다.

$ npm install mqtt -save

모듈 불러오기

script 상단에 mqtt 모듈을 불러옴으로써 사용할 수 있다.

const mqtt = require('mqtt');

mqtt 모듈 개요

Node.js 는 비동기와 이벤트를 사용한다. mqtt client가 연결이 되었을때 이벤트들이 발생해 사용할 수 있다.

그럼 여러 listener들을 만들고 원하는 처리를 할 수 있다.

연결하기

const client = mqtt.connect(url, options);

가장 중요한 메소드로, MQTT broker와 연결해주고 client class를 반환해준다.

options는 broker와 연결할 때 설정될 속성들이다. broker에 따라 username, password를 요구하는 broker가 있다면 자바스크립트 객체를 생성해 options를 작성하고 넣어주면 된다.

ex)

const options = {
  host: '127.0.0.1',
  port: 8883,
  protocol: 'mqtts',
  username:"steve",
  password:"password",
};

const client = mqtt.connect(options);

connect 이벤트

연결할 때는 connect 이벤트가 호출되어 제어할 수 있다. 또한 connect 메소드는 client.connected 변수를 true로 설정한다.

client.on("connect", () => {	
  console.log("connected"+ client.connected);
}

연결 종료

connect 메소드를 사용하면 계속 연결 상태에 머물러 있게된다. 하지만 어떤 시나리오에서는 연결을 종료할 때가 오길 바랄 수도 있다. 그럴 때 end() 메소드를 사용할 수 있다.

client.end();

연결 실패

연결 실패에 대한 오류 이벤트를 제공한다. 이벤트를 모니터링하려면 listener를 만든다.

client.on("error", (error) => { 
  console.log("Can't connect" + error);
}

하지만 이 코드는 인증 실패 같은 오류만 잡을 것이다. 잘못된 포트나 주소에 연결하려고 시도하면 오류가 생성되지 않고 client는 계속 다시 연결을 시도할 것이다.

그러므로 오류로 인해 인증 실패가 감지되면 클라이언트를 종료해야한다.

client.on("error", (error) => {
  console.log("Can't connect" + error);
}
process.exit(1)});

메시지 Publish

이제 publish 를 해보자.

client.publish(topic, message, [options], [callback])

옵션과 콜백은 선택사항이다. 옵션은 retain message flag나 qos 등을 설정할 수 있다.

var options = {
  retain:true,
  qos:1
};
client.publish("testtopic", "test message", options)

Topic에 subscribe

구독하려면 client.subscribe 메소드를 사용하면 된다.

client.subscribe(topic/topic array/topic object, [options], [callback])
  • 하나의 Topic이면 string을 써도 된다.
  • 여러 topic들을 같은 qos로 구독하고 싶다면 array로 하면된다.
  • 여러 topic들을 다른 qos로 구독하고 싶다면 object를 사용하면 된다.

ex)

const topic_s="topic";
const topic_list=["topic2","topic3","topic4"];
const topic_o={"topic22":0,"topic33":1,"topic44":1};
client.subscribe(topic_s, {qos:1});
client.subscribe(topic_list, {qos:1});
client.subscribe(topic_o);

메세지 받기

구독했다면 메세지가 왔을 때 message 이벤트로 리스너를 만들어 처리할 수 있다.

client.on('message', (topic, message, packet) => {
	console.log("message is "+ message);
	console.log("topic is "+ topic);
});

콜백은 topic, message, packet의 세가지 파라미터가 필요하다.




*참조

http://www.steves-internet-guide.com/using-node-mqtt-client/

김땡땡's blog

김땡땡's blog

김땡땡