사물인터넷(IoT)을 위한 표준 메시징 프로토콜
구조, 설치, 사용이 간단하고 이식성이 좋음, 가벼움, 사용자 많음
GitHub - eclipse/mosquitto: Eclipse Mosquitto - An open source MQTT broker
mosquitto
├── config
│ ├── mosquitto.conf
│ └── pwfile
│
├── data
│ └── mosquitto.db
│
├── log
└── docker-compose.yml
version: "3.7"
services:
mosquitto:
image: eclipse-mosquitto
container_name: mosquitto
restart: always
ports:
- "1883:1883"
- "9001:9001"
volumes:
- ./config:/mosquitto/config:rw
- ./data:/mosquitto/data:rw
- ./log:/mosquitto/log:rw
mosquitto.conf
mosquitto/mosquitto.conf at master · eclipse/mosquitto
allow_anonymous false
listener 1883
listener 9001
protocol websockets
persistence true
password_file /mosquitto/config/pwfile
persistence_file mosquitto.db
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
log_type all
connection_messages true
log_timestamp true
log_dest file /mosquitto/log/mosquitto.log
로그의 목적지를 설정, 이 설정은 로그를 파일로 저장하도록 함.log_type all
로그에 포함할 로그의 유형을 설정connection_messages true
클라이언트 연결 및 연결 해제 메시지를 포함할지 여부log_timestamp true
로그에 타임 스탬프 포함할지 여부pwfile
$ touch config/pwfile
$ docker-compose up -d --build
# login interactively into the mqtt container
$ docker exec -it mosquitto sh
# Create new password file and add user and it will prompt for password
$ mosquitto_passwd -c /mosquitto/config/pwfile user1
# Add additional users (remove the -c option) and it will prompt for password
$ mosquitto_passwd /mosquitto/config/pwfile user2
# delete user command format
$ mosquitto_passwd -D /mosquitto/config/pwfile <user-name-to-delete>
# type 'exit' to exit out of docker container prompt
$ docker restart mosquitto
download
conection
$ npm install mqtt --save
# or
$ yarn add mqtt
let mqttWS = useRef();
const connectMqtt = () => {
mqttWS.current = mqtt.connect("mqtt://192.168.0.200:9001", {
clientId: `web_${Math.random().toString(16).substr(2, 8)}`,
username: "user1",
password: "1234"
});
mqttWS.current.on("connect", () => {
console.log("Connected");
});
mqttWS.current.on("error", (err) => {
console.error("Connection error: ", err);
mqttWS.current.end();
});
mqttWS.current.on("reconnect", () => {
console.log("Reconnecting");
});
mqttWS.current.on("offline", () => {
console.log("Went offline");
});
mqttWS.current.on("close", () => {
console.log("Connection closed");
});
mqttWS.current.subscribe(`TOPIC/${streamId}`, 0, (error) => {
if (error) {
console.log("Subscribe to topics error", error);
return;
} else {
console.log(`Subscribe ${streamId}`);
}
});
mqttWS.current.on("message", (topic, message) => {
const payload = { topic, message: JSON.parse(message) };
if (payload.message) {
if (payload.topic === `ZONE1/CAM${streamId}`) {
const { bAlarmOccur, draw_info } = payload.message;
setDrawInfo(draw_info);
}
} else {
alert(JSON.parse(payload.message).error);
}
});
};
useEffect(() => {
connectMqtt();
return () => {
if (mqttWS.current)
mqttWS.current.end(() => {
console.log("Disconnected");
});
}
}, [])
mqttWS.current.unsubscribe(`TOPIC/${streamId}`, (error) => {
if (error) {
console.log("Unsubscribe error", error);
} else {
console.log(`Unsubscribe ${streamId}`);
}
});
mqttWS.current.end(() => {
console.log("Disconnected");
});