node js xuất MQTT và KEP OPC đọc
- Sao chép liên kết
- Chia sẻ với Facebook
- Chia sẻ với X
- Chia sẻ với Pinterest
- Chia sẻ với Linkedin
- Gửi bài qua Email
gửi email cho tác giả
OK 👍 hình bạn gửi KHÔNG phải “tạo tag trong broker” mà là:
MQTT Broker (Mosquitto) chỉ lưu & phân phối topic
👉 Topicnickybaby+ dữ liệu thời gian là do 1 client PUBLISH lên
Bây giờ mình chỉ bạn 3 cách chuẩn để tạo topic nickybaby có Minute / Second như hình.
🧠 Hiểu đúng trước (rất quan trọng)
-
❌ MQTT Broker KHÔNG tự sinh tag
-
✅ Client (NodeJS / Python / FUXA / MQTT Explorer) → publish
-
✅ MQTT Explorer chỉ là tool xem
Luồng:
Client (publish) → Mosquitto Broker → MQTT Explorer (subscribe)
✅ CÁCH 1 — TẠO NHANH NHẤT (MQTT Explorer)
Dùng luôn MQTT Explorer để publish dữ liệu thời gian.
🔹 Bước 1: Kết nối broker
Host: 127.0.0.1
Port: 1883
TLS: OFF
🔹 Bước 2: Publish topic nickybaby
-
Topic:
nickybaby
-
Payload (chọn json):
{
"d": {
"Second": 57,
"Minute": 24
},
"ts": "2026-02-04T10:24:57"
}
👉 Bấm PUBLISH
➡️ Ngay lập tức bạn sẽ thấy nickybaby xuất hiện bên trái giống hình.
⚠️ Cách này thủ công, không tự chạy.
✅ CÁCH 2 — TỰ ĐỘNG CHẠY THỜI GIAN (KHUYÊN DÙNG)
Dùng Node.js publish mỗi giây / mỗi phút.
🔹 Bước 1: Cài thư viện
npm install mqtt
🔹 Bước 2: Code tạo topic nickybaby
const mqtt = require("mqtt");
const client = mqtt.connect("mqtt://127.0.0.1:1883");
client.on("connect", () => {
console.log("Connected to MQTT Broker");
setInterval(() => {
const now = new Date();
const payload = {
d: {
Second: now.getSeconds(),
Minute: now.getMinutes()
},
ts: now.toISOString()
};
client.publish("nickybaby", JSON.stringify(payload));
}, 1000); // mỗi 1 giây
});
🔹 Bước 3: Chạy
node time_pub.js
👉 MQTT Explorer sẽ hiện:
nickybaby
└─ d.Second
└─ d.Minute
└─ ts
✔ Giống hình bạn gửi 99%
✅ CÁCH 3 — DÙNG FUXA (nếu bạn đang dùng SCADA)
Nếu bạn muốn FUXA xuất MQTT:
🔹 FUXA → MQTT Client
-
Mode: Publish
-
Topic:
nickybaby -
Payload template:
{
"d": {
"Second": ${Second},
"Minute": ${Minute}
},
"ts": "${ISOTime}"
}
👉 Map Second, Minute từ tag internal (script)
❗ Lỗi thường gặp
| Lỗi | Nguyên nhân |
|---|---|
| Không thấy topic | Không có client publish |
| Thấy topic nhưng không cập nhật | Client publish 1 lần |
| JSON không bung cây | Payload không phải JSON |
| Mất data khi restart | Chưa bật retain |
🔥 Mẹo giống hệt hình
-
QoS:
0 -
Retain: ✅ bật
-
JSON format
-
Publish liên tục
👉 Bạn muốn làm theo cách nào?
1️⃣ Test nhanh bằng MQTT Explorer
2️⃣ Tự động bằng NodeJS
3️⃣ Xuất từ FUXA (SCADA)
Nói mình chọn số mấy, mình hướng dẫn chi tiết từng click 👌
À, lỗi này rất chuẩn bài Node.js luôn 👍
Đọc lỗi là biết ngay bạn khai báo client TRÙNG TÊN trong cùng file.
❌ Lỗi đang gặp
SyntaxError: Identifier 'client' has already been declared
👉 Nghĩa là trong file index.js của bạn đã có 1 biến client rồi, và bạn lại khai báo thêm:
const client = mqtt.connect("mqtt://127.0.0.1:1883");
Node.js không cho phép khai báo const 2 lần cùng tên trong cùng scope.
✅ CÁCH SỬA (3 cách – chọn 1)
🔹 CÁCH 1 (ĐƠN GIẢN NHẤT – KHUYÊN DÙNG)
👉 Đổi tên biến mới
const mqttClient = mqtt.connect("mqtt://127.0.0.1:1883");
mqttClient.on("connect", () => {
console.log("Connected to MQTT Broker");
});
✔ Không đụng biến client cũ
✔ An toàn nhất
🔹 CÁCH 2 (XÓA KHAI BÁO CŨ)
Tìm trong index.js dòng nào có:
const client = ...
👉 chỉ giữ lại 1 chỗ duy nhất
❌ Không được có 2 dòng:
const client = ...
const client = ...
🔹 CÁCH 3 (NẾU FILE DÀI – TÁCH RIÊNG)
Tạo file mới:
📄 mqtt_time_pub.js
const mqtt = require("mqtt");
const client = mqtt.connect("mqtt://127.0.0.1:1883");
client.on("connect", () => {
setInterval(() => {
const now = new Date();
const payload = {
d: {
Second: now.getSeconds(),
Minute: now.getMinutes()
},
ts: now.toISOString()
};
client.publish("nickybaby", JSON.stringify(payload));
}, 1000);
});
Chạy:
node mqtt_time_pub.js
✔ Không đụng code cũ
✔ Dễ debug
🔍 MẸO TÌM LỖI NHANH
Trong VS Code:
-
Ctrl + F -
gõ:
const client -
Nếu thấy 2 dòng trở lên → chính là lỗi
✅ Sau khi sửa đúng
MQTT Explorer sẽ thấy:
nickybaby
├─ d
│ ├─ Second
│ └─ Minute
└─ ts
👉 Cho mình hỏi nhanh 1 câu để hỗ trợ đúng hơn:
Bạn đang:
1️⃣ Gộp MQTT vào project NodeJS cũ
2️⃣ Hay chỉ test MQTT riêng?
Mình sẽ chỉnh code đúng cấu trúc project của bạn, không bị lỗi nữa 👍
OK 👍 vậy chỉ cần đổi đúng topic thành nickybaby/data2 là xong.
Mình đưa code chuẩn – gọn – không lỗi trùng client cho bạn luôn.
✅ Code Node.js publish topic nickybaby/data2
👉 Dùng file riêng (khuyên dùng) để tránh lỗi trùng biến.
📄 mqtt_time_pub.js
const mqtt = require("mqtt");
// đổi tên biến để tránh trùng
const mqttClient = mqtt.connect("mqtt://127.0.0.1:1883");
mqttClient.on("connect", () => {
console.log("✅ Connected to MQTT Broker");
setInterval(() => {
const now = new Date();
const payload = {
d: {
Second: now.getSeconds(),
Minute: now.getMinutes()
},
ts: now.toISOString()
};
mqttClient.publish(
"nickybaby/data2",
JSON.stringify(payload),
{ qos: 0, retain: true }
);
}, 1000); // mỗi 1 giây
});
▶️ Chạy
node mqtt_time_pub.js
👀 Kết quả trong MQTT Explorer
Bên trái bạn sẽ thấy đúng cấu trúc:
nickybaby
└─ data2
├─ d
│ ├─ Second
│ └─ Minute
└─ ts
✔ Giống hệt hình bạn gửi
✔ Có Minute / Second
✔ Có timestamp
✔ Broker chỉ là Mosquitto (không cần cấu hình gì thêm)
❗ Nếu KHÔNG thấy topic
Check nhanh:
-
Mosquitto đang chạy chưa?
net start mosquitto
-
MQTT Explorer kết nối đúng chưa?
Host: 127.0.0.1
Port: 1883
TLS: OFF
-
Không có lỗi trong console NodeJS
🔥 Mở rộng (khi bạn cần)
-
Muốn publish mỗi phút → đổi
1000thành60000 -
Muốn gửi thêm
Hour,Day -
Muốn FUXA đọc topic này
-
Muốn ThingsBoard subscribe topic này
👉 Chỉ cần nói: “tôi muốn FUXA / ThingsBoard đọc topic này”
mình chỉ tiếp từng bước, không sót 1 click nào 👌

