智能家居功能细节拆分:
控制端支持语音设备的输入(用到之前所学习的LD3320语音识别模块)或者是socket客户端(这个客户端可以是ftp项目的客户端也可以是Android的app),主控芯片是树莓派,既接收语音模块的控制指令还可以接收来自客户端网络TCP的指令,然后树莓派编写程序时,会编写两个线程(一个用于语音模块串口线程、一个用于客户端线程),然后树莓派会通过IO的高低电平来控制继电器进而控制不同房间的灯的亮灭。同样是通过IO口的输入功能来检测火焰传感器电平的高低判断进而驱动蜂鸣器是否发出警报。还有就是摄像头模块(用于视频监控和人脸识别),然后还会用到WemosD1(因为在实际开发时,树莓派只有一个串口),为了学习更多的知识,我们采用433M射频模块(基于串口通信)控制窗帘和泳池灯,使用红外模块(基于串口通信)控制电风扇、电视、空调等红外设备,这就需要两个串口了就需要使用第三方设备来增加树莓派的串口,进而实现相应的功能。编码模式采用:普通编码模式和内核设计模式,采用内核设计模式设计整个项目。
智能家居代码机构——简单工厂模式:
什么是设计模式?
百度百科解释: 软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
总的来说: 就是代码设计经验的总结,能够让代码稳定,拓展性更强,一系列编程的思想,代码容易被他人理解,保证代码可靠性,程序的重用性。设计模式有23种,要慢慢的积累,使用设计模式会增强代码的稳定性,在代码里面添加某些功能不会将代码其他部分的功能破坏掉。
算法: 算法不是设计模式,因为算法致力于解决问题而非设计问题,设计模式通常描述了一组相互紧密作用的类与对象。
C语言面向对象引入类和对象的概念:
程序举例:
struct Animal
{
char [128];
int age;
int sex;//成员属性
void (*peat)();
void (*pbeat)();//成员方法
}
struct Animal dog;
struct Animal cat;//dog cat 是类(Animal)的一种对象
C语言面向对象举例:
#include
//类 :抽象 模板
struct Animal
{
char name[128];
int age;
int sex;//成员属性
void (*peat)();
void (*pbeat)();//成员方法,这里是函数指针类型。
};
void dogEat()
{
printf("eat meat\n");
}
void catEat()
{
printf("ear fish\n");
}
void dogBeat()
{
printf("咬\n");
}
void catBeat()
{
printf("抓\n");
}
int int main()
{
struct Animal dog;
struct Animal cat;//dog cat 是类(Animal)
dog.peat=dogEat;
cat.peat =catEat;
dog.pbeat=dogBeat;
cat.pbeat=catBeat;//函数名相当于指针
dog.peat();
dog.pbeat();
cat.peat();
cat.pbeat();
return 0;
}
C结构体的另一种使用方法(在前面驱动代码的编写中使用过):
#include
//l类 :抽象 模板
struct Animal
{
char name[128];
int age;
int sex;//成员属性
void (*peat)();
void (*pbeat)();//成员方法
};
void dogEat()
{
printf("eat meat\n");
}
void catEat()
{
printf("ear fish\n");
}
void dogBeat()
{
printf("咬\n");
}
void catBeat()
{
printf("抓\n");
}
int main()
{
struct Animal dog1={"阿黄",11,20,dogEat,dogBeat};//这是之前的写法,必须按照顺序来
//下面是新的写法,可以选择性的为模板里面的元素赋值
struct Animal dog={
.pbeat=dogBeat,
.peat=dogEat
} ;
struct Animal cat={
.pbeat=catBeat,
.peat=catEat
} ;
//结构体新的用法
dog.peat();
dog.pbeat();
cat.peat();
cat.pbeat();
return 0;
}
什么是工厂模式:
工厂模式(Factory Pattern)是最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。下面通过软件将以上代码采用简单工厂模式在sourceInsight里面进行编写,以下是简单工厂模式的示例,工厂模式使代码逻辑和思路更加清晰,便于修改和添加。
#include"animal.h"
void dogEat()
{
printf("eat meat\n");
}
void dogBeat()
{
printf("咬\n");
}
struct Animal dog={
.name="quan",
.pbeat=dogBeat,
.peat=dogEat
};
struct Animal* putdogLink(struct Animal*phead)
{
if(phead==NULL){
phead=&dog;
return phead;
}
else{
dog.next=phead;
phead=&dog;
return phead;
}
}
#include "animal.h"
void catEat()
{
printf("ear fish\n");
}
void catBeat()
{
printf("抓\n");
}
struct Animal cat={
.name="Tom",
.pbeat=catBeat,
.peat=catEat
} ;
struct Animal *putcatLink(struct Animal *phead)
{
if(phead==NULL){
phead=&cat;
return phead;
}
else{
cat.next=phead;
phead=&cat;
return phead;
}
}
#include
//l类 :抽象 模板
struct Animal
{
char name[128];
int age;
int sex;//成员属性
void (*peat)();
void (*pbeat)();//成员方法
struct Animal*next;
};
struct Animal* putdogLink(struct Animal*phead);
struct Animal *putcatLink(struct Animal *phead);
#include "animal.h"
#include
struct Animal *findUtilByName(char *str,struct Animal * phead)
{
struct Animal* tmp=phead;
if(tmp==NULL){
printf("空链表\n");
return NULL;
}
else{
while(tmp!=NULL){
if(strcmp(tmp->name,str)==0){
return tmp;
}
tmp=tmp->next;
}
return NULL;
}
}
int main()
{
char buf[128]={'\0'};
struct Animal *phead=NULL;
struct Animal *ptemp;
phead = putcatLink(phead);
phead = putdogLink(phead);
while(1){
printf("请输入你想要动物的名字(TOm or quan)\n");
scanf("%s",buf);
ptemp = findUtilByName(buf,phead);
if(ptemp!=NULL){
ptemp->pbeat();
ptemp->peat();
}
memset(buf,'\0',sizeof(buf));
}
return 0;
}
gcc *.c -o factory
,*
是通配符。然后执行以下就可以了,运行如下:以上是智能家居开发的软件框架构建准备工作,接下来开始代码的编写。