From 7885cede659f3255be56f77c1eef2ada7387d6f1 Mon Sep 17 00:00:00 2001
From: chenyc <501753378@qq.com>
Date: 星期日, 22 三月 2026 16:23:21 +0800
Subject: [PATCH] 初始化项目
---
src/index.js | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 105 insertions(+), 0 deletions(-)
diff --git a/src/index.js b/src/index.js
new file mode 100644
index 0000000..d48f58f
--- /dev/null
+++ b/src/index.js
@@ -0,0 +1,105 @@
+// 整个网关程序的入口文件
+// 负责:
+// 1)初始化各个核心模块(缓存、限流、物模型映射、MQTT、阿里云等);
+// 2)创建 TCP Socket 服务,用于接收透析机数据;
+// 3)创建 HTTP 服务,对外提供查询与运维接口;
+// 4)统一处理优雅关闭逻辑(Ctrl+C / 进程退出信号)。
+
+const logger = require("./logger");
+const config = require("./config");
+const DataCache = require("./dataCache");
+const RateLimiter = require("./rateLimiter");
+const PropertyMapper = require("./propertyMapper");
+const createMqttClient = require("./mqttClient");
+const createAliyunManager = require("./aliyunClient");
+const createTcpServer = require("./tcpServer");
+const createHttpServer = require("./httpServer");
+
+function main() {
+ // 进程级兜底:记录未捕获异常,避免因为单点问题导致静默退出
+ process.on("uncaughtException", (err) => {
+ logger.error("uncaughtException", err && (err.stack || err.message || err));
+ });
+ process.on("unhandledRejection", (reason) => {
+ logger.error("unhandledRejection", reason && (reason.stack || reason.message || reason));
+ });
+
+ // 启动日志,方便从日志文件中定位一次完整的运行周期
+ logger.info("Starting SWS Communication Gateway...");
+
+ // 初始化核心业务模块
+ // dataCache:按设备号缓存“最新一帧”透析机数据
+ // rateLimiter:HTTP 接口访问限流
+ // propertyMapper:协议字段到物模型属性的映射
+ const dataCache = new DataCache();
+ const rateLimiter = new RateLimiter();
+ const propertyMapper = new PropertyMapper();
+
+ // 创建 MQTT 客户端(可通过配置开启/关闭)
+ // publishDeviceData:对外暴露的简单发布函数
+ const { client: mqttClient, publishDeviceData } = createMqttClient();
+
+ // 启动时输出阿里云传输开关状态,便于现场快速确认配置是否生效
+ if (config.aliyun && config.aliyun.enabled) {
+ logger.info("Aliyun IoT transfer enabled", {
+ baseURL: config.aliyun.baseURL
+ });
+ } else {
+ logger.info("Aliyun IoT transfer disabled by config");
+ }
+
+ // 阿里云物联网对接管理器
+ // 封装:根据设备号自动获取三元组、建立连接,并在收到数据时上报属性
+ const aliyunManager = createAliyunManager({ propertyMapper });
+
+ // 创建 TCP Socket 服务器
+ // - dataCache:在 onFrameParsed 时写入最新一帧数据
+ // - mqttPublisher:可选,解析成功后往 MQTT 推送
+ // - aliyunReporter:可选,解析成功后上报阿里云物联网
+ const { server: tcpServer, deviceManager } = createTcpServer({
+ dataCache,
+ mqttPublisher: config.mqtt && config.mqtt.enabled ? publishDeviceData : null,
+ aliyunReporter:
+ config.aliyun && config.aliyun.enabled
+ ? (deviceNumber, data) => aliyunManager.reportDeviceData(deviceNumber, data)
+ : null
+ });
+
+ // 创建 HTTP 服务,对外提供数据查询与运维接口
+ const httpServer = createHttpServer({
+ dataCache,
+ rateLimiter,
+ propertyMapper,
+ deviceManager
+ });
+
+ // 统一的优雅退出逻辑:
+ // - 关闭 TCP / HTTP 监听
+ // - 断开 MQTT / 阿里云连接
+ // - 最后退出进程
+ function shutdown() {
+ logger.warn("Shutting down gateway...");
+ try {
+ if (tcpServer) tcpServer.close();
+ } catch (e) {}
+ try {
+ if (httpServer) httpServer.close();
+ } catch (e) {}
+ try {
+ if (mqttClient) mqttClient.end(true);
+ } catch (e) {}
+ try {
+ if (aliyunManager && typeof aliyunManager.closeAll === "function") {
+ aliyunManager.closeAll();
+ }
+ } catch (e) {}
+ process.exit(0);
+ }
+
+ // 进程信号监听:在 Ctrl+C 或系统退出时触发优雅关闭
+ process.on("SIGINT", shutdown);
+ process.on("SIGTERM", shutdown);
+}
+
+// 直接启动主函数
+main();
--
Gitblit v1.8.0