最效果展示
(PS:房屋模型的搭建是靠纸板箱和淘宝买的家居模型,户型参考了留学时短租的公寓~)
前言
到目前为止,对于linux的嵌入式软件开发,从底层到上层都有了一定的认识。这个项目的初衷就是整合知识并以工厂模式的架构开发项目。
功能实现
- 实现了socket服务器远程控制卧室,餐厅,厕所,客厅4盏灯的开启和关闭
- 实现了语音控制卧室,餐厅,厕所,客厅4盏灯的开启和关闭
- 实现了当温度超过阈值的时候进行火灾报警,并且可以语音关闭警报
- 实现了进门前结合语音,OLED和摄像头的人脸识别
- 实现了实时的远程视频监控
- 实现OLED屏幕的实时温湿度显示
开发环境 & 实现思路
- 开发板:树莓派3B+
- 开发语言:C
- 编程工具:Source Insight 3
工厂设计
对于这个项目的实现,采用上节学到的工厂模式来设计,从而提升整体代码的稳定性和可拓展性。
阅读功能需求后,结合工厂模式的思路可以先设计两个工厂:指令工厂 和 设备工厂
- 指令工厂:存储需要使用到的指令
- 设备工厂:存储需要使用到的设备
工厂模式的主要的考量有两点:
1. 工厂的类
struct device //设备工厂
{
char device_name[64]; //设备名称
int status;
int (*init)(); //初始化函数
int (*open)(); //打开设备的函数
int (*close)(); //关闭设备的函数
int (*read_status)(); //查看设备状态的函数
struct device *next;
};
struct cmd //指令工厂
{
char cmd_name[64]; //指令名称
//char cmd_log[1024]; //指令日志
int (*init)(int port, char *IP, char *UART, int BAUD); //初始化函数
int (*accept)(int fd); //接受函数
int (*cmd_handler)(struct device *phead, int fd); //处理指令的函数
struct cmd *next;
};
2. 工厂的对象
实现思路Q&A
Q:如何实现socket服务器的远程控制?
A:使用之前学习的socket知识,创建一个服务端一个客户端,服务端负责创建套接字并绑定,然后阻塞监听;客户端负责建立连接后发送指令。指令在服务端通过指令工厂中socket对象的cmd_handler函数进行分析并作出相关动作。最后在main函数中使用一个线程不断阻塞等待新客户端的加入;使用另一个线程不断阻塞接受客户端传来的指令并分析。
参考我之前的博文:
(
标签:树莓,struct,int,pfind,cmd,智能家居,---,fd,device From: https://blog.csdn.net/mjmmm/article/details/135516194