package ece448.iot_sim; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Simulate a smart plug with power monitoring. */ public class PlugSim { private final String name; private boolean on = false; private double power = 0; // in watts public PlugSim(String name) { this.name = name; } /** * No need to synchronize if read a final field. */ public String getName() { return name; } /** * Switch the plug on. */ synchronized public void switchOn() { // P1: add your code here on = true; } /** * Switch the plug off. */ synchronized public void switchOff() { // P1: add your code here on = false; } /** * Toggle the plug. */ synchronized public void toggle() { // P1: add your code here on = !on; } /** * Measure power. */ synchronized public void measurePower() { if (!on) { updatePower(0); return; } // a trick to help testing if (name.indexOf(".") != -1) { updatePower(Integer.parseInt(name.split("\\.")[1])); } // do some random walk else if (power < 100) { updatePower(power + Math.random() * 100); } else if (power > 300) { updatePower(power - Math.random() * 100); } else { updatePower(power + Math.random() * 40 - 20); } } protected void updatePower(double p) { power = p; logger.debug("Plug {}: power {}", name, power); } /** * Getter: current state */ synchronized public boolean isOn() { return on; } /** * Getter: last power reading */ synchronized public double getPower() { return power; } private static final Logger logger = LoggerFactory.getLogger(PlugSim.class);

时间: 2024-02-14 20:21:53 浏览: 78
这段代码是用 Java 实现的模拟智能插座并进行电力监测。其中,PlugSim 类包括以下方法: - switchOn():开启插座; - switchOff():关闭插座; - toggle():切换插座状态; - measurePower():测量电力; - isOn():获取当前插座状态; - getPower():获取上次电力读数。 这些方法都被 synchronized 修饰,以确保线程安全。类的属性包括插座名称(name)、插座状态(on)和电力(power)。measurePower() 方法中,如果插座未开启,则电力为 0;否则,电力会根据一定规则进行变动。最后,updatePower() 方法用于更新电力读数,并使用 logger 对象打印日志。
相关问题

> Task :compileTestJava FAILED /home/ubuntu/iot_ece448/src/test/java/ece448/iot_sim/HTTPCommandsTests.java:16: error: unreported exception Exception; must be caught or declared to be thrown String ret = get("/xxxx"); ^

这个错误是由于你在调用 `get("/xxxx")` 方法时,该方法可能会抛出 `Exception` 异常,但是你没有在代码中处理这个异常。 你需要使用 `try-catch` 块来处理这个异常,或者在方法的声明中使用 `throws Exception` 来声明该方法可能会抛出 `Exception` 异常。 例如: ``` try { String ret = get("/xxxx"); // 处理返回值 } catch (Exception e) { // 处理异常 } ``` 或者在方法的声明中声明可能会抛出 `Exception` 异常: ``` public void someMethod() throws Exception { String ret = get("/xxxx"); // 处理返回值 } ``` 请注意,这只是一个示例,具体的处理方式取决于你的业务逻辑和代码结构。

package ece448.iot_sim; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ece448.iot_sim.http_server.RequestHandler; public class HTTPCommands implements RequestHandler { // Use a map so we can search plugs by name. private final TreeMap<String, PlugSim> plugs = new TreeMap<>(); public HTTPCommands(List<PlugSim> plugs) { for (PlugSim plug: plugs) { this.plugs.put(plug.getName(), plug); } } @Override public String handleGet(String path, Map<String, String> params) { // list all: / // do switch: /plugName?action=on|off|toggle // just report: /plugName logger.info("HTTPCmd {}: {}", path, params); if (path.equals("/")) { return listPlugs(); } PlugSim plug = plugs.get(path.substring(1)); if (plug == null) return null; // no such plug String action = params.get("action"); if (action == null) return report(plug); // P2: add your code here, modify the next line if necessary if("toggle".equals(action)){ plug.toggle(); return report(plug); }else if("on".equals(action)){ plug.switchOn(); return report(plug); }else if("off".equals(action)){ plug.switchOff(); return report(plug); } return "<html><body></body></html>"; } protected String listPlugs() { StringBuilder sb = new StringBuilder(); sb.append("<html><body>"); for (String plugName: plugs.keySet()) { sb.append(String.format("<p><a href='/%s'>%s</a></p>", plugName, plugName)); } sb.append("</body></html>"); return sb.toString(); } protected String report(PlugSim plug) { String name = plug.getName(); return String.format("<html><body>" +"<p>Plug %s is %s.</p>" +"<p>Power reading is %.3f.</p>" +"<p><a href='/%s?action=on'>Switch On</a></p>" +"<p><a href='/%s?action=off'>Switch Off</a></p>" +"<p><a href='/%s?action=toggle'>Toggle</a></p>" +"</body></html>", name, plug.isOn()? "on": "off", plug.getPower(), name, name, name); }

这段代码是一个HTTP请求处理器,用于处理与插座模拟器相关的HTTP请求。它包含一个名为“plugs”的TreeMap,用于存储所有插座的名称和对应的PlugSim对象。HTTPCommands类实现了RequestHandler接口,该接口定义了处理HTTP请求的方法。handleGet方法用于处理GET请求,根据请求路径和参数执行相应的操作,比如列出所有插座、开启/关闭/切换特定插座、报告特定插座的状态和功率读数等。listPlugs方法用于生成列出所有插座的HTML响应,report方法用于生成报告特定插座状态和功率读数的HTML响应。
阅读全文

相关推荐

第一段代码 GroupsResource package ece448.lec16; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class GroupsResource { private final GroupsModel groups; public GroupsResource(GroupsModel groups) { this.groups = groups; } @GetMapping("/api/groups") public Collection<Object> getGroups() throws Exception { ArrayList<Object> ret = new ArrayList<>(); for (String group: groups.getGroups()) { ret.add(makeGroup(group)); } logger.info("Groups: {}", ret); return ret; } @GetMapping("/api/groups/{group}") public Object getGroup( @PathVariable("group") String group, @RequestParam(value = "action", required = false) String action) { if (action == null) { Object ret = makeGroup(group); logger.info("Group {}: {}", group, ret); return ret; } // modify code below to control plugs by publishing messages to MQTT broker List<String> members = groups.getGroupMembers(group); logger.info("Group {}: action {}, {}", group, action, members); return null; } @PostMapping("/api/groups/{group}") public void createGroup( @PathVariable("group") String group, @RequestBody List<String> members) { groups.setGroupMembers(group, members); logger.info("Group {}: created {}", group, members); } @DeleteMapping("/api/groups/{group}") public void removeGroup( @PathVariable("group") String group) { groups.removeGroup(group); logger.info("Group {}: removed", group); } protected Object makeGroup(String group) { // modify code below to include plug states HashMap<String, Object> ret = new HashMap<>(); ret.put("name", group); ret.put("members", groups.getGroupMembers(group)); return ret; } private static final Logger logger = LoggerFactory.getLogger(GroupsResource.class); }

import java.util.Arrays; import org.apache.http.client.fluent.Request; import ece448.iot_sim.SimConfig; import ece448.iot_sim.Main; public class GradeP2 { public static void main(String[] args) throws Exception { SimConfig config = new SimConfig( 8080, Arrays.asList("xxxx", "yyyy", "zzzz.789"), null, null, null); try (Main m = new Main(config)) { Grading.run(new GradeP2(), 10); } } private String get(String pathParams) throws Exception { return Request.Get("http://127.0.0.1:8080"+pathParams) .userAgent("Mozilla/5.0") .connectTimeout(1000) .socketTimeout(1000) .execute().returnContent().asString(); } public boolean testCase00() throws Exception { String ret = get("/xxxx"); return (ret.indexOf("xxxx is off") != -1) && (ret.indexOf("xxxx is on") == -1) && (ret.indexOf("Power reading is 0.000") != -1); } public boolean testCase01() throws Exception { String ret = get("/xxxx?action=on"); return (ret.indexOf("xxxx is on") != -1) && (ret.indexOf("xxxx is off") == -1); } public boolean testCase02() throws Exception { String ret = get("/xxxx?action=off"); return (ret.indexOf("xxxx is off") != -1) && (ret.indexOf("xxxx is on") == -1); } public boolean testCase03() throws Exception { String ret = get("/xxxx?action=on"); return (ret.indexOf("xxxx is on") != -1) && (ret.indexOf("xxxx is off") == -1); } public boolean testCase04() throws Exception { String ret = get("/xxxx?action=toggle"); return (ret.indexOf("xxxx is off") != -1) && (ret.indexOf("xxxx is on") == -1); } public boolean testCase05() throws Exception { String ret = get("/xxxx?action=toggle"); return (ret.indexOf("xxxx is on") != -1) && (ret.indexOf("xxxx is off") == -1); } public boolean testCase06() throws Exception { String ret = get("/yyyy"); return (ret.indexOf("yyyy is off") != -1) && (ret.indexOf("yyyy is on") == -1); } public boolean testCase07() throws Exception { String ret = get("/xxxx"); return (ret.indexOf("xxxx is on") != -1) && (ret.indexOf("xxxx is off") == -1); } public boolean testCase08() throws Exception { String ret = get("/zzzz.789"); return (ret.indexOf("Power reading is 0.000") != -1); } public boolean testCase09() throws Exception { get("/zzzz.789?action=on"); Thread.sleep(1500); String ret = get("/zzzz.789"); return (ret.indexOf("Power reading is 789.000") != -1); } } private static final Logger logger = LoggerFactory.getLogger(HTTPCommands.class); }请逐句解释一下上述代码

最新推荐

recommend-type

HDMI-CEC简介及其应用.doc

"HDMI-CEC简介及其应用" 一、HDMI-CEC简介 HDMI-CEC(Consumer Electronics Control),即消费电子控制,为用户环境中所有通过HDMI线连接的家庭视听设备提供高级控制功能的一种协议。用户通过一个遥控器即可对这些...
recommend-type

Windows Server 2019 IIS10.0+PHP(FastCGI)+MySQL环境搭建教程

4. **Microsoft URL 重写模块 2.0**:用于实现IIS的URL重写功能,可以从[微软下载中心](https://download.microsoft.com/download/4/E/7/4E7ECE9A-DF55-4F90-A354-B497072BDE0A/rewrite_x64_zh-CN.msi)下载。...
recommend-type

R157 有关自动车道保持系统的车辆批准的统一规定

4. **测试与认证**:车辆制造商需要按照法规进行严格的测试,证明其ALKS系统符合所有安全标准。获得批准后,车辆才能在成员国市场销售。 5. **驾驶员责任与系统限制**:法规强调了驾驶员在整个过程中仍需保持警惕,...
recommend-type

高速公路路面裂缝焊接材料及设备.pdf

高速公路路面裂缝焊接材料及设备
recommend-type

《计算机网络技术》试卷及答案.pdf

《计算机网络技术》试卷及答案.pdf
recommend-type

Twinkle Tray:轻松一招,多屏亮度管理

资源摘要信息:"Twinkle Tray 让您轻松管理多台显示器的亮度级别" 在当今的数字化工作环境中,拥有多台显示器已经成为许多用户的常态。这为用户提供了更为宽敞的视野和更高的工作空间灵活性。然而,管理多台显示器的亮度设置一直是一个挑战,因为操作系统的原生功能往往不足以满足用户的需求。Windows 10作为目前广泛使用的操作系统之一,虽然提供了调整大多数显示器背光的功能,但却存在诸多限制,尤其是对于连接的外部显示器来说,Windows 10通常不支持调整其亮度。这就是“Twinkle Tray”应用程序出现的背景。 “Twinkle Tray”是一款旨在简化多显示器亮度管理的应用程序。通过在系统托盘中添加一个图标,用户可以方便地访问并调整所有兼容显示器的亮度级别。这个应用程序的特点可以归纳为: 1. 系统托盘集成:Twinkle Tray 在系统托盘中添加了一个亮度滑块,这一设计模仿了Windows 10内置的音量控制面板,使其直观且易于使用。 2. 背光标准化:应用程序可以对不同显示器的背光进行标准化,确保在进行屏幕间切换时视觉体验保持一致。 3. 自动亮度调节:根据一天中的时间自动改变显示器的亮度,有助于减少眼睛疲劳并提升能效。 4. 与Windows 10无缝融合:Twinkle Tray与Windows 10深度集成,可以使用用户的个性化设置来匹配任务栏,保持用户界面的一致性。 5. 随Windows启动:Twinkle Tray设置为与Windows 10一同启动,确保用户在开机后能够立即使用该软件调整显示器亮度。 技术实现方面,“Twinkle Tray”应用程序是利用现代网络技术与系统API相结合的方式构建的。具体使用了以下技术组件: - Electron:一个使用JavaScript、HTML和CSS等网页技术来创建跨平台的桌面应用程序的框架。 - Node.js:一个基于Chrome V8引擎的JavaScript运行环境,允许开发者使用JavaScript编写服务器端应用程序。 - node-ddcci:一个Node.js模块,用于实现DDC/CI(Display Data Channel Command Interface)协议,该协议用于计算机与显示器之间的通信。 - wmi-client:一个Node.js模块,允许访问Windows Management Instrumentation (WMI),这是Windows系统中用于管理系统信息和控制的一种技术。 - win32-displayconfig:一个Windows平台的库,提供了直接控制显示器配置的接口。 用户可以通过twinkletray.com网站或者发布页面下载“Twinkle Tray”的最新版本。下载完成后,用户将运行一个安装程序EXE,安装完成后,系统托盘会显示Twinkle Tray图标。用户单击该图标后会显示“调整亮度”面板,通过该面板可以进行亮度设置;单击面板以外的地方可以隐藏它。右键单击系统托盘图标还会提供更多选项和设置,使用户能够精细调整应用程序的行为。 标签“Miscellaneous”(杂项)表明,该应用程序虽然专门针对显示器亮度管理,但也可以视为多功能工具箱中的一部分,因为它通过提供与系统紧密集成的便利工具来增强用户的多显示器使用体验。 总之,对于那些需要在多显示器设置中保持高效和舒适体验的用户来说,“Twinkle Tray”应用程序提供了一种便捷的解决方案,可以有效地解决Windows 10在多显示器亮度管理方面存在的不足。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【STS8200系统集成指南】:将STS8200无缝融入任何现有系统

![【STS8200系统集成指南】:将STS8200无缝融入任何现有系统](https://5.imimg.com/data5/SELLER/Default/2020/10/IJ/TE/RX/5414966/siemens-sitop-power-supply-psu8200-3-phase-1000x1000.jpg) 参考资源链接:[STS8200编程手册v3.21:ATE开发必备](https://wenku.csdn.net/doc/6401ab9acce7214c316e8d7d?spm=1055.2635.3001.10343) # 1. STS8200系统集成概述 在信息技术
recommend-type

在自动化装配线上,如何根据不同的应用场景选择合适的机器视觉对位引导技术以实现高精度定位?请结合Cognex、Halcon、OpenCV以及机器人运动控制进行说明。

在面对自动化装配线的高精度定位需求时,选择合适的机器视觉对位引导技术至关重要。首先,我们需要根据装配线的具体应用环境和目标精度要求来选择技术方案。例如,在只需要单个工件定位的应用场景中,可以考虑使用Cognex视觉系统,它提供了强大的图像处理能力和丰富的视觉工具库,适合快速开发和部署。对于更复杂的多工件或动态环境,Halcon的高级算法能够提供更精确的视觉分析,特别是在处理复杂光照条件和不规则形状物体时表现出色。 参考资源链接:[机器视觉对位引导技术详解](https://wenku.csdn.net/doc/7don5ccveb?spm=1055.2569.3001.10343) Ope
recommend-type

WHOIS-Python-Bot:自动抓取WHOIS信息的Python脚本

资源摘要信息:"WHOIS-Python-Bot:https" 知识点概述: 根据提供的文件信息,我们可以推断出以下知识点: 1. WHOIS协议与域名信息检索 2. Python编程语言在网络请求与自动化中的应用 3. 文件和目录管理在Python项目中的实践 4. HTTP协议与网络请求的基本概念 5. 使用Python创建项目目录的步骤与方法 详细知识点: 1. WHOIS协议与域名信息检索: WHOIS是一个互联网标准协议,用于查询数据库以获取域名、IP地址或自治系统的所有者等信息。WHOIS服务允许用户查询域名的注册数据,这些数据包括注册人、注册机构、联系信息、注册日期、到期日期和状态等。WHOIS-Python-Bot可能指的是一个使用Python编程语言编写的自动化脚本或机器人,旨在通过WHOIS协议查询域名相关信息。 2. Python编程语言在网络请求与自动化中的应用: Python作为一种高级编程语言,因其简洁的语法、强大的库支持和广泛的应用场景,非常适合用于网络编程和自动化任务。在处理WHOIS查询时,Python可以利用其标准库如urllib或第三方库如requests来发送网络请求,并解析返回的数据。Python还提供了一些用于自动化和网络操作的工具,比如BeautifulSoup用于解析HTML和XML文档,以及Scrapy用于网络爬虫开发。 3. 文件和目录管理在Python项目中的实践: 文件和目录管理是任何编程项目中的常见任务。在Python项目中,开发者经常需要创建和管理文件和目录,以便组织源代码、配置文件、日志和其他资源。Python提供了一套内建的文件处理函数,比如os模块,允许开发者执行创建目录、删除目录、重命名文件等操作。这对于项目结构的初始化和动态构建非常有用。 4. HTTP协议与网络请求的基本概念: HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,是用于从万维网服务器传输超文本到本地浏览器的传输协议。了解HTTP协议的基本概念对于开发网络相关的应用至关重要。例如,HTTP请求和响应的基本结构,包括请求方法(GET、POST、PUT、DELETE等)、状态码、请求头、请求体和响应体。Python通过各种库简化了HTTP请求的发送和处理。 5. 使用Python创建项目目录的步骤与方法: 在Python中创建项目目录是一个简单的过程,通常涉及到使用内置的os模块或pathlib模块。os模块提供了一系列文件操作的函数,比如os.mkdir()用于创建目录。pathlib模块引入了面向对象的文件系统路径操作。使用这些工具,开发者可以轻松地在代码中创建项目所需的目录结构。例如,创建一个名为“文件”的目录,可以使用os.mkdir("文件"),如果目录不存在的话。更好的做法是先检查目录是否已存在,使用os.path.exists()函数,然后再决定是否创建目录。 项目目录创建示例代码: ```python import os # 指定要创建的目录名称 dir_name = "文件" # 检查目录是否存在,如果不存在则创建 if not os.path.exists(dir_name): os.mkdir(dir_name) print(f"目录 '{dir_name}' 创建成功.") else: print(f"目录 '{dir_name}' 已存在.") ``` 通过上述知识点,我们可以对WHOIS-Python-Bot项目及其可能的功能、结构和实现技术有一个大致的了解。项目名称暗示了该项目是一个利用Python编写的网络自动化脚本,可能用于批量查询域名注册信息,并通过HTTP协议将查询结果发送到服务器。此外,项目初始化阶段需要创建特定的目录来存储相关文件和数据。