智能家居功能細節拆分:
控制端支持語音設備的輸入(用到之前所學習的LD3320語音識別模塊)或者是socket客戶端(這個客戶端可以是ftp項目的客戶端也可以是Android的app),主控芯片是樹莓派,既接收語音模塊的控制指令還可以接收來自客戶端網絡TCP的指令,然后樹莓派編寫程序時,會編寫兩個線程(一個用于語音模塊串口線程、一個用于客戶端線程),然后樹莓派會通過IO的高低電平來控制繼電器進而控制不同房間的燈的亮滅。同樣是通過IO口的輸入功能來檢測火焰傳感器電平的高低判斷進而驅動蜂鳴器是否發出警報。還有就是攝像頭模塊(用于視頻監控和人臉識別),然后還會用到WemosD1(因為在實際開發時,樹莓派只有一個串口),為了學習更多的知識,我們采用433M射頻模塊(基于串口通信)控制窗簾和泳池燈,使用紅外模塊(基于串口通信)控制電風扇、電視、空調等紅外設備,這就需要兩個串口了就需要使用第三方設備來增加樹莓派的串口,進而實現相應的功能。編碼模式采用:普通編碼模式和內核設計模式,采用內核設計模式設計整個項目。
智能家居代碼機構——簡單工廠模式:
-
什么是設計模式?
百度百科解釋: 軟件設計模式(Design pattern),又稱設計模式,是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性、程序的重用性。
總的來說: 就是代碼設計經驗的總結,能夠讓代碼穩定,拓展性更強,一系列編程的思想,代碼容易被他人理解,保證代碼可靠性,程序的重用性。設計模式有23種,要慢慢的積累,使用設計模式會增強代碼的穩定性,在代碼里面添加某些功能不會將代碼其他部分的功能破壞掉。 -
算法: 算法不是設計模式,因為算法致力于解決問題而非設計問題,設計模式通常描述了一組相互緊密作用的類與對象。
C語言面向對象引入類和對象的概念:
- 類: 類是一種用戶定義的引用數據類型,也稱類類型。(在C語言中和結構體差不多)
- 對象: 對象是對客觀事物的抽象,類是對對象的抽象。類是一種抽象的數據類型。它們的關系是:對象是類的實例,類是對象的模板。
程序舉例:
struct Animal
{char [128];int age;int sex;//成員屬性void (*peat)();void (*pbeat)();//成員方法
}
struct Animal dog;
struct Animal cat;//dog cat 是類(Animal)的一種對象
C語言面向對象舉例:
#include <stdio.h>
//類 :抽象 模板
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 <stdio.h>
//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里面進行編寫,以下是簡單工廠模式的示例,工廠模式使代碼邏輯和思路更加清晰,便于修改和添加。
- 首先在選定位置新建一個文件夾,然后在文件夾里面新建dog.c、animal.h、cat.c和mianpro.c 然后再新建一個文件夾存放sourceInsight的工程文件(有關sourceInsight的用法),如下圖所示:
- 然后將對應的代碼寫入對應的文件,比如:dog.c這個文件就是存放dog這個對象的相關行為,并且提供讓主程序調用的函數API將dog這個對象添加到鏈表中去(這個就像是以后的智能家居為實現整個控制系統,需要添加的各個功能模塊,一個供能模塊就是一個文件),putdogLink 是將dog對象插入進鏈表的API接口,這里采用頭插法進行插入,即:先插入的在后邊。
#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;}}
- 然后再將cat.c的代碼進行編寫,意思和上面一樣
#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;}
}
- 因為dog.c和cat.c里面都含有,struct Animal 這個結構體,所以應該將其聲明在animal.h 這個頭文件里面,然后還需要聲明供主程序調用的API函數接口。
#include <stdio.h>
//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);
- 最后就是編寫mainpro.c主函數,下面函數還編寫了一個可供用戶輸入的然后查找響應節點的函數,用戶輸入要查找的節點名稱,找到后返回指向該節點的指針,通過指針就可以對該節點進行操作,就把它當做鏈表的一個節點即可。
#include "animal.h"
#include<string.h>
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
,*
是通配符。然后執行以下就可以了,運行如下:
- 根據以上簡單工廠模式,智能家居設計的時候,就可以設計為指令工廠、main函數、控制工廠,指令工廠面就存放指令(比如:語音指令、客戶端指令等,將這些指令串為一個鏈表),控制工廠就是控制一些家庭設備(比如:各個房間的燈,門鎖、串口等,創建一個鏈表,然后根據指令,去查找對應的控制結點),main函數里面首先創建兩個鏈表(指令工廠、控制工廠),然后接下來創建兩個線程(一個是語音的、一個是客戶端的),在每個線程里面在接受到指令后去控制工廠里面去查找對應的控制設備然后進行一系列操作。
- 根據上面的敘述,我們可以創建以下架構的代碼文件工程,指令工場和控制工場的頭文件就是以下圖片中的兩個頭文件。然后將這些文件導入到sourceInsight里面進行代碼的編寫。
以上是智能家居開發的軟件框架構建準備工作,接下來開始代碼的編寫。