智能家居项目开发准备工作

智能家居功能细节拆分:

控制端支持语音设备的输入(用到之前所学习的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.mzph.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…

TCP三次握手、四次挥手、socket,tcp,http三者之间的区别和原理

接着上一篇文章叙述&#xff1a; TCP/IP连接(在互联网的通信中&#xff0c;永远是客户端主动连接到服务端)&#xff1a; 手机能够使用联网功能是因为手机底层实现了TCP/IP协议&#xff0c;可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口&#xff0c;使…

NSUserDefaults的用法

NSUserDefaults适合存储轻量级的本地数据&#xff0c;比如要保存一个登陆界面的数据&#xff0c;用户名、密码之类的&#xff0c;个人觉得使用NSUserDefaults是首选。下次再登陆的时候就可以直接从NSUserDefaults里面读取上次登陆的信息咯。 因为如果使用自己建立的plist文件什…

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则不执行循环。循环完成后会进入下一次循环之…

libcurl库的安装和使用

libcurl简介: libcurl是一个跨平台的网络协议库&#xff0c;支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权&#xff0c;HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传&#xff0c;代理&#xff0c;cookies,和用户认证。li…

android 微信缩小通话界面_安卓如何做出微信那样的界面仿微信“我”的界面2/5...

本系列目标通过安卓编程仿写微信“我”的界面,让大家也能做出类似微信界面.效果图如下:本文目标做出支付部分(其他部分在后续文章中逐步分享).效果图如下:实现方案通过截图工具或者下载一张微信支付照片,放到工程的src/main/res/drawable目录下,命名为pay.png;同样获取一张向右…

Shell脚本中函数的定义和调用笔记

Shell脚本函数的作用主要是把一些可以通用的功能封装起来、避免脚本中出现大量重复的脚本代码&#xff0c;同时可以大大增强脚本的可读性、和可维护性。Shell函数定义的语法格式&#xff1a;function FUNCTION_NAME(){command1command2command3}也可以省略function 关键字FUNCT…

opensll、libcurl库安装的使用,树莓派CSI摄像头的配置,树莓派调用智能API平台实现人脸识别、树莓派配置中文环境

接着上一节人工智能翔云平台介绍&#xff1a; 人工智能OCR识别&#xff1a; OCR 是英文Optical Character Recognition的缩写&#xff0c;意思是光学字符识别&#xff0c;也可简单地称为文字识别&#xff0c;是文字自动输入的一种方法。它通过 扫描 和摄像等光学输入方式获取纸…