布景

公司是做数字孪生可视化的,有一个以B/S架构为根底,围绕数字孪生全要素场景,协助用户轻松快速构建专业级数字孪生运用的专用产品

需求

客户有MQTT数据库,需求在咱们产品上面对接指标数据,由于前端通常无法直接对接MQTT数据库,因为MQTT是一种根据发布/订阅形式的轻量级通信协议,主要用于物联网设备间的通信,需求在后端完成MQTT协议的客户端,然后经过后端服务器提供的API或WebSocket等方法向前端传输数据。

完成

本次运用Node.js作为后端来读取MQTT的数据,然后将其转化成API接口的形式回来给前端。

前期预备

前期预备包含以下两个过程:

  1. 创立一个Node.js服务。
  2. 与客户确认MQTT数据中台的地址、端口号、用户名、暗码和订阅话题等信息。

建立Node服务

  1. 安装Node.js,能够从官网下载安装包并按照提示安装。
  2. 在本地创立一个项目文件夹,并在终端中进入该文件夹。
  3. 运转 npm init 指令来初始化项目,并生成 package.json 文件。
  4. 安装 express 结构:npm install express --save
  5. 创立一个名为 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!” 字样。

  1. 在终端中运转 node app.js 指令发动服务。

衔接MQTT数据库

  1. 在node根目录创立一个subscribe.js文件
  2. 刺进以下代码
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);
});
  1. 最终,在终端中运转 node subscribe.js 发动服务。就能够在根目录看到my.json文件而且现已把数据写入了。
  2. 至此,mqtt数据读取并保存到本地已完毕。

转化成API接口

  1. 在建立node服务时现已安装了Express结构,这儿运用Express创立路由。
  2. 创立路由文件并编写路由处理函数。例如,在 /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;
  1. 在主文件(app.js)中引进路由文件,并将其注册到 Express 运用程序中。能够刺进以下代码
const readMqtt = require('./routes/readMqtt');
// 注册该路由
app.use('/readMqtt', readMqtt);
  1. 最终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.'); });
  1. 在浏览器中拜访拜访 http://localhost:3000/readMqtt 就能够看到转化后的数据啦。

或许遇到的问题

前端调用时或许会报跨域的过错,Node.js 能够经过设置 HTTP 呼应头来支撑跨域恳求。以下是两种常用的设置方法:

  1. 运用 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 中间件会答应所有源的恳求。假如需求指定答应的源,能够经过传递一个装备对象来完成。

  1. 手动设置呼应头

也能够手动设置呼应头来支撑跨域恳求,示例如下:
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协议,详细如何装备在这儿就不过多论述了。