三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

保姆级教程:用MQTT.fx的JS脚本5分钟模拟智能家居设备联动

保姆级教程:用MQTT.fx的JS脚本5分钟模拟智能家居设备联动

用MQTT.fx脚本引擎5分钟构建智能家居仿真测试环境

在物联网开发中,设备联动的调试往往需要真实硬件配合,这不仅增加测试成本,还会拖慢开发节奏。MQTT.fx内置的Nashorn JavaScript引擎为解决这个问题提供了优雅方案——通过编写简单的脚本,就能模拟出完整的设备行为逻辑。本文将演示如何用不到50行代码实现灯光感应联动、环境数据上报等典型智能家居场景的自动化测试。

1. 环境准备与基础配置

1.1 初始化MQTT连接

首先在MQTT.fx中创建到broker的连接配置文件。关键参数包括:

Broker Address: test.mosquitto.org // 公共测试服务器 Port: 1883 // 非加密端口 Client ID: simulator_001 // 唯一标识符

提示:生产环境建议启用TLS加密,本文使用公共服务器仅作演示

1.2 脚本编辑器入口

通过顶部菜单栏的"Scripting"按钮打开JS编辑器,界面主要分为:

  • 代码区:编写Nashorn兼容的JavaScript代码
  • 输出窗口:显示脚本执行日志
  • 动作管理:创建定时/触发式执行任务

2. 基础设备模拟实现

2.1 单一设备状态上报

以下代码模拟温度传感器每2秒上报一次数据:

var Thread = Java.type("java.lang.Thread"); function startReporting() { while(true) { var temp = (Math.random() * 10 + 20).toFixed(1); // 生成20-30℃随机值 mqttManager.publish("home/livingroom/temperature", temp); Thread.sleep(2000); } } // 启动脚本 startReporting();

2.2 多设备协同工作

添加光照传感器与智能灯泡的联动逻辑:

var lightStatus = "OFF"; function checkLightCondition() { var lux = Math.random() * 1000; // 模拟0-1000lux光照度 if(lux < 50 && lightStatus == "OFF") { mqttManager.publish("home/livingroom/light/switch", "ON"); lightStatus = "ON"; } else if(lux >= 50 && lightStatus == "ON") { mqttManager.publish("home/livingroom/light/switch", "OFF"); lightStatus = "OFF"; } } // 每1秒检测一次环境光 setInterval(checkLightCondition, 1000);

3. 高级仿真技巧

3.1 设备异常状态模拟

真实设备常会出现网络抖动或异常数据,可通过以下模式模拟:

function simulateNetworkIssue() { // 10%概率产生异常数据 if(Math.random() > 0.9) { mqttManager.publish("home/bedroom/humidity", "ERROR"); } else { mqttManager.publish("home/bedroom/humidity", (Math.random() * 30 + 40).toFixed(1)); } } // 带重试机制的发布函数 function safePublish(topic, payload, retryCount=3) { try { mqttManager.publish(topic, payload); } catch(e) { if(retryCount > 0) { Thread.sleep(500); safePublish(topic, payload, retryCount-1); } } }

3.2 复杂场景编排

使用JSON格式消息实现多设备场景联动:

场景模式触发条件执行动作
睡眠模式手机位置"卧室"且时间>22:00关闭所有灯光,空调调至26℃
离家模式门锁状态"锁定"持续5分钟关闭非必要电器,安防摄像头启动
function executeScene(sceneName) { var scenes = { "goodnight": { "topics": ["home/bedroom/light", "home/livingroom/ac"], "payloads": ["OFF", "26"] }, "leave_home": { "topics": ["home/kitchen/fridge", "home/security/camera"], "payloads": ["ECO_MODE", "ARMED"] } }; scenes[sceneName].topics.forEach((topic, index) => { mqttManager.publish(topic, scenes[sceneName].payloads[index]); }); }

4. 调试与性能优化

4.1 消息追踪技巧

在脚本中添加调试输出:

function debugPublish(topic, payload) { output.print("[DEBUG] Publishing to " + topic + ": " + payload); mqttManager.publish(topic, payload); }

4.2 负载测试对比

手动操作与脚本执行的效率差异:

测试项手动操作(次/分钟)脚本执行(次/分钟)
单设备发布15-20500+
多设备联动5-8300+
异常重试需人工干预自动处理

4.3 脚本性能优化建议

  • 使用setInterval替代while+sleep循环
  • 批量消息采用JSON数组格式减少发布次数
  • 高频数据启用QoS 0级别提升吞吐量

5. 实战案例:智能花园系统

完整模拟包含以下设备的系统:

// 土壤湿度传感器 function soilMonitor() { setInterval(() => { var moisture = (Math.random() * 50 + 20).toFixed(1); var data = JSON.stringify({ value: moisture, unit: "%", timestamp: new Date().getTime() }); mqttManager.publish("garden/soil/moisture", data); }, 30000); // 每30秒上报 } // 自动灌溉控制 function irrigationControl() { mqttManager.subscribe("garden/soil/moisture", (topic, payload) => { var data = JSON.parse(payload); if(data.value < 30) { mqttManager.publish("garden/valve/control", "OPEN"); setTimeout(() => { mqttManager.publish("garden/valve/control", "CLOSE"); }, 5000); // 浇水5秒 } }); } // 启动所有组件 soilMonitor(); irrigationControl();
← 返回列表