// server.js
|
const express = require('express');
|
const bodyParser = require('body-parser');
|
const morgan = require('morgan');
|
const logger = require('./logger');
|
const { getTripleByMac, publishToIot } = require('./aliyun-iot');
|
const hmConfig = require('./hmConfig.json');
|
|
const app = express();
|
const PORT = hmConfig.port || 13000;
|
process.env.IOT_REGION = hmConfig.iotRegion || 'cn-shanghai';
|
|
// 日志中间件
|
app.use(morgan('combined', {
|
stream: { write: (msg) => logger.info(msg.trim()) }
|
}));
|
|
// 解析 JSON
|
app.use(bodyParser.json());
|
|
// 接收设备数据
|
app.post('/api/message', async (req, res) => {
|
const { MAC, IP, DataBase } = req.body;
|
console.log(req.body);
|
if (!MAC || !IP || !DataBase) {
|
return res.status(400).json({
|
success: false,
|
message: '缺少必要字段: MAC, ip, data'
|
});
|
}
|
|
const logMeta = { deviceMac: MAC, deviceIp: IP };
|
|
logger.info(` 收到设备数据`, logMeta);
|
|
try {
|
// 1. 获取三元组
|
const triple = await getTripleByMac(MAC);
|
|
// 2. 转发数据到阿里云 IoT
|
publishToIot(triple, DataBase,logMeta);
|
|
res.status(200).json({
|
success: true,
|
message: '数据接收并转发成功',
|
deviceId: `${triple.productKey}/${triple.deviceName}`
|
});
|
} catch (error) {
|
logger.error(`处理数据失败`, { ...logMeta, error: error.message });
|
res.status(500).json({
|
success: false,
|
message: '内部错误'
|
});
|
}
|
});
|
|
// 健康检查
|
app.get('/health', (req, res) => {
|
res.json({
|
status: 'OK',
|
clients: deviceClients?.size || 0,
|
cacheSize: tripleCache?.size || 0,
|
timestamp: new Date().toISOString()
|
});
|
});
|
|
// 启动服务
|
app.listen(PORT, () => {
|
logger.info(`透析机数据服务启动`, { port: PORT });
|
});
|