gx
chenyc
2025-12-10 1daaf55ceac01b00be25aecc7efb57cf47a34155
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// 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 });
});