布景
公司是做数字孪生可视化的,有一个以B/S架构为根底,围绕数字孪生全要素场景,协助用户轻松快速构建专业级数字孪生运用的专用产品。
需求
客户有MQTT数据库,需求在咱们产品上面对接指标数据,由于前端通常无法直接对接MQTT数据库,因为MQTT是一种根据发布/订阅形式的轻量级通信协议,主要用于物联网设备间的通信,需求在后端完成MQTT协议的客户端,然后经过后端服务器提供的API或WebSocket等方法向前端传输数据。
完成
本次运用Node.js作为后端来读取MQTT的数据,然后将其转化成API接口的形式回来给前端。
前期预备
前期预备包含以下两个过程:
- 创立一个Node.js服务。
- 与客户确认MQTT数据中台的地址、端口号、用户名、暗码和订阅话题等信息。
建立Node服务
- 安装Node.js,能够从官网下载安装包并按照提示安装。
- 在本地创立一个项目文件夹,并在终端中进入该文件夹。
- 运转
npm init
指令来初始化项目,并生成package.json
文件。 - 安装
express
结构:npm install express --save
。 - 创立一个名为
app.js
的文件,并在其间编写代码。
const express = require('express');
const app = express();
app.get('/', (req, res) => { res.send('Hello World!'); });
app.listen(3000, () => { console.log('Server is running on port 3000.'); });
上述代码中,咱们运用了 express
结构,创立了一个简略的路由 /
,并在监听端口 3000
。运转 node app.js
发动服务后,拜访 http://localhost:3000/
就能够看到 “Hello World!” 字样。
- 在终端中运转
node app.js
指令发动服务。
衔接MQTT数据库
- 在node根目录创立一个subscribe.js文件
- 刺进以下代码
const mqtt = require("mqtt");
const fs = require('fs');
const options = {
username: "aiwater@WT",
password: "Tenlink@123"
};
// 创立MQTT客户端并衔接MQTT代理服务器
const client = mqtt.connect("mqtt:/example.com:1883", options);
// 监听MQTT客户端衔接成功事情
client.on("connect", () => {
console.log("Connected to MQTT broker.");
// 订阅MQTT主题并在订阅完成后执行回调函数
client.subscribe("aiwater/mendix/p", (err) => {
if (err) {
console.error("Failed to subscribe to topic:", err);
} else {
console.log("Subscribed to topic successfully.");
}
});
});
// 监听MQTT客户端接纳到音讯事情
// MQTT协议的音讯内容是一个Buffer对象,而不是字符串。Buffer对象是Node.js中表示二进制数据的标准方法。因而,假如需求读取MQTT音讯内容,则需求运用toString()将Buffer对象转化为字符串。
client.on("message", (topic, message) => {
const DATA_PATH = 'D://temp/my.json'; // 数据文件位置 会在该目录创立该json文件
let mqttData = message.toString(); //接纳mqtt数据
let b = fs.existsSync(DATA_PATH);
// 检查是否存在指定的JSON文件。假如存在,则运用fs.writeFileSync()方法向该文件写入音讯内容;假如不存在,则创立该文件并向其间写入音讯内容。
if (b) {
fs.writeFileSync(DATA_PATH, mqttData);
} else {
let fd = fs.openSync(DATA_PATH, 'w');
fs.writeFileSync(fd, mqttData);
}
});
client.on("error", (err) => {
console.error("An error occurred:", err);
});
- 最终,在终端中运转
node subscribe.js
发动服务。就能够在根目录看到my.json文件而且现已把数据写入了。 - 至此,mqtt数据读取并保存到本地已完毕。
转化成API接口
- 在建立node服务时现已安装了Express结构,这儿运用Express创立路由。
- 创立路由文件并编写路由处理函数。例如,在
/routes/readMqtt.js
文件中,定义了一个/readMqtt
路由,并在其间编写了 GET 恳求的处理函数:(没有routes文件夹需在根目录手动创立)。并刺进以下代码。
var express = require('express');
var router = express.Router();
const fs = require('fs');
const DATA_PATH = 'D://temp/my.json'; //此处应和衔接MQTT数据库时创立的途径一致
router.get('/', function(req, res, next) {
let buffer = fs.readFileSync(DATA_PATH,'utf8');
let data = JSON.parse(buffer);
res.json(data)
});
module.exports = router;
- 在主文件(
app.js
)中引进路由文件,并将其注册到 Express 运用程序中。能够刺进以下代码
const readMqtt = require('./routes/readMqtt');
// 注册该路由
app.use('/readMqtt', readMqtt);
- 最终app.js文件如下
const express = require('express');
const app = express();
app.get('/', (req, res) => { res.send('Hello World!'); });
const readMqtt = require('./routes/readMqtt');
// 注册该路由
app.use('/readMqtt', readMqtt);
app.listen(3000, () => { console.log('Server is running on port 3000.'); });
- 在浏览器中拜访拜访
http://localhost:3000/readMqtt
就能够看到转化后的数据啦。
或许遇到的问题
前端调用时或许会报跨域的过错,Node.js 能够经过设置 HTTP 呼应头来支撑跨域恳求。以下是两种常用的设置方法:
- 运用 CORS 中间件
能够运用 cors
中间件来处理跨域恳求,运用方法如下:
const express = require('express');
const cors = require('cors');
const app = express();
app.use(cors()); // 答应所有源的恳求
// 或者指定答应的源
const corsOptions = { origin: 'http://example.com' };
app.use(cors(corsOptions));
上述代码中,咱们首要引进了 cors
模块,并在运用程序中运用了该模块作为中间件。默认情况下, cors
中间件会答应所有源的恳求。假如需求指定答应的源,能够经过传递一个装备对象来完成。
- 手动设置呼应头
也能够手动设置呼应头来支撑跨域恳求,示例如下:
const express = require(‘express’);
const app = express();
app.get(‘/’, (req, res) => {
res.header(‘Access-Control-Allow-Origin’, ‘*’); // 答应所有源的恳求
// res.header(‘Access-Control-Allow-Origin’, ‘example.com’); // 指定答应的源
res.send(‘Hello World!’);
});
app.listen(3000, () => {
console.log(‘Server is running on port 3000.’);
});
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.header('Access-Control-Allow-Origin', '*'); // 答应所有源的恳求
// res.header('Access-Control-Allow-Origin', 'http://example.com'); // 指定答应的源
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000.');
});
上述代码中,在处理恳求时,咱们手动设置了 Access-Control-Allow-Origin
呼应头,答应所有源的恳求。假如需求指定答应的源,能够将 *
替换为详细的域名。
小结
代码到这儿,前端对接MQTT数据库就完成了,假如要运用到实践项目中,能够将node服务部署到windows或Linux的公网服务器上,一起node服务也支撑https协议,详细如何装备在这儿就不过多论述了。