const pool = require('../config/db'); const { client } = require('../mqttClient'); const logger = require('../logger'); // 控制继电器状态 const toggleRelay = async (req, res) => { const { state } = req.params; // 获取状态参数(on 或 off) const { roomId } = req.query; // 获取房间 ID logger.info(`尝试设置房间 ${roomId} 的继电器状态为 ${state}`); // 校验 state 参数 if (state.toLowerCase() !== 'on' && state.toLowerCase() !== 'off') { logger.warn(`无效的继电器状态参数: ${state}`); return res.status(400).send('无效的状态参数,请使用 "on" 或 "off"'); } // 校验 roomId 参数 if (!roomId) { logger.warn('缺少房间ID参数'); return res.status(400).send('房间 ID 不能为空'); } try { // 查询房间的继电器设备 const query = ` SELECT device_id FROM devices WHERE room_id = ? AND status = 'online' AND device_id LIKE '%ESP32%' LIMIT 1 `; const [results] = await pool.promise().query(query, [roomId]); if (results.length === 0) { logger.warn(`房间 ${roomId} 没有在线的继电器设备`); return res.status(404).send('该房间没有在线的继电器设备'); } const deviceId = results[0].device_id; const relayTopic = `device/${deviceId}/relay/control`; if (!client.connected) { logger.error('MQTT客户端未连接'); return res.status(500).send('MQTT 客户端未连接'); } // 发布 MQTT 消息 client.publish(relayTopic, state.toUpperCase(), (err) => { if (err) { logger.error('MQTT消息发送失败:', err); return res.status(500).send('发布消息失败: ' + err.message); } logger.info(`成功发送继电器控制命令: 房间=${roomId}, 状态=${state}`); res.send(`房间 ${roomId} 的继电器状态已设置为 ${state}`); }); } catch (err) { logger.error('控制继电器失败:', err); res.status(500).send('控制继电器失败'); } }; // 下发继电器ID给人体存在传感器 const sendRelayIdToSensor = async (req, res) => { const { roomId } = req.params; logger.info(`尝试为房间 ${roomId} 的人体传感器配置继电器ID`); try { // 查询房间的人体传感器和继电器设备 const query = ` SELECT (SELECT device_id FROM devices WHERE room_id = ? AND device_id LIKE '%24G-%' LIMIT 1) AS humanSensorDeviceId, (SELECT device_id FROM devices WHERE room_id = ? AND device_id LIKE '%ESP32%' LIMIT 1) AS relayDeviceId `; const [results] = await pool.promise().query(query, [roomId, roomId]); if (!results[0].humanSensorDeviceId) { logger.warn(`房间 ${roomId} 未绑定人体传感器模块`); return res.status(404).json({ success: false, message: '该房间未绑定人体传感器模块' }); } if (!results[0].relayDeviceId) { logger.warn(`房间 ${roomId} 未绑定继电器模块`); return res.status(404).json({ success: false, message: '该房间未绑定继电器模块' }); } const { humanSensorDeviceId, relayDeviceId } = results[0]; const controlTopic = `device/${humanSensorDeviceId}/control`; // 发布 MQTT 消息 client.publish(controlTopic, relayDeviceId, (err) => { if (err) { logger.error('MQTT消息发送失败:', err); return res.status(500).json({ success: false, message: 'MQTT 消息发布失败' }); } logger.info(`成功配置继电器ID: 传感器=${humanSensorDeviceId}, 继电器=${relayDeviceId}`); res.status(200).json({ success: true, message: `已将继电器 ${relayDeviceId} 配置给人体传感器模块` }); }); } catch (error) { logger.error('配置继电器ID失败:', error); res.status(500).json({ success: false, message: '处理人体传感器模块时出错' }); } }; module.exports = { toggleRelay, sendRelayIdToSensor, };