模拟智能家居物联网控制系统(源代码)
目录
一、设计要求
设计任务:构建一个虚拟的智能家居物联网控制系统,支持控制各种家居智能设备(例如灯光、窗帘、空调等)。采用C语言编写程序,模拟设备之间的通信和控制逻辑。系统允许通过命令行界面或简易图形用户界面(GUI,采用ASCII字符实现)进行设备控制,并能让用户设定定时任务和场景模式(例如离家模式、回家模式)。
技术要求:掌握C语言中函数、循环、条件语句等基本语法知识,理解多线程或事件驱动编程的基本概念(虽然对于初学者可能无法实现多线程,但可以通过模拟轮询方式),以及如何利用结构体和数组管理设备信息。
二、设计思路
1. 总体设计思路
系统模拟了一个简单智能家居控制系统,采用C语言编写,并通过命令行菜单进行用户交互。设计主要包括以下方面:
- 设备管理:包含设备的添加、移除、状态查看以及单个设备的控制(开/关)。
- 定时任务管理:支持为设备设置定时任务,在指定时间执行开启或关闭操作。
- 场景模式:提供预设场景(比如离家模式、回家模式)和自定义场景功能,用户可以批量控制多个设备。
- 调试与帮助:调试模式用于展示系统中所有设备和定时任务信息,帮助用户了解系统状态;同时提供帮助信息和日志记录功能,用于追踪操作。
2. 数据结构设计
系统中涉及两种主要数据结构:
2.1 设备结构体 Device
- 属性:
name
:设备名称(字符串)。status
:设备状态(0表示关闭,1表示开启)。
typedef struct {
char name[20];
int status; // 0 = 关闭, 1 = 开启
} Device;
2.2 定时任务结构体 TimerTask
- 属性:
deviceIndex
:目标设备在数组中的索引。action
:任务执行的操作(0表示关闭,1表示开启)。triggerTime
:任务触发时间(使用time_t记录当前时间加上用户输入的延时秒数)。
typedef struct {
int deviceIndex;
int action; // 0 = 关闭, 1 = 开启
time_t triggerTime;
} TimerTask;
同时,系统定义全局数组 devices[]
和 tasks[]
分别用于存储设备和定时任务,以及计数变量 deviceCount
和 taskCount
来管理数量。
3. 功能模块实现
3.1 设备管理模块
initializeDevices()
初始化设备列表,默认添加三个设备(如“灯光”、“窗帘”、“空调”),初始状态为关闭。listDevices()
遍历设备数组,打印每个设备的名称及状态,并显示设备总数。addDevice()
检查设备数量,接受用户输入设备名称,将新设备添加到数组中并初始化为关闭状态。removeDevice()
选择要删除的设备,将后续设备依次向前移动覆盖删除位置,减少设备数量。controlDevice()
允许用户选择设备并选择“开启”或“关闭”操作,相应修改设备状态。
3.2 定时任务管理模块
addTimerTask()
实现添加定时任务功能:- 选择目标设备。
- 指定操作(开启或关闭)。
- 输入延迟时间(秒),将当前时间与延迟时间相加,记录任务触发时间并存入任务数组。
executeTasks()
执行定时任务:- 获取当前系统时间,与每个任务的
triggerTime
比较。 - 若任务到达执行时间,则执行对应设备的状态修改并打印任务信息。
- 完成后使用数组移除策略删除任务(移动后续任务填补空位,调整任务计数和索引)。
- 获取当前系统时间,与每个任务的
3.3 场景模式模块
runSceneMode()
提供三种场景模式:- 离家模式:关闭所有设备。
- 回家模式:开启所有设备。
- 自定义场景:逐个选择设备进行开启或关闭操作,输入“0”结束。
3.4 调试及帮助模块
debugMode()
显示所有设备状态、定时任务信息(包括剩余时间),用于调试和了解系统内部状态。printHelp()
输出系统操作说明和各功能模块使用方法,方便新用户查看帮助。
3.5 日志记录模块
logOperation()
每次用户执行操作后,将操作描述写入日志文件operations.log
中,并记录当前时间戳。这个功能有助于在系统运行中跟踪用户操作记录。
void logOperation(const char *operation) {
FILE *logFile = fopen("operations.log", "a");
if (logFile == NULL) {
printf("无法打开日志文件!\n");
return;
}
time_t now = time(NULL);
fprintf(logFile, "[%s] %s\n", ctime(&now), operation);
fclose(logFile);
}
4. 主程序流程
在 main()
函数中,系统通过无限循环显示主菜单,允许用户做出选择。根据用户输入,系统调用相应函数实现功能,并在每次操作后使用 logOperation()
记录日志。用户选择“退出”后,主循环结束,程序退出。
int main() {
initializeDevices();
while (1) {
printf("\n智能家居控制系统\n");
printf("1. 查看设备列表\n");
printf("2. 添加新设备\n");
printf("3. 移除设备\n");
printf("4. 控制设备\n");
printf("5. 设置定时任务\n");
printf("6. 执行定时任务\n");
printf("7. 场景模式\n");
printf("8. 调试模式\n");
printf("9. 帮助\n");
printf("10. 退出\n");
printf("请输入你的选择: ");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
listDevices();
logOperation("查看设备列表");
break;
case 2:
addDevice();
logOperation("添加新设备");
break;
case 3:
removeDevice();
logOperation("移除设备");
break;
case 4:
controlDevice();
logOperation("控制设备");
break;
case 5:
addTimerTask();
logOperation("设置定时任务");
break;
case 6:
executeTasks();
logOperation("执行定时任务");
break;
case 7:
runSceneMode();
logOperation("运行场景模式");
break;
case 8:
debugMode();
logOperation("进入调试模式");
break;
case 9:
printHelp();
logOperation("查看帮助信息");
break;
case 10:
printf("退出系统,再见!\n");
logOperation("退出系统");
return 0;
default:
printf("无效的选择!\n");
logOperation("无效选择");
}
}
return 0;
}
本系统经过模块化设计,将智能家居各功能(设备管理、定时任务、场景模式、调试模式等)分隔开,负责不同功能点,并通过统一菜单实现交互。日志功能记录每次操作,定时任务利用时间戳进行状态更改。设计简单明了,易于扩展和维护。
三、结果分析
—