| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- 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,
- };
|