webhook.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. const express = require('express');
  2. const WebhookService = require('../webhook/webhookService');
  3. const logger = require('../logger');
  4. const router = express.Router();
  5. // Webhook 路由
  6. router.post('/webhook', (req, res) => {
  7. const eventData = req.body;
  8. const eventType = eventData.event;
  9. logger.info(`收到 Webhook 事件: ${eventType}`);
  10. logger.debug('事件数据:', JSON.stringify(eventData, null, 2));
  11. // 根据事件类型处理不同的事件
  12. switch (eventType) {
  13. case 'client.connected':
  14. case 'client.disconnected':
  15. logger.info(`处理设备${eventType}事件`);
  16. WebhookService.handleDeviceEvent(eventData);
  17. break;
  18. case 'switch_status_update':
  19. logger.info(`处理开关状态更新: 设备=${eventData.clientid}`);
  20. WebhookService.handleSwitchEvent(eventData);
  21. break;
  22. case 'client.check_authn_complete':
  23. logger.info(`处理认证检查完成事件: 客户端=${eventData.clientid}`);
  24. logger.debug('认证结果:', eventData.result);
  25. break;
  26. case 'session.subscribed':
  27. logger.info(`处理会话订阅事件: 客户端=${eventData.clientid}, 主题=${eventData.topic}`);
  28. break;
  29. case 'message.delivered':
  30. logger.info(`处理消息投递事件: 客户端=${eventData.clientid}, 主题=${eventData.topic}`);
  31. WebhookService.handleMessageDeliveredEvent(eventData);
  32. break;
  33. case 'message.publish':
  34. logger.info(`处理消息发布事件: 主题=${eventData.topic}`);
  35. // 处理不同类型的消息主题
  36. if (eventData.topic.includes('/temperature')) {
  37. logger.info('处理温度数据事件');
  38. WebhookService.handleTemperatureEvent(eventData);
  39. }
  40. // 如果主题以 device/ 开头并以 /relay/state 结尾,处理继电器状态事件
  41. else if (eventData.topic.startsWith('device/') && eventData.topic.endsWith('/relay/state')) {
  42. logger.info('处理继电器状态事件');
  43. WebhookService.handleRelayStateEvent(eventData);
  44. }
  45. // 如果主题包含 GPIO,处理 GPIO 状态事件
  46. else if (eventData.topic.startsWith('device/') && eventData.topic.includes('/gpio')) {
  47. logger.info('处理GPIO状态事件');
  48. WebhookService.handleGpioStateEvent(eventData);
  49. } else {
  50. logger.warn(`未处理的消息主题: ${eventData.topic}`);
  51. }
  52. break;
  53. case 'client.check_authz_complete':
  54. logger.info(`处理授权检查完成事件: 客户端=${eventData.clientid}`);
  55. WebhookService.handleAuthzCheckEvent(eventData);
  56. break;
  57. case 'client.connack':
  58. logger.info(`处理连接确认事件: 客户端=${eventData.clientid}`);
  59. logger.debug('连接详情:', {
  60. clean_start: eventData.clean_start,
  61. keepalive: eventData.keepalive,
  62. proto_ver: eventData.proto_ver
  63. });
  64. break;
  65. case 'message.dropped':
  66. logger.warn('消息丢弃事件:', {
  67. client_id: eventData.clientid || eventData.client_id || 'unknown',
  68. topic: eventData.topic,
  69. payload: eventData.payload,
  70. reason: eventData.reason,
  71. timestamp: WebhookService.convertToBeijingTime(eventData.timestamp)
  72. });
  73. break;
  74. default:
  75. logger.warn(`未处理的事件类型: ${eventType}`);
  76. }
  77. // 返回成功响应
  78. logger.debug('Webhook 处理完成');
  79. res.status(200).json({ status: 'success' });
  80. });
  81. module.exports = router;