본문 바로가기
it/nestjs

Nest.JS MQTT 통신 브로커 연결

by sss24 2023. 5. 3.
npm i mqtt

로 먼저 라이브러리를 다운 받아줍니다.

 

그 다음 

app.module.ts

@Module({
    MqttModule.forRoot({     
              servers: [       
                     {         
                             host: process.env.MQTT_HOST, // 현재 통신하고 있는 MQTT 브로커 호스트
                             port: parseInt(process.env.MQTT_PORT_M), //대부분의 브로커는 1883 또는 1884를 사용함.
                      },
               ],
                clientId: process.env.MQTT_CLIENT_ID, // 하고 싶은 암호같은 이름? 예를 들어 "nestjs-microservice"
                username: process.env.MQTT_USER_NAME, // 설정한 브로커 ID
                password: process.env.MQTT_PASSWORD, // 설정한 브로커 PW
                protocol: 'mqtt',
                rejectUnauthorized: false,
              }),
  ],
...
})

이렇게 연결이 완료되면, mqtt를 사용하고 싶은 파일에 초기화를 진행해줘야하는데,

 

Module에서 MQTT 브로커에 연결을 해 주었는데 왜 또 초기화를 진행하나요?

라고 생각하실 수 있습니다.

왜냐하면 MQTT 브로커에 연결을 진행하였더라도 아직 해당 MQTT 브로커와의 통신에 관한 정의를 해주지 않았기 때문입니다. 그렇기 때문에 사용하고 싶은 파일에 OnModuleInit을 implements 해줄 겁니다.

 

 

import { CreateManualDto } from './dto/create-manual.dto';
import { Injectable, OnModuleInit } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { ManualRepository } from './manual.repository';
import { Manual_Entity } from './manual.entity';
import { MqttClient, connect } from 'mqtt';

@Injectable()
export class ManualService implements OnModuleInit {
  private client: MqttClient;
 
  constructor(
    @InjectRepository(ManualRepository)
    private manualRepository: ManualRepository,
  ) {}
 
  async onModuleInit() { //해당 MQTT 브로커 초기화
    this.client = connect(`mqtt://${process.env.MQTT_HOST}:${process.env.MQTT_PORT}`, { //MQTT 브로커 연결 한번 더
      clientId: process.env.MQTT_CLIENT_ID,
      username: process.env.MQTT_USER_NAME,
      password: process.env.MQTT_PASSWORD,
      protocol: 'mqtt',
      rejectUnauthorized: false,
    });
 
    console.log(this.client);
    this.client.on('connect', () => { // 브로커에 대한 연결이 성공하면 알려줌.
      this.client.subscribe('MQTT SERVER', (err) => {
        if (err) {
          console.log(`error subscribing to MQTT SERVER`, err);
        } else {
          console.log(`successfully subscribed to MQTT SERVER`);
        }
      })
    });
   

    this.client.on('message', async (topic, message) => { // 라즈베리 파이에서 온 MQTT 브로커 통신을 이렇게 받음.
      console.log(`Received a message on topic "${topic}": ${message.toString()}`);
   
    this.client.publish(`/보낼려하는 주소`, '{"보낼 key" : "보낼 value"}',{qos : 1});
   
  }
}

이런 식으로 구독을 하고 받을 때는 this.client.on
보낼 때는 this.client.publish

'it > nestjs' 카테고리의 다른 글

Next.js( react-slick )  (1) 2023.03.23
JWT 순서  (3) 2023.02.16
JWT Token  (0) 2023.02.02
typescript로 날씨 api 가져오기  (0) 2023.01.19
Nest.js 구글 로그인(1)  (1) 2023.01.11

댓글