智能家居項目開發準備工作

智能家居功能細節拆分:

控制端支持語音設備的輸入(用到之前所學習的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.canimal.hcat.cmianpro.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里面進行代碼的編寫。
    在這里插入圖片描述

以上是智能家居開發的軟件框架構建準備工作,接下來開始代碼的編寫。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272133.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272133.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272133.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

catia曲面掃掠命令詳解_Mastercam快捷鍵命令,附中英文功能講解!值得收藏!

組合鍵式快捷鍵功能快 捷 鍵功能Alt 0設置Z向控制深度Alt 1設置繪制圖形的顏色Alt 2設置當前層Alt 3與Alt 2功能相同Alt 4設置刀具面(Tplane)Alt 5設置繪圖面(Cplane)Alt 6設置視圖面(Gview)Alt A進入自動存文件對話框快 捷 鍵功能Alt B工具條的顯示/關閉Alt C選擇執…

RocketMQ中主從復制

生產者把消息發送到master&#xff0c;不會發送到slave 消費者可以從maste也可以從slave消費消息 如果master掛了&#xff0c;那就從slave消費數據&#xff0c;那么slave怎么拿到master中的數據 這就要用到主從復制

智能家居代碼構建編寫、簡單工廠模式、樹莓派攝像頭視頻監控功能實現

根據上一節內容的代碼框架開始編寫代碼&#xff1a; 首先編寫controlDevices.h這個頭文件里面的代碼&#xff0c;這個是設備工廠每一個結點的結構體類型&#xff0c;而且還要在這個頭文件里面進行函數的聲明&#xff0c;也就是創建的那些設備.c文件里面的函數&#xff08;為了…

Linux中Shell的命令替換用法筆記

命令替換主要是指將命令的標準輸出值賦值給某個變量。命令替換屬于Shell編程中非常重要的功能&#xff0c;需要熟悉掌握。 命令替換的方式 1、反引號:命令 2、$()&#xff1a;$(命令) 用法說明&#xff1a;date1date #將date命令值給date1變量 date2$(date) #將date命令值給dat…

采樣次數不同平均值不一樣_網絡推廣采取的方式不同,效果也不一樣

網絡推廣是基于互聯網而進行&#xff0c;針對目標客戶群體&#xff0c;加之以有效的網絡鏈接形式使其形成迅速大的購買力的一種營銷模式&#xff0c;是目前很多企業已經認識到的&#xff0c;但是在推廣過程之中往往會出現不同的狀況&#xff0c;比如說模式是完全不一樣的。 …

rocketmq 同步刷盤和異步刷盤以及主從復制之同步復制和異步復制你理解了嗎

同步刷盤、異步刷盤 RocketMQ的消息是存儲到磁盤上的&#xff0c;這樣既能保證斷電后恢復&#xff0c;又可以讓存儲的消息量超出內存的限制。 RocketMQ為了提高性能&#xff0c;會盡可能地保證磁盤的順序寫。消息在通過Producer寫入RocketMQ的時候&#xff0c;有兩種 寫磁盤方…

七層網絡模型、TCP/IP四層模型、網絡數據包、交換機路由器區別

七層網絡模型&#xff08;簡稱OSI模型&#xff09;&#xff1a; OSI 模型(Open System Interconnection model)是一個由國際標準化組織提出的概念模型,試圖供一個使各種不同的計算機和網絡在世界范圍內實現互聯的標準框架。它將計算機網絡體系結構劃分為七層,每層都可以提供抽…

Linux中Shell的算數運算符和位運算符用法筆記

1、算數運算符 算數運算符主要是加、減、乘、除、余、冪等常見的算術運算&#xff0c;以及加等、減等、乘等、除等、余等復合算術運算。 注意&#xff1a;Shell只支持整數運算&#xff0c;小數部分會舍去。一般情況下算術運行需要個let命令一起來使用。注意除法運算&#xff0c…

ostu閾值分割python實現_PIL大津法閾值分割Python代碼

[Python]代碼#codingutf8"""大津法閾值分割:A Threshold Selection Method from Gray-Level Histograms需要PIL庫"""import Imageimport sysdef sigma(im,i,debug False):"""閾值為i時,圖像im中兩組的方差"""c0_p…

php執行一條insert插入兩條數據其中一條亂碼

顯然這就是編碼問題&#xff0c;但是問題從哪來的呢&#xff0c; 我把文件編碼以及代碼的編碼都設置成utf-8了&#xff0c;為什么還有這個問題于是我就開始寫測試腳本 第一條 mysql_query(insert into table value(1,1,"思考思考123")) 測試沒有問題 第二條 $name$_G…

TCP三次握手、四次揮手、socket,tcp,http三者之間的區別和原理

接著上一篇文章敘述&#xff1a; TCP/IP連接(在互聯網的通信中&#xff0c;永遠是客戶端主動連接到服務端)&#xff1a; 手機能夠使用聯網功能是因為手機底層實現了TCP/IP協議&#xff0c;可以使手機終端通過無線網絡建立TCP連接。TCP協議可以對上層網絡提供接口&#xff0c;使…

小程序接入h5頁面_小程序-實現怎么跳轉打開 H5 網頁鏈接(或跳轉至公眾號文章)...

背景有時候,因為業務需求,在小程序當中,需要跳轉到 h5 網頁,或跳轉到公眾號,形成流量的閉環,那在小程序當中怎么實現呢?實例效果前提條件該小程序與需要跳轉至的公眾號(訂閱號/服務號)進行了綁定關聯使用小程序開放能力web-view實現跳轉(承載網頁的容器。會自動鋪滿整個小程序…

NSUserDefaults的用法

NSUserDefaults適合存儲輕量級的本地數據&#xff0c;比如要保存一個登陸界面的數據&#xff0c;用戶名、密碼之類的&#xff0c;個人覺得使用NSUserDefaults是首選。下次再登陸的時候就可以直接從NSUserDefaults里面讀取上次登陸的信息咯。 因為如果使用自己建立的plist文件什…

http、https、密碼學基礎、GET和POST區別

http協議相關&#xff1a; http協議的特性: http協議是建立在TCP/IP協議之上應用層協議&#xff0c;默認端口為80或者8080。http協議的的特點是無狀態&#xff0c;無連接&#xff08;并不是真的沒有連接&#xff0c;而是在請求數據的時候有連接&#xff0c;在數據回來的時候就…

apache 配置文件內使用 8080 端口_【SpringBoot 框架】- SpringBoot 配置文件

一、SpringBoot配置文件類型SpringBoot是基于約定的&#xff0c;所以很多配置都有默認值&#xff0c;但如果想使用自己的配置替換默認配置的話 &#xff0c;就可以自己編寫配置文件進行相應配置&#xff0c;起步依賴spring-boot-starter-parent 中&#xff0c;有配置文件的引入…

Linux中while循環的用法筆記

Shell中可以采用while循環來實現需要進行循環的操作。 語法結構如下&#xff1a; while exp do command done 執行過程&#xff1a;while將測試exp的返回值&#xff0c;如果返回值為true則執行循環體的命令&#xff0c;返回值為false則不執行循環。循環完成后會進入下一次循環之…

IOS9.0 導航欄狀態欄

狀態欄高度20px 豎屏是導航欄高度44px 橫屏時導航欄高度32px 獲取當前屏幕狀態&#xff1a;UIApplication.sharedApplication().statusBarOrientation轉載于:https://www.cnblogs.com/iOSboyYang/p/5328886.html