| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- const express = require('express');
- const WebhookService = require('../webhook/webhookService');
- const logger = require('../logger');
- const router = express.Router();
- // Webhook 路由
- router.post('/webhook', (req, res) => {
- const eventData = req.body;
- const eventType = eventData.event;
- logger.info(`收到 Webhook 事件: ${eventType}`);
- logger.debug('事件数据:', JSON.stringify(eventData, null, 2));
- // 根据事件类型处理不同的事件
- switch (eventType) {
- case 'client.connected':
- case 'client.disconnected':
- logger.info(`处理设备${eventType}事件`);
- WebhookService.handleDeviceEvent(eventData);
- break;
- case 'switch_status_update':
- logger.info(`处理开关状态更新: 设备=${eventData.clientid}`);
- WebhookService.handleSwitchEvent(eventData);
- break;
- case 'client.check_authn_complete':
- logger.info(`处理认证检查完成事件: 客户端=${eventData.clientid}`);
- logger.debug('认证结果:', eventData.result);
- break;
- case 'session.subscribed':
- logger.info(`处理会话订阅事件: 客户端=${eventData.clientid}, 主题=${eventData.topic}`);
- break;
- case 'message.delivered':
- logger.info(`处理消息投递事件: 客户端=${eventData.clientid}, 主题=${eventData.topic}`);
- WebhookService.handleMessageDeliveredEvent(eventData);
- break;
- case 'message.publish':
- logger.info(`处理消息发布事件: 主题=${eventData.topic}`);
- // 处理不同类型的消息主题
- if (eventData.topic.includes('/temperature')) {
- logger.info('处理温度数据事件');
- WebhookService.handleTemperatureEvent(eventData);
- }
- // 如果主题以 device/ 开头并以 /relay/state 结尾,处理继电器状态事件
- else if (eventData.topic.startsWith('device/') && eventData.topic.endsWith('/relay/state')) {
- logger.info('处理继电器状态事件');
- WebhookService.handleRelayStateEvent(eventData);
- }
- // 如果主题包含 GPIO,处理 GPIO 状态事件
- else if (eventData.topic.startsWith('device/') && eventData.topic.includes('/gpio')) {
- logger.info('处理GPIO状态事件');
- WebhookService.handleGpioStateEvent(eventData);
- } else {
- logger.warn(`未处理的消息主题: ${eventData.topic}`);
- }
- break;
- case 'client.check_authz_complete':
- logger.info(`处理授权检查完成事件: 客户端=${eventData.clientid}`);
- WebhookService.handleAuthzCheckEvent(eventData);
- break;
- case 'client.connack':
- logger.info(`处理连接确认事件: 客户端=${eventData.clientid}`);
- logger.debug('连接详情:', {
- clean_start: eventData.clean_start,
- keepalive: eventData.keepalive,
- proto_ver: eventData.proto_ver
- });
- break;
- case 'message.dropped':
- logger.warn('消息丢弃事件:', {
- client_id: eventData.clientid || eventData.client_id || 'unknown',
- topic: eventData.topic,
- payload: eventData.payload,
- reason: eventData.reason,
- timestamp: WebhookService.convertToBeijingTime(eventData.timestamp)
- });
- break;
- default:
- logger.warn(`未处理的事件类型: ${eventType}`);
- }
- // 返回成功响应
- logger.debug('Webhook 处理完成');
- res.status(200).json({ status: 'success' });
- });
- module.exports = router;
|