智能家居功能细节拆分:

控制端支持语音设备的输入(用到之前所学习的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里面进行代码的编写。

以上是智能家居开发的软件框架构建准备工作,接下来开始代码的编写。

智能家居项目开发准备工作相关推荐

  1. 智能家居项目开发: 设计模式(工厂模式)+ 线程池 + Socket (持续更新中)

    智能家居项目开发 一.智能家居功能细节拆分 控制区: 外设区: 面向对象类和对象的概念 结构体新玩法 二.工厂模式 1. 工厂模式的概念 2. 工厂模式的实现 3. 工厂模式使用及功能验证 三.智能家 ...

  2. 智能家居项目开发(一):简单工厂设计模式引入

    智能家居项目开发 一.智能家居功能细节拆分 二.设计模式概念的引入 三.类与对象 四.结构体新玩法 五.工厂模式 一.智能家居功能细节拆分 1.控制区 我们会用到之前学过的: 语音识别模块 socke ...

  3. 至尊智能家居项目开发全过程

    [至尊智能家居] 主要内容 项目开发过程简介 项目功能分析 数据建模&UML 建模 基础环境搭建 一. 项目开发过程简介 1 项目的核心是什么? 项目不是简单的 CRUD.不是数据的增删改查. ...

  4. 智能家居 (8) ——智能家居项目整合(网络控制线程、语音控制线程,火灾报警线程)

    目录 mainPro.c(主函数) 指令工厂 inputCommand.h voiceControl.c(语音控制) socketControl.c(网络线程) 控制工厂 contrlEquipmen ...

  5. android 智能家居 pdf,智能家居项目化教程.pdf

    作 者 :曾文波,伦硕波,黄日胜,钟建坤编著 出版发行 : 北京:中国水利水电出版社 , 2019.03 ISBN号 :978-7-5170-6858-7 页 数 : 151 原书定价 : 27.00 ...

  6. 嵌入式智能家居项目视频监控_智能化您的视频嵌入

    嵌入式智能家居项目视频监控 Video content is taking over the Internet. The trend began long ago and the most recen ...

  7. 基于2.4GHz射频NRF24L01模块的智能家居项目总结

    1.      经过陆陆续续的几个双休日和考试周里的空闲时间里的编写和调试,终于于2015/12/26今天晚上大体完成了智能家居的调试工作!总算是没有半途而废,耐心也受到挑战. 2.      几个比 ...

  8. 基于stm32的智能家居项目

    基于stm32的智能家居 具体教程可以看文中的B站链接,上面有手把手教程 本人其他项目链接基于linux的智能仓储项目 基于Qt的人脸识别 移植人脸识别到Linux开发板上 基于正点原子的IMX6UL ...

  9. 智能家居项目(十三)

    1.socket.tcp.http之间的协议 戳我跳转 2.了解一下HTTP协议相关名词概念 戳我跳转 3.HTTPS协议及密码学基础名字 戳我跳转 4.初见Libcurl库 戳我跳转1 戳我跳转2 ...

最新文章

  1. 高性能Javascript:高效的数据访问
  2. python字符串与文本处理技巧(1):分割、首尾匹配、模式搜索、匹配替换
  3. html css 表格自动高度,HTML/CSS - 具有固定高度的容器中表格单元格的高度不一致...
  4. TensorFlow入门:第一个机器学习Demo
  5. JavaScipt面向对象编程----闭包
  6. 主函数和子函数的传值传址例子
  7. 我用 Python 集齐了五福
  8. SplitContainer如何实现左导航,右显示与导航相关内容
  9. 2021年中国电子高度表市场趋势报告、技术动态创新及2027年市场预测
  10. 雷军:小米MIX α量产难度太大已放弃;iPhone 12系列将支持北斗导航;TypeScript 4.0 RC发布|极客头条
  11. 华为手机android版本升级失败怎么办,华为手机系统更新好吗 华为手机系统更新方法...
  12. [转载] python strptime函数转时间数组_python—时间与时间戳之间的转换
  13. 用python读取cifar-10与cifar-100图像数据
  14. 科工网大数据有力促进机器人制造业发展
  15. [翻译]X窗口管理器的原理剖析(一)
  16. uniApp入门(一)
  17. Android 中自定义ViewGroup实现流式布局的效果
  18. PB DES、3DES加密解密(简单便捷)
  19. Eclipse安装DSS会出现的一点问题
  20. 2022年使用的至佳Java IDE

热门文章

  1. 【深度学习】——模型评估指标MAP计算实例计算
  2. 学习笔记(26):Python网络编程并发编程-GIL与自定义互斥锁的区别
  3. C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法
  4. 科技鸿蒙系统一千章,第一千六百零七章 鸿蒙紫气,成圣之机 (上)
  5. jq js json 转字符串_JS中JSON对象和String之间的互转及处理技巧
  6. mysql5.0 java连接_Java连接mysql5.0
  7. Linux之RPM 软件管理程序
  8. 3D 立体 backface-visibility
  9. 测试工作中常用的方法
  10. HDU3183 A Magic Lamp —— 贪心(单调队列优化)/ RMQ / 线段树